{
  "status": "completed",
  "completed_count": 54,
  "applicable_count": 54,
  "failed_count": 0,
  "schema_version": 13,
  "config_hash": "f88dabeac494b003",
  "data": {
    "scenes": [
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "공포에 질려 비명을 지르기 직전의 얼굴 클로즈업",
        "representative_moment": "극한의 공포에 질린 C05의 눈동자와 일그러진 표정이 화면을 가득 채운 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme facial close-up from chest height and slightly below eyeline, muted golden dusk backlight with cold green-gray shadows.",
            "t2i_prompt": "Photorealistic cinematic still. C05O07 in a dark hiking jacket, a Korean adult man, appears in the middle-center foreground as a terrified man isolated in extreme close-up. The camera is positioned chest-height, barely 40 centimeters from his face and slightly below his eyeline. His eyes and brow occupy most of the frame. Facing the camera, his head is recoiling backward. His wide eyes are gazing off-screen in sheer panic. He is visibly wounded and pained. A muted golden dusk backlight leaks through the fog, leaving his face cold and green-gray with tiny red glints reflecting in his eyes. [: The wet forest floor and leaves smear into soft darkness around the frame edges. Dark vertical shapes of wet tree trunks stack vertically behind his head, receding into the heavy fog.]",
            "outfit_assignments": [
              {
                "character_id": "C05",
                "outlook_id": "O07"
              }
            ],
            "source_facts": [
              "S#1 action: '잔뜩 겁에 질린 남자 표정(T.S)'",
              "shot description: 'A close view of the immobilized subject’s terrified face and recoiling head'",
              "DP direction: 'tightened into an extreme facial close-up where his eyes and brow occupy most of the frame'"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: head recoiling back",
              "extreme facial close-up pushes the thigh wound and the attacker completely off-frame"
            ],
            "creative_decisions": [
              "Used L02 block instead of L01 for the frame-edge environment to comply with the L01 omission request.",
              "Emphasized the color contrast on the face (cold green-gray skin with tiny red glints in the eyes) to intensify the horror tone.",
              "Blurred the wet leaves into soft darkness at the edges to firmly anchor the focus on the terrified eyes."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5d99d7ec44dade52",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "1679a38bf9ded890",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "C05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the flow’s end position, the camera is chest-height and barely 40 centimeters from the Korean man’s face, slightly below his eyeline, tightened into an extreme facial close-up where his eyes and brow occupy most of the frame. The forest floor and wet leaves smear into soft darkness around the frame edges, while his head recoils slightly backward as if the lens has arrived too close to his panic.",
            "lighting_mood": "Muted golden dusk backlight leaks through the fog, leaving his face cold and green-gray with tiny red glints in the eyes and wound edges.",
            "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": "terrified man isolated in extreme close-up",
                  "screen_zone": "middle_center",
                  "target_id": "C05",
                  "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": [
              "C05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C05",
                "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": "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": "foggy_dusk_forest",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense and untamed forest at dusk, heavy with thick fog. The rough forest floor is heavily covered with dirt and wet fallen leaves. A muted golden backlight filters weakly through the trees and fog, swallowed largely by deep, cold green-black shadows.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "숲속 / 해 질 무렵",
                  "우거진 수풀",
                  "wet leaves smear into soft darkness",
                  "golden dusk is mostly swallowed by green-black forest shadow",
                  "Muted golden dusk backlight leaks through the fog"
                ],
                "visual_inferences": [
                  "The ground is uneven and damp, characteristic of an unmanaged woodland environment.",
                  "The fog obscures deep background visibility, enclosing the space."
                ],
                "creative_decisions": [
                  "Emphasize the contrast between the muted golden dusk highlights and the oppressive green-black shadows to build a sense of danger and 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": [],
            "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": "12ad5f0ca3106c96"
      },
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "정체불명의 검은 인영에게 덮쳐지는 부상당한 남자",
        "representative_moment": "C10O11이 공중에서 몸을 날려 바닥에 쓰러진 C05O07을 강하게 덮치는 찰나의 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Wide frame, low side camera position near the forest floor angled slightly upward, conveying a dynamic handheld impact.",
            "t2i_prompt": "Photorealistic cinematic still. C05O07 in dark hiking clothes, an Asian adult man, crashes onto the muddy forest floor in the lower-center foreground. C10O11 in a black zip-up hoodie, an Asian adult man appearing as a dark-haired silhouette with face not visible, leaps into the frame from the upper left in left profile, forcefully driving C05O07 down into the dirt. C05O07 is in right profile, head recoiled back, looking up with a terrified wide-eyed expression, missing one shoe, a large bleeding tooth mark exposed on the thigh. The low side camera angles slightly upward from the ground. The shared forest floor is churned with damp dirt and wet fallen leaves, smeared with sharp red blood accents. Airborne leaves and dirt kick up toward the lens, frozen mid-air at the moment of collision. Muted golden dusk backlight filters weakly through thick fog, heavily swallowed by deep green-black shadows. Slanted, wet dark tree trunks lean across the dense underbrush in the background, framing the violent impact.",
            "outfit_assignments": [
              {
                "character_id": "C05",
                "outlook_id": "O07"
              },
              {
                "character_id": "C10",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "벗겨진 한쪽 신발. 허벅지에 커다란 이빨 자국. 피가 흐르고. 잔뜩 겁에 질린 남자",
              "어디선가 쏜살같이 달려온 검은 인영이 남자를 덮친다",
              "The black shape slices in from the upper left and drives the wounded man down into the lower center"
            ],
            "visual_inferences": [
              "fixed_element foggy_dusk_forest: dense untamed forest, damp dirt, wet fallen leaves, muted golden backlight",
              "The low side camera angle makes the leaping figure appear dominant while the muddy ground anchors the lower frame"
            ],
            "creative_decisions": [
              "Airborne debris and kicked-up dirt are used to convey the violent impact and the requested 'handheld shake' energy in a frozen still frame",
              "Strong contrast between the green-black shadows and the sharp red blood accents to highlight the brutality of the scene"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c6045e67a7119aa1",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "599f71e06a76037a",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "S1_Shot3의 숲속 배경(exact_background) 및 C05의 부상 상태(immobilized continuity) 유지",
        "_shot_index": 4,
        "visible_entities": [
          "L01",
          "C05",
          "C10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Cutting from the face close-up to the flow’s low side position, the camera sits near the forest floor about two meters from impact, angled slightly upward so both bodies collide across the same horizontal plane. The frame opens wide and shakes handheld as the black shape slices in from the upper left and drives the wounded man down into the lower center, dirt and leaves kicking toward the lens without any single prop overwhelming the image.",
            "lighting_mood": "The golden dusk is mostly swallowed by green-black forest shadow, with sharp red blood accents and fog-muted highlights on airborne leaves.",
            "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": "wounded man on forest floor",
                  "screen_zone": "lower_center",
                  "target_id": "C05",
                  "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": [
              "L01",
              "C05",
              "C10"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C05",
                "outlook_id": "O07"
              },
              {
                "character_id": "C10",
                "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": "foggy_dusk_forest",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense and untamed forest at dusk, heavy with thick fog. The rough forest floor is heavily covered with dirt and wet fallen leaves. A muted golden backlight filters weakly through the trees and fog, swallowed largely by deep, cold green-black shadows.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "숲속 / 해 질 무렵",
                  "우거진 수풀",
                  "wet leaves smear into soft darkness",
                  "golden dusk is mostly swallowed by green-black forest shadow",
                  "Muted golden dusk backlight leaks through the fog"
                ],
                "visual_inferences": [
                  "The ground is uneven and damp, characteristic of an unmanaged woodland environment.",
                  "The fog obscures deep background visibility, enclosing the space."
                ],
                "creative_decisions": [
                  "Emphasize the contrast between the muted golden dusk highlights and the oppressive green-black shadows to build a sense of danger and isolation."
                ],
                "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": "C10O11",
                "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": "c083e2e797585fff"
      },
      {
        "scene_index": 2,
        "heading": "S#2. 도시 뒷골목 / N",
        "beat_title": "물어뜯는 남자의 이빨과 쓰러지는 여자",
        "representative_moment": "C12가 C07의 목을 물어뜯으며, C07은 눈을 감고 힘없이 쳐지는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up at shoulder height, shallow depth of field, low sodium waxy lighting",
            "t2i_prompt": "Photorealistic cinematic still. An extreme close-up at shoulder height, tightly framing the predatory contact. C12O13 in a dark canvas jacket, a Korean adult man in right profile, jaw clamped forward, gaze looking down with faint red eyes, his teeth deeply sunk into the exposed neck. C07 in a trench coat, a Korean adult woman in left profile, her neck arched back, eyes completely closed, remaining still and unresponsive in a severely injured state. The focus sharply isolates the man's strained lower face and the woman's compressed skin at the bite mark, with a hard red accent on the wound. Behind them, [: a blurred vertical old utility pole and sickly yellow-green streetlight pools enveloped in damp blue-black alley shadow and fog] fill the frame edges in shallow depth of field. Low sodium lighting casts a dim waxy sheen on their skin.",
            "outfit_assignments": [
              {
                "character_id": "C12",
                "outlook_id": "O13"
              },
              {
                "character_id": "C07",
                "outlook_id": "O09"
              }
            ],
            "source_facts": [
              "Shot 3: gaze=closed_eyes",
              "Shot 3: damp blue-black alley shadow, Low sodium streetlight",
              "Scene text: 남자의 붉은 눈동자, 목의 살점을 뜯는 이빨"
            ],
            "visual_inferences": [
              "fixed_element woman_closed_eyes: Her facial muscles are relaxed, showing a lack of consciousness.",
              "fixed_element alley_night_environment: The dim lighting creates a damp, deep shadow atmosphere around the pole.",
              "The extreme close-up isolates the jaw and neck, leaving the background in a sickly blur to emphasize the predatory tension."
            ],
            "creative_decisions": [
              "Used L02 instead of L01 for the background block as requested.",
              "Applied a waxy sheen to the skin via low sodium lighting to heighten the grim, horror-thriller mood.",
              "Focused purely on the physical contact point (teeth on neck) to comply with the single-shutter extreme close-up rule, avoiding any full-body descriptions."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5ab9ec8aeb95e7a2",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "2df9a8cb9e06ba55",
              "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 prior scenes for this specific close-up framing.",
        "_shot_index": 3,
        "visible_entities": [
          "C12",
          "C07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Following the flow’s shoulder-height position beside the utility pole, the dolly-in resolves into an almost motionless extreme close-up less than a meter from the pair, angled into the woman’s exposed neck and the man’s lower face. Only the teeth, strained jaw, and compressed skin are sharp; the pole and alley lights dissolve into a sickly blur behind them, emphasizing the fixed, predatory contact.",
            "lighting_mood": "Low sodium streetlight and damp blue-black alley shadow make the skin look waxy, with the wound carrying the only hard 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": [
              "C12",
              "C07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C12",
                "outlook_id": "O13"
              },
              {
                "character_id": "C07",
                "outlook_id": "O09"
              }
            ],
            "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": "C07",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "The woman is shown mainly through her neck and partial profile during the bite, making full outlook alignment unreliable."
              }
            ],
            "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": "woman_closed_eyes",
                "element_type": "character_state",
                "character_name": "한국인 여성",
                "description": "The Korean woman's eyes are completely closed. Her face remains still and unresponsive.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "close",
                "source_facts": [
                  "Shot 3: gaze=closed_eyes",
                  "Shot 5: gaze=closed_eyes"
                ],
                "visual_inferences": [
                  "Her facial muscles are relaxed, showing a lack of consciousness."
                ],
                "creative_decisions": [
                  "Keep the closed eyes visually consistent to emphasize her incapacitated state across both the close-up and wide shots."
                ],
                "confidence": "high"
              },
              {
                "element_id": "alley_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dimly lit urban back alley at night. The ground consists of damp, wet asphalt enveloped in deep blue-black shadows and fog. The area is faintly illuminated by sparse streetlights.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Scene text: 도시 뒷골목 / N",
                  "Shot 3: damp blue-black alley shadow, Low sodium streetlight",
                  "Shot 5: wet asphalt, blue-black fog, streetlight"
                ],
                "visual_inferences": [
                  "The wet surface of the asphalt slightly reflects the dim lighting."
                ],
                "creative_decisions": [
                  "Maintain a consistent blue-black and damp atmosphere to preserve the grim and dark mood of 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": "C12O13",
                "policy": "required"
              },
              {
                "kind": "character",
                "id": "C07",
                "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": "bc0a6b29096c332c"
      },
      {
        "scene_index": 2,
        "heading": "S#2. 도시 뒷골목 / N",
        "beat_title": "여자의 죽음과 고요해진 골목",
        "representative_moment": "차가운 아스팔트 바닥에 축 늘어져 죽음을 맞이한 C07의 곁으로 안개가 깔리는 전신 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "ankle-height wide shot, cold greenish streetlight and blue-black fog",
            "t2i_prompt": "Photorealistic cinematic still. Ankle-level low observer perspective looking along the street, showing C07O09 in a dark trench coat, a Korean adult woman, lying motionless and lifeless, sprawled diagonally across the lower half of the frame on the ground. She is in right profile, her eyes completely closed, face still and unresponsive. The scene is a dimly lit urban back alley at night, the broad empty surface of cold, damp, wet asphalt isolating the body and reflecting a thin wash of greenish streetlight in broken patches. In the upper frame, thick, low, and unmoving blue-black fog compresses the alley depth. A stained, damp, and half-obscured utility pole stands in the background, its front-left side facing the camera, while muted red traces pool near the body against the deep blue-black shadows.",
            "outfit_assignments": [
              {
                "character_id": "C07",
                "outlook_id": "O09"
              }
            ],
            "source_facts": [
              "S#2 action: '푹 힘없이 쓰러지는 여자.'",
              "shot description: 차가운 아스팔트 바닥에 축 늘어진 채 미동도 없는 한국인 여성의 전신.",
              "DP notes: observer at ankle height, wide distance, empty wet asphalt around her."
            ],
            "visual_inferences": [
              "fixed_element woman_closed_eyes: C07O09's eyes completely closed, face unmoving.",
              "fixed_element alley_night_environment: damp asphalt, blue-black shadows, dim streetlight.",
              "The low camera angle naturally places the ground and the sprawled body in the lower half of the frame, leaving the foggy alley background in the upper half."
            ],
            "creative_decisions": [
              "Use a wide framing to isolate the subject, making her stillness feel final and grounded.",
              "Emphasize the color contrast between the greenish streetlight on the slick asphalt and the muted red traces near the body."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "700726231ccd5e4d",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "715208d286a9b85c",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 2,
        "dependency_reason": "동일 씬 내 이전 샷(Shot 3)의 뒷골목 배경(전봇대, 젖은 아스팔트, 안개)을 그대로 공유하여 연속성 유지",
        "_shot_index": 5,
        "visible_entities": [
          "L02",
          "C07"
        ],
        "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": "The camera completes the flow’s downward track and settles at ankle height a few meters away, looking along the alley so the Korean woman’s full body lies diagonally across the lower half of the frame. The distance is wider than the bite close-up, leaving empty wet asphalt around her and making her stillness feel final rather than theatrical.",
            "lighting_mood": "A thin wash of greenish streetlight skims the asphalt while the surrounding alley falls into blue-black fog and muted red traces near the 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": [
              "L02",
              "C07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C07",
                "outlook_id": "O09"
              }
            ],
            "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": "woman_closed_eyes",
                "element_type": "character_state",
                "character_name": "한국인 여성",
                "description": "The Korean woman's eyes are completely closed. Her face remains still and unresponsive.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "close",
                "source_facts": [
                  "Shot 3: gaze=closed_eyes",
                  "Shot 5: gaze=closed_eyes"
                ],
                "visual_inferences": [
                  "Her facial muscles are relaxed, showing a lack of consciousness."
                ],
                "creative_decisions": [
                  "Keep the closed eyes visually consistent to emphasize her incapacitated state across both the close-up and wide shots."
                ],
                "confidence": "high"
              },
              {
                "element_id": "alley_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dimly lit urban back alley at night. The ground consists of damp, wet asphalt enveloped in deep blue-black shadows and fog. The area is faintly illuminated by sparse streetlights.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Scene text: 도시 뒷골목 / N",
                  "Shot 3: damp blue-black alley shadow, Low sodium streetlight",
                  "Shot 5: wet asphalt, blue-black fog, streetlight"
                ],
                "visual_inferences": [
                  "The wet surface of the asphalt slightly reflects the dim lighting."
                ],
                "creative_decisions": [
                  "Maintain a consistent blue-black and damp atmosphere to preserve the grim and dark mood of the scene."
                ],
                "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": [],
            "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": "2bde9b005259aa2e"
      },
      {
        "scene_index": 3,
        "heading": "S#3. 현장 / D",
        "beat_title": "뉴스에 보도되는 감식 현장과 혜수의 굳은 얼굴",
        "representative_moment": "형사들의 어깨 너머로, 굳은 표정으로 현장을 지휘하는 C02의 얼굴이 뉴스 화면을 통해 중계된다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye-level frontal medium-close on Hyesu, broadcast image texture, cool muted grays",
            "t2i_prompt": "Photorealistic cinematic still. C02O03 in a dark detective blouson, a Korean middle-aged woman with dark neat hair, stands in the middle-center foreground, framed between detectives. Facing the camera with shoulders locked forward, she maintains a sharp facial impression, her eyes fixed off-screen just past the lens, fully alive and observant. A Korean adult man in a police forensic vest acts as a cropped, out-of-focus barrier at the frame edge, seen from an over-the-shoulder angle with his side and back plane facing the lens, leaning into the evidence and looking down. [: The immediate surroundings feature a highly defocused forensic scene, the daylight flattened by coastal haze and broadcast compression, with muted grays and hard police-line yellow tape cutting across, all overlaid with a faint, cool-toned digital broadcast texture.]",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S#3 action: '형사무리 속에 사건을 지휘하는 혜수의 모습이 보인다.'",
              "shot description: '형사들 틈에서 날카로운 눈빛으로 감식 현장을 응시하는 혜수의 굳은 얼굴 정면.'",
              "C02 state: facing the camera, shoulders locked forward, gaze=off_screen, state=alive",
              "C11 state: over_shoulder, leaning into evidence, gaze=down"
            ],
            "visual_inferences": [
              "C11 is described generically using a common noun as per generic_descriptor_allowed policy",
              "foreground detectives act as visual barriers focusing attention on the primary subject",
              "daylight is flattened to simulate a live news feed"
            ],
            "creative_decisions": [
              "implemented close framing by placing the generic detective in soft focus at the frame edge",
              "applied a faint digital broadcast texture to capture the 'through_device' observational feel without rendering physical TV borders"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d1058bb23e9fd54d",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "403c0849c477bb12",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "동일한 사건 현장(금월도 야산 및 골목길)의 시공간적 연속성",
        "_shot_index": 3,
        "visible_entities": [
          "C02",
          "C11"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 3,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Within the news-report visual logic, the camera holds an eye-level frontal medium-close on 혜수 from just inside the detective cluster, tighter than the flow default so her face dominates while shoulders and coat edges of detectives cut the foreground. She is centered with rigid control, but her eyes look just past the lens toward the forensic work beyond the camera, making the broadcast image feel observational rather than confessional.",
            "lighting_mood": "Daylight is flattened by broadcast compression and coastal haze, with muted grays and police-line yellow reduced to hard, anxious 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": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "Hyesu framed between detectives",
                  "screen_zone": "middle_center",
                  "target_id": "C02",
                  "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": [
              "C02",
              "C11"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C11",
                "outlook_id": "O12"
              }
            ],
            "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": [
              {
                "subject_id": "C11",
                "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": 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": 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": "C02O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "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": "0238b6df9df211fb"
      },
      {
        "scene_index": 4,
        "heading": "S#4. 옥탑방 / D",
        "beat_title": "불안한 전경",
        "representative_moment": "황금빛 노을이 지는 인천 변두리, 낡은 옥탑방의 쓸쓸한 외부 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide medium-long exterior vantage, dense golden dusk backlight",
            "t2i_prompt": "Photorealistic cinematic still. From a medium-long exterior vantage held slightly above the worn roofline, the damp building mass occupies the lower half of the frame. In the upper-middle frame against a heavy, hazy sunset sky sits a lonely rooftop room. A faded parapet wall, a clothesline, and a water tank rest on the dim roof deck. A dense golden dusk backlight silhouettes the edges of the rooftop room, while the lower facade falls into muted coastal gray and brown. The distant outskirts skyline is flattened by thick fog, focusing entirely on the isolated architectural structure.",
            "outfit_assignments": [],
            "source_facts": [
              "scene_text: '인천 변두리 부감, 오래된 빌라 옥탑방 전경.'",
              "shot_extract description: '황금빛 짙은 노을이 내려앉은 인천 변두리, 낡은 다세대 빌라 꼭대기에 자리 잡은 옥탑방의 쓸쓸한 외부 전경.'"
            ],
            "visual_inferences": [
              "No characters are present; the scene is purely an architectural establishing shot.",
              "The fog and hazy sky compress the distant view, emphasizing the isolation of the rooftop."
            ],
            "creative_decisions": [
              "Framing places the main building mass at the bottom half to anchor the structure, leaving the rooftop room visually isolated against the upper-middle sky.",
              "Applied a dense golden backlight to contrast sharply against the muted coastal gray concrete, creating a moody, tense atmosphere."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "clothesline",
                "usage_kind": "anchor",
                "source_phrase": "a clothesline"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drying platform",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "parapet wall",
                "usage_kind": "anchor",
                "source_phrase": "A faded parapet wall"
              },
              {
                "owned_token": "post",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "roof deck",
                "usage_kind": "anchor",
                "source_phrase": "rest on the dim roof deck"
              },
              {
                "owned_token": "rooftop room",
                "usage_kind": "anchor",
                "source_phrase": "a lonely rooftop room"
              },
              {
                "owned_token": "stairhead landing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "water tank",
                "usage_kind": "anchor",
                "source_phrase": "a water tank"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1e69c69866f69284",
              "owned_hash": "0ed61e4dfb9b231a",
              "camera_direction_hash": "8372330a7ae78a7b",
              "owned_usage_hash": "550399b1721cc255",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "clothesline",
                  "violating_phrase": "a clothesline",
                  "reason": "The clothesline is mentioned as an existing element resting on the roof deck to establish context, matching the producer's anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "parapet wall",
                  "violating_phrase": "A faded parapet wall",
                  "reason": "The parapet wall is described as an existing structure on the roof deck, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "roof deck",
                  "violating_phrase": "rest on the dim roof deck",
                  "reason": "The roof deck is used as a spatial reference for positioning other elements, consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rooftop room",
                  "violating_phrase": "sits a lonely rooftop room",
                  "reason": "The rooftop room is referenced to set the scene's composition and lighting layout, confirming the producer's anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "water tank",
                  "violating_phrase": "a water tank",
                  "reason": "The water tank is mentioned as resting on the roof deck to anchor the setting, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "L03"
        ],
        "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 the flow’s medium-long exterior vantage, the camera holds slightly above and across from the worn villa roofline, keeping the rooftop room in the upper-middle of the frame against the sunset sky. No people are present; the building mass occupies the lower half while the lonely rooftop structure sits exposed, small but unmistakable, as fog and dusk flatten the surrounding outskirts.",
            "lighting_mood": "A dense golden dusk backlight silhouettes the rooftop edges while damp concrete falls into muted coastal gray and brown.",
            "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": [
              "L03"
            ],
            "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": "L03B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "clothesline",
              "door",
              "drying platform",
              "parapet wall",
              "post",
              "roof deck",
              "rooftop room",
              "stairhead landing",
              "water tank",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "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": "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": "3d66ad4457366966"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "투정 부리는 수리영",
        "representative_moment": "약초 물을 마시고 인상을 찌푸리는 C01",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing, slightly low observer angle from the tabletop, shallow depth of field with a beige-gray and faint herbal green tone",
            "t2i_prompt": "Photorealistic cinematic still. Observer view from just across the table, angled slightly up from the horizontal near edge of the tabletop at the bottom of the frame. C01O01 in a casual top, a Korean young woman in her early 20s, at three-quarter angle from the left, her face occupying the center-right of the frame with a sharply pinched expression, looking down. A cup is pressed to her lips in the lower center. [L##: The lived-in small kitchen area behind her is compressed into a warm domestic blur, damp from steam, cabinet fronts angling away in shallow focus.] The space is bathed in thin daylight from an off-screen dusty window, mixing with the steam to establish a calm, muted beige-gray tone with a faint herbal green cast.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Suriyeong drinks the herbal water and reacts with a pinched expression.",
              "Thin daylight mixes with warm kitchen steam, muting the palette into beige-gray."
            ],
            "visual_inferences": [
              "fixed_element rooftop_apartment_atmosphere: warm, muted beige and gray color palette.",
              "Camera positioned near the table angled up to capture the cup at her lips and her grimace in a tight composition."
            ],
            "creative_decisions": [
              "Rendered the background as a warm domestic blur to strictly follow the close framing rule and emphasize her facial reaction.",
              "Used a faint herbal green cast in the lighting to reflect the herbal medicine's presence without showing the herbs directly.",
              "Replaced the background ID L04 with L## as requested to ensure it acts as a generic edge-surface blur."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "TV stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bathroom door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bedroom door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tea cup",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5f73bf84bda3dd6b",
              "owned_hash": "ea8725301d968314",
              "camera_direction_hash": "5210a0463f0d2ba9",
              "owned_usage_hash": "74ed527e4e3a8b6d",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 8,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Maintaining the flow’s seated-height table position, the camera sits just across from 수리영 about three feet away and slightly below her eyeline, angled up from the tabletop so the cup at her lips and her pinched expression share the frame. The shot is tighter than the stage default: her face occupies the center-right, the cup sits in the lower center, and the kitchen background compresses into warm domestic blur.",
            "lighting_mood": "Thin daylight from the small window mixes with warm kitchen steam, muting the palette into beige-gray domestic calm with a faint herbal green cast.",
            "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": "L04B01",
            "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": "rooftop_apartment_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the small rooftop apartment maintains a consistent warm, muted beige and gray color palette. It is softly illuminated by thin natural daylight filtering in, creating a calm and slightly shadowed domestic atmosphere that unifies different areas such as the kitchen and the entrance.",
                "applies_to_shots": [
                  8,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "Thin daylight from the small window mixes with warm kitchen steam",
                  "muting the palette into beige-gray domestic calm",
                  "Soft entrance daylight is warm and ordinary",
                  "shadowed domestic beige"
                ],
                "visual_inferences": [
                  "The kitchen and entrance share the same overarching lighting setup and muted color scheme characteristic of the small rooftop apartment."
                ],
                "creative_decisions": [
                  "Using consistent beige-gray tones and soft daylight to establish a cozy, intimate, yet slightly melancholic domestic 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"
              }
            ],
            "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": "5fcca114c30657f3"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "손목 표식을 발견하는 수리영",
        "representative_moment": "수리영이 신발을 신으며 민숙(C04)의 손목에 새겨진 붉은 원형 표식(P12)을 힐끗 본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "macro close-up with shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. In the middle-center foreground, the marked inner wrist of C04 in a beige knitwear, a Korean middle-aged woman, is positioned at wrist height in a macro close-up. On the camera-facing skin surface of the inner wrist, a small, vivid red circular mark, P12, is sharply focused. C04 stands with her wrist angled inward, looking away off-screen, though only her lower forearm and wrist are fully visible in the frame. Soft, warm entrance daylight gently illuminates the skin. P12 catches a sharper red accent against the muted, shadowed domestic beige tones. Behind the wrist, the background collapses into soft, out-of-focus creamy shapes. The inner side frame of an open doorway faces the camera obliquely, and indistinct shoe profiles blur into the lower background at the threshold.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "S#5 action: '민숙 손목에 보이는 작은 원(이하 표식)을 본다.'",
              "shot description: macro close-up focusing entirely on the red circular mark on the inner wrist"
            ],
            "visual_inferences": [
              "fixed_element rooftop_apartment_atmosphere: warm, muted beige and gray color palette, soft entrance daylight",
              "The background is deliberately heavily defocused (creamy shapes, blurred doorway and shoes) to maintain the macro scale and isolation of the wrist"
            ],
            "creative_decisions": [
              "Using shallow depth of field to isolate the wrist and P12, drawing all visual attention to the symbolic mark",
              "Contrasting the sharp red of P12 against the soft, warm domestic beige tones of the skin and blurred background"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "TV stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bathroom door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bedroom door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tea cup",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6aef0fda5a593eb8",
              "owned_hash": "ea8725301d968314",
              "camera_direction_hash": "92f3b2c85662e97c",
              "owned_usage_hash": "74ed527e4e3a8b6d",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 11,
        "visible_entities": [
          "C04",
          "P12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the reveal flow, the camera is within a foot of 민숙’s inner wrist at wrist height, slightly below the forearm so the small red circular mark sits crisp near the middle of the frame. The macro depth of field lets only the inner wrist and mark hold focus, while the entrance behind collapses into creamy shapes of doorway and shoes without turning the shot into an abstract insert.",
            "lighting_mood": "Soft entrance daylight is warm and ordinary, but the mark catches a sharper red accent against muted skin tones and shadowed domestic beige.",
            "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": "Minsuk's marked inner wrist",
                  "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",
              "P12"
            ],
            "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": 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": [
              {
                "subject_id": "C04",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "Only Minsuk's wrist and symbolic mark are visible in macro close-up, so a full outlook-specific identity reference would likely mislead the image generation."
              }
            ],
            "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": "L04B01",
            "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": "rooftop_apartment_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the small rooftop apartment maintains a consistent warm, muted beige and gray color palette. It is softly illuminated by thin natural daylight filtering in, creating a calm and slightly shadowed domestic atmosphere that unifies different areas such as the kitchen and the entrance.",
                "applies_to_shots": [
                  8,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "Thin daylight from the small window mixes with warm kitchen steam",
                  "muting the palette into beige-gray domestic calm",
                  "Soft entrance daylight is warm and ordinary",
                  "shadowed domestic beige"
                ],
                "visual_inferences": [
                  "The kitchen and entrance share the same overarching lighting setup and muted color scheme characteristic of the small rooftop apartment."
                ],
                "creative_decisions": [
                  "Using consistent beige-gray tones and soft daylight to establish a cozy, intimate, yet slightly melancholic domestic setting."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "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",
                "id": "C04",
                "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": "ead89532ec9a144a"
      },
      {
        "scene_index": 6,
        "heading": "S#6. 해안가 도로 / D",
        "beat_title": "해안가 도로를 달리는 수리영",
        "representative_moment": "C01이 자전거를 타고 해무가 깔린 해안가 도로를 활기차게 달리고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide side-tracking shot at full-body distance, approximately 1.2 meters high, capturing the lateral movement",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a Korean young woman with an early 20s face, dark long hair, clear facial features, and natural complexion and hair, appears in the middle-center midground, moving toward the right side of the coastal road. She is seen in right profile, gazing off-screen, seated on the saddle of the bicycle in mid-pedal with one knee bent driving the pedal downward, her dark long hair flowing back in the direction opposite to motion. Her hands firmly grip the handlebar, with the bicycle frame and both wheels fully visible below her against the dry center of the road. Daylight is diffused through thick, low-drifting sea fog, washing the misty tidal flats in the background in pale, muted blue-gray coastal tones. Soft gold rim light catches the edges of her hair and the metallic parts of the bicycle, while the damp edges of the coastal road slide behind her in a steady lateral blur.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#6 action: 수리영 자전거를 타고 해안가 도로를 달린다.",
              "shot description: 짙은 해무가 깔린 갯벌 옆 도로, 자전거 핸들을 꽉 쥐고 한쪽 페달을 힘껏 밟아 내리는 역동적인 자세의 수리영 전신"
            ],
            "visual_inferences": [
              "mid-pedal action frozen in time with hair flowing backward opposite to motion",
              "wide side-tracking perspective maintaining full-body visibility and lateral scale reference"
            ],
            "creative_decisions": [
              "heavy sea fog to create muted blue-gray tones, accented with soft gold lighting on the hair and bicycle edges for contrast",
              "horizontal coastal road acting as a lateral tracking line in 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": "ebd342dcc1a64007",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "a85d067ff241e22f",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "None",
        "_shot_index": 1,
        "visible_entities": [
          "L06",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 6,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inheriting the side-tracking flow, the camera runs parallel to 수리영 at full-body distance, about 1.2 meters high and four meters off the bicycle, keeping her entire body, handlebar, and downward pedal stroke visible. She travels left to right through the middle of the frame, one foot driving the pedal down as foggy tidal flats and the coastal road slide behind her in a steady lateral blur.",
            "lighting_mood": "Daylight is diffused through heavy sea fog into muted blue-gray coastal tones, with only soft gold on her hair and bicycle edges.",
            "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": "right side of coastal road",
                  "label": "Suriyoung riding bicycle left to right",
                  "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": [
              "L06",
              "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": [],
            "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": "7d5d74affcda7e12"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "맹견을 제압하는 수리영의 시선",
        "representative_moment": "수리영(C01)이 미간을 찌푸린 채 강렬한 시선으로 정면을 응시하며 맹견을 진정시킨다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Subjective POV from the dog's eyeline, rigid frontal close-up with flat cool daylight",
            "t2i_prompt": "Photorealistic cinematic still. Suriyoung's confrontational stare dominates the middle-center foreground. C01O01 in a casual jacket, a Korean young woman with an early 20s face, dark long hair, clear facial features, and a natural complexion, faces the camera directly. Her chin is thrust forward, brow hard, eyes fixed intently on the lens. The camera is positioned at eye level for a subjective POV, capturing a rigid frontal close-up where only her face and the tops of her shoulders are visible. A small, hard highlight catches in her eyes against the flattened space. The background consists of vague, soft-focus metallic cage lines and muted gray-green kennel geometry at the frame edges, lit by cool shelter daylight and dull fluorescent fill that emphasize the damp, functional texture of the dim space behind her.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "맹견의 눈을 노려보는 수리영. 금방이라도 물어버릴 거 같던 맹견의 기세가 수그러드는데",
              "The camera sits about one meter from 수리영 at eye level, centered on her face",
              "Her brow is hard in the middle of the frame, shoulders barely visible below",
              "Cool shelter daylight and dull fluorescent fill... muted gray-green kennel tones"
            ],
            "visual_inferences": [
              "Subjective dog POV requires her eyes to look directly into the camera lens with intense focus",
              "Close framing necessitates a highly blurred, out-of-focus background where the shelter is only suggested by abstract cage lines"
            ],
            "creative_decisions": [
              "Emphasized a sharp specular highlight in her eyes to contrast with the dull, flat lighting of the shelter, heightening the psychological intensity of the stare",
              "Omitted background clutter to keep the compositional weight entirely on her facial expression"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e5b45e54f0a891c3",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "823dd11a0b3c3705",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 2,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "This shot takes the flow’s rigid frontal close-up but treats it as the dog’s direct eyeline: the camera sits about one meter from 수리영 at eye level, centered on her face while the kennel remains just off camera. Her brow is hard in the middle of the frame, shoulders barely visible below, and the background is stripped down to vague cage lines so the stare lands like a silent command.",
            "lighting_mood": "Cool shelter daylight and dull fluorescent fill flatten the space, while her eyes catch a small hard highlight against the muted gray-green kennel 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": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "Suriyoung's confrontational stare",
                  "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": "shelter_kennel_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The background consists of an indoor animal shelter featuring visible metallic cage lines and kennel geometry. The space is illuminated by a combination of cool daylight and dull fluorescent fill lights, which cast muted gray-green tones across the area. The overall texture of the facility feels slightly damp and purely functional.",
                "applies_to_shots": [
                  2,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "vague cage lines",
                  "muted gray-green kennel tones",
                  "Cool shelter daylight and dull fluorescent fill",
                  "kennel aisle and cage geometry",
                  "damp shelter texture",
                  "Cold kennel daylight"
                ],
                "visual_inferences": [
                  "The cages are metallic and arranged in rows forming an aisle"
                ],
                "creative_decisions": [
                  "The gray-green tones and cold lighting are emphasized to create a slightly bleak but realistic institutional atmosphere"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "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": "2ae321d4eef90c72"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "초조한 수리영의 통화 시도",
        "representative_moment": "스마트폰을 귀에 댄 채 초조하게 입술을 깨물고 있는 C01의 얼굴을 프레임 가득 담은 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight three-quarter close-up, eye level just forward of the phone side, shallow depth of field with muted gray-green tones",
            "t2i_prompt": "Photorealistic cinematic still. A neutral observer is positioned at eye level just forward of the phone side. C01O01 in a casual jacket, a Korean young woman with an early 20s face, dark long hair, clear facial features, and a natural complexion, is positioned at three-quarter angle from the right, her face occupying most of the frame. She presses the dark back and side edge of a smartphone tight to her ear, the device sitting along the left frame edge. She is looking off-screen, her gently bitten lower lip anchoring the center of the image. The scene is lit by cold kennel daylight muted by damp gray-green tones, casting a faint gold edge on her cheek and a restrained red rawness in her bitten lip. Only a soft out-of-focus background is visible behind her. [: A narrow strip of damp shelter texture, featuring softly blurred metallic cage lines of a kennel aisle receding obliquely under dull fluorescent fill.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영이 민숙에게 연락을 취해보지만 받지 않는다",
              "귀에 스마트폰을 바짝 댄 채 입술을 지그시 깨무는 수리영의 초조한 얼굴"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: face occupies most of the frame in a tight shot",
              "background cages are heavily out of focus to emphasize the internal anxiety without distracting from her expression"
            ],
            "creative_decisions": [
              "positioned the smartphone explicitly along the left frame edge to balance the composition",
              "added a faint gold edge on the cheek to contrast with the cold, muted gray-green kennel tones"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "0465d1f3091109d6",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9a84bfd97cd89d32",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 7,
        "dependency_reason": "동일한 유기견 보호원 내부 (아웃포커싱된 배경 톤과 조명 환경 유지)",
        "_shot_index": 6,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A neutral observer remains in the flow’s tight three-quarter close-up, eye level just forward of 수리영’s phone side, dollying the last few centimeters so her smartphone sits along the left edge while her bitten lower lip becomes the emotional anchor near center. The kennel aisle and cage geometry stay soft behind her, with her face occupying most of the frame and only a narrow strip of damp shelter texture visible.",
            "lighting_mood": "Cold kennel daylight is muted by damp gray-green tones, with a faint gold edge on her cheek and a restrained red rawness in her bitten lip.",
            "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": "shelter_kennel_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The background consists of an indoor animal shelter featuring visible metallic cage lines and kennel geometry. The space is illuminated by a combination of cool daylight and dull fluorescent fill lights, which cast muted gray-green tones across the area. The overall texture of the facility feels slightly damp and purely functional.",
                "applies_to_shots": [
                  2,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "vague cage lines",
                  "muted gray-green kennel tones",
                  "Cool shelter daylight and dull fluorescent fill",
                  "kennel aisle and cage geometry",
                  "damp shelter texture",
                  "Cold kennel daylight"
                ],
                "visual_inferences": [
                  "The cages are metallic and arranged in rows forming an aisle"
                ],
                "creative_decisions": [
                  "The gray-green tones and cold lighting are emphasized to create a slightly bleak but realistic institutional atmosphere"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 7,
                "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": "e05821c568942461"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "사라진 엄마와 엇갈린 단서",
        "representative_moment": "마트 진열대 사이에서 고개를 돌려 시선을 고정하는 C01의 얼굴.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing, observer eye-level, shallow depth of field, cool fluorescence with amber dusk",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in casual cycling clothing, a Korean young woman with an early 20s face, dark long hair, and natural complexion, positioned tight in the center-right of the close frame. She appears in left profile, her head turned sharply, her eyes fixed off-screen. Her head and shoulders occupy the foreground. [L09: An eye-level supermarket aisle bounded by high grocery shelves that form hard vertical borders on the left and right frame edges. Rows of product package fronts face the aisle in partial blur, their labels unreadable but forming oppressive color blocks behind her. Cool overhead fluorescent light spill flattens the aisle space, polluted by a faint amber dusk filtering from the aisle end, leaving her face pale against muted coastal blues and sickly greens.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영의 얼굴 (Shot 3)",
              "능숙하게 자전거를 모는 수리영 (Scene text)"
            ],
            "visual_inferences": [
              "Her hairstyle and upper-body clothing remain unchanged as she moves from the exterior into the supermarket interior.",
              "The tall shelves act as strong vertical elements squeezing her face into the frame."
            ],
            "creative_decisions": [
              "Positioned the face tight in the center-right to emphasize the claustrophobic framing of the grocery shelves.",
              "Contrasted the cool supermarket fluorescence with the warm amber dusk to reflect narrative tension and match the DP's color instructions."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "food stall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "neon sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "roadway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sidewalk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storefront",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "taxi",
                "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": "3d493d360aabf48d",
              "owned_hash": "8d796ce5f825497c",
              "camera_direction_hash": "6bd43c7ed876bf4f",
              "owned_usage_hash": "ee9c211256afe63e",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "L09",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera inherits the aisle-end dolly-in and lands at eye level between tall shelves, with 수리영’s turned face held tight in the center-right while both shelf walls remain as hard vertical borders on the frame edges. A neutral observer watches her freeze on an unseen point beyond the aisle, using shallow depth of field so the stacked goods become oppressive color blocks rather than readable comfort.",
            "lighting_mood": "Cool supermarket fluorescence is polluted by the last amber dusk filtering from the aisle end, leaving her face pale against muted coastal blues and sickly greens.",
            "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": [
              "L09",
              "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": "L08B01",
            "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_facial_appearance",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A young Korean female teenager with consistent facial features and hairstyle. She wears casual, practical clothing suitable for cycling, though primarily her head and shoulders are visible. Her facial identity and overall upper-body styling remain identical across these closely framed shots.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "element_scope": "close",
                "source_facts": [
                  "능숙하게 자전거를 모는 수리영 (Scene text)",
                  "수리영의 얼굴 (Shot 3)",
                  "미간을 찌푸린 수리영의 굳은 얼굴 (Shot 6)"
                ],
                "visual_inferences": [
                  "Her hairstyle and upper-body clothing remain unchanged as she moves from the supermarket interior to the exterior street."
                ],
                "creative_decisions": [
                  "Focused the visual continuity strictly on her facial identity and upper-body attire since both shots frame her relatively tight."
                ],
                "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": "325e377eccd837c8"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "연락이 닿지 않는 엄마",
        "representative_moment": "어스름이 깔린 마트 밖 거리, 스마트폰을 귀에 댄 채 미간을 찌푸린 수리영.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing at eye level, blue dusk lighting with cold shadows and red/gold neon accents.",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual cycling jacket, a young Korean female teenager with dark long hair, positioned just left of center at three-quarter angle from the left. She is gazing down with a furrowed brow, a palm-sized modern black rectangular smartphone, P06, pressed to her ear. Observer holds static at eye level framed closely on her head and shoulders, focusing on the tension between her eyes. [L08: dim reflective market storefront glass immediately behind her, faintly showing the dark shop interior beyond while reflecting blurred taxi headlamps and lit neon sign faces angled toward the street, passing vehicle sides sliding laterally in the soft background]. Blue dusk and damp reflections wrap the face and shoulders in cold shadow, cut by faint red and gold neon accents.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#8 action: 수리영 마트 밖을 나오면서 연락을 취해보지만 받지않는다.",
              "Shot description: 어스름이 깔린 마트 밖 거리, 귀에 스마트폰을 댄 채 미간을 찌푸린 수리영의 굳은 얼굴."
            ],
            "visual_inferences": [
              "fixed_element suriyeong_facial_appearance: A young Korean female teenager with consistent facial features and hairstyle, wearing casual practical clothing suitable for cycling.",
              "Her head and shoulders dominate the close framing, consistent with the tight eye-level observer perspective.",
              "The background is rendered soft and out-of-focus to maintain emphasis on the phone call and her furrowed brow."
            ],
            "creative_decisions": [
              "Placed C01O01 just left of center to allow the reflective storefront glass to convey the darkening street atmosphere behind her stillness.",
              "Incorporated blue dusk lighting with contrasting red and gold neon accents to heighten the urban unease.",
              "Excluded explicit distance measurements like 'one meter' in favor of proportional relationship descriptions ('framed closely on her head and shoulders')."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "food stall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "neon sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "roadway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sidewalk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storefront",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "taxi",
                "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": "0e4900cb04267217",
              "owned_hash": "8d796ce5f825497c",
              "camera_direction_hash": "3c28f31b20e37b94",
              "owned_usage_hash": "ee9c211256afe63e",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "Continuity with prior shot in the same scene (S8 Shot 3), maintaining C01's facial appearance and casual cycling clothing.",
        "_shot_index": 6,
        "visible_entities": [
          "L08",
          "C01",
          "P06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Outside the market, the camera holds static at eye level about one meter from 수리영, slightly tighter than the stage default so her furrowed brow and the phone pressed to her ear read together. She is placed just left of center against dim storefront glass and passing traffic streaks, the lens tipped a touch upward to catch the tension between her eyes and the darkening street behind her.",
            "lighting_mood": "Blue dusk and damp storefront reflections wrap her in cold shadow, cut by small red and gold neon accents across 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": [
              "L08",
              "C01",
              "P06"
            ],
            "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": "L08B01",
            "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_facial_appearance",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A young Korean female teenager with consistent facial features and hairstyle. She wears casual, practical clothing suitable for cycling, though primarily her head and shoulders are visible. Her facial identity and overall upper-body styling remain identical across these closely framed shots.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "element_scope": "close",
                "source_facts": [
                  "능숙하게 자전거를 모는 수리영 (Scene text)",
                  "수리영의 얼굴 (Shot 3)",
                  "미간을 찌푸린 수리영의 굳은 얼굴 (Shot 6)"
                ],
                "visual_inferences": [
                  "Her hairstyle and upper-body clothing remain unchanged as she moves from the supermarket interior to the exterior street."
                ],
                "creative_decisions": [
                  "Focused the visual continuity strictly on her facial identity and upper-body attire since both shots frame her relatively tight."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "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": "1a87c9f9c583b1fe"
      },
      {
        "scene_index": 9,
        "heading": "S#9. 해안가 / N",
        "beat_title": "수리영의 다급한 야간 질주",
        "representative_moment": "안개 낀 밤, C01이 자전거를 타고 가로등 불빛 아래 해안도로를 다급하게 달리는 정지된 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "low roadside tracking wide shot with deep blue-black fog and hard backlight",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual outfit, a Korean young woman in her early 20s, is positioned on a bicycle in the middle-center midground, moving toward a darker stretch of coastal road. Captured from a low observer at ground level, the bicycle's frame and wheels cross the lower frame, her upper body bent over the handlebars in right profile. She is suspended in mid-pedal with one foot driving down, her dark long hair and wind-pulled clothing stretched backward toward the left edge in the direction opposite to motion. Her eyes gaze into the distance. A hard gold-white streetlamp pool from above casts a bright backlight, carving her backlit body volume out of the thick deep blue-black fog, with rim light tracing her clear facial features and natural complexion. The damp asphalt of the coastal road lane stretches diagonally into the dark fog, swallowing the ambient color and leaving only a wet rim of light.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#9 action: 수리영 riding a bicycle frantically along the coastal road toward home",
              "shot description: 수리영 bent over the handlebars, mid-pedal under a streetlight in thick fog"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: bent over handlebars in right profile, suspended in mid-pedal",
              "low observer angle to capture both the moving bicycle frame and the full body silhouette",
              "motion direction expressed through stretched clothing and backward-flowing hair"
            ],
            "creative_decisions": [
              "hard gold-white streetlamp backlight to emphasize the suspended motion and carve a sharp silhouette",
              "deep blue-black fog to add atmospheric tension and swallow the surrounding road"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "3dbbd8e0a3ac5391",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "286ea2842273a133",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 6,
        "dependency_reason": "Location continuity with S6_Shot1 (same coastal road setting, maintaining consistent atmosphere).",
        "_shot_index": 1,
        "visible_entities": [
          "L06",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 9,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera tracks parallel at a low roadside height, freezing the strongest instant as 수리영 passes directly beneath the streetlight: her bicycle and body cut a sharp side silhouette across the middle of the frame, one foot driving the pedal down. The coastal road opens behind her into fog, while her wind-pulled clothing stretches backward toward the left edge, making the acceleration legible in a suspended moment.",
            "lighting_mood": "A hard gold-white streetlamp backlight carves her out of deep blue-black fog, with damp asphalt swallowing nearly all color except the rim of 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": "midground",
                  "gesture_action": "moves_toward",
                  "gesture_target_label": "darker stretch of coastal road",
                  "label": "수리영 riding bicycle",
                  "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": [
              "L06",
              "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": [],
            "previous_shot_refs": [
              {
                "scene_index": 6,
                "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": "69faab850df683e7"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "문턱에 멈춰선 그림자",
        "representative_moment": "달빛 아래 옥탑방 철문 현관 밑으로 길고 새카맣게 늘어진 남자의 기괴한 그림자.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Very low observer position focused on the floor, stark shadows with cold silver-gray and blue-black moonlight palette",
            "t2i_prompt": "Photorealistic cinematic still. From a very low observer position resting nearly on the cold silver-gray cement floor, a dense, elongated black shadow of a Korean adult male figure extends across the gritty surface toward the bottom of the frame. Near the upper edge of the frame, the dark shoes and lower legs of the man stand halted at the threshold of the weathered iron door, facing away from the camera. The exterior environment is bathed in hard, cold blue-black moonlight, illuminating the rooftop deck near the edge of the deep shadow, highlighting the existing dried leaves resting on its surface.",
            "outfit_assignments": [],
            "source_facts": [
              "달빛 아래 옥탑방 철문 현관 밑으로 길고 새카맣게 늘어진 남자의 기괴한 그림자.",
              "신발은 옥탑방 철문 현관 앞에 멈춰 선다.",
              "DP directive: From a very low neutral observer position nearly on the cement... shoes near the top edge, and the long black shape crawling toward the camera announce his presence."
            ],
            "visual_inferences": [
              "fixed_element intruder_obscured_state: The male intruder's physical form is reduced to a shadow and shoes, face unseen.",
              "fixed_element exterior_moonlight_environment: cold blue-black color palette, hard moonlight casting sharp deep shadows.",
              "Camera is angled slightly downward toward the floor, placing the door threshold and shoes at the upper frame edge to emphasize the shadow stretching downward."
            ],
            "creative_decisions": [
              "Using the shadow as the primary visual subject to build dread, keeping the physical intruder mostly out of frame.",
              "Applying a stark contrast between the cold moonlight on the cement and the pitch-black shadow."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "clothesline",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "threshold of the weathered iron door"
              },
              {
                "owned_token": "drying platform",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flyer",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "leaf",
                "usage_kind": "anchor",
                "source_phrase": "highlighting the existing dried leaves resting on its surface"
              },
              {
                "owned_token": "parapet wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "roof deck",
                "usage_kind": "anchor",
                "source_phrase": "illuminating the rooftop deck"
              },
              {
                "owned_token": "rooftop room",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "water tank",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "0d0791e3e0fd0f68",
              "owned_hash": "1100adfa501b5f7a",
              "camera_direction_hash": "6c19debaa2cb573f",
              "owned_usage_hash": "c334b75857ed0813",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "threshold of the weathered iron door",
                  "reason": "The prompt refers to the door as a spatial marker for the character's position, aligning with the producer's declaration as a non-redraw anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "leaf",
                  "violating_phrase": "highlighting the existing dried leaves resting on its surface",
                  "reason": "The prompt specifies 'existing dried leaves', indicating they are present in the background and only illuminated, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "roof deck",
                  "violating_phrase": "illuminating the rooftop deck",
                  "reason": "The prompt references the rooftop deck as an environmental surface receiving moonlight, which is an anchor reference rather than a redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "S4_Shot1의 옥탑방 외부(exact_background) 공간 구조와 동일한 장소에서 달빛 아래 환경을 유지.",
        "_shot_index": 3,
        "visible_entities": [
          "L03",
          "C10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "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 a very low neutral observer position nearly on the cement, the camera reaches the end of its dolly-in two meters from the iron door and holds wider than expected, letting the lower door slab and the full stretched shadow occupy the floor plane. The man’s face remains completely unseen; only the threshold, shoes near the top edge, and the long black shape crawling toward the camera announce his presence.",
            "lighting_mood": "Hard moonlight turns the rooftop into cold silver-gray cement, with the intruder’s shadow rendered as a dense black slash under the door.",
            "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": [
              "L03",
              "C10"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C10",
                "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": [
              {
                "subject_id": "C10",
                "policy_type": "identity_reference",
                "policy": "generic_descriptor_allowed",
                "reason": "Only the man’s shoes and cast shadow are visible; facial or outlook identity details should not be required for this shot."
              }
            ],
            "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": "L03B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "clothesline",
              "door",
              "drying platform",
              "flyer",
              "leaf",
              "parapet wall",
              "roof deck",
              "rooftop room",
              "water tank",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "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": "intruder_obscured_state",
                "element_type": "character_state",
                "character_name": "남자",
                "description": "The male intruder's facial features, clothing details, and physical textures are completely obscured by darkness. He is consistently rendered as a dense, dark silhouette or shadowy mass, keeping his identity entirely hidden.",
                "applies_to_shots": [
                  3,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "남자의 긴 그림자. (얼굴은 보이지 않는다)",
                  "The man's face remains completely unseen",
                  "거대한 체구가... 섬뜩한 실루엣",
                  "huge male silhouette"
                ],
                "visual_inferences": [
                  "Regardless of his changing posture, the attacker's physical form is intentionally reduced to a pure shadow to maintain a mysterious and threatening presence."
                ],
                "creative_decisions": [
                  "Using sheer silhouette rather than direct lighting on the subject to convey a sense of dread and anonymity."
                ],
                "confidence": "high"
              },
              {
                "element_id": "exterior_moonlight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior environment is bathed in a cold, hard moonlight that dominates the nighttime setting. This lighting creates a stark silver-gray and cold blue-black color palette, casting sharp and deep shadows across the outdoor spaces.",
                "applies_to_shots": [
                  3,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "달빛 아래",
                  "Hard moonlight turns the rooftop into cold silver-gray cement",
                  "exterior remains cold blue-black"
                ],
                "visual_inferences": [
                  "The consistent cold moonlight acts as the primary ambient light for the exterior, emphasizing the chill and isolation of the late night."
                ],
                "creative_decisions": [
                  "Contrasting the cold, unfeeling exterior lighting with the violent actions to heighten the thriller atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "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": "L03B03",
                "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": "7abd1ada8cab50e5"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "창문에 비친 기괴한 습격의 실루엣",
        "representative_moment": "A huge male shadow presses down on a crouched female silhouette behind the thin curtain of the rooftop window.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye-level voyeur shot, squared framing, high-contrast amber vs cold blue-black lighting",
            "t2i_prompt": "Photorealistic cinematic still. A huge Korean adult man silhouette above occupies the middle-center background, pressing over a Korean middle-aged woman crouched silhouette below in the lower-center background. The camera holds a locked eye-level voyeur position directly outside the window, squared to the closed, slightly smudged window glass. The figures appear as flat, dense shadow shapes projected onto a thin closed curtain behind the glass. The man silhouette, positioned facing away from the camera with his gaze fixed on the woman, forces his weight down, his facial features and clothing textures completely obscured by darkness. The woman silhouette, turned in right profile and looking down, cowers in a severely injured state beneath his dominant form. Weak interior amber backlight pushes the dark figures against the fabric. The exterior environment is bathed in cold blue-black moonlight, casting sharp silver-gray shadows across the weathered window frame.",
            "outfit_assignments": [],
            "source_facts": [
              "창문에 비친 그림자",
              "민숙을 덮쳐 어깨를 물어뜯는 듯한 모습",
              "거대한 체구가 아래쪽의 웅크린 여성 형상을 완전히 짓누르며 덮고 있는 섬뜩한 실루엣"
            ],
            "visual_inferences": [
              "fixed_element intruder_obscured_state: male intruder rendered as a dense dark silhouette with no textures",
              "fixed_element exterior_moonlight_environment: cold moonlight in silver-gray and blue-black outside",
              "window glass separating the observer from the lit curtain inside"
            ],
            "creative_decisions": [
              "Locked voyeur composition to heighten the feeling of helplessness",
              "Using sheer flat silhouette shapes to emphasize the violence without graphic gore"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "clothesline",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drying platform",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flyer",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "leaf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "parapet wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "roof deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rooftop room",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "water tank",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "the closed, slightly smudged window glass"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "25dbe6a1ec015c4b",
              "owned_hash": "1100adfa501b5f7a",
              "camera_direction_hash": "848e06fad8adcbc4",
              "owned_usage_hash": "1e59533f658a4d69",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "window",
                  "violating_phrase": "directly outside the window, squared to the closed, slightly smudged window glass",
                  "reason": "The prompt uses the existing window and its glass as a spatial anchor for the camera position and shadow projection, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 10,
        "dependency_reason": "Exact background from S10_Shot3, maintaining the same window exterior and moonlight conditions.",
        "_shot_index": 7,
        "visible_entities": [
          "L04",
          "C10",
          "C04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "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 camera stays locked in a voyeur position directly outside the window, eye level and squared to the curtain so the room is reduced to flat, violent shadow shapes. The huge male silhouette occupies the upper and central area while 민숙’s smaller crouched form is compressed low beneath him, with no interior detail visible beyond the thin fabric and glass.",
            "lighting_mood": "Weak interior amber backlight pushes the silhouettes onto a gray curtain while the exterior remains cold blue-black, making the violence feel hidden and airless.",
            "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": "민숙 crouched silhouette below",
                  "screen_zone": "lower_center",
                  "target_id": "C04",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "남자 silhouette above",
                  "screen_zone": "middle_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": [
              "L04",
              "C10",
              "C04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C10",
                "outlook_id": "O11"
              },
              {
                "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": [
              {
                "subject_id": "C04",
                "policy_type": "identity_reference",
                "policy": "generic_descriptor_allowed",
                "reason": "Minsook appears only as a small crouched silhouette with no facial or clothing detail visible through the curtain."
              },
              {
                "subject_id": "C10",
                "policy_type": "identity_reference",
                "policy": "generic_descriptor_allowed",
                "reason": "The man is only a flattened silhouette behind curtain fabric, so outlook identity references would create inappropriate visible detail."
              }
            ],
            "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": "L03B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "clothesline",
              "door",
              "drying platform",
              "flyer",
              "leaf",
              "parapet wall",
              "roof deck",
              "rooftop room",
              "water tank",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "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": "intruder_obscured_state",
                "element_type": "character_state",
                "character_name": "남자",
                "description": "The male intruder's facial features, clothing details, and physical textures are completely obscured by darkness. He is consistently rendered as a dense, dark silhouette or shadowy mass, keeping his identity entirely hidden.",
                "applies_to_shots": [
                  3,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "남자의 긴 그림자. (얼굴은 보이지 않는다)",
                  "The man's face remains completely unseen",
                  "거대한 체구가... 섬뜩한 실루엣",
                  "huge male silhouette"
                ],
                "visual_inferences": [
                  "Regardless of his changing posture, the attacker's physical form is intentionally reduced to a pure shadow to maintain a mysterious and threatening presence."
                ],
                "creative_decisions": [
                  "Using sheer silhouette rather than direct lighting on the subject to convey a sense of dread and anonymity."
                ],
                "confidence": "high"
              },
              {
                "element_id": "exterior_moonlight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior environment is bathed in a cold, hard moonlight that dominates the nighttime setting. This lighting creates a stark silver-gray and cold blue-black color palette, casting sharp and deep shadows across the outdoor spaces.",
                "applies_to_shots": [
                  3,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "달빛 아래",
                  "Hard moonlight turns the rooftop into cold silver-gray cement",
                  "exterior remains cold blue-black"
                ],
                "visual_inferences": [
                  "The consistent cold moonlight acts as the primary ambient light for the exterior, emphasizing the chill and isolation of the late night."
                ],
                "creative_decisions": [
                  "Contrasting the cold, unfeeling exterior lighting with the violent actions to heighten the thriller atmosphere."
                ],
                "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": "L03B03",
                "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": "e7c7cd0c76e47ee1"
      },
      {
        "scene_index": 11,
        "heading": "S#11. 옥탑 방 밖 / N",
        "beat_title": "반쯤 열려 있는 어두운 현관 철문",
        "representative_moment": "짙은 어둠이 깔린 옥상, 반쯤 열린 현관 철문 사이로 새카만 내부가 보이는 서늘한 정면.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Subjective chest-height POV, symmetrical framing, desaturated moon-dim blues and deep shadows",
            "t2i_prompt": "Photorealistic cinematic still. [L03: Symmetrical composition looking towards the pre-existing half-open iron door with its black interior gap in the middle-center background.] Viewed from a subjective chest-height perspective on a dark rooftop, the framing holds the doorway in the middle third of the frame. The visible surfaces of the pre-existing cement roof slab and low parapet wall are desaturated and cold, illuminated only by a faint, silvery moon-gray light. Moon-dim rooftop blues and cold shadow tones leave the door rim faintly silver, while the interior gap remains absolute black. The edges of the space fall into heavy shadows, creating a desolate and chilling atmosphere with no figures present.",
            "outfit_assignments": [],
            "source_facts": [
              "S#11 action: '옥상에 올라와 보니 반쯤 열린 현관 철문.'",
              "shot description: '짙은 어둠이 깔린 옥상, 열린 틈 사이로 새카만 방 내부가 들여다보이는 현관 철문의 서늘한 정면.'"
            ],
            "visual_inferences": [
              "fixed_element rooftop_night_environment: desaturated, cold cement illuminated only by a faint, silvery moon-gray light.",
              "Subjective POV without the observer in the frame, focusing entirely on the door as the central object of fear."
            ],
            "creative_decisions": [
              "Symmetrical middle-center framing of the door to emphasize the absolute black void inside.",
              "Applied desaturated cement tones and moon-dim blues to contrast against the pitch-black gap."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "clothesline",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "looking towards the pre-existing half-open iron door with its black interior gap"
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drying platform",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "parapet",
                "usage_kind": "anchor",
                "source_phrase": "low parapet wall"
              },
              {
                "owned_token": "roof slab",
                "usage_kind": "anchor",
                "source_phrase": "visible surfaces of the pre-existing cement roof slab"
              },
              {
                "owned_token": "sill",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stair enclosure",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "water tank",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "fa96444c0d696c7a",
              "owned_hash": "eade9a4a61193fbc",
              "camera_direction_hash": "d1df19a03005baa0",
              "owned_usage_hash": "90ef1a4f2eed0713",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "looking towards the pre-existing half-open iron door with its black interior gap",
                  "reason": "The prompt specifies 'pre-existing' and references the door's position and lighting to anchor the composition, which aligns with the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "roof slab",
                  "violating_phrase": "visible surfaces of the pre-existing cement roof slab",
                  "reason": "The prompt uses the 'pre-existing' roof slab as an illumination reference and anchor for composition, with no intent to redraw.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "parapet",
                  "violating_phrase": "low parapet wall",
                  "reason": "The parapet wall is mentioned to describe lighting effects on its visible surfaces, which serves as a scene anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "low parapet wall",
                  "reason": "The wall is mentioned in the phrase 'low parapet wall' for lighting reference, serving as an anchor in the scene.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 3,
        "visible_entities": [
          "L03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "This is 수리영’s unaided subjective view: from chest height on the dark rooftop, the camera continues the reveal-stage dolly-in but holds colder and more symmetrical on the half-open iron door several meters ahead. The black gap sits dead center, the doorway occupying the middle third while the rooftop edges fall into darkness, as if the smell and silence are pulling her forward.",
            "lighting_mood": "Moon-dim rooftop blues and desaturated cement tones leave the door rim faintly silver while the interior gap remains absolute black.",
            "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": "half-open iron door with black interior gap",
                  "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": [
              "L03"
            ],
            "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": "L05B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "clothesline",
              "door",
              "drain",
              "drying platform",
              "parapet",
              "roof slab",
              "sill",
              "stair enclosure",
              "threshold",
              "wall",
              "water tank",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "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": "rooftop_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The rooftop of a multi-family residential building at night, engulfed in deep darkness. The visible surfaces consist of desaturated, cold cement illuminated only by a faint, silvery moon-gray light. The edges of the space fall into heavy shadows, creating a desolate and chilling atmosphere.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "짙은 어둠이 깔린 옥상 (dark rooftop covered in deep darkness)",
                  "Moon-dim rooftop blues and desaturated cement tones",
                  "Cold rooftop darkness leaves her face under a faint moon-gray wash"
                ],
                "visual_inferences": [
                  "The concrete textures of the rooftop floor and surrounding low parapet walls are present but heavily muted and obscured by the lack of lighting."
                ],
                "creative_decisions": [
                  "Consistent use of cool, desaturated blue and gray tones across both the forward and reverse angles to establish a threatening, isolated mood before the internal horror is fully revealed."
                ],
                "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": "L05B02",
                "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": "17f59b9681e968b2"
      },
      {
        "scene_index": 11,
        "heading": "S#11. 옥탑 방 밖 / N",
        "beat_title": "반쯤 열린 철문 앞의 경악",
        "representative_moment": "C01O01이 열려 있는 철문을 향해 충격받은 표정으로 얼어붙어 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "close framing object POV near the door line at eye level, cold moon-gray light with dark negative space",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, an East Asian young woman in her 20s with dark long hair and clear facial features, stands frozen mid-step in the middle-center foreground, her shocked reaction dominating the tight frame. Facing the camera at eye level, her widened eyes are fixed on the camera. Her natural complexion is bathed in a faint, silvery moon-gray wash from the cold rooftop darkness, with tiny wet highlights catching in her eyes. [: A sliver of cold metal edge from the offscreen iron doorway brushes the extreme frame edge, while the background falls into soft dark negative space—an out-of-focus desaturated cement rooftop engulfed in deep darkness and heavy chilling shadows.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#11 action: '옥상에 올라와 보니 반쯤 열린 현관 철문.'",
              "shot description: Her widened eyes dominate the center of a tight frame",
              "DP instruction: Cold rooftop darkness leaves her face under a faint moon-gray wash, with tiny wet highlights in her eyes"
            ],
            "visual_inferences": [
              "fixed_element rooftop_night_environment: desaturated, cold cement illuminated only by a faint, silvery moon-gray light",
              "The half-open door is kept mostly offscreen, creating psychological tension through her direct gaze toward the camera POV"
            ],
            "creative_decisions": [
              "Use of close framing to lock onto her shocked reaction in the middle-center foreground, omitting the background reference as per the background_binding policy",
              "Blurring the background into soft dark negative space to isolate the terror in her face"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "clothesline",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drying platform",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "parapet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "roof slab",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sill",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stair enclosure",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "water tank",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "59430e790816c141",
              "owned_hash": "eade9a4a61193fbc",
              "camera_direction_hash": "6299579a5d5ad8a5",
              "owned_usage_hash": "9214523ae4466f29",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "동일한 옥상 환경 내에서의 시점 전환 및 연속적인 상황 진행",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "After the axis reversal, the camera locks off near the door line at eye level, looking back across the rooftop as if the threshold itself is staring at 수리영. Her widened eyes dominate the center of a tight frame, with the half-open door kept offscreen in her eyeline so the threat remains implied rather than shown again.",
            "lighting_mood": "Cold rooftop darkness leaves her face under a faint moon-gray wash, with tiny wet highlights in her eyes carrying the terror.",
            "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": "수리영 shocked reaction",
                  "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": "L05B02",
            "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": "rooftop_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The rooftop of a multi-family residential building at night, engulfed in deep darkness. The visible surfaces consist of desaturated, cold cement illuminated only by a faint, silvery moon-gray light. The edges of the space fall into heavy shadows, creating a desolate and chilling atmosphere.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "짙은 어둠이 깔린 옥상 (dark rooftop covered in deep darkness)",
                  "Moon-dim rooftop blues and desaturated cement tones",
                  "Cold rooftop darkness leaves her face under a faint moon-gray wash"
                ],
                "visual_inferences": [
                  "The concrete textures of the rooftop floor and surrounding low parapet walls are present but heavily muted and obscured by the lack of lighting."
                ],
                "creative_decisions": [
                  "Consistent use of cool, desaturated blue and gray tones across both the forward and reverse angles to establish a threatening, isolated mood before the internal horror is fully revealed."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "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": "513abb5b58187118"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "엄마의 참혹한 시신 발견",
        "representative_moment": "리영이 커튼을 젖히자, 처참하게 훼손된 채 앉아있는 엄마 C04의 시신이 드러난다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Wide framing from just below eye level, illuminated by cold moonlight-blue and weak amber spill.",
            "t2i_prompt": "Photorealistic cinematic still. Observed from just below eye level in the murky bedroom, C04O05 in a beige knitwear, a Korean middle-aged woman, sits facing the camera with her head bowed and eyes closed, lifeless, positioned between the opened curtain panels that frame her body. Deep red, torn bloody wounds mark her exposed shoulder and collarbone. One stiff hand rests downward, clenched around the pre-existing photograph. Behind the seated figure, the dark bedroom window reveals faint exterior night haze. The floor surface below her feet, with the pre-existing dark bloodstain pools, reflects the cold moonlight-blue tint from the glass mixed with a weak amber spill. Deep blue-black shadows swallow the surrounding edges of the room.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "앉은 채로 고개를 떨군 채 죽어있는 엄마- 민숙!!!!",
              "살점이 뜯긴 어깨와 쇄골, 마치 동물에게 물어뜯긴 듯한 거친 상처",
              "바닥에 흥건한 혈흔",
              "엄마 손안에 구겨진 사진 한 장"
            ],
            "visual_inferences": [
              "fixed_element blood_stained_floor: The floor surface is heavily stained with dark, coagulated blood.",
              "fixed_element cold_night_lighting: The interior is dominated by murky, blue-black shadows and a cold moonlight-blue tint.",
              "The opened curtain panels act as a visual frame around the victim's body."
            ],
            "creative_decisions": [
              "Wide framing from slightly below eye level to anchor the horrific tableau, keeping the window and blood pools in the same unified composition.",
              "Using a contrasting cold moon-blue backlight against deep shadows to emphasize the visceral wounds."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bloodstain",
                "usage_kind": "anchor",
                "source_phrase": "with the pre-existing dark bloodstain pools"
              },
              {
                "owned_token": "curtain",
                "usage_kind": "anchor",
                "source_phrase": "opened curtain panels"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "The floor surface below her feet"
              },
              {
                "owned_token": "footprint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "anchor",
                "source_phrase": "clenched around the pre-existing photograph"
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "the dark bedroom window"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "260a16ff12745ba0",
              "owned_hash": "b71e5d990231eb50",
              "camera_direction_hash": "fc540d41813e36cc",
              "owned_usage_hash": "9706214e685afb9e",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bloodstain",
                  "violating_phrase": "with the pre-existing dark bloodstain pools",
                  "reason": "The prompt references the bloodstain as a pre-existing element to describe light reflections, which matches the producer's declaration of anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curtain",
                  "violating_phrase": "opened curtain panels",
                  "reason": "The prompt uses the curtains to establish the framing of the seated figure without requesting a redraw, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "The floor surface below her feet",
                  "reason": "The floor is referenced only to describe light and color reflections, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "photograph",
                  "violating_phrase": "clenched around the pre-existing photograph",
                  "reason": "The prompt explicitly notes the photograph as pre-existing and uses it as an anchor for the character's hand posture, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "the dark bedroom window",
                  "reason": "The window is referenced as a background anchor to describe the exterior night haze, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "동일한 옥탑방 공간의 물리적 구조와 배경 유지 (exact_background)",
        "_shot_index": 7,
        "visible_entities": [
          "L04",
          "C04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "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 neutral observer holds slightly wider than the forward push inside the bedroom, just below eye level and about six feet from the window, facing 민숙’s seated body frontally in one horrific tableau. The opened curtain frames her bowed head and torn shoulder line, while the blood-dark floor and window area remain visible enough to show the room’s physical reality rather than isolating the gore.",
            "lighting_mood": "Cold moon-blue from the window mixes with weak amber spill from the apartment, picking out the red-black wounds and damp blood without theatrical 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": [
              "L04",
              "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": "L04B06",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bed",
              "bloodstain",
              "curtain",
              "door",
              "floor",
              "footprint",
              "photograph",
              "shelf",
              "wardrobe",
              "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": "blood_stained_floor",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The floor surface is heavily stained with dark, coagulated blood. Deep red and black patches of blood pool extensively on the ground, grounding the scene in a grim physical reality.",
                "applies_to_shots": [
                  7,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "blood-dark floor and window area remain visible",
                  "blood-dark floor giving scale",
                  "바닥에 흥건한 혈흔"
                ],
                "visual_inferences": [
                  "The blood is dark and coagulating, forming large, messy pools rather than neat drops on the floor."
                ],
                "creative_decisions": [
                  "Keeping the blood texture dark and murky to blend seamlessly with the low-key lighting."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior is dominated by murky, blue-black shadows and a cold moonlight-blue tint. The overall illumination is extremely weak and low-key, casting deep, chilling shadows that swallow most details of the room.",
                "applies_to_shots": [
                  7,
                  12,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "Cold moon-blue from the window mixes with weak amber spill",
                  "murky blue-black room",
                  "Cold night room shadows"
                ],
                "visual_inferences": [
                  "The primary light source is the cold ambient moonlight from outside, leaving the interior largely unlit and enveloped in darkness."
                ],
                "creative_decisions": [
                  "Using a strong monochromatic blue and black color palette to heighten the supernatural and horrific tension across all shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 11,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete 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": "L04B06",
                "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": "11eca3ae8d3cb02d"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "기괴한 초자연적 현상에 대한 공포",
        "representative_moment": "A tight view of Minsook's pale, stiff hand tightly gripping a crumpled photograph, her wrist tattoo turning a saturated red.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Hand-level macro perspective, cold moonlight-blue tint with deep shadows",
            "t2i_prompt": "Photorealistic cinematic still. C04 in a beige knitwear sleeve, a Korean middle-aged woman, with her rigid hand filling the lower center of the frame, her body implied beyond the upper frame edge. The stiff, pale fingers are smeared with dark red paint, tightly gripping P09, a small crumpled photograph. The printed face of P09 is partially visible to the camera between creases and fingers, but its full image is obscured. The marked side of the wrist faces the camera at a shallow angle, the tattoo standing out in a saturated red hue against the pale skin. A narrow cold highlight catches the knuckles and the photo creases. The background is a soft, out-of-focus blur of a dark red paint-smeared floor, grounding the scale, while the rest of the murky blue-black room dissolves into chilling deep shadows.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "S#12 action: Minsook is dead, her hand rigidly gripping a crumpled photograph.",
              "S#12 action: The tattoo on her wrist turns red.",
              "DP direction: Hand fills the lower center, dark red paint on the floor gives scale."
            ],
            "visual_inferences": [
              "fixed_element blood_stained_floor: The floor is heavily stained with dark red paint, visible in the blurred background under the hand.",
              "fixed_element cold_night_lighting: The room is filled with murky blue-black shadows, leaving only the hand highlighted.",
              "Macro focus intentionally blurs the rest of the environment and character to isolate the critical supernatural clue (tattoo and photo)."
            ],
            "creative_decisions": [
              "Used a narrow cold highlight on the hand and P09 to create high contrast against the murky blue-black shadows.",
              "Described the tattoo's supernatural state as 'standing out in a saturated red hue' to capture the moment of transformation as a still frame without using motion verbs."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background",
              "prop"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bloodstain",
                "usage_kind": "anchor",
                "source_phrase": "dark red paint-smeared floor"
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "soft, out-of-focus blur of a dark red paint-smeared floor"
              },
              {
                "owned_token": "footprint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "redraw",
                "source_phrase": "tightly gripping P09, a small crumpled photograph"
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "053232d2d4ece526",
              "owned_hash": "b71e5d990231eb50",
              "camera_direction_hash": "9ce58722256f4c64",
              "owned_usage_hash": "aea5c4ab14da0ebe",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "photograph",
                  "violating_phrase": "tightly gripping P09, a small crumpled photograph. The printed face of P09 is partially visible to the camera between creases and fingers",
                  "reason": "The prompt explicitly describes the photograph in detail, specifying that it is crumpled in the hand with its printed face partially visible, which constitutes a redraw violation. Deterministic prop-owned namespace reconciliation: visible prop P09 owns token photograph; prompt uses P09 in the source phrase.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "soft, out-of-focus blur of a dark red paint-smeared floor",
                  "reason": "The floor is referenced only as a soft, out-of-focus background element to establish scale, serving as an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bloodstain",
                  "violating_phrase": "dark red paint-smeared floor",
                  "reason": "The red paint-smeared floor refers to the existing environmental stains as an out-of-focus background anchor, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "Shot 12 maintains the exact spatial continuity and lighting conditions (murky blue-black shadows, dark red paint on the floor) established in earlier S12 shots.",
        "_shot_index": 12,
        "visible_entities": [
          "C04",
          "P09"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera drops to hand level beside the seated body for a tighter macro observation than the stage default, tracking minimally as focus racks onto the crumpled photograph trapped inside 민숙’s stiff fingers. Her hand fills the lower center but not the whole frame, with a soft suggestion of wrist, sleeve, and blood-dark floor giving scale while the rest of the body falls away into blur.",
            "lighting_mood": "A narrow cold highlight catches the knuckles and photo creases while the tattoo’s red shift becomes the only saturated color in the murky blue-black room.",
            "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",
              "P09"
            ],
            "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": 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": [
              {
                "subject_id": "C04",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "The shot frames only Minsook’s dead hand and wrist; a full outlook reference would not align with the visible body part."
              }
            ],
            "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": "L04B06",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bed",
              "bloodstain",
              "curtain",
              "door",
              "floor",
              "footprint",
              "photograph",
              "shelf",
              "wardrobe",
              "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": "blood_stained_floor",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The floor surface is heavily stained with dark, coagulated blood. Deep red and black patches of blood pool extensively on the ground, grounding the scene in a grim physical reality.",
                "applies_to_shots": [
                  7,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "blood-dark floor and window area remain visible",
                  "blood-dark floor giving scale",
                  "바닥에 흥건한 혈흔"
                ],
                "visual_inferences": [
                  "The blood is dark and coagulating, forming large, messy pools rather than neat drops on the floor."
                ],
                "creative_decisions": [
                  "Keeping the blood texture dark and murky to blend seamlessly with the low-key lighting."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior is dominated by murky, blue-black shadows and a cold moonlight-blue tint. The overall illumination is extremely weak and low-key, casting deep, chilling shadows that swallow most details of the room.",
                "applies_to_shots": [
                  7,
                  12,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "Cold moon-blue from the window mixes with weak amber spill",
                  "murky blue-black room",
                  "Cold night room shadows"
                ],
                "visual_inferences": [
                  "The primary light source is the cold ambient moonlight from outside, leaving the interior largely unlit and enveloped in darkness."
                ],
                "creative_decisions": [
                  "Using a strong monochromatic blue and black color palette to heighten the supernatural and horrific tension across all shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "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": "C04",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L04B06",
                "policy": "required"
              },
              {
                "kind": "prop",
                "id": "P09",
                "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": [
            {
              "contract_id": "rc_001",
              "scope": {
                "scene_index": 12,
                "shot_indices": [
                  12
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P09",
                  "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": 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": "f845b063bf0adb7b"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "벽에 나타나는 피의 원",
        "representative_moment": "침대 위 텅 빈 벽에 핏빛 붉은 원형 자국(P13)이 선명하게 나타난 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height close framing tilting upward, sharp focus on the wall mark, hallucination distortion with stark cold blue and red contrast",
            "t2i_prompt": "Photorealistic cinematic still. P13, a wet arterial blood-red circular mark resembling a fresh brushstroke, is in sharp focus near the upper-center of [L04: a damp, blank wall above a bed, bathed in murky blue-black shadows and a cold moonlight-blue tint, the dim side edge of the mattress forming a dark horizontal line along the lower frame edge]. No figures are present. The vibrant wet red of P13 cuts through the weak, low-key ambient shadows, giving the muted interior a sudden occult tension.",
            "outfit_assignments": [],
            "source_facts": [
              "S#12 action: '침대 위 벽에 붉은 원이 생겨난다 (마치 누군가 붓으로 벽에 원으로 그리는 것처럼).'",
              "shot description: upward tilt locking on the blank wall above the mattress, blood-red circular mark resolves in sharp focus"
            ],
            "visual_inferences": [
              "fixed_element cold_night_lighting: murky blue-black shadows and cold moonlight-blue tint",
              "P13 appears wet and starkly defined against the dim, cold-toned wall"
            ],
            "creative_decisions": [
              "Emphasize the texture of the wet arterial blood against the damp, cold-toned wall to highlight the supernatural hallucination perception mode.",
              "Use the dark horizontal line of the mattress to anchor the frame and provide geometric consistency for the upward tilt."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mark",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "55f105d711679897",
              "owned_hash": "3a03399602ad4075",
              "camera_direction_hash": "5b0f82ea14f62434",
              "owned_usage_hash": "67b9012eb085a759",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "전 샷(Shot 7)의 방 내부 공간 톤(cold night lighting)을 공유하되, 배경 합성 모드가 skipped_close_framing이므로 프레임 가장자리의 벽과 매트리스 선만 묘사함",
        "_shot_index": 14,
        "visible_entities": [
          "L04",
          "P13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "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 near the side of the bed at chest height, the camera completes the upward tilt and locks on the blank wall above the mattress; the lower edge of the bed remains a thin, dark horizontal reference at the bottom of frame while the wall takes most of the image. The blood-red circular mark resolves in sharp focus near the upper-center, as if a wet brush has just completed the stroke, with no visible hand or figure present.",
            "lighting_mood": "Cold night room shadows are cut by the wet, arterial red of the mark, giving the muted interior a sudden occult pulse.",
            "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": [
              "L04",
              "P13"
            ],
            "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": "L04B08",
            "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": "cold_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior is dominated by murky, blue-black shadows and a cold moonlight-blue tint. The overall illumination is extremely weak and low-key, casting deep, chilling shadows that swallow most details of the room.",
                "applies_to_shots": [
                  7,
                  12,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "Cold moon-blue from the window mixes with weak amber spill",
                  "murky blue-black room",
                  "Cold night room shadows"
                ],
                "visual_inferences": [
                  "The primary light source is the cold ambient moonlight from outside, leaving the interior largely unlit and enveloped in darkness."
                ],
                "creative_decisions": [
                  "Using a strong monochromatic blue and black color palette to heighten the supernatural and horrific tension across all shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "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": "d4f001e6f41c37f3"
      },
      {
        "scene_index": 13,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "멍하니 선 수리영",
        "representative_moment": "붉은 사이렌 불빛 아래, 초점 잃은 눈으로 멍하니 서 있는 수리영의 굳은 전신.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level wide frame with harsh red siren flashes cutting through coastal night fog",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a dark casual jacket, a Korean young woman with dark long hair and clear facial features, facing the camera with a rigid heel-locked stance in the center of the frame, gazing into the distance with vacant eyes. At eye level below the stair in the exterior courtyard, the static wide frame captures her full body, her shoes positioned on the wet reflective paving in the lower frame, with the dark building exterior extending behind her. Harsh, pulsing red siren lights flash across the area, washing her face, her jacket, and the cold, sickly blue night tones with a stark, blood-red glow, cutting through the dark, blue-black coastal night fog.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#13 text: 혜수 finds 수리영 standing blankly with lost focus after running down the stairs.",
              "Shot 2 description: Red siren light washes over 수리영 as she stands frozen with vacant eyes, wide full-body frame."
            ],
            "visual_inferences": [
              "fixed_element flashing_red_siren_night: blue-black coastal night fog and a pulsing red siren acting as the dominant light source."
            ],
            "creative_decisions": [
              "Eye-level wide framing placing the subject in the center as a rigid post against the dark building.",
              "Strong color contrast between the cold blue ambient fog and the harsh red siren strobe reflecting on the wet paving."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle nook",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "building",
                "usage_kind": "anchor",
                "source_phrase": "dark building exterior extending behind her"
              },
              {
                "owned_token": "courtyard",
                "usage_kind": "anchor",
                "source_phrase": "exterior courtyard"
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "landing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "paving",
                "usage_kind": "anchor",
                "source_phrase": "wet reflective paving in the lower frame"
              },
              {
                "owned_token": "police car",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stair",
                "usage_kind": "anchor",
                "source_phrase": "below the stair in the exterior courtyard"
              },
              {
                "owned_token": "utility meter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "75db6b1acdd17368",
              "owned_hash": "df1a4015371be39f",
              "camera_direction_hash": "c118d9a806344168",
              "owned_usage_hash": "6dd4d6d3cd1142a6",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "building",
                  "violating_phrase": "dark building exterior extending behind her",
                  "reason": "The prompt mentions the building as a background element to establish composition, consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "courtyard",
                  "violating_phrase": "exterior courtyard",
                  "reason": "The prompt uses the courtyard as a spatial reference to anchor the camera height, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "paving",
                  "violating_phrase": "wet reflective paving in the lower frame",
                  "reason": "The prompt references the paving as the ground plane on which the subject is standing, which acts as a background anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "stair",
                  "violating_phrase": "below the stair in the exterior courtyard",
                  "reason": "The stair is mentioned to define the camera height and position relative to the environment, acting as an anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "Same exact background as S11, maintaining the exterior courtyard architecture and dark, wet atmosphere.",
        "_shot_index": 2,
        "visible_entities": [
          "L05",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "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 in the exterior space below the stairs, the camera holds a static wide frame about fourteen feet from 수리영, placing her full body in the center like a rigid post against the dark building façade. The only emphasized change is lighting: red siren pulses sweep across her face, coat, and the wet ground while she remains absolutely still.",
            "lighting_mood": "Harsh red siren flashes break through blue-black coastal night fog, flattening her shock into a blood-colored strobe.",
            "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": [
              "L05",
              "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": "L05B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bicycle",
              "bicycle nook",
              "building",
              "courtyard",
              "curb",
              "door",
              "gate",
              "landing",
              "paving",
              "police car",
              "stair",
              "utility meter",
              "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": "flashing_red_siren_night",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior environment is engulfed in a dark, blue-black coastal night fog. Harsh, pulsing red siren lights flash across the area, washing the cold, sickly blue night tones with a stark, blood-red glow.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "Harsh red siren flashes break through blue-black coastal night fog (Shot 2)",
                  "A shallow-focus red siren wash flickers over sickly blue night tones (Shot 4)"
                ],
                "visual_inferences": [
                  "The red lighting originates from an off-screen emergency vehicle, dramatically illuminating the surrounding dark space and acting as the dominant light source."
                ],
                "creative_decisions": [
                  "Highlighting the stark contrast between the chilling blue-black night atmosphere and the aggressive red siren flashes to visually amplify the character's shock and the tragic tone of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "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": "L05B01",
                "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": "7c42da88cfe8bea4"
      },
      {
        "scene_index": 13,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "절망에 빠진 수리영과 도착한 혜수",
        "representative_moment": "붉은 사이렌 불빛 아래서 패닉에 빠진 C01이 고개를 들어 혜수를 바라보며 눈물을 흘린다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close upward angle, shallow focus with stark red siren wash over sickly blue-black night",
            "t2i_prompt": "Photorealistic cinematic still. Shot from close beside C01O01 at slightly below eye level, about two feet from her cheek, angling upward. C01O01 in a casual jacket, a Korean young woman with an early 20s face, clear facial features, and dark long hair, occupies the left foreground in right profile, chin lifted trembling, eyes fixed on the figure above. She shares a single line of sight with a Korean middle-aged woman in a detective coat, who occupies the right background at three-quarter angle from the left, bending toward C01O01 and gazing down. C01O01's pale cheek, tear line, and trembling jaw stay in razor-thin focus, while the older woman exists mostly as a soft, out-of-focus looming shoulder and partial face high in the right frame. A shallow-focus red siren wash flickers over sickly blue-black night tones, making the tears on C01O01's face flash like fresh blood. [: The frame edges reveal a soft, underexposed damp coastal night fog behind them, washed in an intermittent stark red glow].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Suryoung is in a panic state, looking up at Hyesu and crying.",
              "Hyesu arrives and bends down to check on her.",
              "Harsh red siren flashes break through blue-black coastal night fog (Shot 2)."
            ],
            "visual_inferences": [
              "flashing_red_siren_night environmental element applied to rim-light C01's tears and pale profile.",
              "Close framing omits the background reference, keeping Hyesu as a partial soft figure to emphasize C01's shock."
            ],
            "creative_decisions": [
              "Positioning the camera slightly below eye level and focusing razor-thin on the tear line to maximize emotional tension.",
              "Using shallow depth of field to turn the unregistered older woman into a looming background shape, fulfilling the close framing rule."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle nook",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "building",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "courtyard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "landing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "paving",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "police car",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility meter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "14a9cbff319db9f5",
              "owned_hash": "df1a4015371be39f",
              "camera_direction_hash": "c99e6cffb8678f8b",
              "owned_usage_hash": "d29a67ec55c8ec2e",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "동일한 옥탑방 외곽 환경이 배경이지만, close framing 룰에 의해 인물과 조명에 집중함",
        "_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": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Close beside 수리영 at slightly below eye level, the camera holds about two feet from her cheek and angles upward along her pale side profile toward 혜수’s position. 수리영’s tear line and trembling jaw stay in razor-thin focus on the left foreground, while 혜수 exists mostly as a soft, looming shoulder and partial face high in the right background.",
            "lighting_mood": "A shallow-focus red siren wash flickers over sickly blue night tones, making 수리영’s tears flash like fresh 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": [
              "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": "L05B01",
            "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": "flashing_red_siren_night",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior environment is engulfed in a dark, blue-black coastal night fog. Harsh, pulsing red siren lights flash across the area, washing the cold, sickly blue night tones with a stark, blood-red glow.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "Harsh red siren flashes break through blue-black coastal night fog (Shot 2)",
                  "A shallow-focus red siren wash flickers over sickly blue night tones (Shot 4)"
                ],
                "visual_inferences": [
                  "The red lighting originates from an off-screen emergency vehicle, dramatically illuminating the surrounding dark space and acting as the dominant light source."
                ],
                "creative_decisions": [
                  "Highlighting the stark contrast between the chilling blue-black night atmosphere and the aggressive red siren flashes to visually amplify the character's shock and the tragic tone of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "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": "a7494128018ed495"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "핏자국 없이 말끔하게 정돈된 빈 방",
        "representative_moment": "시신과 핏자국이 온데간데없이 깨끗하게 정돈된 방안의 고요하고 텅 빈 정경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level centered wide view through the open doorway, muted gray-green night lighting",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from just past the open door at eye level, [L04: an unnervingly tidy and empty bedroom] is fully visible under muted interior night lighting. A neatly arranged bed sits to one side, its linens perfectly flat with absolutely no signs of physical disturbance. In the background, a pale beige curtain hangs motionless, the bare floor space immediately around and behind it immaculately clean and devoid of any debris. A backpack and a doll rest quietly near the wall. Weak light spilling from the hallway casts a drained, cold gray-green stillness across the spotless surfaces, emphasizing the oppressive emptiness of the room.",
            "outfit_assignments": [],
            "source_facts": [
              "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고, ... 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
              "수리영 방안에 놓여진 백팩, 인형. 약간씩 위치가 달라진.",
              "spotless curtain hangs still in the background where the body and blood should have been."
            ],
            "visual_inferences": [
              "fixed_element spotless_curtain_and_floor: A pale beige curtain hanging still, floor immaculately clean, cold gray-green appearance.",
              "fixed_element tidy_bed: neatly arranged bed, linens perfectly tidy, no signs of physical disturbance.",
              "No characters are visible in this exact moment, emphasizing the stark emptiness and silence."
            ],
            "creative_decisions": [
              "Using the open door as a framing device at eye level to make the viewer feel like an observer inspecting the unnaturally clean scene.",
              "Applying a drained, cold gray-green color palette to highlight the absence of life, blood, and warmth."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "backpack",
                "usage_kind": "anchor",
                "source_phrase": "backpack"
              },
              {
                "owned_token": "bed",
                "usage_kind": "anchor",
                "source_phrase": "neatly arranged bed"
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "anchor",
                "source_phrase": "pale beige curtain"
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "doll",
                "usage_kind": "anchor",
                "source_phrase": "doll"
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "open door"
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a17f5a2c36a47513",
              "owned_hash": "39261047e4552b32",
              "camera_direction_hash": "7489001e2aa8525f",
              "owned_usage_hash": "d6638329a22d965f",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "open door",
                  "reason": "The prompt mentions 'open door' to establish the camera's viewing position, which functions as a spatial anchor, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bed",
                  "violating_phrase": "neatly arranged bed",
                  "reason": "The prompt describes the state of the existing bed ('neatly arranged bed') to emphasize the room's emptiness, acting as an anchor matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curtain",
                  "violating_phrase": "pale beige curtain",
                  "reason": "The prompt references the 'pale beige curtain' to describe the background space and cleanliness, serving as a spatial anchor matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "backpack",
                  "violating_phrase": "backpack",
                  "reason": "The prompt mentions the 'backpack' resting near the wall as a static background element, serving as an anchor matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "doll",
                  "violating_phrase": "doll",
                  "reason": "The prompt refers to the 'doll' resting quietly as a static reference object in the background, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "exact_background usage referencing the established room layout from scene 12, preserving the same environment but reflecting the unnaturally clean state.",
        "_shot_index": 4,
        "visible_entities": [
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Just inside the open bedroom doorway at eye level, the camera holds a wide, centered view long enough for the room’s impossible cleanliness to become oppressive. The bed sits to one side, the clean floor opens in the middle, and the spotless curtain hangs still in the background where the body and blood should have been.",
            "lighting_mood": "Muted interior night light and weak spill from the main room give the tidy surfaces a drained, gray-green stillness with no comforting warmth.",
            "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": [
              "L04"
            ],
            "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": "L04B07",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "backpack",
              "bed",
              "chair",
              "curtain",
              "dining table",
              "doll",
              "door",
              "kitchen counter",
              "shelf",
              "stand",
              "wardrobe",
              "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": "spotless_curtain_and_floor",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pale beige curtain hanging still in the bedroom, along with the floor space immediately behind and around it. Both the curtain fabric and the floor are immaculately clean, devoid of any bloodstains, messy debris, or hidden bodies. The area maintains an unnervingly tidy and cold gray-green appearance.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고, ... 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
                  "spotless curtain hangs still in the background where the body and blood should have been.",
                  "pale beige fabric and gray floor tones",
                  "empty floor line behind the curtain"
                ],
                "visual_inferences": [
                  "The floor is a typical bare surface like wood or linoleum, making its total cleanliness stark and obvious."
                ],
                "creative_decisions": [
                  "The absolute absence of any gruesome mess is highlighted to create a cold, oppressive emptiness in the room."
                ],
                "confidence": "high"
              },
              {
                "element_id": "tidy_bed",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A neatly arranged bed positioned to one side of the bedroom. The bed linens are perfectly tidy, showing absolutely no red marks, bloodstains, or signs of physical disturbance.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "침대 위에 붉은 표식은 물론...",
                  "The bed sits to one side",
                  "Inside the room near the bed"
                ],
                "visual_inferences": [
                  "The bed covers are tightly made and flat, matching the unnatural and meticulous neatness of the room."
                ],
                "creative_decisions": [
                  "Positioning the bed as a perfectly clean background element that anchors the geometric stillness of the bedroom."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "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": "background",
                "id": "L04B07",
                "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": "125140f4084f749a"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "사라진 시신과 깨끗한 방",
        "representative_moment": "시신이 있던 커튼 뒤 바닥이 깨끗한 것을 확인하고 경악하는 C01",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height observer angle tilting slightly down, flat cold practical lighting with pale gray-green tones.",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jumper, an East Asian young woman in her early 20s, stands in the middle-left midground at a three-quarter angle from the right, leaning slightly over the fabric edge and looking down toward the spotless empty floor behind the curtain in the lower-right background. Captured from an observer's perspective at chest height angled slightly down, the composition compresses her visibly exhausted, bloodless face and dark long hair against the unsettlingly clean space. A pale beige curtain hangs straight down as a vertical frame divider near the right side, exposing a bare gray floor devoid of any marks. A neatly arranged bed sits obliquely in the left midground, its flat covers perfectly tidy. Flat, cold practical light fills the room, casting a cold gray-green tone over the immaculately clean surfaces and accentuating the severe fatigue in her expression.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고, 침대 위에 붉은 표식은 물론 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
              "얼굴이 파리해지는 수리영.",
              "시신이 사라진 텅 빈 커튼 뒤 바닥을 멍하니 내려다보는 수리영의 파리해진 얼굴."
            ],
            "visual_inferences": [
              "Suri-young leans slightly over the curtain edge to inspect the exact spot where the body used to be.",
              "The pale beige curtain acts as a stark vertical divider in the frame, separating her from the disturbingly clean empty floor."
            ],
            "creative_decisions": [
              "Chest-height camera angled slightly down to capture both her shocked, drained facial expression and the pristine empty floor she is looking at.",
              "Cold, flat practical lighting is used to drain warmth from the room, making her pale skin and the eerie cleanliness of the space stand out against a gray-green tone."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "backpack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bed",
                "usage_kind": "anchor",
                "source_phrase": "neatly arranged bed sits obliquely in the left midground"
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "anchor",
                "source_phrase": "pale beige curtain hangs straight down as a vertical frame divider"
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "doll",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "252f548e922ecf2a",
              "owned_hash": "39261047e4552b32",
              "camera_direction_hash": "e22d43dd37153e4e",
              "owned_usage_hash": "f427bc1598eea769",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bed",
                  "violating_phrase": "A neatly arranged bed sits obliquely in the left midground, its flat covers perfectly tidy.",
                  "reason": "The prompt describes the state and position of the existing bed to anchor the background composition, which aligns with the producer's declaration and is not a redraw.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curtain",
                  "violating_phrase": "A pale beige curtain hangs straight down as a vertical frame divider near the right side",
                  "reason": "The prompt refers to the curtain as a composition anchor and vertical frame divider, which matches the producer's declaration and does not violate the redraw restriction.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "수리영의 옥탑방 배경(L04B07)과 이전 샷(S5_Shot8)의 정확한 배경 상태를 공유하여 일관성 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the room near the bed, the camera has dollyed to within about one meter of 수리영 at chest height and angles slightly down so her drained face and the empty floor line behind the curtain share the frame. The lens tightens just enough to compress her with the spotless absence behind her, keeping the curtain edge as a vertical divider near the right side.",
            "lighting_mood": "The room is lit in flat, cold practical light, with pale beige fabric and gray floor tones making 수리영’s face look bloodless.",
            "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": "empty floor behind curtain",
                  "screen_zone": "lower_right",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "empty floor behind curtain",
                  "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": "L04B07",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "backpack",
              "bed",
              "chair",
              "curtain",
              "dining table",
              "doll",
              "door",
              "kitchen counter",
              "shelf",
              "stand",
              "wardrobe",
              "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": "suri_young_base_appearance",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A young female student in her late teens or early twenties with a noticeably pale, bloodless complexion. She looks severely exhausted, reflecting her overworked state from studying and part-time jobs. She is dressed in ordinary, casual everyday clothing suitable for a busy student, and her overall physical demeanor remains completely drained.",
                "applies_to_shots": [
                  5,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "네가 요즘 과로했잖아. 공부에다 알바까지...",
                  "얼굴이 파리해지는 수리영.",
                  "수리영’s face look bloodless.",
                  "학생? 장난전화 하면 안 되는 거 몰라?"
                ],
                "visual_inferences": [
                  "She wears casual, slightly worn clothing that reflects her tight schedule balancing study and part-time work."
                ],
                "creative_decisions": [
                  "Her pale complexion is maintained across shots to visually convey her deep psychological shock and severe physical fatigue."
                ],
                "confidence": "high"
              },
              {
                "element_id": "spotless_curtain_and_floor",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pale beige curtain hanging still in the bedroom, along with the floor space immediately behind and around it. Both the curtain fabric and the floor are immaculately clean, devoid of any bloodstains, messy debris, or hidden bodies. The area maintains an unnervingly tidy and cold gray-green appearance.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고, ... 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
                  "spotless curtain hangs still in the background where the body and blood should have been.",
                  "pale beige fabric and gray floor tones",
                  "empty floor line behind the curtain"
                ],
                "visual_inferences": [
                  "The floor is a typical bare surface like wood or linoleum, making its total cleanliness stark and obvious."
                ],
                "creative_decisions": [
                  "The absolute absence of any gruesome mess is highlighted to create a cold, oppressive emptiness in the room."
                ],
                "confidence": "high"
              },
              {
                "element_id": "tidy_bed",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A neatly arranged bed positioned to one side of the bedroom. The bed linens are perfectly tidy, showing absolutely no red marks, bloodstains, or signs of physical disturbance.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "침대 위에 붉은 표식은 물론...",
                  "The bed sits to one side",
                  "Inside the room near the bed"
                ],
                "visual_inferences": [
                  "The bed covers are tightly made and flat, matching the unnatural and meticulous neatness of the room."
                ],
                "creative_decisions": [
                  "Positioning the bed as a perfectly clean background element that anchors the geometric stillness of the bedroom."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "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": "L04B07",
                "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": "e023baf05a6bc906"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "사라진 시신, 위로하는 혜수",
        "representative_moment": "혜수가 고개 숙인 수리영의 어깨를 양손으로 굳게 쥐고 위로한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye level frontal medium shot with a tired warm practical light against cold room tones",
            "t2i_prompt": "Photorealistic cinematic still. In the same dim apartment room, C02O03 in a dark blouson, a Korean middle-aged woman, facing the camera from the waist up, squared to the lens. Her hands are firmly gripping the shoulders of C01O01 in a casual jacket, a Korean young woman, who shares the same standing space. C02O03 has her eyes fixed on C01O01. C01O01 is positioned with her back to the camera in the foreground center, her head bowed inward and looking down, her upper back forming a collapsed shape reflecting a severely exhausted state. A tired warm practical light from an off-screen lamp spills across C02O03's visible front planes, fighting the cold gray room tones, giving the hands a small human warmth against the muted background.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "혜수 (수리영 어깨를 어루만지며) 영아.",
              "Shot 10: 고개를 푹 숙인 수리영의 어깨를 양손으로 따뜻하게 감싸 쥔 혜수의 정면.",
              "C02: facing_camera, hands gripping shoulders, gaze=looks_at_character→C01",
              "C01: back_to_camera, head bowed inward, gaze=down"
            ],
            "visual_inferences": [
              "fixed_element character_state: C01 severely exhausted, upper back forming a collapsed shape",
              "tired warm practical light falling on C02's front planes against the cold room",
              "medium framing emphasizing the upper bodies and the emotional connection"
            ],
            "creative_decisions": [
              "restrained frontal medium shot at eye level to emphasize the contrast between C02's steadiness and C01's collapsed state",
              "foreground-background arrangement with C01's back to camera to focus on C02's comforting expression",
              "warm light specifically catching the hands to highlight the human warmth amid the supernatural confusion"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "backpack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "doll",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "42b3370fef5cd8f5",
              "owned_hash": "39261047e4552b32",
              "camera_direction_hash": "a444264d16df4662",
              "owned_usage_hash": "97318422d9a0d2d7",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "exact_background continuity from S14_Shot5",
        "_shot_index": 10,
        "visible_entities": [
          "C01",
          "C02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "In the main room at eye level, the camera holds a restrained frontal medium shot about 1.2 meters from 혜수 and 수리영. 혜수 is squared toward the lens with both hands centered on 수리영’s lowered shoulders, while 수리영’s bowed head and upper back form a smaller, collapsed shape in the foreground center.",
            "lighting_mood": "A tired warm practical light fights the cold room tones, giving 혜수’s hands a small human warmth amid the gray apartment.",
            "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",
              "C02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C02",
                "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": "L04B07",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "backpack",
              "bed",
              "chair",
              "curtain",
              "dining table",
              "doll",
              "door",
              "kitchen counter",
              "shelf",
              "stand",
              "wardrobe",
              "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": "suri_young_base_appearance",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A young female student in her late teens or early twenties with a noticeably pale, bloodless complexion. She looks severely exhausted, reflecting her overworked state from studying and part-time jobs. She is dressed in ordinary, casual everyday clothing suitable for a busy student, and her overall physical demeanor remains completely drained.",
                "applies_to_shots": [
                  5,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "네가 요즘 과로했잖아. 공부에다 알바까지...",
                  "얼굴이 파리해지는 수리영.",
                  "수리영’s face look bloodless.",
                  "학생? 장난전화 하면 안 되는 거 몰라?"
                ],
                "visual_inferences": [
                  "She wears casual, slightly worn clothing that reflects her tight schedule balancing study and part-time work."
                ],
                "creative_decisions": [
                  "Her pale complexion is maintained across shots to visually convey her deep psychological shock and severe physical fatigue."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "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": "C02O03",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L04B07",
                "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": "ba25233ab0995ec2"
      },
      {
        "scene_index": 15,
        "heading": "S#15. 해안가. 버스정류장 부근 / N",
        "beat_title": "불확실성 속의 기다림",
        "representative_moment": "어두운 밤바다를 배경으로 정류장 벤치에 웅크리고 앉아 허공을 응시하는 C01.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Voyeuristic low-angle composition with blue-black coastal darkness and faint sodium edge lighting.",
            "t2i_prompt": "Photorealistic cinematic still. Low observer at bench height on the seaward side of the bus stop, the damp bench running laterally across the lower frame. C01O01 in casual activewear, a Korean young woman with dark long hair and clear facial features, positioned in the lower-left third in left profile, curled on the bench, gazing into the distance. Deep blue-black nighttime darkness and cold sea fog envelop the coastal environment, the dark ocean spreading behind her as a large negative space. The wet, smudged shelter panels of the bus stop barely enclose the right side of the scene. Faint, muted sodium streetlights cast a dim, moody glow, placing a faint sodium edge light tracing her shoulders and jawline, body volume preserved against the dark ambient fill, focusing on the isolated figure against the vast emptiness of the fog-softened ocean.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#15 action: '바다를 바라보며 멍한 채로 앉아있는 수리영'",
              "shot description: curled on the bench at the lower-left third, gazing into the distance"
            ],
            "visual_inferences": [
              "fixed_element coastal_night_environment: Deep blue-black nighttime darkness, cold sea fog, and faint sodium streetlights",
              "Low camera position at bench height places her in the lower frame, emphasizing the large negative space of the ocean above and behind her"
            ],
            "creative_decisions": [
              "Voyeuristic side-profile framing to create a sense of being secretly watched",
              "Applying rim-lit silhouette rules to preserve body depth and jawline contour against the dim coastal night",
              "Using the smudged shelter panels on the frame edge to slightly box in the character without providing safety"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1e6d90dc606bbbf8",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "e5024ac2f9a5d93f",
              "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": [
          "L11",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 15,
            "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 low bench height on the seaward side of the bus stop, the camera holds a quiet wide side-profile frame about three meters from 수리영. She is curled on the bench at the lower-left third, while the dark ocean spreads behind her as a large negative space, with the bus stop structure barely enclosing the scene.",
            "lighting_mood": "Blue-black coastal darkness, salt fog, and a faint sodium edge light make her silhouette feel cold and abandoned.",
            "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": [
              "L11",
              "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": "coastal_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A coastal road and bus stop area enveloped in deep blue-black nighttime darkness and cold sea fog. The scene is sparsely illuminated by faint, muted sodium streetlights that cast a dim, moody glow across the damp surroundings.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Blue-black coastal darkness, salt fog, and a faint sodium edge light",
                  "Muted roadside sodium light and cold sea fog",
                  "receding blue-black road"
                ],
                "visual_inferences": [
                  "The sodium lights create a subtle color contrast against the vast dark blue-black environment."
                ],
                "creative_decisions": [
                  "Emphasizing the dense cold fog and stark, sparse lighting to establish a lonely and chilling atmosphere surrounding the characters."
                ],
                "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": "62bbfe202c20e9d5"
      },
      {
        "scene_index": 15,
        "heading": "S#15. 해안가. 버스정류장 부근 / N",
        "beat_title": "혜수의 외침과 멀어지는 수리영",
        "representative_moment": "혜수가 양손을 입에 모으고 짙은 안개 속으로 달려가는 수리영을 향해 소리친다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level wide framing with off-axis frontal angle on the foreground character, focusing on her cupped hands and calling expression against the deep blue-black fog.",
            "t2i_prompt": "Photorealistic cinematic still. C02O03 in a dark jacket, a Korean middle-aged woman, stands in the middle-left foreground, looking toward a Korean young woman down the coastal road, with the coastal road vanishing line extending into the middle-right background, the damp asphalt acting as a shared spatial anchor between them. Captured at a three-quarter angle from the right, C02O03's hands are cupped at her open mouth, her mature facial features warmed slightly by muted roadside sodium light. The Korean young woman is seen with her back to the camera, running mid-stride away along the receding road, one foot just lifted off the ground, her hair flowing back in the direction opposite to motion. The coastal night environment is enveloped in deep blue-black darkness and thickening cold sea fog that swallows the distant figure. Wet, unlit bus stop shelter panels sit obliquely near the left frame edge, catching faint dim reflections.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "A coastal road and bus stop area enveloped in deep blue-black nighttime darkness and cold sea fog.",
              "수리영 (달려간다)",
              "혜수 (등 뒤에 대고 소리친다)",
              "Muted roadside sodium light and cold sea fog flatten the scene, with 혜수’s face warmed slightly against the receding blue-black road."
            ],
            "visual_inferences": [
              "C02 stands at a three-quarter angle from the right, cupping her hands to her mouth to amplify her voice.",
              "The unregistered young woman (수리영) is frozen mid-stride, her hair flowing opposite to her forward motion.",
              "The wet bus stop shelter panels catch faint reflections from the distant sodium lights."
            ],
            "creative_decisions": [
              "Foreground-background spatial tension is established by placing C02 in the middle-left foreground and the vanishing line in the middle-right background.",
              "Warm sodium light on C02's face sharply contrasts with the cold blue-black fog swallowing the running figure."
            ],
            "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": "264a546f80bfc186",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "31336a6d0a611fa4",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 15,
        "dependency_reason": "동일 씬 내 이전 샷의 해안가 도로, 짙은 밤바다 안개, 희미한 가로등 조명의 환경 상태(coastal_night_environment)와 연속성 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 15,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Eye-level and diagonally between the bus stop and road, the camera finishes its pan on 혜수 about five meters away, using a slight off-axis frontal angle so her cupped hands and open calling mouth read clearly. The coastal road recedes behind and beside her, carrying 수리영’s small back-facing figure away into the foggy upper-right distance.",
            "lighting_mood": "Muted roadside sodium light and cold sea fog flatten the scene, with 혜수’s face warmed slightly against the receding blue-black 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": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "coastal road vanishing line",
                  "screen_zone": "middle_right",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "수리영 down the coastal road",
                  "label": "혜수",
                  "screen_zone": "middle_left",
                  "target_id": "C02",
                  "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": [
              "C02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "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": "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_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A coastal road and bus stop area enveloped in deep blue-black nighttime darkness and cold sea fog. The scene is sparsely illuminated by faint, muted sodium streetlights that cast a dim, moody glow across the damp surroundings.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Blue-black coastal darkness, salt fog, and a faint sodium edge light",
                  "Muted roadside sodium light and cold sea fog",
                  "receding blue-black road"
                ],
                "visual_inferences": [
                  "The sodium lights create a subtle color contrast against the vast dark blue-black environment."
                ],
                "creative_decisions": [
                  "Emphasizing the dense cold fog and stark, sparse lighting to establish a lonely and chilling atmosphere surrounding the characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 15,
                "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": "C02O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "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": "2bbe131c128f8da6"
      },
      {
        "scene_index": 16,
        "heading": "S#16. 경찰서 사무실 / N",
        "beat_title": "혜수의 불안한 진입과 전화 연결 시도",
        "representative_moment": "차가운 형광등 불빛 아래, 불안한 표정의 C02가 스마트폰을 귀에 댄 채 경찰서 문을 밀며 들어서는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level observer perspective tracking backward at medium distance, bathed in cold green-white fluorescent tones to emphasize institutional sterility.",
            "t2i_prompt": "Photorealistic cinematic still. C02O03 in a dark detective blouson, an East Asian middle-aged woman with a mid-40s face, dark neat hair, sharp facial impression, and mature features, facing the camera, standing at the open doorway of the door, a palm-sized black smartphone, P06, pressed to her ear with one hand. Her eyes fixed off-screen. Torso and head centered in the frame. The interior of the police office behind her is bathed in cold, green-white fluorescent lighting from overhead fluorescent fixtures, stripping away warmth and establishing a stale, chilling atmosphere over a duty desk in the dimly active background.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "사무실 안으로 들어오면서 민숙에게 전화를 거는 혜수",
              "형광등 불빛 아래 스마트폰을 귀에 댄 채 미간을 좁히며 경찰서 문을 밀고 선 혜수의 정면."
            ],
            "visual_inferences": [
              "fixed_element police_office_fluorescent_lighting: cold green-white fluorescent lighting stripping away warmth",
              "Duty desk space occupying the background as the door swings inward",
              "Anxious expression translating her off-screen gaze"
            ],
            "creative_decisions": [
              "Positioned the character's torso and head in the center frame to reflect medium distance framing",
              "Emphasized the harsh green-white glare on her sharp facial features to build atmospheric tension"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "anchor",
                "source_phrase": "a duty desk in the dimly active background"
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "standing at the open doorway of the door"
              },
              {
                "owned_token": "file cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fluorescent fixture",
                "usage_kind": "anchor",
                "source_phrase": "overhead fluorescent fixtures"
              },
              {
                "owned_token": "monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5414d29f623cdadc",
              "owned_hash": "3b10780732f50299",
              "camera_direction_hash": "7aeaeed773d33b28",
              "owned_usage_hash": "3a773d5b54475b5e",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "desk",
                  "violating_phrase": "a duty desk in the dimly active background",
                  "reason": "The desk is referenced solely to set the spatial background environment of the police office, aligning with the producer's declaration as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "standing at the open doorway of the door",
                  "reason": "The door is used as a spatial anchor to specify the character's position, with no request to redraw or modify the pre-existing background door.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fluorescent fixture",
                  "violating_phrase": "overhead fluorescent fixtures",
                  "reason": "The fluorescent fixtures are mentioned to establish the source of the cold, green-white lighting, serving as a background reference with no redraw instruction.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 1,
        "visible_entities": [
          "L12",
          "C02",
          "P06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "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 inside the police office just beyond the entrance, the eye-level camera faces the doorway at medium distance and dollies backward as 혜수 pushes in toward the lens with a smartphone pressed to her ear. She remains centered and frontal under the fluorescent wash, the door edge swinging behind her while the duty room opens dimly around her.",
            "lighting_mood": "Green-white fluorescent light strips away warmth, making the police office feel stale and procedural while her worry cuts through 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": 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": [
              "L12",
              "C02",
              "P06"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "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": "L12B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "chair",
              "desk",
              "door",
              "file cabinet",
              "fluorescent fixture",
              "monitor",
              "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_office_fluorescent_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the police office is bathed in cold, green-white fluorescent lighting. This harsh glare strips away warmth from the space, establishing a stale, procedural, and chilling atmosphere across the room.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "형광등 불빛 아래",
                  "Green-white fluorescent light strips away warmth, making the police office feel stale and procedural",
                  "Cold fluorescent glare reflects off the phone glass and desk, sharpening the urgency into a hard green-white office chill."
                ],
                "visual_inferences": [
                  "The lighting from the ceiling fixtures uniformly affects the entire duty room, creating an unwelcoming and austere environment."
                ],
                "creative_decisions": [
                  "Emphasize the cold green-white color temperature of the lighting to visually reflect the character's ominous foreboding and the emotional chill of the situation."
                ],
                "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": "C02O03",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L12B03",
                "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": "a9fbfff960321321"
      },
      {
        "scene_index": 16,
        "heading": "S#16. 경찰서 사무실 / N",
        "beat_title": "불길한 예감과 위치 추적 요구",
        "representative_moment": "혜수가 당직 중인 김형사의 눈앞에 민숙의 번호가 뜬 스마트폰 화면을 바짝 들이미는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Very close observer perspective at desk height with shallow focus",
            "t2i_prompt": "Photorealistic cinematic still. C02O03 in a blue blouson, a Korean middle-aged woman, occupies the middle-left foreground reaching for the seated detective's eye line. The detective, a Korean man in his 30s in a brown leather jacket, sits in the middle-center midground. Captured from a very close observer perspective at desk height. C02O03, facing three-quarter left with her eyes fixed on the man, holds her arm thrust diagonally into the frame, her tense fingers wrapped around P06, a palm-sized modern black smartphone. P06 dominates the lower-center foreground, its lit screen angled toward the camera and the man, clearly displaying a saved contact interface. The man, in three-quarter right profile, keeps his eyes fixed on P06, his upper face hovering just behind the device in shallow focus. [: The horizontal plane of the duty desk sits beneath the phone, bathed in cold, green-white fluorescent lighting.] This harsh glare reflects off the desk surface and phone glass, stripping away warmth and establishing a chilling, procedural atmosphere. In the out-of-focus background behind the man, institutional paperwork on a notice board forms a blurry texture.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "핸드폰에 저장된 민숙번호 보여주며",
              "사무실 안에는 김형사 혼자 당직 근무 중이다.",
              "Very close at desk height, the camera sits just in front of 김형사’s seated eye line and angles toward 혜수’s extended hand"
            ],
            "visual_inferences": [
              "The lighting from the ceiling fixtures uniformly affects the duty room, creating an unwelcoming and austere environment.",
              "Shallow depth of field isolates the foreground smartphone and hands from the background elements."
            ],
            "creative_decisions": [
              "Emphasize the cold green-white color temperature of the lighting to visually reflect the character's ominous foreboding.",
              "Blur the institutional paperwork on the notice board to concentrate attention on the tense interaction centered around the glowing phone screen."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "file cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fluorescent fixture",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "36907aad55655ac9",
              "owned_hash": "3b10780732f50299",
              "camera_direction_hash": "d25f6ee71bda86af",
              "owned_usage_hash": "2f6c0fd30152dc2f",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 16,
        "dependency_reason": "Same police office location as Shot 1; requires consistent lighting and atmosphere.",
        "_shot_index": 3,
        "visible_entities": [
          "C02",
          "C06",
          "P06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Very close at desk height, the camera sits just in front of 김형사’s seated eye line and angles toward 혜수’s extended hand; the smartphone screen occupies the lower-center foreground without exceeding the frame, with 혜수’s tense fingers wrapped around it. 김형사’s eyes and upper face hover just behind the phone in shallow focus, while 혜수’s arm enters from the side as a firm diagonal demand.",
            "lighting_mood": "Cold fluorescent glare reflects off the phone glass and desk, sharpening the urgency into a hard green-white office chill.",
            "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": "reaches_for",
                  "gesture_target_label": "김형사's eye line",
                  "label": "혜수",
                  "screen_zone": "middle_left",
                  "target_id": "C02",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "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": [
              "C02",
              "C06",
              "P06"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "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": 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": [
              {
                "subject_id": "C06",
                "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": "L12B03",
            "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_office_fluorescent_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the police office is bathed in cold, green-white fluorescent lighting. This harsh glare strips away warmth from the space, establishing a stale, procedural, and chilling atmosphere across the room.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "형광등 불빛 아래",
                  "Green-white fluorescent light strips away warmth, making the police office feel stale and procedural",
                  "Cold fluorescent glare reflects off the phone glass and desk, sharpening the urgency into a hard green-white office chill."
                ],
                "visual_inferences": [
                  "The lighting from the ceiling fixtures uniformly affects the entire duty room, creating an unwelcoming and austere environment."
                ],
                "creative_decisions": [
                  "Emphasize the cold green-white color temperature of the lighting to visually reflect the character's ominous foreboding and the emotional chill of the situation."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 16,
                "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": "C02O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "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": "c7579025808fcd01"
      },
      {
        "scene_index": 17,
        "heading": "S#17. 옥탑방 / 동틀무렵",
        "beat_title": "쓸쓸한 옥탑방의 여명",
        "representative_moment": "푸르스름한 새벽 하늘 아래 노란 불빛이 새어 나오는 옥탑방 외부 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height observer framing, muted blue dawn ambience pierced by yellow window glow",
            "t2i_prompt": "Photorealistic cinematic still. Shot from a neighboring terrace at chest height, a small rooftop room occupies the middle distance beneath a bruised blue dawn sky. A wet parapet wall and neighboring roof deck frame the lower foreground emptiness. Slightly right of center, the rooftop room stands in the muted blue dawn ambience, its window glowing with a sickly warm yellow light. Coastal fog flattens the contrast into a damp occult stillness, the warm lit window cutting through the mist without revealing any figure.",
            "outfit_assignments": [],
            "source_facts": [
              "S#17 action: '새벽녘, 고양이 울음소리. 검은 고양이가 불이 켜져 있는 옥탑 방을 슬쩍 보더니 담을 넘는다'",
              "shot description: 여명이 밝아오는 푸르스름한 하늘 아래, 창문에 노란 불빛이 새어 나오는 옥탑방의 쓸쓸한 외부 전경."
            ],
            "visual_inferences": [
              "fixed_element previous_shot_refs: exact_background from S4_Shot1 (rooftop room exterior geometry preserved)",
              "wet surfaces reflecting the muted dawn light",
              "no figure is visible in the frame, emphasizing the eerie isolation"
            ],
            "creative_decisions": [
              "replaced 'wide shot' with explicit spatial framing: 'occupies the middle distance' and 'frame the lower foreground emptiness'",
              "used 'bruised blue dawn sky' and 'sickly warm yellow light' to heighten the K-occult horror-thriller atmosphere"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "clothesline",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drying platform",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "parapet wall",
                "usage_kind": "anchor",
                "source_phrase": "A wet parapet wall and neighboring roof deck frame the lower foreground emptiness"
              },
              {
                "owned_token": "roof deck",
                "usage_kind": "anchor",
                "source_phrase": "A wet parapet wall and neighboring roof deck frame the lower foreground emptiness"
              },
              {
                "owned_token": "rooftop room",
                "usage_kind": "anchor",
                "source_phrase": "a small rooftop room occupies the middle distance"
              },
              {
                "owned_token": "stairhead",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "water tank",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "its window glowing with a sickly warm yellow light"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8949e3ccedcb09e7",
              "owned_hash": "26546bcdc02e2b6d",
              "camera_direction_hash": "20e7bc49fec3f99b",
              "owned_usage_hash": "44b7e5e00e44b718",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "parapet wall",
                  "violating_phrase": "A wet parapet wall and neighboring roof deck frame the lower foreground emptiness",
                  "reason": "The prompt references the existing parapet wall as a framing element in the foreground, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "roof deck",
                  "violating_phrase": "neighboring roof deck frame the lower foreground emptiness",
                  "reason": "The prompt utilizes the existing roof deck for spatial composition, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rooftop room",
                  "violating_phrase": "a small rooftop room occupies the middle distance",
                  "reason": "The prompt references the rooftop room's position in the middle distance to establish composition, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "its window glowing with a sickly warm yellow light",
                  "reason": "The prompt specifies a lighting condition for the existing window rather than instructing to add or structurally alter it, validating the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "S4_Shot1의 옥탑방 배경(exact_background) 연속성 및 분위기 일관성 유지",
        "_shot_index": 1,
        "visible_entities": [
          "L03"
        ],
        "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": "From the neighboring rooftop terrace at chest height, the camera holds a wide, static view about eighteen meters away, placing the small rooftop room in the middle distance beneath a bruised blue dawn sky. The lit window sits slightly right of center, its warm rectangle cutting through fog while wet parapet lines and neighboring roof edges frame the emptiness without revealing any figure.",
            "lighting_mood": "Muted blue dawn ambience is pierced by one sickly warm yellow window glow, with coastal fog flattening the contrast into a damp occult 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": [
              "L03"
            ],
            "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": "L03B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cat",
              "clothesline",
              "door",
              "drying platform",
              "parapet wall",
              "roof deck",
              "rooftop room",
              "stairhead",
              "water tank",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "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": "L03B01",
                "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": "c71e6ab965313f5c"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "수리영의 안도와 긴장",
        "representative_moment": "C01 looks down at the unnaturally clean floor in relief, her tense side profile illuminated by the cool morning light.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Slightly lowered shoulder-side close framing, tense side profile composition with cool, dull morning daylight and a weak yellow interior spill.",
            "t2i_prompt": "Photorealistic cinematic still. From a slightly lowered shoulder-side observer position, C01O01 in a casual shirt, a Korean young woman with an early 20s face and dark long hair, occupies the left third of the frame in right profile, positioned leaning toward the window. Her face is in sharp focus, lips half-parted in a shallow exhale, eyes fixed downward on the lower-right area. A consistent cool, dull morning daylight filters in, illuminating the lower frame, with a weak yellow interior spill clinging to her face. [L04: An unnaturally clean, dry floor occupies the lower right as empty negative space, positioned below the opened curtains. The curtain panels are pulled outward to both sides behind her profile, their inner folds facing the camera. A faintly fogged, cool-toned bedroom window glass and a tidy, scrubbed-looking wall with hard vertical window frames enclose the space.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "지나치리만큼 깨끗하게 정돈된 방안. 창문에 다가가 커튼을 확 열어젖힌다. 시신은 없다.",
              "안도의 한숨을 내쉬듯 입술을 반쯤 벌린 채 시신이 없는 깨끗한 창가 바닥을 내려다보는 수리영의 측면."
            ],
            "visual_inferences": [
              "fixed_element house_morning_daylight: A consistent cool, dull morning daylight filters into the space.",
              "The opened curtains frame the sides of the window behind her, serving as vertical framing elements.",
              "The floor in the lower right highlights the unnaturally clean absence of the body."
            ],
            "creative_decisions": [
              "Used close framing on her right profile positioned on the left third to emphasize her tense expression and shallow exhale.",
              "Placed the clean floor in the lower right as accusatory negative space.",
              "Contrasted cool morning daylight on the floor with weak yellow interior spill on her face for an eerie, sanitized mood."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ceiling",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light fixture",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8b27fb8eecfd5914",
              "owned_hash": "4714fc7ccf556b0f",
              "camera_direction_hash": "6e4a640f9d3e6a76",
              "owned_usage_hash": "6f313eaecf1111f7",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "Same room location (L04) referenced from prior shot, sharing the morning daylight and spatial layout, though the background reference is skipped due to close framing.",
        "_shot_index": 5,
        "visible_entities": [
          "L04",
          "C01"
        ],
        "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": "Just inside the room, the camera has tracked to a slightly lowered shoulder-side position beside 수리영, holding her tense side profile on the left third while the unnaturally clean floor below the opened curtains remains visible in the lower right. The frame is tight enough to read her half-parted lips and shallow exhale, but keeps the empty window area as the accusatory negative space she is checking.",
            "lighting_mood": "Cool morning light washes the clean floor while a weak yellow interior spill clings to 수리영’s face, making the room feel sanitized rather than safe.",
            "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": [
              "L04",
              "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": "L04B04",
            "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": "house_morning_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A consistent cool, dull morning daylight filters into the various interior spaces of the house. This diffuse natural light provides a weak, slightly sickly base illumination that unifies the different rooms, keeping colors muted and shadows soft to reflect an unsettling, eerie atmosphere.",
                "applies_to_shots": [
                  5,
                  11,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "Cool morning light washes the clean floor (Shot 5)",
                  "Greenish bathroom daylight (Shot 11)",
                  "A dull domestic daylight base (Shot 14)"
                ],
                "visual_inferences": [
                  "The entire house shares the same weak early morning natural lighting condition, connecting the distinct rooms visually despite being different physical spaces."
                ],
                "creative_decisions": [
                  "Emphasized the cool, dull, and sickly qualities of the daylight across all rooms to enhance the hallucinatory and anxious mood of the protagonist's experience."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "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": "49fc0a285f908658"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "거울 속 환영",
        "representative_moment": "거울에 비친 욕실 뒷벽에 기괴하고 선명한 핏빛 원형 표식(P13)이 떠오른 순간",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At sink height, close framing squarely aligned into the mirror with shallow depth of field, greenish sickly daylight contrasting with the red mark",
            "t2i_prompt": "Photorealistic cinematic still. [L04: At sink height, the curved front edge of a wet porcelain sink rim occupies the lower foreground frame, leading up to a squarely aligned bathroom mirror.] Inside the left-right reversed reflection of the glass, P13, a vivid blood-red circular mark, sits sharply in the mid-frame against the pale tile of the rear bathroom wall. Faint moisture streaks and fresh water droplets cling to the mirror surface, softening the edges of the trapped image. A consistent cool, dull morning daylight provides a weak, slightly sickly base illumination, casting a greenish haze over the muted porcelain whites. The sharp crimson of P13 ruptures the eerie, diffuse atmosphere, with shallow depth of field isolating the terrifying mark within the damp, unreliable reflection.",
            "outfit_assignments": [],
            "source_facts": [
              "거울 속 반사된 욕실 벽면에 선명한 핏빛 원형 표식이 맺혀 있는 기괴한 순간 (Shot description)",
              "거울에 비친 욕실 벽에 갑자기 또 발생하는 붉은 원 (Scene text)"
            ],
            "visual_inferences": [
              "fixed_element house_morning_daylight: A consistent cool, dull morning daylight provides a weak, slightly sickly base illumination",
              "Water droplets and moisture streaks on the mirror surface from recent use",
              "Left-right reversed reflection characteristic of a mirror surface"
            ],
            "creative_decisions": [
              "Close framing at sink height to anchor the shot in the physical room while focusing entirely on the impossible reflection",
              "Greenish bathroom daylight color grading to create a sickly mood that contrasts sharply with the vivid blood-red mark",
              "Shallow depth of field to emphasize the mark trapped inside the reflective surface"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mirror",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shower drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "toilet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1c30d14a894fcbdf",
              "owned_hash": "37ad8f772ed5fa59",
              "camera_direction_hash": "771b067409136721",
              "owned_usage_hash": "2844ac72e251ca12",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "수리영의 집 내부 공간 분위기 (거울 속 반사된 방의 톤) 연속성 유지",
        "_shot_index": 11,
        "visible_entities": [
          "L04",
          "P13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At sink height inside the bathroom, the camera is aligned squarely into the mirror so the reflected rear wall takes priority over the room itself. The blood-red circular mark sits sharp in the reflected mid-frame, while the mirror edge, damp sink line, and shallow focus make the image feel trapped inside a left-right reversed surface.",
            "lighting_mood": "Greenish bathroom daylight and dull porcelain whites are ruptured by the sharp blood-red circle, with moisture haze making the reflected image feel sickly and unreliable.",
            "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": [
              "L04",
              "P13"
            ],
            "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": "L04B05",
            "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": "house_morning_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A consistent cool, dull morning daylight filters into the various interior spaces of the house. This diffuse natural light provides a weak, slightly sickly base illumination that unifies the different rooms, keeping colors muted and shadows soft to reflect an unsettling, eerie atmosphere.",
                "applies_to_shots": [
                  5,
                  11,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "Cool morning light washes the clean floor (Shot 5)",
                  "Greenish bathroom daylight (Shot 11)",
                  "A dull domestic daylight base (Shot 14)"
                ],
                "visual_inferences": [
                  "The entire house shares the same weak early morning natural lighting condition, connecting the distinct rooms visually despite being different physical spaces."
                ],
                "creative_decisions": [
                  "Emphasized the cool, dull, and sickly qualities of the daylight across all rooms to enhance the hallucinatory and anxious mood of the protagonist's experience."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "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": "f84abeafe6be1de2"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "기괴하게 일그러진 엄마의 사진",
        "representative_moment": "수리영이 거실 식탁에 놓인 P10 액자 속 C18의 일그러진 얼굴을 바라본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "intimate close framing from a slightly downward subjective angle, cool sickly daylight with a bruised red-brown cast on the photograph",
            "t2i_prompt": "Photorealistic cinematic still. P10, a glossy framed family photograph, occupies most of the frame from a slightly downward angle, resting diagonally on [L04B05: a dim, tidy dining table surface] barely visible at the lower frame edge. Inside P10, the printed portrait of C18 in beige knitwear, a Korean middle-aged woman with dark hair, is facing the camera, eyes looking at the camera. Her early-40s face is a grounded hallucination, showing a distorted facial outline and a melting facial shape smeared downward within the glossy print under a bruised red-brown cast. The clean photo frame glass catches a faint strip of room light reflecting across the melting face, partially veiling the features. A consistent cool, dull morning daylight filters into the space, providing a weak, sickly base illumination.",
            "outfit_assignments": [
              {
                "character_id": "C18",
                "outlook_id": "O14"
              }
            ],
            "source_facts": [
              "S#18 action: 환하게 웃는 엄마 얼굴이 뭉개져 흘러내린다",
              "shot description: 사진 속, 얼굴이 기괴하게 일그러져 뭉개진 민숙의 섬뜩한 이미지 클로즈업"
            ],
            "visual_inferences": [
              "fixed_element house_morning_daylight: A consistent cool, dull morning daylight provides a weak, slightly sickly base illumination",
              "The table surface acts as a physical grounding scale reference at the lower edge of the frame, lying diagonally beneath the frame"
            ],
            "creative_decisions": [
              "Framed P10 prominently from a slightly downward angle to emphasize the intimate, unstable subjective perspective",
              "Applied a bruised red-brown cast strictly to the printed face inside P10, contrasting with the cool ambient room light to ground the hallucination"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "prop"
            ],
            "owned_object_usage": [
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mirror",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shower drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "toilet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f0058c85bdd3c976",
              "owned_hash": "37ad8f772ed5fa59",
              "camera_direction_hash": "55e0092cfacaea42",
              "owned_usage_hash": "2844ac72e251ca12",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "Shot 12 is referenced for location/background consistency (house interior environment).",
        "_shot_index": 14,
        "visible_entities": [
          "C18",
          "P10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 14
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From 수리영’s near-subjective position beside the dining table, the handheld camera pushes into an intimate close-up of the framed family photograph until the mother’s distorted printed face occupies most of the frame without losing the photo border. The angle is slightly downward and unstable, with the table edge barely visible as a scale reference while the melting features seem to crawl within the glossy print.",
            "lighting_mood": "A dull domestic daylight base is infected by a bruised red-brown cast over the photograph, turning the familiar family image into a grounded hallucination rather than a supernatural spectacle.",
            "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": [
              "C18",
              "P10"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C18",
                "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": 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": [
              {
                "subject_id": "C18",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "The visible subject is a distorted printed image inside a photograph, not the physical person in the room. A base identity reference is enough; outlook-specific matching could conflict with the hallucinated melting face."
              }
            ],
            "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": "L04B05",
            "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": "house_morning_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A consistent cool, dull morning daylight filters into the various interior spaces of the house. This diffuse natural light provides a weak, slightly sickly base illumination that unifies the different rooms, keeping colors muted and shadows soft to reflect an unsettling, eerie atmosphere.",
                "applies_to_shots": [
                  5,
                  11,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "Cool morning light washes the clean floor (Shot 5)",
                  "Greenish bathroom daylight (Shot 11)",
                  "A dull domestic daylight base (Shot 14)"
                ],
                "visual_inferences": [
                  "The entire house shares the same weak early morning natural lighting condition, connecting the distinct rooms visually despite being different physical spaces."
                ],
                "creative_decisions": [
                  "Emphasized the cool, dull, and sickly qualities of the daylight across all rooms to enhance the hallucinatory and anxious mood of the protagonist's experience."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "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",
                "id": "C18",
                "policy": "required"
              },
              {
                "kind": "prop",
                "id": "P10",
                "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": 18,
                "shot_indices": [
                  14
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P10",
                  "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": "afe60fa62489e3e1"
      },
      {
        "scene_index": 19,
        "heading": "S#19. 마트 / D",
        "beat_title": "마트 직원 추궁",
        "representative_moment": "높은 진열대 사이에서 남자 직원의 눈을 똑바로 쳐다보는 수리영의 굳은 표정.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close dolly-in framing, cool fluorescent lighting with shallow focus",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a Korean young woman in her early 20s, at three-quarter angle from the right with shoulders squared forward, maintains a rigid and firm facial expression, her facial muscles taut and jaw set, displaying a tense and determined demeanor without any relaxed features. Her face is placed tight in the center-left, compressed between tall shelf walls, her eyes fixed on the man at the right edge. Sharing the same narrow space, a Korean middle-aged man in worker uniform appears as a partial shoulder-and-cheek presence at the right edge in an over-shoulder view, leaning beside the shelf, eyes fixed on C01O01. [L09: narrow aisle formed by tall grocery shelves running away from camera, front edges forming dark vertical bands, product label rows visible as muted colored strips along the shelf edges]. Cool mart fluorescents drain the skin tones, muted shelf colors box in her face, shallow focus blurring the product labels in the background.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#19 action: 수리영이 어제 만났던 남자 직원을 찾는다",
              "shot description: 높은 진열대 사이에서 남자 직원의 눈을 똑바로 쳐다보는 수리영의 굳은 표정"
            ],
            "visual_inferences": [
              "fixed_element suri_young_firm_face: rigid and firm facial expression, taut facial muscles, jaw set without relaxed features",
              "over-the-shoulder perspective with male employee as a partial framing element on the right edge",
              "cool mart fluorescents draining skin tones to emphasize a clinical, investigative tension"
            ],
            "creative_decisions": [
              "Close framing scale applying vertical pressure around C01's face using the dark edges of the grocery shelves",
              "Shallow depth of field to isolate C01's rigid expression against the muted, blurred product labels"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "checkout counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "display window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "exit door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "produce island",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "swing door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tile floor",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "2dcdff71803d7ba4",
              "owned_hash": "305167adc568bd2f",
              "camera_direction_hash": "65e7bc936448c345",
              "owned_usage_hash": "6e28b68fc967b209",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "L09",
          "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": "Inside the narrow aisle, the camera continues the dolly-in from eye level and compresses 수리영 between two tall shelf walls, placing her firm face tight in the center-left while 남자 직원 remains a partial shoulder-and-cheek presence at the right edge. The shelves form vertical bars around her, and the shallow focus lets her locked eyeline carry the confrontation rather than cutting to a conventional reverse.",
            "lighting_mood": "Cool mart fluorescents drain the skin tones while muted shelf colors box in 수리영’s face, keeping the tension practical and airless.",
            "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": [
              "L09",
              "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": "L09B01",
            "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": "suri_young_firm_face",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A young Korean woman maintains a rigid and firm facial expression. Her facial muscles are taut and her jaw is set, displaying a tense and determined demeanor without any relaxed features. This serious facial state remains identical whether she is confronting someone or looking up at a surveillance camera.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "close",
                "source_facts": [
                  "수리영의 굳은 표정",
                  "firm face tight in the center-left",
                  "chin raised rigid",
                  "upturned face"
                ],
                "visual_inferences": [
                  "Her minimal, natural morning look highlights the underlying tension and rigidness in her facial expression across both indoor and outdoor lighting conditions."
                ],
                "creative_decisions": [
                  "Focusing on the tautness of her jawline and unyielding expression to carry the emotional continuity and investigative tension of 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": "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": "1f542fa289c84c4e"
      },
      {
        "scene_index": 19,
        "heading": "S#19. 마트 / D",
        "beat_title": "CCTV 위치 확인과 서늘한 시선",
        "representative_moment": "마트 밖에서 CCTV 위치를 확인하며 고개를 들어 카메라를 쏘아보는 수리영(C01).",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Overhead high angle from a CCTV-adjacent position, flat early daylight",
            "t2i_prompt": "Photorealistic cinematic still. Overhead high angle from above, looking steeply down from the exterior wall. C01O01 in a casual outfit, a Korean young woman, facing the camera with her chin raised rigid, looking up directly into the lens. The top of her head and shoulders occupy the lower-center frame, her dark long hair falling back. She maintains a rigid and firm facial expression, facial muscles taut and jaw set, displaying a tense and determined demeanor without any relaxed features, preserving her early 20s face with clear facial features and a natural complexion. The plain, morning-damp mart exterior wall drops vertically behind her, with a slice of the dull overcast morning sky visible at the upper edge. Flat early daylight and the wall's grey-green cast leave her upturned face exposed, accented only by a faint gold edge from the low morning sun catching her jawline. Far below in the deep background, the tile floor and drying pavement anchor the steep height difference.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영: facing_camera, chin raised rigid, gaze=camera, state=alive",
              "수리영의 굳은 표정",
              "firm face tight in the center-left",
              "upturned face",
              "엄마와 남자 직원 CCTV 위치를 확인하다"
            ],
            "visual_inferences": [
              "Overhead high angle simulating the CCTV's steep downward POV",
              "Her minimal, natural morning look highlights the underlying tension and rigidness in her facial expression across outdoor lighting conditions"
            ],
            "creative_decisions": [
              "Placed the top of her head and shoulders in the lower-center frame to emphasize the steep vertical drop and the oppressive feeling of the surveillance camera",
              "Used flat grey-green daylight with a faint gold edge to highlight her determined, upturned face against the dull 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": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "checkout counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "display window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "exit door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "produce island",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "swing door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tile floor",
                "usage_kind": "anchor",
                "source_phrase": "the tile floor and drying pavement anchor the steep height difference"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "42c49bf970a5c5dc",
              "owned_hash": "305167adc568bd2f",
              "camera_direction_hash": "08070a9c15bd7c53",
              "owned_usage_hash": "46366b478f81b31b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "tile floor",
                  "violating_phrase": "the tile floor and drying pavement anchor the steep height difference",
                  "reason": "The prompt mentions the tile floor far below in the background to anchor the steep height difference, which acts as a composition anchor and aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 19,
        "dependency_reason": "Same mart environment; requires exact background consistency while changing the camera angle and character moment.",
        "_shot_index": 5,
        "visible_entities": [
          "L08",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "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 a high, CCTV-adjacent position on the exterior wall, the camera looks steeply down at 수리영 as she lifts her chin directly into the lens, making the surveillance point feel like an accuser. She is centered below with a slice of store wall and dull morning sky around her, her raised face confronting the exact place where evidence might exist.",
            "lighting_mood": "Flat early daylight and the wall’s grey-green cast make 수리영’s upturned face feel exposed, with no warmth except a faint gold edge from the low morning sun.",
            "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": [
              "L08",
              "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": "L09B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "ceiling light",
              "checkout counter",
              "display window",
              "exit door",
              "produce island",
              "shelf",
              "sliding door",
              "swing door",
              "tile floor"
            ],
            "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": "suri_young_firm_face",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A young Korean woman maintains a rigid and firm facial expression. Her facial muscles are taut and her jaw is set, displaying a tense and determined demeanor without any relaxed features. This serious facial state remains identical whether she is confronting someone or looking up at a surveillance camera.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "close",
                "source_facts": [
                  "수리영의 굳은 표정",
                  "firm face tight in the center-left",
                  "chin raised rigid",
                  "upturned face"
                ],
                "visual_inferences": [
                  "Her minimal, natural morning look highlights the underlying tension and rigidness in her facial expression across both indoor and outdoor lighting conditions."
                ],
                "creative_decisions": [
                  "Focusing on the tautness of her jawline and unyielding expression to carry the emotional continuity and investigative tension of the scene."
                ],
                "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": "C01O01",
                "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": "5ede22a90aa15eff"
      },
      {
        "scene_index": 20,
        "heading": "S#20. 마트 총무과 / 실내",
        "beat_title": "형체를 알 수 없는 CCTV 화면과 깊어지는 불안",
        "representative_moment": "양손을 꽉 쥔 채 고개를 푹 숙인 수리영(C01)의 굳은 옆얼굴 뒤로 CCTV 모니터가 흐릿하게 빛난다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At head height beside and slightly behind the seated subject, close framing on her rigid side profile with hands in the lower foreground, cool fluorescent and localized monitor glow.",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in casual activewear, a Korean young woman with dark long hair and clear facial features, seated in left profile. The camera is positioned at head height beside and slightly behind her, focusing on her rigid side profile. Her head is bowed, gazing down at her tightly clasped hands occupying the lower foreground. In the soft background, the edge of the office desk holds the out-of-focus CCTV monitor. The monitor's front screen faces diagonally toward the camera, displaying indistinct dark surveillance footage. Stale fluorescent ceiling lights and the monitor's localized blue-grey glow illuminate her tense side profile and clenched fingers in cool tones, with the hands catching the hardest highlights. The far edge of the frame is enclosed by a [: plain, beige-grey worn partition wall of a security office, blurred in a harsh grey-green ambient atmosphere].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Shot 3 description: 양손을 꽉 쥔 채 고개를 푹 숙인 수리영의 굳은 옆얼굴.",
              "DP instruction: The CCTV desk and monitor glow stay soft behind her.",
              "DP instruction: The monitor’s front screen faces diagonally toward camera, showing indistinct dark surveillance footage."
            ],
            "visual_inferences": [
              "fixed_element cctv_monitor_desk: The monitor casts a faint bluish light onto the area immediately surrounding it.",
              "fixed_element cold_office_fluorescence: Stale, cold fluorescent ceiling lights create a harsh, grey-green ambient atmosphere.",
              "The tightly clasped hands positioned in the lower foreground highlight the physical manifestation of her deep anxiety."
            ],
            "creative_decisions": [
              "Close framing explicitly focuses on Su-ri-young's rigid side profile and clasped hands, intentionally blurring the monitor in the background to comply with the skipped_close_framing background rule.",
              "Used a localized blue-grey glow on her face and hands contrasting with a generic plain beige-grey partition wall to emulate the requested institutional security office setting without relying on the forbidden L10 background ID."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cable",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "equipment rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "filing cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fluorescent light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "keyboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "notice board",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "paper",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "47c8e1ce3c51578c",
              "owned_hash": "75236b01cc279d8c",
              "camera_direction_hash": "a1f322570e100938",
              "owned_usage_hash": "875c19002ae2ac0e",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 3,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 20,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Beside and slightly behind seated 수리영 at head height, the tracking camera lowers just enough to catch her tightly clasped hands in the lower foreground before settling on her rigid side profile. The CCTV desk and monitor glow stay soft behind her, while her bent head and clenched fingers form a single anxious line through the frame.",
            "lighting_mood": "The monitor’s blue-grey glow and stale fluorescent light carve 수리영’s profile into a tense, colorless shape, with her hands catching the hardest highlights.",
            "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": "L10B01",
            "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": "cctv_monitor_desk",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "An office desk holding a CCTV monitor that emits a distinct blue-grey glow. The monitor remains stationary on the desk, serving as the focal point of the scene and casting a faint bluish light onto the area and people immediately surrounding it.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "CCTV desk and monitor glow stay soft behind her",
                  "monitor’s blue-grey glow",
                  "seated Korean male across the desk",
                  "CCTV monitor adding a faint blue cast"
                ],
                "visual_inferences": [
                  "The monitor is positioned directly on the desk where the security guard sits, facing outward so characters standing or sitting nearby can view it."
                ],
                "creative_decisions": [
                  "The desk is cluttered with typical security office items, but the glowing monitor remains the visually dominant prop."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_office_fluorescence",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The general affairs office is illuminated by stale, cold fluorescent ceiling lights. This overhead lighting creates a somewhat harsh, grey-green ambient atmosphere throughout the room, contrasting with the localized blue glow of the monitor.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "stale fluorescent light",
                  "Cold office fluorescence holds the palette in grey-green tones"
                ],
                "visual_inferences": [
                  "The light comes from standard rectangular overhead fluorescent fixtures common in back-office environments."
                ],
                "creative_decisions": [
                  "Maintained a sterile, slightly oppressive color palette to reflect the tense and anxious mood of 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": "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": "927d2fd6857ceb5b"
      },
      {
        "scene_index": 20,
        "heading": "S#20. 마트 총무과 / 실내",
        "beat_title": "CCTV 원본 확보 결정",
        "representative_moment": "혜수가 단호한 표정으로 모니터에서 고개를 돌려 책상 너머의 보안팀 직원을 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium-close side angle, cold fluorescent lighting with a faint blue cast.",
            "t2i_prompt": "Photorealistic cinematic still. C02O03 in a dark detective jacket, a Korean middle-aged woman with dark neat hair and a sharp facial impression, occupies the left frame in right profile, her head turned away from the screen, eyes fixed on a Korean man in worker uniform. The man sits on a chair at a three-quarter angle from the left, his eyes fixed on her across the shared office desk. The desk holds a CCTV monitor emitting a distinct blue-grey glow that illuminates C02O03's face. The monitor's screen face is angled partly toward the camera, displaying dark surveillance imagery as a dim block separating the two figures. Orderly filing cabinets and an office wall form the institutional background behind the man. A fluorescent light from the ceiling casts a harsh, grey-green ambient atmosphere throughout the room, contrasting with the localized cool blue screen reflection.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "혜수: 흠... 일단 어제 CCTV 전체 잠깐 가져가도 될까요?",
              "앞에 앉은 한국인 남성을 향해 단호한 눈빛으로 고개를 돌린 혜수의 측면.",
              "CCTV desk and monitor glow stay soft behind her",
              "stale fluorescent light"
            ],
            "visual_inferences": [
              "fixed_element cctv_monitor_desk: The CCTV monitor acts as a framing device and light source between the two characters.",
              "fixed_element cold_office_fluorescence: The ambient lighting is dominated by overhead fluorescence, creating a sterile procedural atmosphere.",
              "The two figures are anchored in the same space by the shared office desk."
            ],
            "creative_decisions": [
              "Framed C02O03 in right profile to emphasize her dominant eyeline and firm decision.",
              "Placed the unregistered extra partially behind the monitor to keep the narrative focus entirely on C02O03's reaction.",
              "Combined the grey-green ambient and blue-grey glow for a gritty, tense color palette."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cable",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "anchor",
                "source_phrase": "sits on a chair"
              },
              {
                "owned_token": "desk",
                "usage_kind": "anchor",
                "source_phrase": "across the shared office desk"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "equipment rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "filing cabinet",
                "usage_kind": "anchor",
                "source_phrase": "Orderly filing cabinets and an office wall"
              },
              {
                "owned_token": "fluorescent light",
                "usage_kind": "anchor",
                "source_phrase": "A fluorescent light from the ceiling casts a harsh, grey-green ambient"
              },
              {
                "owned_token": "keyboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "monitor",
                "usage_kind": "anchor",
                "source_phrase": "holds a CCTV monitor emitting a distinct blue-grey glow"
              },
              {
                "owned_token": "mouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "notice board",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "paper",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "79626c6613efa0be",
              "owned_hash": "75236b01cc279d8c",
              "camera_direction_hash": "4cfe086b939eccfa",
              "owned_usage_hash": "086574fe0a6978f3",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "chair",
                  "violating_phrase": "sits on a chair",
                  "reason": "The prompt mentions the chair solely to anchor the seated posture of the character, in line with the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "desk",
                  "violating_phrase": "across the shared office desk",
                  "reason": "The desk is referenced to establish spatial relations and position the characters in the scene, matching the producer's anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "filing cabinet",
                  "violating_phrase": "Orderly filing cabinets",
                  "reason": "The filing cabinets are mentioned to describe the background layout, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fluorescent light",
                  "violating_phrase": "A fluorescent light from the ceiling casts a harsh, grey-green ambient atmosphere",
                  "reason": "The fluorescent light is used as an environmental light source to establish the atmosphere, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "monitor",
                  "violating_phrase": "CCTV monitor emitting a distinct blue-grey glow",
                  "reason": "The monitor is referenced for scene composition and localized screen lighting effects without requiring a redraw, matching the producer's anchor echo.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 20,
        "dependency_reason": "previous_shot_refs specifies Scene 20 Shot 3 (exact_background) as a spatial and atmospheric anchor.",
        "_shot_index": 4,
        "visible_entities": [
          "C02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 20,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera continues the sideward track and stops at an eye-level medium-close side angle just forward of 혜수’s shoulder as she turns her head toward the seated 한국인 남성 across the desk. He remains present but secondary near the opposite edge, partially framed by the monitor, so her firm decision lands through her profile and eyeline rather than a centered two-shot.",
            "lighting_mood": "Cold office fluorescence holds the palette in grey-green tones, with the CCTV monitor adding a faint blue cast to 혜수’s determined profile.",
            "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": [
              "C02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "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": 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": "L10B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cable",
              "chair",
              "desk",
              "door",
              "equipment rack",
              "filing cabinet",
              "fluorescent light",
              "keyboard",
              "monitor",
              "mouse",
              "notice board",
              "paper",
              "table",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "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": "cctv_monitor_desk",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "An office desk holding a CCTV monitor that emits a distinct blue-grey glow. The monitor remains stationary on the desk, serving as the focal point of the scene and casting a faint bluish light onto the area and people immediately surrounding it.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "CCTV desk and monitor glow stay soft behind her",
                  "monitor’s blue-grey glow",
                  "seated Korean male across the desk",
                  "CCTV monitor adding a faint blue cast"
                ],
                "visual_inferences": [
                  "The monitor is positioned directly on the desk where the security guard sits, facing outward so characters standing or sitting nearby can view it."
                ],
                "creative_decisions": [
                  "The desk is cluttered with typical security office items, but the glowing monitor remains the visually dominant prop."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_office_fluorescence",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The general affairs office is illuminated by stale, cold fluorescent ceiling lights. This overhead lighting creates a somewhat harsh, grey-green ambient atmosphere throughout the room, contrasting with the localized blue glow of the monitor.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "stale fluorescent light",
                  "Cold office fluorescence holds the palette in grey-green tones"
                ],
                "visual_inferences": [
                  "The light comes from standard rectangular overhead fluorescent fixtures common in back-office environments."
                ],
                "creative_decisions": [
                  "Maintained a sterile, slightly oppressive color palette to reflect the tense and anxious mood of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 20,
                "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": "C02O03",
                "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": "9f32289eabc1263e"
      },
      {
        "scene_index": 21,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "끔찍한 살인 사건 사진을 보고 경악하는 수리영",
        "representative_moment": "수리영(C01)이 책상 위에 널브러진 잔혹한 사건 사진들을 내려다보며 입을 벌린 채 충격으로 얼어붙어 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low dolly-in angle from just above the desk edge, close framing with shallow depth of field isolating the face",
            "t2i_prompt": "Photorealistic cinematic still. A low observer angle from just above the tabletop, focusing on C01O01 in a casual jacket, a Korean young woman with an early 20s face, dark long hair, and natural complexion. She is seated in an office chair at a detective's desk at a three-quarter angle from the left, upper body hunched over, eyes looking down. Her distinctly pale face, featuring clear facial features and a mouth open in shock, dominates the upper frame. In the lower foreground, [: a worn desk edge receding toward the character] is scattered with glossy, indistinct crime photographs facing upward, heavily blurred along the lower edge. Bleached, cool overhead fluorescent light drains her face, while the blurred photo gloss throws faint red-brown accents upward onto her skin. Behind her, the background is a soft-focus muted grey-blue negative space with a faint monitor glow, isolating the seated figure.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "사무실에 홀로 앉아있는 수리영",
              "혜수 책상위에는 살인사건 확대 사진들이 어지럽게 널려있다",
              "넘겨보며 놀라는 수리영",
              "Her pale face",
              "seated eye level beside 혜수's desk"
            ],
            "visual_inferences": [
              "fixed_element suri_young_seated_at_desk: C01 remains seated in an office chair at a detective's desk with her lower body anchored",
              "fixed_element police_station_empty_bullpen: muted grey-blue tones in the negative space and the faint glow of computer monitors",
              "The low camera position forces the scattered photos on the desk edge into the immediate blurred foreground"
            ],
            "creative_decisions": [
              "Used shallow depth of field (skipped_close_framing) to blur the disturbing photos and the background, focusing all visual tension on her shocked expression",
              "Bounced faint red-brown accents from the glossy photos onto her chin to create a nauseating, clinical horror tone in the lighting"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coffee machine",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coffee station",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fluorescent fixture",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "178d81692cf38747",
              "owned_hash": "77b4f5d8cdeac5b3",
              "camera_direction_hash": "67af26d601c6d4bd",
              "owned_usage_hash": "ce2b84c360056418",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 16,
        "dependency_reason": "S16_Shot1에서 확립된 경찰서 내부 분위기(조명과 톤)를 참조하되, close framing 정책에 따라 배경은 아웃포커스로 생략 처리함.",
        "_shot_index": 5,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From just above the tabletop at the desk edge, the camera dollies in low toward 수리영 beyond the blurred crime photographs in the lower foreground. Her pale face and open mouth take over the upper frame, angled down toward the images, while the photos remain out-of-focus wounds at the bottom rather than readable evidence.",
            "lighting_mood": "Bleached fluorescent light drains 수리영’s face while the blurred photo gloss throws faint red-brown accents upward, making her shock feel clinical and nauseating.",
            "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": "L12B02",
            "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_empty_bullpen",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The police station interior is illuminated by bleached, cool fluorescent lights that cast a harsh, clinical glare. The surrounding office bullpen area is completely empty and abandoned, featuring muted grey-blue tones in the negative space and the faint glow of computer monitors in the background.",
                "applies_to_shots": [
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "Bleached fluorescent light drains",
                  "Cool police-station fluorescents",
                  "empty bullpen recedes into negative space",
                  "silence of the abandoned office",
                  "tiny monitor glows"
                ],
                "visual_inferences": [
                  "The environment feels stark, cold, and highly institutional with rows of empty desks.",
                  "The ambient light primarily comes from the overhead fixtures and the active monitors."
                ],
                "creative_decisions": [
                  "Using muted grey-blue tones in the background to emphasize isolation and coldness against the harsh overhead lights."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suri_young_seated_at_desk",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A woman with a distinctly pale complexion remains seated in an office chair at a detective's desk. Her lower body is anchored to the chair, maintaining her base position at the workstation even as she shifts her upper body and head.",
                "applies_to_shots": [
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "Her pale face",
                  "seated eye level beside 혜수’s desk",
                  "사무실에 홀로 앉아있는 수리영"
                ],
                "visual_inferences": [
                  "She is wearing modern, casual clothing suitable for a contemporary setting, though her specific outfit isn't the primary focus.",
                  "Her pale skin is accentuated by the harsh station lighting."
                ],
                "creative_decisions": [
                  "Keeping her anchored firmly to the chair to ground the scene's tension in a static, lonely location."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 16,
                "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": "8ec8ea960fba29b5"
      },
      {
        "scene_index": 21,
        "heading": "경찰서 안 / D",
        "beat_title": "아무도 없는 사무실 확인",
        "representative_moment": "고개를 돌려 텅 빈 사무실 주위를 살피는 수리영의 긴장된 눈빛.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing at seated eye level, cool clinical fluorescent lighting, shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a dark casual outfit, a Korean young woman with an early 20s face and dark long hair, sits at three-quarter angle from the right in the middle-left foreground, twisting her upper body in the office chair and looking off-screen, while [: an empty police office space] recedes into soft focus in the middle-right background. Captured in close framing at seated eye level, her pale complexion and tense, hard eyes are sharply detailed against the silence. In the lower-left foreground, a blurred slice of a cluttered desk corner anchors the scene. In the dim background, a nearby computer monitor face is angled away, displaying a faint active glow with unreadable detail, framed by a smudged, faintly reflective glass partition. Bleached, cool fluorescent lights cast a clinical glare on her face, contrasting with the muted grey-blue emptiness of the abandoned bullpen.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "사무실에 홀로 앉아있는 수리영",
              "주위를 둘러본다. 아무도 없는 것을 확인하고",
              "seated eye level beside 혜수’s desk",
              "Bleached fluorescent light drains"
            ],
            "visual_inferences": [
              "fixed_element suri_young_seated_at_desk: shifting upper body to check surroundings",
              "fixed_element police_station_empty_bullpen: empty bullpen recedes into negative space with muted grey-blue tones",
              "Tense, scanning eyes reflect her cautious state before looking at the monitor"
            ],
            "creative_decisions": [
              "Close framing strictly isolates her sharp facial tension on the left side, leaving the right side for the blurred, negative space of the abandoned office.",
              "The computer monitor is angled away to explicitly prevent rendering readable content, maintaining its peripheral glowing presence.",
              "Cool fluorescents emphasize her pale complexion and create a clinical, isolating mood."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coffee machine",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coffee station",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fluorescent fixture",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "4b72c6a85bdb81d0",
              "owned_hash": "77b4f5d8cdeac5b3",
              "camera_direction_hash": "f21095f3ccd1c18b",
              "owned_usage_hash": "ce2b84c360056418",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "동일 씬 앞선 샷(S21_Shot5)의 장소 연속성 및 조명/분위기 유지 (background_binding: skipped_close_framing 방식 적용)",
        "_shot_index": 7,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At seated eye level beside 혜수’s desk, the camera holds tight on 수리영 after her head turn, placing her tense eyes sharp on the left half of the frame while the empty bullpen recedes into negative space behind her. The static composition lets her pupils scan off-frame without cutting, making the silence of the abandoned office part of the threat.",
            "lighting_mood": "Cool police-station fluorescents leave her eyes hard and glassy, while the background falls into muted grey-blue emptiness with only tiny monitor glows for life.",
            "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": "empty police office space",
                  "screen_zone": "middle_right",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "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"
            ],
            "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": "L12B02",
            "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_empty_bullpen",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The police station interior is illuminated by bleached, cool fluorescent lights that cast a harsh, clinical glare. The surrounding office bullpen area is completely empty and abandoned, featuring muted grey-blue tones in the negative space and the faint glow of computer monitors in the background.",
                "applies_to_shots": [
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "Bleached fluorescent light drains",
                  "Cool police-station fluorescents",
                  "empty bullpen recedes into negative space",
                  "silence of the abandoned office",
                  "tiny monitor glows"
                ],
                "visual_inferences": [
                  "The environment feels stark, cold, and highly institutional with rows of empty desks.",
                  "The ambient light primarily comes from the overhead fixtures and the active monitors."
                ],
                "creative_decisions": [
                  "Using muted grey-blue tones in the background to emphasize isolation and coldness against the harsh overhead lights."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suri_young_seated_at_desk",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A woman with a distinctly pale complexion remains seated in an office chair at a detective's desk. Her lower body is anchored to the chair, maintaining her base position at the workstation even as she shifts her upper body and head.",
                "applies_to_shots": [
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "Her pale face",
                  "seated eye level beside 혜수’s desk",
                  "사무실에 홀로 앉아있는 수리영"
                ],
                "visual_inferences": [
                  "She is wearing modern, casual clothing suitable for a contemporary setting, though her specific outfit isn't the primary focus.",
                  "Her pale skin is accentuated by the harsh station lighting."
                ],
                "creative_decisions": [
                  "Keeping her anchored firmly to the chair to ground the scene's tension in a static, lonely location."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "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": "51f9fe43d1c7f757"
      },
      {
        "scene_index": 22,
        "heading": "S#22. 경찰서 밖 / D",
        "beat_title": "좌표를 향해 다급히 자전거를 달리는 수리영",
        "representative_moment": "C01이 주차된 자전거에 올라타 젖은 도로 위를 힘차게 페달링하며 프레임 우측으로 달려나간다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "waist-height side-tracking medium shot with shallow depth of field, panning blur on background",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a Korean young woman in her early 20s on the pre-existing bicycle, is in the middle-right midground, moving toward frame right out of the police-station forecourt. Captured in right profile in mid-pedal, her torso leans sharply over the handlebars. The observer camera tracks parallel at waist height, framing her relative to the pre-existing bicycle frame and front wheel established in the lower-left foreground. Her eyes are fixed off-screen, long dark hair blown back against the forward momentum. Behind her, the pre-existing police station exterior wall and door smear into muted cold gray-green streaks from the shallow depth of field. Overcast daylight hits the pre-existing damp asphalt road and sidewalk below, scattering tense metallic wet highlights under the wheel.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#22 action: Suriyeong riding the parked bicycle and immediately dashing off",
              "shot description: dynamic side view of Suriyeong leaning forward, pedaling hard",
              "camera_direction: observer view, tracks parallel at pedal-to-waist height",
              "character_angles: profile_right, leaning over handlebars, gaze=off_screen"
            ],
            "visual_inferences": [
              "mid-pedal freeze to preserve forward motion direction without blurring the main subject",
              "hair flowing backward opposite to the direction of motion",
              "tracking camera blurs the static background wall and door into horizontal streaks"
            ],
            "creative_decisions": [
              "cold gray-green palette to emphasize the overcast, tense mood of the K-occult thriller",
              "metallic highlights on the damp road to contrast with the dark surroundings and ground the scene in realism"
            ],
            "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": "bicycle",
                "usage_kind": "anchor",
                "source_phrase": "on the pre-existing bicycle... framing her relative to the pre-existing bicycle frame and front wheel established in the lower-left foreground"
              },
              {
                "owned_token": "bicycle rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "door"
              },
              {
                "owned_token": "police station",
                "usage_kind": "anchor",
                "source_phrase": "police-station forecourt... pre-existing police station exterior wall"
              },
              {
                "owned_token": "road",
                "usage_kind": "anchor",
                "source_phrase": "pre-existing damp asphalt road"
              },
              {
                "owned_token": "sidewalk",
                "usage_kind": "anchor",
                "source_phrase": "sidewalk below"
              },
              {
                "owned_token": "sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "traffic cone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "be10446918770a86",
              "owned_hash": "60f694c5105f58bc",
              "camera_direction_hash": "fb4bdc67bceec825",
              "owned_usage_hash": "d527f2d91abe28d1",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bicycle",
                  "violating_phrase": "on the pre-existing bicycle... framing her relative to the pre-existing bicycle frame and front wheel",
                  "reason": "The prompt references the bicycle as pre-existing to anchor the character's posture and camera composition, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "pre-existing police station exterior wall and door",
                  "reason": "The prompt references the pre-existing door as part of the background that smears into streaks due to depth of field, which is an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "police station",
                  "violating_phrase": "police-station forecourt... pre-existing police station exterior wall",
                  "reason": "The prompt refers to the police station to anchor the background setting and camera depth blur, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "road",
                  "violating_phrase": "pre-existing damp asphalt road",
                  "reason": "The prompt mentions the pre-existing road to describe overcast daylight and wet highlights, acting as a background anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sidewalk",
                  "violating_phrase": "sidewalk below",
                  "reason": "The prompt mentions the sidewalk beneath the wheel as a spatial context for lighting reflections, which is an anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "exact_background (L12B01) binding from S21_Shot7",
        "_shot_index": 1,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 22,
            "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 launch-stage low side-tracking path, the camera runs parallel to Suriyeong at pedal-to-waist height, about 1.5 meters off the bicycle, tightening the frame so her forward-leaning torso sits in the upper right while the loaded pedal and front wheel cut across the lower left. This is a direct observer view with a slight handheld vibration and shallow depth of field, making the parked police-station exterior smear into damp muted streaks as the bicycle surges forward.",
            "lighting_mood": "Overcast daylight is flattened into a cold gray-green police-station palette, with wet pavement highlights giving the launch a tense metallic edge.",
            "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": "frame right, out of the police-station forecourt",
                  "label": "Suriyeong on bicycle",
                  "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": "background_ref_attached",
            "bg_id": "L12B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "bicycle",
              "bicycle rack",
              "bollard",
              "curb",
              "door",
              "police station",
              "road",
              "sidewalk",
              "sign",
              "streetlight",
              "traffic cone",
              "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": 21,
                "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": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L12B01",
                "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": "5880064afbc2f246"
      },
      {
        "scene_index": 23,
        "heading": "S#23. 어느 PC방 / 실내",
        "beat_title": "좌표 확인",
        "representative_moment": "어두운 PC방 안, 모니터 불빛을 받으며 화면을 내려다보는 C01의 굳은 정면 모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Direct observer view from monitor height, close-up composition, harsh bluish monitor glow against heavy blackness",
            "t2i_prompt": "Photorealistic cinematic still. The camera holds at monitor height on the far side of the desk, lens just above the screen line, capturing a computer monitor edge as a thin lower foreground band. C01O01 in a casual jacket, a Korean young woman, early 20s face, dark long hair, clear facial features, natural complexion and hair, occupies the center frame, facing the camera with head and shoulders visible. She is hunched over a keyboard, looking down. The unreadable monitor screen, turned partly toward the camera, casts a harsh bluish glow upward, illuminating her rigid frontal face with sharp contrast against the dark room. [L14: dim PC room partitions dissolve into heavy blackness immediately behind her head, punctured by faint red and amber LEDs and soft rectangular light patches from distant blurred screens angled away].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#23 action: Suriyeong sitting at a monitor screen, checking coordinates",
              "shot description: dark PC room, bright monitor light on Suriyeong's stiff frontal face",
              "C01 state: facing the camera, hunched over keyboard, looking down",
              "DP notes: monitor edge glows as a thin lower foreground band"
            ],
            "visual_inferences": [
              "close framing positions the monitor at the bottom edge as a physical foreground anchor",
              "bluish light mapping directly translates to computer screen illumination",
              "unlit desk partitions forming narrow dark corridors immediately behind the subject"
            ],
            "creative_decisions": [
              "centered, rigid composition to emphasize the feeling of the 'computer staring back' at the observer",
              "harsh blue and deep black contrast with faint amber LED accents to heighten the tense thriller mood",
              "restricted background depth via heavy shadows to keep focus entirely on the illuminated face"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "92b1703c99310fe7",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "4699bb57ae860bec",
              "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 shot required for this framing.",
        "_shot_index": 1,
        "visible_entities": [
          "L14",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 23,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "In the close-observation start position, the camera holds at monitor height on the far side of the desk, lens just above the screen line about three feet from Suriyeong, framing her face tightly while the monitor edge glows as a thin lower foreground band. This is a direct observer view that feels almost like the computer staring back at her; her face sits centered, rigid and frontal, while rows of dark PC booths dissolve behind her.",
            "lighting_mood": "The room is nearly black except for a harsh bluish monitor glow carving her face, with faint red and amber PC-room LEDs puncturing the 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": [
              "L14",
              "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": [],
            "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": "a7d4dde4e195f49a"
      },
      {
        "scene_index": 24,
        "heading": "S#24. 해안가 / 소나기",
        "beat_title": "거센 소나기를 뚫고 달리는 수리영",
        "representative_moment": "천둥번개가 치는 거친 빗속에서 C01이 물보라를 일으키며 자전거 핸들을 꽉 쥐고 정면으로 내달리고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "low frontal camera roughly at handlebar height, medium framing with sudden backflash",
            "t2i_prompt": "Photorealistic cinematic still. C01 in a dark wet windbreaker, a Korean young woman, moves toward the camera along the flooded coastal road in the middle-center midground. The observer stays very low and frontal, positioned roughly at handlebar height. C01 is seated on the saddle in mid-pedal, facing the camera, looking at the camera, hands clamped across the handlebars of the bicycle. The bicycle frame, down tube, and front wheel occupy the lower frame amidst violently splashing water. She appears as a backlit figure against a sudden white-gold lightning flash from behind, body volume preserved with cold rim light tracing her shoulders and arms, her dark long hair trailing back in the direction opposite to motion. Heavy rain and sea mist obscure the dark environment, creating a cold storm palette that sharpens the upward-bursting water spray into silver-white.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#24 action: Suriyeong riding a bicycle through the heavy rain",
              "shot description: sudden lightning backflash, low frontal camera roughly handlebar height, frontal silhouette, hands clamped on handlebars, water splashing from front wheel",
              "id_policy: base_id_required for C01, intentionally rendered as a rain-dark frontal silhouette"
            ],
            "visual_inferences": [
              "pose: seated on saddle in mid-pedal leaning over handlebars, facing the camera",
              "motion representation: hair trailing in the direction opposite to motion",
              "atmospheric mood: cold storm palette derived from S9_Shot1 location atmosphere"
            ],
            "creative_decisions": [
              "applied rim light and body volume preservation to satisfy the silhouette rule (preventing a flat cutout)",
              "placed the bicycle frame and front wheel prominently in the lower frame to anchor the vehicle with the low camera position"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1e73f9a14a67283d",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "a6e24dcf27e4dc81",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 9,
        "dependency_reason": "atmosphere_reference: carry over the dark coastal road and cool gray storm mood from S9_Shot1 without importing specific layout",
        "_shot_index": 1,
        "visible_entities": [
          "L06",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 24,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Following the close-observation mid flow, the camera stays very low and frontal just ahead of the bicycle, roughly handlebar height and about two meters away, dollying backward on the same axis as Suriyeong drives through the rain. Her silhouette occupies the center vertical strip, hands clamped across the lower third on the handlebars, while splashing water bursts up from the front wheel without overwhelming the frame.",
            "lighting_mood": "A cold storm palette is cut by a sudden lightning backflash, turning Suriyeong into a black frontal silhouette while rain and water spray sharpen silver-white.",
            "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": "camera along the flooded coastal road",
                  "label": "Suriyeong cycling through rain",
                  "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": [
              "L06",
              "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": [
              {
                "subject_id": "C01",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "Suriyeong is intentionally rendered as a rain-dark frontal silhouette; detailed outlook reference should not drive the face because the identity is carried by action and context."
              }
            ],
            "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": 9,
                "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": "C01",
                "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": "5c2e1e3462cb270a"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "벽에 꽂힌 사진과 붉은 원",
        "representative_moment": "A tight close-up of the blood-stained photograph P09 pinned dead center inside the red circular mark P13 on the wall.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "extremely tight direct view, locked square to the marked surface",
            "t2i_prompt": "Photorealistic cinematic still. In the middle-center background, a blood-red circle and pinned photograph centered on the bedroom wall fill the direct view. P13, a fresh-looking, uneven, and smeared circular mark, surrounds the pinned picture like a target. Dead center inside P13, P09, an aged and creased paper photograph, is held to the plaster by a central pin. The yellowed, wrinkled surface of P09 bears dried dark red-brown paint stains, partially obscuring the printed image of an old rural restaurant and two young East Asian girls seated in front. The rough [L04: dirty, scuffed bedroom wall plaster] occupies the outer edges of the tight frame. Low golden dusk light is muted by gray interior shadow, leaving the dark red of the painted mark and the brown-black stains on the photograph as the only aggressive color accents in the heavy, desaturated space.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 3 description: The blood-red circle expands to the edges of the wall plane, while the old blood-stained photograph is pinned dead center.",
              "Scene text states the photograph shows a 70s-80s rural restaurant with a circular structure and two 12-year-old girls."
            ],
            "visual_inferences": [
              "fixed_element mirestone: The photograph is the same aged, creased prop with dried dark red-brown paint stains.",
              "fixed_element velrith: Room interior is lit by low golden dusk light muted by gray interior shadow, leaving the room tone dim and heavy."
            ],
            "creative_decisions": [
              "Locked the frame square to the wall to flatten the view into a ritual-like content plane, emphasizing the tactile textures of the pin, creases, and fresh paint.",
              "Muted the surrounding plaster into dim, desaturated gray shadow to make the red circle and blood stains visually punchy."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "prop"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photo",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6c5a2d49fc5eb8cb",
              "owned_hash": "809f5e0b8031942c",
              "camera_direction_hash": "2763ff074b701ee6",
              "owned_usage_hash": "238df5668a71e4c0",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 18,
        "dependency_reason": "Same rooftop room location, though the background reference is intentionally skipped for this close framing composition.",
        "_shot_index": 3,
        "visible_entities": [
          "L04",
          "P09",
          "P13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "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 reveal-stage push-in ends at eye level in an extremely tight direct view of the bedroom wall: the blood-red circle expands to the edges of the wall plane, while the old blood-stained photograph is pinned dead center and kept just large enough to read without becoming an impossible oversized prop. The frame is locked square to the marked surface, flattening the wall into a ritual-like content plane and making the pinhole and dried stains feel tactile.",
            "lighting_mood": "Golden dusk leaking through the ruined rooftop room is muted by gray interior shadow, letting the red circle and brown-black blood stains become the only aggressive 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": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "blood-red circle and pinned photograph centered on bedroom wall",
                  "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": [
              "L04",
              "P09",
              "P13"
            ],
            "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": "L04B02",
            "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": [
              {
                "applies_to_shots": [
                  3,
                  6
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Keep the photograph visually recognizable across both shots even though its placement changes from the wall to the character's hands.",
                  "Do not enlarge the photograph beyond a plausible handheld paper prop; preserve its aged, tactile quality."
                ],
                "description": "An aged, creased photograph prop with dried dark red-brown paint stains remains the same object across the shots. The paper should look old and slightly worn, with the dark red staining clearly visible as a continuity mark. Its exact placement changes by shot, but its aged paper texture, creases, and dried paint staining must remain consistent.",
                "element_id": "mirestone",
                "element_scope": "full",
                "element_type": "persistent_prop",
                "source_facts": [
                  "Shot 3 describes an old photograph stained with red paint, pinned at the center of the red circle on the bedroom wall.",
                  "Shot 6 describes the photograph clutched near Suriyeong's lap, with dried red-brown stains visible.",
                  "Scene text says the photograph is removed from the wall and later held tightly in hand."
                ],
                "visual_inferences": [
                  "The photograph in Shot 6 is the same prop that was pinned to the wall in Shot 3."
                ]
              },
              {
                "applies_to_shots": [
                  3,
                  6
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Maintain a muted, oppressive interior palette so the red-brown paint marks remain the strongest color accents.",
                  "Let the dusk light feel low and indirect rather than bright or clean."
                ],
                "description": "The rooftop room interior remains lit by low golden dusk light muted by gray interior shadow. The overall room tone is dim, desaturated, and heavy, with the red and dark red-brown paint marks standing out as the strongest color accents. The lighting should not shift into bright daylight or full night between the shots.",
                "element_id": "velrith",
                "element_scope": "full",
                "element_type": "environment_state",
                "source_facts": [
                  "Shot 3 lighting: golden dusk leaks through the ruined rooftop room and is muted by gray interior shadow.",
                  "Shot 6 lighting: low gold dusk from the rooftop window is swallowed by interior gray shadow.",
                  "Scene heading places the rooftop room interior at dusk."
                ],
                "visual_inferences": []
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 18,
                "shot_index": 11,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete 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": "P09",
                "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": 25,
                "shot_indices": [
                  3
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P09",
                  "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": "f349c1dc93e7d431"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "붉은 원 중앙의 사진 확인 및 충격",
        "representative_moment": "침대 가장자리에 주저앉은 C01이 무릎 부근에 피 묻은 사진을 쥐고 넋이 나간 채 바닥을 내려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "seated eye level frontal medium framing, low golden dusk muted by heavy gray interior shadow",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in casual workwear, an Asian young woman, sits isolated on the bed edge in the middle-center foreground. She is facing the camera, slumped heavily on the sagging mattress, her posture slack and limp, looking down at her lap. Her hands tightly clutch an aged, creased photograph prop with dried dark red-brown paint stains near her lap; the photo front is tilted downward toward her, only partly visible to the camera. The camera sits at the foot of the bed at seated eye level, lowered enough that the rumpled bed edge cuts across the lower frame as a horizontal foreground anchor. Behind her, the room is disordered with ransacked furniture, an open wardrobe, and scattered household items, the drawer fronts facing the camera at uneven angles. Low golden dusk light from the window is swallowed by interior gray shadow, leaving her face pallid while the dark red-brown paint stains on the photograph stand out as a sharp color accent against the dim, heavy room tone.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Shot 6 describes the photograph clutched near Suriyeong's lap, with dried red-brown stains visible.",
              "Scene text says Suriyeong collapses onto the bed.",
              "Scene heading places the rooftop room interior at dusk."
            ],
            "visual_inferences": [
              "The photograph in Shot 6 is the same prop that was pinned to the wall in Shot 3.",
              "Ransacked room layout creates chaotic background pressure around her.",
              "The sagging mattress emphasizes the dead weight of her collapse."
            ],
            "creative_decisions": [
              "Lowered the camera slightly to let the bed edge cut across the lower frame, visually anchoring her seated posture.",
              "Muted the interior colors with heavy gray shadow to make the red-brown stains on the photograph the strongest visual accent."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bed",
                "usage_kind": "anchor",
                "source_phrase": "sits isolated on the bed edge"
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "household item",
                "usage_kind": "anchor",
                "source_phrase": "scattered household items"
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "anchor",
                "source_phrase": "open wardrobe"
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "light from the window"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "2d14ff2ad1afe18e",
              "owned_hash": "b510750c6fe1aecc",
              "camera_direction_hash": "caff028c26798edf",
              "owned_usage_hash": "2d6935db3dbf8c8b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bed",
                  "violating_phrase": "sits isolated on the bed edge",
                  "reason": "The bed is used as a spatial and physical anchor for the character to sit on, aligning with the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "household item",
                  "violating_phrase": "scattered household items",
                  "reason": "These items are mentioned as pre-existing background clutter to define the scene's disorder, posing no redraw violation.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wardrobe",
                  "violating_phrase": "open wardrobe",
                  "reason": "The wardrobe is mentioned as part of the background environment to establish the room's messy state.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "light from the window",
                  "reason": "The window is referenced solely as a natural light source to dictate the lighting setup.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 18,
        "dependency_reason": "이전 옥탑방 씬(S18_Shot5)의 배경 레이아웃과 조명 상태 일관성 유지",
        "_shot_index": 6,
        "visible_entities": [
          "L04",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "After the logical cut to the reaction stage, the camera sits at the foot of the bed at seated eye level, about five feet from Suriyeong, holding the frontal angle but lowered enough that the sagging mattress edge cuts across the lower frame. Suriyeong is centered and slightly compressed by the messy room behind her, the photograph clutched near her lap rather than pushed toward lens, so the emphasis shifts to the dead weight of her collapse.",
            "lighting_mood": "Low gold dusk from the rooftop window is swallowed by interior gray shadow, leaving her face pallid and the photograph's dried red-brown stains as a quiet horror 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": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "Suriyeong isolated on bed edge",
                  "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": [
              "L04",
              "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": "L04B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "bed",
              "chair",
              "cooktop",
              "counter",
              "curtain",
              "door",
              "household item",
              "shelf",
              "sink",
              "stand",
              "table",
              "wardrobe",
              "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": [
              {
                "applies_to_shots": [
                  3,
                  6
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Keep the photograph visually recognizable across both shots even though its placement changes from the wall to the character's hands.",
                  "Do not enlarge the photograph beyond a plausible handheld paper prop; preserve its aged, tactile quality."
                ],
                "description": "An aged, creased photograph prop with dried dark red-brown paint stains remains the same object across the shots. The paper should look old and slightly worn, with the dark red staining clearly visible as a continuity mark. Its exact placement changes by shot, but its aged paper texture, creases, and dried paint staining must remain consistent.",
                "element_id": "mirestone",
                "element_scope": "full",
                "element_type": "persistent_prop",
                "source_facts": [
                  "Shot 3 describes an old photograph stained with red paint, pinned at the center of the red circle on the bedroom wall.",
                  "Shot 6 describes the photograph clutched near Suriyeong's lap, with dried red-brown stains visible.",
                  "Scene text says the photograph is removed from the wall and later held tightly in hand."
                ],
                "visual_inferences": [
                  "The photograph in Shot 6 is the same prop that was pinned to the wall in Shot 3."
                ]
              },
              {
                "applies_to_shots": [
                  3,
                  6
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Maintain a muted, oppressive interior palette so the red-brown paint marks remain the strongest color accents.",
                  "Let the dusk light feel low and indirect rather than bright or clean."
                ],
                "description": "The rooftop room interior remains lit by low golden dusk light muted by gray interior shadow. The overall room tone is dim, desaturated, and heavy, with the red and dark red-brown paint marks standing out as the strongest color accents. The lighting should not shift into bright daylight or full night between the shots.",
                "element_id": "velrith",
                "element_scope": "full",
                "element_type": "environment_state",
                "source_facts": [
                  "Shot 3 lighting: golden dusk leaks through the ruined rooftop room and is muted by gray interior shadow.",
                  "Shot 6 lighting: low gold dusk from the rooftop window is swallowed by interior gray shadow.",
                  "Scene heading places the rooftop room interior at dusk."
                ],
                "visual_inferences": []
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 18,
                "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": "L04B03",
                "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": "cb6c5bda54652d13"
      },
      {
        "scene_index": 26,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "안개 낀 포구에서 홀로 막막하게 배를 기다리는 수리영",
        "representative_moment": "안개가 자욱한 텅 빈 포구의 갯바위 위에 수리영이 등 돌려 웅크려 앉아 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "very wide low-angle establishing shot, muted blue-gray and gray-green tones with faint golden dusk backlight",
            "t2i_prompt": "Photorealistic cinematic still. Low observer at ground level on the empty harbor edge, the frame held very wide. C01 in a dark casual outfit, a Korean young woman in her early 20s with dark long hair, with back to camera, is curled into herself on the uneven, slick black wet rocks in the lower-left foreground, her distant gaze directed toward the fog-covered sea. The vacant wet pier stretches laterally across the midground, its edge receding into the thick heavy fog. The post-rain coastal harbor is deeply blanketed in dense, drifting fog under the fading faint golden dusk diffused from behind. The sea appears as a flat, gray, boatless void, significantly obscuring any distant background elements. The overall atmosphere is dominated by muted blue-gray and gray-green tones, leaving the figure as a small, isolated silhouette against the wet harbor emptiness.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "소나기가 한차례 퍼 붓는가 싶더니, 비는 그치고 안개가 자욱하다. 텅 빈 포구.",
              "갯바위에 앉아있는 수리영. 하염없이 안개가 몰려오는 바다를 바라보는데",
              "shot description: 짙은 안개가 깔린 텅 빈 포구, 갯바위 위에 무릎을 모으고 웅크려 앉은 수리영의 고독한 전신"
            ],
            "visual_inferences": [
              "fixed_element foggy_dusk_harbor_environment: thick fog, wet surfaces, muted blue-gray and gray-green tones",
              "character posture: back_to_camera, curled into herself on the wet rocks",
              "low camera angle places the wet rocks in the lower frame to emphasize the vast emptiness of the harbor"
            ],
            "creative_decisions": [
              "very wide framing to emphasize the character's isolation and the scale of the fog compared to the small figure",
              "muted blue-gray palette contrasted with a faint golden dusk backlight to convey coldness and abandonment"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5e22c94f5d56404f",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "b0df1a17e22d3666",
              "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": [
          "L15",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "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 establishing start position, the camera holds very wide at low eye level on the empty harbor edge, about eighteen meters from Suriyeong, facing the fog-covered sea while the vacant pier stretches laterally across the frame. Suriyeong appears small on the lower-left rocks, curled into herself against the massive pale fog and wet harbor emptiness.",
            "lighting_mood": "The post-rain harbor is washed in muted blue-gray fog with faint golden dusk diffused behind it, making the rocks and Suriyeong's silhouette feel cold and abandoned.",
            "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": [
              "L15",
              "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": [
              {
                "subject_id": "C01",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "Suriyeong is a small, back-facing figure in a very wide foggy frame; body placement and silhouette matter more than detailed 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": "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": "foggy_dusk_harbor_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The post-rain coastal harbor is deeply blanketed in thick, heavy fog under the fading light of dusk. The ground, rocks, and surrounding structures remain visibly wet from the recent shower, reflecting the dim light. The overall atmosphere is dominated by muted blue-gray and gray-green tones, significantly obscuring any distant background elements.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "소나기가 한차례 퍼 붓는가 싶더니, 비는 그치고 안개가 자욱하다.",
                  "해질 무렵",
                  "The post-rain harbor is washed in muted blue-gray fog with faint golden dusk",
                  "Fog-diffused dusk softens everything into gray-green coastal tones"
                ],
                "visual_inferences": [
                  "The wet surfaces across the harbor consistently reflect the faint, diffused dusk light.",
                  "The density of the fog completely hides the horizon and softens all background textures."
                ],
                "creative_decisions": [
                  "A cool blue-gray and gray-green color palette is uniformly applied to the environment to emphasize the cold, abandoned, and isolated mood of the post-rain seaside."
                ],
                "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",
                "id": "C01",
                "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": "90c10ad7865c2541"
      },
      {
        "scene_index": 26,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "인우의 등장과 밧줄을 쥐고 선 순간",
        "representative_moment": "안개를 뚫고 도착한 배에서 내린 C03이 밧줄을 단단히 쥐고 멈춰 서서 프레임 밖을 응시하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium observer framing at waist height, focusing on the character's side profile and the diagonal mooring rope against the foggy dusk harbor.",
            "t2i_prompt": "Photorealistic cinematic still. Observer view at waist height. C03O04 in worn fishing workwear, a Korean young man in his mid-20s with dark hair, handsome facial features, delicate eyes and nose, in left profile, standing tight in the right half of the frame, torso and upper body in frame, lower legs implied beyond the lower edge. He is bracing a wet mooring rope, his gaze looking off-screen. The taut, wet mooring rope cuts diagonally through the lower foreground before reaching his hand. Behind him in the left background, the damp wooden hull of a small moored fishing boat sits quietly, its side partly swallowed by thick, heavy fog. The wet, darkened wooden dock edge runs horizontally beneath him. The post-rain coastal harbor is deeply blanketed in dense gray fog under the fading light of dusk. The atmosphere is dominated by muted blue-gray and gray-green tones, with a faint warm dusk rim light catching along the taut rope and tracing the figure's cheekbone against the cold ambient fog.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "S#26 action: '배에서 내린 인우(24세. 남)는 닷줄을 고정시키고 있다.'",
              "shot description: '배에서 내려 밧줄을 쥔 채 멈춰 선 인우의 무표정한 측면.'"
            ],
            "visual_inferences": [
              "fixed_element foggy_dusk_harbor_environment: post-rain harbor washed in muted blue-gray fog with faint golden dusk",
              "Waist-height observer camera logically frames the subject's torso while implying the lower body is out of frame",
              "The mooring rope acts as a foreground diagonal leading toward his hand based on the DP directions"
            ],
            "creative_decisions": [
              "Framed the character tightly in the right half to leave the left background open for the moored boat and fog mass",
              "Applied a faint warm rim light along the cheekbone and rope to separate the subject from the flat gray-green fog"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "48bb0e9a831be2e2",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "20c4001c49e85122",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 26,
        "dependency_reason": "동일 씬 내 이전 샷(Shot 1)에서 설정된 안개 낀 해질녘 포구의 환경(비 온 뒤 젖은 질감, 청회색 톤)을 그대로 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "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 the close-observation mid point on the dock, the camera holds waist height about two meters from Inwoo, slightly behind the mooring rope line so the rope cuts diagonally through the foreground before reaching his hand. Inwoo's side profile sits tight in the right half of frame, with the subdued foggy dock and moored boat kept soft behind him.",
            "lighting_mood": "Fog-diffused dusk softens everything into gray-green coastal tones, with a faint warm rim along the rope and Inwoo's cheekbone but no comforting 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": [
              "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": [
              {
                "element_id": "foggy_dusk_harbor_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The post-rain coastal harbor is deeply blanketed in thick, heavy fog under the fading light of dusk. The ground, rocks, and surrounding structures remain visibly wet from the recent shower, reflecting the dim light. The overall atmosphere is dominated by muted blue-gray and gray-green tones, significantly obscuring any distant background elements.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "소나기가 한차례 퍼 붓는가 싶더니, 비는 그치고 안개가 자욱하다.",
                  "해질 무렵",
                  "The post-rain harbor is washed in muted blue-gray fog with faint golden dusk",
                  "Fog-diffused dusk softens everything into gray-green coastal tones"
                ],
                "visual_inferences": [
                  "The wet surfaces across the harbor consistently reflect the faint, diffused dusk light.",
                  "The density of the fog completely hides the horizon and softens all background textures."
                ],
                "creative_decisions": [
                  "A cool blue-gray and gray-green color palette is uniformly applied to the environment to emphasize the cold, abandoned, and isolated mood of the post-rain seaside."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 26,
                "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": "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": "e6164226ef41051c"
      },
      {
        "scene_index": 27,
        "heading": "S#27. 옥탑방 안 / 해질 무렵",
        "beat_title": "수리영의 음성 메시지를 듣고 굳어버린 혜수",
        "representative_moment": "C02O03가 엉망이 된 방 한가운데서 P06 스마트폰을 귀에 댄 채 허공을 응시하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close frontal framing, shallow focus, dirty amber-gray dusk wash",
            "t2i_prompt": "Photorealistic cinematic still. C02O03 in a dark detective jacket, a Korean middle-aged woman with dark neat hair, a mid-40s face showing a sharp facial impression and mature features, facing the camera, head and shoulders filling the frame. She is gazing into the distance, her hand tightly holding P06, a palm-sized black smartphone, pressed against her right ear. Lit by late dusk seeping in a dirty amber-gray wash, her tense face is underlit against cold shadows. [L04: shallow focus immediately behind her, blurred frame-edge surfaces of a ransacked room, a dim open window edge revealing dusk haze, soft outlines of overturned chair backs in the dark rear].",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S#27 action: 수리영의 녹음메시지를 확인하는 혜수",
              "shot description: Hyesu standing in the ransacked rooftop living area, phone pressed to ear, facing camera, gaze distant"
            ],
            "visual_inferences": [
              "close framing restricts view to head, shoulders, and the hand holding the phone",
              "the ransacked room elements (open window, overturned chairs) are heavily blurred due to shallow depth of field",
              "late dusk lighting creates a dim, cold underlit effect on the subject's face"
            ],
            "creative_decisions": [
              "placed the phone clearly visible on the right edge of her face as described in the DP staging",
              "used the amber-gray dusk wash to contrast with the cold interior shadows, enhancing the trapped and tense mood"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "household item",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1cc2a3aba2b186c4",
              "owned_hash": "b510750c6fe1aecc",
              "camera_direction_hash": "86b1587fec3443f7",
              "owned_usage_hash": "41eb95e172c35f3f",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "동일한 옥탑방 배경(S14) 유지 (단, 클로즈업 프레이밍 정책에 따라 배경 참조 이미지를 합성에서 제외하고 아웃포커싱된 프레임 엣지 표면만 묘사)",
        "_shot_index": 1,
        "visible_entities": [
          "L04",
          "C02",
          "P06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the close-observation start, the camera is eye level in the ransacked rooftop living area, about 1.5 meters in front of Hyesu, holding a slightly tight frontal frame that keeps the phone at her ear visible along the right edge of her face. The ruined room falls behind her in shallow focus, making her fixed expression feel trapped between the recorded message and the hollow interior.",
            "lighting_mood": "Late dusk seeps through the open window in a dirty amber-gray wash, leaving Hyesu's face tense and underlit against the trashed room's cold shadows.",
            "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": [
              "L04",
              "C02",
              "P06"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "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": "L04B03",
            "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": 14,
                "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": "C02O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "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": "e116c9b7b4dcdfd9"
      },
      {
        "scene_index": 28,
        "heading": "바다 + 갑판 / 해질 무렵",
        "beat_title": "지도를 건네며 기이한 목적지를 밝히는 수리영",
        "representative_moment": "해질녘 어선 갑판에서 C01이 인우를 향해 P17 지도를 불쑥 내밀고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low shoulder-height wide shot, golden dusk backlight with cool blue-gray ambient shadows",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a dark jacket, a Korean young woman in her 20s with dark long hair, sits in the middle-left foreground extending the P17 map, reaching for a Korean man across the deck. She is in right profile, her arm thrusting as a clear diagonal, her eyes fixed on the man. The Korean man in fisher workwear stands in the right midground at a three-quarter angle from the left, leaning against the wet, salt-stained port-side deck rail, looking down at the P17 map. The P17 map is held between them, angled toward the man. The wet, cluttered deck boards recede from C01O01 toward the wheelhouse in the background. Observed from a low shoulder-height angle, the scene is illuminated by golden dusk backlight that silhouettes the deck edges and the figures, warming the sea haze over the sunset sea behind them. Warm rim lights catch the edges of the boat and their bodies, while their faces remain muted ashen blue-gray in the cool ambient shadows, with the P17 map acting as the sharpest light accent.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Suriyeong (C01) is seated on the deck of the boat at sunset, handing a map to Inwoo.",
              "Inwoo looks down at the map, leaning by the rail.",
              "The scene takes place on a small fishing boat at dusk."
            ],
            "visual_inferences": [
              "fixed_element sunset_boat_deck_environment: Golden dusk backlight silhouettes the deck edges, contrasting with cool blue-gray shadows.",
              "The shared deck space physically connects the foreground and midground figures.",
              "The low shoulder-height camera angle emphasizes the exposed, windy nature of the open deck space between them."
            ],
            "creative_decisions": [
              "Placed C01 in the middle-left foreground reaching right, creating a strong diagonal tension toward the man.",
              "Emphasized the pale map as the sharp light accent against the muted ashen faces.",
              "Used a wide framing scale to capture both figures and their relationship with the environment in a single camera shutter."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "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": "anchor",
                "source_phrase": "across the deck, port-side deck rail, wet, cluttered deck boards recede, silhouettes the deck edges"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "foredeck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hatch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "map",
                "usage_kind": "anchor",
                "source_phrase": "extending the P17 map, looking down at the P17 map, The P17 map is held between them, the P17 map acting as the sharpest light accent"
              },
              {
                "owned_token": "passage",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rail",
                "usage_kind": "anchor",
                "source_phrase": "port-side deck rail"
              },
              {
                "owned_token": "sea",
                "usage_kind": "anchor",
                "source_phrase": "sunset sea behind them"
              },
              {
                "owned_token": "storage locker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "anchor",
                "source_phrase": "toward the wheelhouse in the background"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "windshield",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6e23108414f1800c",
              "owned_hash": "5287dff0d9c04ab1",
              "camera_direction_hash": "412469af426e5df4",
              "owned_usage_hash": "91836b016f8be99e",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "deck",
                  "violating_phrase": "across the deck, port-side deck rail, wet, cluttered deck boards recede, silhouettes the deck edges",
                  "reason": "The prompt references the deck and its boards to establish depth, perspective, and character positioning, which acts as a valid background anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "map",
                  "violating_phrase": "extending the P17 map, looking down at the P17 map, The P17 map is held between them, the P17 map acting as the sharpest light accent",
                  "reason": "The P17 map is treated as an interactive story element held by the characters and serving as a light accent, rather than redrawing background structure.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rail",
                  "violating_phrase": "leaning against the wet, salt-stained port-side deck rail",
                  "reason": "The rail is used as a structural anchor for the character to lean against, which is a spatial reference to the existing environment.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sea",
                  "violating_phrase": "sea haze over the sunset sea behind them",
                  "reason": "The sea is mentioned as a background backdrop to anchor the atmospheric lighting and haze, with no redraw request.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wheelhouse",
                  "violating_phrase": "toward the wheelhouse in the background",
                  "reason": "The wheelhouse is used purely as a background landmark to indicate the recession and perspective of the deck.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 1,
        "visible_entities": [
          "L16",
          "C01",
          "P17"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 28,
            "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 port-side deck-rail establishing start, the camera sits low at shoulder height about three meters from seated Suriyeong, angled across the deck toward Inwoo with the sunset sea behind them. Suriyeong is held in strong side profile on the left, her arm and map thrusting as a clear diagonal toward Inwoo on the right, while the open deck space between them feels exposed and windy.",
            "lighting_mood": "Golden dusk backlight silhouettes the deck edges and warms the sea haze, while faces remain muted blue-gray with the pale map as the sharpest light 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": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "reaches_for",
                  "gesture_target_label": "Inwoo across the deck",
                  "label": "Suriyeong offering map",
                  "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": [
              "L16",
              "C01",
              "P17"
            ],
            "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": "L16B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bench",
              "cleat",
              "deck",
              "door",
              "foredeck",
              "hatch",
              "map",
              "passage",
              "photograph",
              "rail",
              "sea",
              "storage locker",
              "wheelhouse",
              "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": "sunset_boat_deck_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior deck of a small fishing boat floating on the sea during sunset. The environment is illuminated by a golden dusk light that creates warm backlights and rim lights on the edges of the boat and the subjects, while the surrounding sea haze and shadows maintain a cool, ashen blue-gray tone.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "해질 무렵 바다 위, 갑판",
                  "Golden dusk backlight silhouettes the deck edges and warms the sea haze",
                  "boat background collapses into dusk blur",
                  "A thin gold dusk rim catches Inwoo's cheek while his face stays cool and ashen"
                ],
                "visual_inferences": [
                  "The overall ambient lighting is a mix of warm golden sunset highlighting the edges and cool dusky shadows on the open sea, which remains consistent across the scene."
                ],
                "creative_decisions": [
                  "Emphasizing the contrast between the warm golden rim light and the cool ambient shadows to heighten the sense of isolation and dramatic tension on the boat."
                ],
                "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": "L16B02",
                "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": "c4c13201b2180574"
      },
      {
        "scene_index": 28,
        "heading": "S#28. 바다 + 갑판 / 해질 무렵",
        "beat_title": "사진을 확인한 인우의 극심한 당황",
        "representative_moment": "C03이 옛 사진을 보자마자 두 눈을 크게 뜨고 얼어붙은 클로즈업 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight direct close-up at eye level, shallow depth of field collapsing background into dusk blur",
            "t2i_prompt": "Photorealistic cinematic still. C03O04 in dark fisher workwear, a Korean young man in his mid-20s with dark hair, handsome facial features, delicate eyes and nose, isolated in frozen reaction in the middle-center foreground. Captured at a three-quarter angle from the right, his widened eyes and frozen mouth occupy most of the frame, the same figure remaining frozen mid-breath and looking off-screen. A thin gold dusk rim light catches his cheek and wet hairline, while his face stays cool and ashen against the ambient shadows., an old creased photograph marked with red-brown stains, enters softly from the lower-left lens edge in the blurred foreground, its front image side angled toward the man and partly toward the camera. Behind him, the background collapses into a shallow depth of field, preserving the same environment, showing [: the same dusk-dark wet deck edges of a small boat and surrounding soft gold-gray sunset sea haze].",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "S28 action: Inwoo looks at the photo and is extremely flustered.",
              "shot description: Inwoo's widened eyes and frozen mouth occupy most of the frame, old photograph enters softly from off-screen side."
            ],
            "visual_inferences": [
              "fixed_element sunset_boat_deck_environment: warm gold dusk rim light on his cheek contrasting with cool ashen shadows.",
              "shallow depth of field focuses purely on the character's reaction while softening the photograph into a looming threat at the frame edge."
            ],
            "creative_decisions": [
              "Keeping the foreground photo blurred at the lens edge to emphasize psychological pressure on the primary subject without competing for visual focus."
            ],
            "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": "cleat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "foredeck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hatch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "map",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sea",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage locker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "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": "c4db222339b6d8b7",
              "owned_hash": "5287dff0d9c04ab1",
              "camera_direction_hash": "9cba9a2900899de4",
              "owned_usage_hash": "6ad5b682140edbcd",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 28,
        "dependency_reason": "zoom_in_detail from previous shot, preserving exact lighting and background mood.",
        "_shot_index": 4,
        "visible_entities": [
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 28,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At the end of the dolly-in, the camera locks less than a meter from Inwoo at eye level, turning the push into a tight direct close-up where his widened eyes and frozen mouth occupy most of the frame. The old photograph enters softly from Suriyeong's off-screen side near the lower-left lens edge, present as pressure rather than the focus, while the boat background collapses into dusk blur.",
            "lighting_mood": "A thin gold dusk rim catches Inwoo's cheek and wet hairline while his face stays cool and ashen, making the red-brown stains on the blurred photograph feel like a threat at the edge of vision.",
            "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": "Inwoo isolated in frozen reaction",
                  "screen_zone": "middle_center",
                  "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": "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": "L16B02",
            "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": "sunset_boat_deck_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior deck of a small fishing boat floating on the sea during sunset. The environment is illuminated by a golden dusk light that creates warm backlights and rim lights on the edges of the boat and the subjects, while the surrounding sea haze and shadows maintain a cool, ashen blue-gray tone.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "해질 무렵 바다 위, 갑판",
                  "Golden dusk backlight silhouettes the deck edges and warms the sea haze",
                  "boat background collapses into dusk blur",
                  "A thin gold dusk rim catches Inwoo's cheek while his face stays cool and ashen"
                ],
                "visual_inferences": [
                  "The overall ambient lighting is a mix of warm golden sunset highlighting the edges and cool dusky shadows on the open sea, which remains consistent across the scene."
                ],
                "creative_decisions": [
                  "Emphasizing the contrast between the warm golden rim light and the cool ambient shadows to heighten the sense of isolation and dramatic tension on the boat."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 28,
                "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": "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": "f5760bb5df76c95d"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "사진 속 소녀가 강민숙임을 밝히는 수리영",
        "representative_moment": "C01's index finger presses against the child's figure on the P09 photograph resting on the console.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A direct, low observer insert shot with shallow focus, utilizing muted golden dusk against cold gray-green shadows.",
            "t2i_prompt": "Photorealistic cinematic still. A direct, neutral low observer camera stays beside the wheelhouse console, capturing an insert shot with shallow focus. C01 in a casual activity jacket, a Korean young woman, her body fully out of frame looking off-screen, only her hand entering the view, index finger pressing the faded child's figure near the center of the P09 photograph. The P09 photograph lies diagonally across the middle of the frame, the upward-facing printed side visible to the camera, with the child's figure directly under the fingertip and the rest of the group fading into soft blur. The worn helm console top faces upward at a shallow angle beneath it, appearing as a damp, dark border with chipped paint and salt grime along the lower edge of the frame. The confined interior of the wheelhouse is deeply submerged in cold, damp shadows with a gray-green undertone, starkly contrasted by a thin, muted golden light spilling in from the dusk outside, creating a harsh rim light on the finger and leaving a faint rusty-red undertone in the print.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영이 '이 사진속의 얘가 우리 엄마예요'라며 사진속의 한 아이를 가리킴",
              "해질 무렵 좁은 조타실 내부"
            ],
            "visual_inferences": [
              "fixed_element wheelhouse_dusk_lighting: The confined interior of the wheelhouse is deeply submerged in cold, damp shadows...",
              "Due to the insert framing, C01's face is out of frame, maintaining focus strictly on the hand and the photograph."
            ],
            "creative_decisions": [
              "Used a shallow focus macro-insert to heighten the narrative importance of the physical contact between the finger and the child's image",
              "Emphasized the damp, gritty texture of the helm console at the lower edge for spatial grounding",
              "Added a rusty-red undertone in the photograph's shadow to foreshadow the bloody events to come"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "prop",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "GPS display",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishfinder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "helm console",
                "usage_kind": "anchor",
                "source_phrase": "worn helm console top faces upward at a shallow angle"
              },
              {
                "owned_token": "locker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "redraw",
                "source_phrase": "the P09 photograph lies diagonally across the middle of the frame"
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "switch panel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "throttle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall marking",
                "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": "89c3d67b1b2f9ba4",
              "owned_hash": "8ab477139bf23e7c",
              "camera_direction_hash": "fabd6118c052fd13",
              "owned_usage_hash": "c41d6f662a478593",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "helm console",
                  "violating_phrase": "worn helm console top faces upward at a shallow angle beneath it, appearing as a damp, dark border with chipped paint and salt grime",
                  "reason": "The helm console is referenced as a damp, dark border along the frame edge to anchor the scene's composition, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "photograph",
                  "violating_phrase": "The P09 photograph lies diagonally across the middle of the frame, the upward-facing printed side visible to the camera",
                  "reason": "The prompt explicitly instructs to generate and render the photograph's contents and positioning as a central focus, constituting a redraw violation. Deterministic prop-owned namespace reconciliation: visible prop P09 owns token photograph; prompt uses P09 in the source phrase.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No previous scene explicitly conditions this specific insert shot's visual output.",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "P09"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A direct, neutral observer camera stays low beside the wheelhouse console, within Suriyoung's reach, pushed tighter than the flow default so the old photograph lies diagonally across the middle of frame and her index finger presses the child's image near center. The shot is an insert with shallow focus: her fingertip and the faded child's figure take nearly all attention, while the console edge only appears as a damp, dark border along the lower frame.",
            "lighting_mood": "Muted golden dusk leaks softly from above and behind, while the fingertip and photograph are held in a cold, damp shadow with a faint rusty-red undertone in the print.",
            "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",
              "P09"
            ],
            "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": [
              {
                "subject_id": "C01",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "Only Suriyoung's hand is visible in this insert; a full outlook reference would over-specify facial or body identity that the frame does not show."
              }
            ],
            "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": "L17B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "GPS display",
              "door",
              "fishfinder",
              "floor",
              "helm console",
              "locker",
              "photograph",
              "shelf",
              "steering wheel",
              "stool",
              "switch panel",
              "throttle",
              "wall marking",
              "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": "wheelhouse_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The confined interior of the wheelhouse is deeply submerged in cold, damp shadows with a gray-green undertone. This bleak darkness is starkly contrasted by a thin, muted golden light spilling in from the dusk outside, creating harsh rim lights and deep shadows.",
                "applies_to_shots": [
                  3,
                  5,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "해질 무렵",
                  "Muted golden dusk leaks softly from above and behind",
                  "Cold interior shadow swallows... thin gold dusk spill",
                  "A hard, thin gold rim light cuts... cold green-gray shadow"
                ],
                "visual_inferences": [
                  "The external dusk light strikes at a low angle, barely penetrating the damp and oppressive interior of the boat."
                ],
                "creative_decisions": [
                  "Utilizing the contrasting color palette of warm, dying golden light against sickly, cold gray-green shadows to visually amplify the escalating tension and horror."
                ],
                "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",
                "id": "C01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L17B01",
                "policy": "required"
              },
              {
                "kind": "prop",
                "id": "P09",
                "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": [
            {
              "contract_id": "rc_001",
              "scope": {
                "scene_index": 29,
                "shot_indices": [
                  3
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P09",
                  "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": 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": "7a00a51efe4cceb5"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "붉은 원의 공포",
        "representative_moment": "C03의 어깨 너머로 조타실 벽면에 빼곡히 칠해진 핏빛 붉은 원형 표식들이 서늘하게 드러난다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level over-the-shoulder medium shot revealing the background, cold and graphic composition.",
            "t2i_prompt": "Photorealistic cinematic still. C03 in dark fisher workwear, a Korean young man, positioned in the left foreground with back to camera, shoulders locked forward, gazing off-screen. He appears as a rigid silhouette guarding the reveal, his body volume preserved as a thin gold dusk light creates a hard rim light cutting across his shoulder against the cold interior shadow. The muted gray-green metal wall of the wheelhouse dominates the midground and background, turning its face toward the camera. The pre-existing blood-red circular marks on the damp wall surface behind his shoulder stand out against the bleak texture. The confined space is deeply submerged in cold, damp shadows with a gray-green undertone, starkly contrasted by the muted golden light spilling from the cloudy window off to the side, highlighting the cramped low ceiling.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "인우 얼굴 너머에 보이는 조타실안 수많은 원.",
              "조타실 벽면에 빼곡히 칠해진 핏빛 붉은 원형 표식들",
              "Muted golden dusk leaks softly from above and behind"
            ],
            "visual_inferences": [
              "fixed_element wheelhouse_red_circles: Numerous blood-red circular marks are densely drawn or painted across the muted gray-green metal walls",
              "fixed_element wheelhouse_dusk_lighting: The confined interior is deeply submerged in cold, damp shadows with a gray-green undertone"
            ],
            "creative_decisions": [
              "C03 rendered as a rigid, rim-lit silhouette in the left foreground to anchor the over-the-shoulder view without drawing focus from the background threat",
              "Golden dusk lighting used to trace C03's body volume, adhering to the silhouette policy while maintaining the grim tone",
              "Medium framing scale employed to capture both the foreground shoulder edge and the dense red circles across the midground wall"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "GPS display",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishfinder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "helm console",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "locker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "switch panel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "throttle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall marking",
                "usage_kind": "anchor",
                "source_phrase": "The pre-existing blood-red circular marks on the damp wall surface behind his shoulder stand out against the bleak texture"
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "muted golden light spilling from the cloudy window off to the side"
              },
              {
                "owned_token": "windshield",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "058f016ebfc56ce5",
              "owned_hash": "8ab477139bf23e7c",
              "camera_direction_hash": "05342be74c3a596e",
              "owned_usage_hash": "de49606e2b98547a",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "wall marking",
                  "violating_phrase": "The pre-existing blood-red circular marks on the damp wall surface behind his shoulder stand out against the bleak texture",
                  "reason": "The prompt describes the pre-existing marks to highlight their appearance on the wall, functioning as a background reference, which is consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "muted golden light spilling from the cloudy window off to the side",
                  "reason": "The prompt references the window only as the source of spilling light rather than requesting a new window to be generated, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 29,
        "dependency_reason": "Same wheelhouse interior and time of day as previous shots, maintaining exact background consistency and dusk lighting conditions.",
        "_shot_index": 5,
        "visible_entities": [
          "L17",
          "C03",
          "P13"
        ],
        "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": "From the flow's eye-level position behind Inwoo, the camera tracks just enough to set his shoulder as a dark, out-of-focus vertical edge on the left foreground while the wheelhouse wall opens across the midground and background. The composition stays colder and more graphic than the previous insert: the red circular marks fill the wall beyond him, with Inwoo reduced to a rigid silhouette guarding the reveal.",
            "lighting_mood": "Cold interior shadow swallows Inwoo's shoulder while the wall's blood-red circles cut sharply against muted gray-green metal and a thin gold dusk spill.",
            "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": [
              "L17",
              "C03",
              "P13"
            ],
            "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": [
              {
                "subject_id": "C03",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "Inwoo is used mainly as a shoulder silhouette and foreground edge; the shot should not depend on detailed outlook matching."
              }
            ],
            "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": "L17B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "GPS display",
              "door",
              "fishfinder",
              "floor",
              "helm console",
              "locker",
              "photograph",
              "shelf",
              "steering wheel",
              "stool",
              "switch panel",
              "throttle",
              "wall marking",
              "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": "wheelhouse_red_circles",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Numerous blood-red circular marks are densely drawn or painted across the muted gray-green metal walls of the wheelhouse.",
                "applies_to_shots": [
                  5,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "조타실안 수많은 원. 빙글빙글 돌고 여기에서 또다시 발견된 붉은 원!",
                  "조타실 벽면에 빼곡히 칠해진 핏빛 붉은 원형 표식들",
                  "blurred red-and-gold traces behind them"
                ],
                "visual_inferences": [
                  "The marks appear erratically hand-drawn, adding a chaotic and deeply unsettling presence to the background."
                ],
                "creative_decisions": [
                  "The vivid red color of the circles is designed to clash violently with the bleak, cold metallic tones of the wheelhouse walls, remaining a persistent visual threat."
                ],
                "confidence": "high"
              },
              {
                "element_id": "wheelhouse_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The confined interior of the wheelhouse is deeply submerged in cold, damp shadows with a gray-green undertone. This bleak darkness is starkly contrasted by a thin, muted golden light spilling in from the dusk outside, creating harsh rim lights and deep shadows.",
                "applies_to_shots": [
                  3,
                  5,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "해질 무렵",
                  "Muted golden dusk leaks softly from above and behind",
                  "Cold interior shadow swallows... thin gold dusk spill",
                  "A hard, thin gold rim light cuts... cold green-gray shadow"
                ],
                "visual_inferences": [
                  "The external dusk light strikes at a low angle, barely penetrating the damp and oppressive interior of the boat."
                ],
                "creative_decisions": [
                  "Utilizing the contrasting color palette of warm, dying golden light against sickly, cold gray-green shadows to visually amplify the escalating tension and horror."
                ],
                "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",
                "id": "C03",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L17B01",
                "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": "8e9e7f559f5c718e"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "붉은 원의 공포와 기절",
        "representative_moment": "의식을 잃고 C03의 어깨에 쓰러진 C01과, 그녀를 차갑게 내려다보는 C03의 서늘한 옆얼굴.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye-level, very close tight side angle, cold green-gray shadow with hard gold rim light",
            "t2i_prompt": "Photorealistic cinematic still. Shot from an eye-level tight side angle. C03O04 in a fisher workwear jacket, a Korean mid-20s young man, dominates the upper right frame in left profile, chin tilted down, his cold eyes fixed on C01O01. C01O01 in a casual activity jacket, a Korean young woman in her early 20s, appears partially in the lower foreground at a three-quarter angle from the right, unconscious, slack and limp, with eyes closed, her head and shoulder sagging softly against his chest as they share the cramped standing space. The confined interior is deeply submerged in cold, damp shadows with a gray-green undertone, while a thin, muted golden dusk light spills from the side, cutting a hard rim light across C03O04's sharp profile. [: A chipped metal doorframe edge stands vertically at the far frame edge, and a fogged side window lets the dusk glow through. Behind the characters, the muted gray-green metal wall is softened by shallow depth of field, revealing numerous blood-red circular marks densely painted across the surface, bleeding softly into the shadows.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "의식이 혼미해지는 수리영. 수리영을 노려보는 인우의 어깨에 그대로 쓰러진다.",
              "The camera holds static at the flow's tight side angle beside Inwoo's face, eye-level and very close"
            ],
            "visual_inferences": [
              "fixed_element wheelhouse_red_circles: Numerous blood-red circular marks are densely drawn or painted across the muted gray-green metal walls.",
              "fixed_element wheelhouse_dusk_lighting: confined interior is deeply submerged in cold, damp shadows with a gray-green undertone, thin muted golden light spilling in from the dusk."
            ],
            "creative_decisions": [
              "Close framing isolates Inwoo's cold reaction and Suriyoung's vulnerable state.",
              "Using shallow depth of field to soften the red marks, making them a menacing but out-of-focus background echo without stealing focus from the characters."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "GPS display",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishfinder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "helm console",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "locker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "switch panel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "throttle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall marking",
                "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": "479992c313cdedda",
              "owned_hash": "8ab477139bf23e7c",
              "camera_direction_hash": "dd801345ce30c2f6",
              "owned_usage_hash": "0bf637432413a75a",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 29,
        "dependency_reason": "이전 샷(Shot 3)에 설정된 조타실 벽면의 붉은 원들과 해질녘의 조명(황금빛 역광과 차가운 그림자) 연속성 유지",
        "_shot_index": 8,
        "visible_entities": [
          "C01",
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera holds static at the flow's tight side angle beside Inwoo's face, eye-level and very close, with his cold profile sharp in the upper right half of frame. Suriyoung's unconscious head and shoulder sag into the lower foreground against him, soft but unmistakable, while the cramped wheelhouse recedes in blurred red-and-gold traces behind them.",
            "lighting_mood": "A hard, thin gold rim light cuts Inwoo's profile while the rest of the close frame falls into cold green-gray shadow, with red marks bleeding softly 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": [
              "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": 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": "L17B01",
            "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": "wheelhouse_red_circles",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Numerous blood-red circular marks are densely drawn or painted across the muted gray-green metal walls of the wheelhouse.",
                "applies_to_shots": [
                  5,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "조타실안 수많은 원. 빙글빙글 돌고 여기에서 또다시 발견된 붉은 원!",
                  "조타실 벽면에 빼곡히 칠해진 핏빛 붉은 원형 표식들",
                  "blurred red-and-gold traces behind them"
                ],
                "visual_inferences": [
                  "The marks appear erratically hand-drawn, adding a chaotic and deeply unsettling presence to the background."
                ],
                "creative_decisions": [
                  "The vivid red color of the circles is designed to clash violently with the bleak, cold metallic tones of the wheelhouse walls, remaining a persistent visual threat."
                ],
                "confidence": "high"
              },
              {
                "element_id": "wheelhouse_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The confined interior of the wheelhouse is deeply submerged in cold, damp shadows with a gray-green undertone. This bleak darkness is starkly contrasted by a thin, muted golden light spilling in from the dusk outside, creating harsh rim lights and deep shadows.",
                "applies_to_shots": [
                  3,
                  5,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "해질 무렵",
                  "Muted golden dusk leaks softly from above and behind",
                  "Cold interior shadow swallows... thin gold dusk spill",
                  "A hard, thin gold rim light cuts... cold green-gray shadow"
                ],
                "visual_inferences": [
                  "The external dusk light strikes at a low angle, barely penetrating the damp and oppressive interior of the boat."
                ],
                "creative_decisions": [
                  "Utilizing the contrasting color palette of warm, dying golden light against sickly, cold gray-green shadows to visually amplify the escalating tension and horror."
                ],
                "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": "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": "9325c15f0afb0b60"
      },
      {
        "scene_index": 30,
        "heading": "S#30. 바다 / 해질 무렵",
        "beat_title": "안개 속으로 사라지는 어선",
        "representative_moment": "황금빛 노을을 등지고 거대한 안개 벽으로 향하는 소형 어선의 실루엣.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low exterior observer wide shot with muted gray-blue and golden backlight",
            "t2i_prompt": "Photorealistic cinematic still. A massive fog wall dominates the upper-center background, while a small fishing boat silhouette floats in the middle-center midground. An exterior observer camera trails low over the restless ocean waves, several boat lengths behind the vessel, focusing on the dark stern pointing directly toward the mist. A low horizon separates the muted gray-blue sky from the water. Towering, dense fog rises through most of the frame, partially swallowing the dim amber setting sun haze. The broken wave surface reflects the low sun in long gold streaks, interrupted by the boat's dark wake. The boat's mast, antenna, and navigation light form a stark black outline against the golden backlight, set against the pale, nearly opaque boundary of the mist.",
            "outfit_assignments": [],
            "source_facts": [
              "S#30 action: 서서히 지는 해가 바다위에 황금빛 그림자를 드리운다. 세상과 경계를 지우는 것 같은 짙은 안개 띠. 서서히 안개 안으로 들어가는 인우의 배.",
              "shot description: small fishing boat silhouette approaching the massive fog wall, golden backlight"
            ],
            "visual_inferences": [
              "No characters are visibly distinct from this distance; the boat itself is the central silhouette",
              "The contrast between the cold fog boundary and the warm golden wake creates visual tension"
            ],
            "creative_decisions": [
              "Low camera position over the waves emphasizes the towering scale of the fog wall compared to the fragile boat",
              "Muted gray-blue palette contrasted with golden amber backlight reflects the boundary between the natural and the occult"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "antenna",
                "usage_kind": "anchor",
                "source_phrase": "boat's mast, antenna, and navigation light"
              },
              {
                "owned_token": "boat",
                "usage_kind": "anchor",
                "source_phrase": "small fishing boat silhouette"
              },
              {
                "owned_token": "fog",
                "usage_kind": "anchor",
                "source_phrase": "massive fog wall dominates"
              },
              {
                "owned_token": "horizon",
                "usage_kind": "anchor",
                "source_phrase": "low horizon"
              },
              {
                "owned_token": "mast",
                "usage_kind": "anchor",
                "source_phrase": "boat's mast, antenna, and navigation light"
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "anchor",
                "source_phrase": "boat's mast, antenna, and navigation light"
              },
              {
                "owned_token": "ocean",
                "usage_kind": "anchor",
                "source_phrase": "restless ocean waves"
              },
              {
                "owned_token": "sky",
                "usage_kind": "anchor",
                "source_phrase": "muted gray-blue sky"
              },
              {
                "owned_token": "wave",
                "usage_kind": "anchor",
                "source_phrase": "broken wave surface"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "dc017d9d2bc78f0d",
              "owned_hash": "f982fc3ab583e7c0",
              "camera_direction_hash": "95b10654aa38f63f",
              "owned_usage_hash": "f8ea4ab219342ae1",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "antenna",
                  "violating_phrase": "boat's mast, antenna, and navigation light",
                  "reason": "The prompt references the antenna as part of a stark black silhouette outline against the backlight, which functions as a spatial and lighting anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "boat",
                  "violating_phrase": "small fishing boat silhouette floats",
                  "reason": "The boat is described as a silhouette to establish composition, composition axis, and lighting direction, confirming its role as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fog",
                  "violating_phrase": "massive fog wall dominates the upper-center background",
                  "reason": "The fog is referenced to define the background atmosphere and backdrop boundaries without demanding a redraw of the asset.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "horizon",
                  "violating_phrase": "low horizon",
                  "reason": "The horizon is mentioned purely to specify composition structure and framing proportions, which is an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "mast",
                  "violating_phrase": "boat's mast, antenna, and navigation light",
                  "reason": "The mast is referenced to describe the dark outline against the backlight, acting as a compositional anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "navigation light",
                  "violating_phrase": "boat's mast, antenna, and navigation light",
                  "reason": "The navigation light is mentioned as part of the silhouette outline, serving as an anchor reference for backlight visualization.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "ocean",
                  "violating_phrase": "restless ocean waves",
                  "reason": "The ocean is referenced to define the camera's path and surface reflections, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sky",
                  "violating_phrase": "muted gray-blue sky",
                  "reason": "The sky is mentioned to establish the color palette of the background environment, which functions as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wave",
                  "violating_phrase": "broken wave surface",
                  "reason": "The wave surface is referenced to describe sunlight reflection and texture, serving as an anchor reference rather than a new element to be drawn.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 28,
        "dependency_reason": "S28_Shot4의 바다 공간 분위기(location) 배경 연속성 유지",
        "_shot_index": 1,
        "visible_entities": [
          "L16"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 30,
            "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 direct exterior observer camera trails low over the waves, several boat lengths behind the small fishing boat, keeping the same axis as the flow while widening slightly so the boat remains a small central silhouette against the towering fog wall. The horizon sits low, the fog rises through most of the frame, and the boat's dark stern points toward camera as its bow nears the pale boundary.",
            "lighting_mood": "Heavy fog cools the palette to muted gray-blue while the low sun throws a restrained golden backlight across the water, making the boat look fragile and doomed.",
            "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": "massive fog wall",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "small fishing boat silhouette",
                  "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": [
              "L16"
            ],
            "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": "L16B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "antenna",
              "boat",
              "fog",
              "horizon",
              "mast",
              "navigation light",
              "ocean",
              "sky",
              "wave"
            ],
            "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": 28,
                "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": "L16B01",
                "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": "6bc26447825ca4e7"
      }
    ],
    "consumed_bg_catalog_hash": "2feb03c476d7e0b4",
    "consumed_shot_binding_hash": "a171a7f41b7e2aa0"
  },
  "step_id": "scene_detail",
  "run_id": "4c710153-9cf2-46fb-b7b8-f0d8d60fdd0f",
  "resolved_model": "gemini-pro",
  "updated_at": "2026-06-30T23:27:13.296868+00:00",
  "project_config_snapshot": {}
}