{
  "status": "completed",
  "completed_count": 61,
  "applicable_count": 61,
  "failed_count": 0,
  "schema_version": 13,
  "config_hash": "187e36a52f3faa6a",
  "data": {
    "scenes": [
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "필사적인 도주",
        "representative_moment": "A terrified Korean man with a bleeding bite mark on his thigh runs mid-stride through a dark, dense forest path, missing one shoe.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "waist-height slightly low wide angle, cold blue dusk lighting with dark muted red contrasts",
            "t2i_prompt": "Photorealistic cinematic still. A fleeing man, a Korean adult in a torn outdoor hiking outfit, is in the middle-center midground, running in mid-stride and moving toward the camera foreground along the narrow forest path. Viewed from a slightly low, waist-height wide angle, his body is positioned at a three-quarter left angle, looking off-screen with a terrified expression. His jacket flaps back in the direction opposite to his motion. His lifted bare foot, smeared with dirt, hangs in the lower frame. Above the knee, the fabric of his trousers is torn, revealing a large bleeding bite mark on his thigh rendered in dark, muted red. Dense, overgrown bushes scrape the left and right edges of the frame, forming a tight natural corridor. The damp, muddy path recedes away into the blue-gray twilight forest haze behind him. The scene is bathed in cold blue dusk light seeping through the foliage, with wet leaves catching faint highlights.",
            "outfit_assignments": [],
            "source_facts": [
              "S#1. 숲속 / 해 질 무렵",
              "우거진 수풀을 헤치며 도망치는. 벗겨진 한쪽 신발. 허벅지에 커다란 이빨 자국.",
              "잔뜩 겁에 질린 남자 표정"
            ],
            "visual_inferences": [
              "fixed_element man_physical_traits: torn fabric revealing bite mark, dirt and mud smeared on bare foot",
              "fixed_element dusk_forest_setting: damp muddy path, cold blue dusk light",
              "mid-stride pose and jacket flapping backward preserve the motion direction of his fleeing action",
              "low waist-height camera placement logically positions his lifted foot in the lower frame edge"
            ],
            "creative_decisions": [
              "wound colored in dark, muted red to contrast with the cold blue ambient dusk tone",
              "overgrown bushes placed tight on the left and right frame edges to emphasize a sense of claustrophobia and the path closing in"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "aeff947f3e8a82ce",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "2a53f54ae7a31d58",
              "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": [
          "C06",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From waist height three meters ahead on the narrow forest path, the handheld camera retreats shakily in a slightly low wide frame, keeping the fleeing man full-body in the middle of the shot. His lifted bare foot hangs in the lower frame while the bleeding thigh bite remains readable above it, with dense bushes scraping the left and right edges as if the path is closing around him.",
            "lighting_mood": "Cold blue dusk light seeps through the foliage, with wet leaves catching faint highlights and the wound rendered in dark, muted red.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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 foreground along forest path",
                  "label": "fleeing man",
                  "screen_zone": "middle_center",
                  "target_id": "C06",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C06",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place 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": "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": "man_physical_traits",
                "element_type": "character_state",
                "character_name": "한국인 남성",
                "description": "A Korean man missing one shoe, leaving one of his feet entirely bare. He has a large, noticeably bleeding bite mark on his thigh. These clothing conditions and bodily injuries persist across the scene regardless of his body posture.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "벗겨진 한쪽 신발.",
                  "허벅지에 커다란 이빨 자국. 피가 흐르고."
                ],
                "visual_inferences": [
                  "torn fabric around the thigh wound revealing the bite mark",
                  "dirt and mud smeared on his bare foot and remaining clothing"
                ],
                "creative_decisions": [
                  "rendering the bite mark with a dark, muted red to match the cold dusk lighting"
                ],
                "confidence": "high"
              },
              {
                "element_id": "dusk_forest_setting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, dense forest environment at dusk. The ground consists of a damp, muddy path surrounded by thick, overgrown bushes. The entire area is bathed in a cold blue ambient dusk light.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "S#1. 숲속 / 해 질 무렵",
                  "우거진 수풀을 헤치며"
                ],
                "visual_inferences": [
                  "damp and muddy forest floor",
                  "cold blue dusk light filtering through the foliage"
                ],
                "creative_decisions": [
                  "wet leaves catching faint highlights to emphasize the gloomy, oppressive 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": [],
            "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": "2d251deab17ce65b"
      },
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "어둠 속의 피습과 제압",
        "representative_moment": "A dark silhouette forcefully pins the bleeding victim to the damp forest floor.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight low angle at ground level, cold blue dusk lighting",
            "t2i_prompt": "Photorealistic cinematic still. Shot from a handheld tight low angle just above the [: damp, muddy forest floor strewn with flattened wet leaves and out-of-focus tangled underbrush]. A Korean figure, appearing as a heavy black silhouette, back to the camera, hunched over a victim from above. The attacker's body volume is preserved against the dim ambient fill, the face fully swallowed in shadow with no discernible facial or head features, gazing down and exerting heavy downward force. Beneath the silhouette, a Korean man is pinned on the muddy ground in right profile, gazing up with a pained, severely injured expression. The mass of the attacker smothers most of the man's torso, leaving only fragments of his limbs visible at the frame edges: a mud-smeared bare foot and torn fabric around the thigh revealing a large, noticeably bleeding bite mark rendered in dark muted red. The scene is swallowed by cold ambient dusk blue, with a faint blood-dark glint and damp ground sheen catching the wet leaves.",
            "outfit_assignments": [],
            "source_facts": [
              "S#1. 숲속 / 해 질 무렵",
              "어디선가 쏜살같이 달려온 검은 인영이 남자를 덮친다.",
              "잔뜩 겁에 질린 남자 표정",
              "Shot description: The black silhouette occupies the upper layer of the frame and smothers most of the man's body"
            ],
            "visual_inferences": [
              "fixed_element man_physical_traits: pinned on the muddy ground, bare foot and bleeding bite mark extending into the frame edge",
              "attacker described via stable_traits: face fully obscured, body volume preserved against dim ambient fill as a thick silhouette"
            ],
            "creative_decisions": [
              "framing the shot close to the muddy ground to emphasize the overwhelming weight of the silhouette over the victim",
              "using cold dusk blue with faint blood-dark glints on wet leaves to enhance the claustrophobic horror tone",
              "applying L02 block instead of L01 for frame-edge surface description to comply with skip_background constraint"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "31a6fa8c2baf43b3",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d7c10aa147543d79",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "maintains visual continuity for the victim's physical state (bleeding bite mark, bare foot) and the dark damp forest setting established in the prior shot",
        "_shot_index": 4,
        "visible_entities": [
          "C12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera has dropped to less than a meter from the forest floor beside the fallen man, handheld but settling into a tight low angle tilted slightly downward. The black silhouette occupies the upper layer of the frame and smothers most of the man's body, leaving only fragments of his pinned limbs and the muddy ground visible at the edges.",
            "lighting_mood": "The scene is nearly swallowed by cold dusk blue, with only damp ground sheen and a faint blood-dark glint breaking the black mass of the attacker.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C12",
                "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": "C12",
                "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": [
              {
                "element_id": "man_physical_traits",
                "element_type": "character_state",
                "character_name": "한국인 남성",
                "description": "A Korean man missing one shoe, leaving one of his feet entirely bare. He has a large, noticeably bleeding bite mark on his thigh. These clothing conditions and bodily injuries persist across the scene regardless of his body posture.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "벗겨진 한쪽 신발.",
                  "허벅지에 커다란 이빨 자국. 피가 흐르고."
                ],
                "visual_inferences": [
                  "torn fabric around the thigh wound revealing the bite mark",
                  "dirt and mud smeared on his bare foot and remaining clothing"
                ],
                "creative_decisions": [
                  "rendering the bite mark with a dark, muted red to match the cold dusk lighting"
                ],
                "confidence": "high"
              },
              {
                "element_id": "dusk_forest_setting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, dense forest environment at dusk. The ground consists of a damp, muddy path surrounded by thick, overgrown bushes. The entire area is bathed in a cold blue ambient dusk light.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "S#1. 숲속 / 해 질 무렵",
                  "우거진 수풀을 헤치며"
                ],
                "visual_inferences": [
                  "damp and muddy forest floor",
                  "cold blue dusk light filtering through the foliage"
                ],
                "creative_decisions": [
                  "wet leaves catching faint highlights to emphasize the gloomy, oppressive atmosphere"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "4dc0fac153ad6f87"
      },
      {
        "scene_index": 2,
        "heading": "S#2. 도시 뒷골목 / N",
        "beat_title": "가로등 아래의 참혹한 습격",
        "representative_moment": "희미한 가로등 불빛이 비치는 전봇대 아래에서 C09가 C07을 강압적으로 억압하며 목덜미를 파고들고, C07은 저항하지 못한 채 눈을 감고 쓰러지듯 밀착된 와이드 앵글 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "static wide view at eye level, tunnel-like framing with deep depth, strong color contrast between amber streetlight and blue-black shadows",
            "t2i_prompt": "Photorealistic cinematic still. At eye level from the mouth of an urban back alley, a static wide view where the head and feet of the subjects both fit in the frame, the damp, unlit narrow walls angling inward to frame the space like a long dark tunnel. In the deep center of the alley, a rough utility pole stands illuminated by a solitary, weak amber streetlight. The muted amber light creates a localized pool around the pole's base, sharply contrasting with the cold, damp, blue-black shadows submerging the alley edges. Two small figures are pressed together against the street-facing side of the shared utility pole. C09O08 in a dark hooded jacket, an East Asian adult man with a darkened face, showing variant features carried from stable_traits — glowing red irises and exposed teeth — stands at a three-quarter angle from the right as the force initiator, his weight pressing forward, hunched deeply into the neck of the second figure. C07O07 in a beige trench coat, an East Asian adult woman with black hair, stands in left profile as the constrained figure receiving the force, her back pressed tightly against the pole, her eyes completely closed, her body slack and helpless, feet resting on the wet pavement reflecting the faint amber glow.",
            "outfit_assignments": [
              {
                "character_id": "C09",
                "outlook_id": "O08"
              },
              {
                "character_id": "C07",
                "outlook_id": "O07"
              }
            ],
            "source_facts": [
              "도심 희미한 가로등 불빛",
              "전봇대에 뒤엉켜있는 두 사람",
              "남자의 붉은 눈동자, 목의 살점을 뜯는 이빨",
              "푹 힘없이 쓰러지는 여자"
            ],
            "visual_inferences": [
              "fixed_element alley_streetlight_environment",
              "fixed_element man_red_eyes",
              "fixed_element woman_closed_eyes",
              "The scene is framed as a distant wide shot to emphasize the isolation and eerie atmosphere of the back alley"
            ],
            "creative_decisions": [
              "Used 'force initiator' and 'constrained figure' wording to physically manifest the violent nature of the attack without relying on kissing/intimacy bias",
              "Replaced the 12-meter measurement with relative depth descriptors like 'deep center of the alley' to prevent T2I scale issues",
              "Enhanced the lighting contrast with explicit color temperatures (amber vs blue-black) to match the required folk horror thriller tone"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "739433b7ded9f3ed",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "28e6741d3b5dbf93",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 1,
        "visible_entities": [
          "C09",
          "C07",
          "L02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level from the mouth of the back alley, the camera holds a static wide view about twelve meters from the utility pole. The man and woman are small but centered beneath the weak streetlight, pressed together against the pole while the alley walls and darkness frame them like a long tunnel.",
            "lighting_mood": "A weak amber streetlight pools around the pole, while the alley remains cold blue-black and damp at the 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": 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": [
              "C09",
              "C07",
              "L02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C09",
                "outlook_id": "O08"
              },
              {
                "character_id": "C07",
                "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": "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": "alley_streetlight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A rough utility pole stands in an urban back alley, illuminated by a solitary, weak amber streetlight. The muted amber light creates a localized pool around the base of the pole, sharply contrasting with the cold, damp, blue-black shadows that submerge the surrounding alley edges.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "도심 희미한 가로등 불빛",
                  "전봇대",
                  "A weak amber streetlight pools around the pole",
                  "alley remains cold blue-black and damp at the edges",
                  "Muted amber from the streetlight cuts against cold blue alley darkness"
                ],
                "visual_inferences": [
                  "The ground is slightly damp, subtly reflecting the warm amber glow against the deep, heavy shadows of the alleyway"
                ],
                "creative_decisions": [
                  "Using the stark contrast between the muted warm amber and the cold blue-black darkness to isolate the characters and heighten the eerie mood"
                ],
                "confidence": "high"
              },
              {
                "element_id": "man_red_eyes",
                "element_type": "character_state",
                "character_name": "한국인 남성",
                "description": "The Korean man's eyes feature stark, glowing red irises, reflecting his mutated, manifested condition. This vivid red eye coloration remains a constant physical trait.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "남자의 붉은 눈동자",
                  "한국인 남성 (발현 상태)"
                ],
                "visual_inferences": [
                  "The red irises emit a faint, unnatural glow that stands out even in the dim amber and blue-black lighting of the alley"
                ],
                "creative_decisions": [
                  "Highlighting the red eyes as a key visual indicator of his monstrous transformation and predatory nature"
                ],
                "confidence": "high"
              },
              {
                "element_id": "woman_closed_eyes",
                "element_type": "character_state",
                "character_name": "한국인 여성",
                "description": "The Korean woman's eyes are completely closed. Her eyelids remain steadily shut throughout the encounter, conveying a state of helplessness or loss of consciousness.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "한국인 여성 — gaze=closed_eyes (Shot 1)",
                  "한국인 여성 — gaze=closed_eyes (Shot 4)"
                ],
                "visual_inferences": [
                  "Her facial muscles are relaxed as she slips into unconsciousness, keeping her eyes heavily and permanently closed"
                ],
                "creative_decisions": [
                  "Maintaining her closed eyes consistently across shots to emphasize her passive, victimized state against the sudden attack"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C09O08",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C07O07",
                "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": "5b87ff2f4e4d5f5e"
      },
      {
        "scene_index": 2,
        "heading": "S#2. 도시 뒷골목 / N",
        "beat_title": "공격 직후 쓰러진 희생자와 가해자",
        "representative_moment": "피를 흘리며 바닥에 쓰러진 C07 위로 붉은 눈의 C09가 내려다보고 있는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide low-angle shot tilting upward, high contrast between muted amber and cold blue darkness",
            "t2i_prompt": "Photorealistic cinematic still. C07O07 in a beige trench coat, a Korean adult woman with black hair, the fallen woman lies motionless sprawled across the wet pavement in the lower-center foreground. She is positioned at a three-quarter angle from the left with her eyes completely closed, a deep dark red blood visible at her neck. Sharing the same wet alley pavement, C09O08 in a dark gray hooded jacket, a Korean adult man with a dark face, stands over her at a three-quarter angle from the right. His glowing red irises and exposed teeth are visible in the dim light, his eyes fixed on C07O07 below, his legs and torso rising above her in the frame to establish a stark power imbalance. A rough utility pole stands behind him, illuminated by a solitary, weak amber streetlight falling from above. The muted amber light creates a localized pool around the base of the pole, sharply contrasting with the cold, damp, blue-black shadows that submerge the surrounding alley edges, captured from a low observer viewpoint near pavement level tilting upward.",
            "outfit_assignments": [
              {
                "character_id": "C07",
                "outlook_id": "O07"
              },
              {
                "character_id": "C09",
                "outlook_id": "O08"
              }
            ],
            "source_facts": [
              "남자의 붉은 눈동자, 목의 살점을 뜯는 이빨",
              "푹 힘없이 쓰러지는 여자",
              "도심 희미한 가로등 불빛",
              "전봇대"
            ],
            "visual_inferences": [
              "The Korean woman's eyes are completely closed in an unconscious state",
              "A rough utility pole stands in an urban back alley, illuminated by a weak amber streetlight",
              "The ground is slightly damp, reflecting the warm amber glow against heavy blue-black shadows",
              "Low camera angle emphasizing the power imbalance between the standing man and the fallen woman"
            ],
            "creative_decisions": [
              "Placing the fallen woman in the lower-center foreground to anchor the low-angle composition",
              "Using the muted amber streetlight to selectively backlight the man and highlight his glowing red eyes against the cold darkness",
              "Contrasting the limp posture of the woman with the dominant standing posture of the man in a single wide frame"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8bf4f58c892ddae7",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "14cf5e768dbc5110",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 2,
        "dependency_reason": "이전 샷(Shot 1)에서 설정된 뒷골목의 환경, 전봇대 위치 및 조명 분위기를 동일하게 유지하기 위함",
        "_shot_index": 4,
        "visible_entities": [
          "C09",
          "C07",
          "L02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From near pavement level beside the fallen woman, the camera completes its upward tilt into a slightly wider low composition. Her limp full body stretches across the lower frame, while the man rises above her near the utility pole, his legs and torso held in the same frame to make the power imbalance unavoidable.",
            "lighting_mood": "Muted amber from the streetlight cuts against cold blue alley darkness, with the blood at the neck registering as a deep, almost black red.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "fallen woman",
                  "screen_zone": "lower_center",
                  "target_id": "C07",
                  "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": [
              "C09",
              "C07",
              "L02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C09",
                "outlook_id": "O08"
              },
              {
                "character_id": "C07",
                "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": "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": "alley_streetlight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A rough utility pole stands in an urban back alley, illuminated by a solitary, weak amber streetlight. The muted amber light creates a localized pool around the base of the pole, sharply contrasting with the cold, damp, blue-black shadows that submerge the surrounding alley edges.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "도심 희미한 가로등 불빛",
                  "전봇대",
                  "A weak amber streetlight pools around the pole",
                  "alley remains cold blue-black and damp at the edges",
                  "Muted amber from the streetlight cuts against cold blue alley darkness"
                ],
                "visual_inferences": [
                  "The ground is slightly damp, subtly reflecting the warm amber glow against the deep, heavy shadows of the alleyway"
                ],
                "creative_decisions": [
                  "Using the stark contrast between the muted warm amber and the cold blue-black darkness to isolate the characters and heighten the eerie mood"
                ],
                "confidence": "high"
              },
              {
                "element_id": "man_red_eyes",
                "element_type": "character_state",
                "character_name": "한국인 남성",
                "description": "The Korean man's eyes feature stark, glowing red irises, reflecting his mutated, manifested condition. This vivid red eye coloration remains a constant physical trait.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "남자의 붉은 눈동자",
                  "한국인 남성 (발현 상태)"
                ],
                "visual_inferences": [
                  "The red irises emit a faint, unnatural glow that stands out even in the dim amber and blue-black lighting of the alley"
                ],
                "creative_decisions": [
                  "Highlighting the red eyes as a key visual indicator of his monstrous transformation and predatory nature"
                ],
                "confidence": "high"
              },
              {
                "element_id": "woman_closed_eyes",
                "element_type": "character_state",
                "character_name": "한국인 여성",
                "description": "The Korean woman's eyes are completely closed. Her eyelids remain steadily shut throughout the encounter, conveying a state of helplessness or loss of consciousness.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "한국인 여성 — gaze=closed_eyes (Shot 1)",
                  "한국인 여성 — gaze=closed_eyes (Shot 4)"
                ],
                "visual_inferences": [
                  "Her facial muscles are relaxed as she slips into unconsciousness, keeping her eyes heavily and permanently closed"
                ],
                "creative_decisions": [
                  "Maintaining her closed eyes consistently across shots to emphasize her passive, victimized state against the sudden attack"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 2,
                "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": "C09O08",
                "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": "34762fb60d1f3dc4"
      },
      {
        "scene_index": 3,
        "heading": "S#3. 현장 / D",
        "beat_title": "사건 현장을 지휘하는 혜수",
        "representative_moment": "경찰 무리 속에서 혜수가 굳은 표정으로 바닥을 주시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "compressed local-news footage, medium distance at chest-to-eye height looking slightly downward",
            "t2i_prompt": "Photorealistic cinematic still. Shot from a medium distance at chest-to-eye height looking slightly downward, mimicking compressed local-news footage. C02O02 in a dark leather jacket, a Korean middle-aged woman with neat black hair and distinct eyes, holds the center in an upper-body frame, positioned at three-quarter angle from the right. Her shoulders are locked forward, her gaze directed downward at the ground. In the immediate foreground, a Korean adult man in a police field uniform appears over his shoulder, leaning into the scene with his back partly to the camera, his gaze also looking downward, sharing the cordoned-off area with her. The surrounding police bodies partially layer the left, right, and rear of the image as blurred silhouettes. Behind the officers, a stretched, slightly sagging police line tape displays its printed warning side in broken strips toward the camera. Near the lower frame edge behind the officers, open forensic equipment cases show their front latches and side edges. Flat daylight is desaturated, filling the scene with cold gray highlights and a slight electronic harshness. Focus is on C02O02's fixed downward expression and locked shoulders against the foreground police cluster.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "scene text: 지역 뉴스 화면... 현장을 감식하는 경찰, 폴리스 라인을 치고 시신을 수거한다. 형사무리 속에 사건을 지휘하는 혜수의 모습이 보인다.",
              "shot description: 경찰 무리 중앙에 선 혜수가 굳은 표정으로 바닥의 시신 쪽을 주시하는 상체"
            ],
            "visual_inferences": [
              "mimicking compressed local-news footage with flat desaturated daylight and cold gray highlights",
              "foreground police officers blurring the edges to create a tight cluster",
              "Korean adult man (C13 placeholder) placed in the foreground with his back partly to the camera to emphasize the perspective of looking past the perimeter"
            ],
            "creative_decisions": [
              "framed at chest-to-eye height looking downward to imply the unseen body on the ground below the lower frame edge",
              "printed warning side of the police line tape facing the camera behind the officers to clearly mark the boundary",
              "forensic equipment cases placed near the lower frame edge to add procedural realism"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5c9708f79d41b74e",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "7a396c6daa7bd506",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "C02",
          "C13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 3,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The shot is framed like compressed local-news footage, medium distance at chest-to-eye height just outside the police cluster, looking slightly downward past blurred shoulders in the foreground. Hyesu holds the center in an upper-body frame, her fixed downward eyeline implying the unseen body on the ground while police bodies partially layer the left, right, and rear of the image.",
            "lighting_mood": "Flat daylight is desaturated by the news-screen treatment, with cold gray highlights and slight electronic harshness replacing 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": [
              "C02",
              "C13"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              },
              {
                "character_id": "C13",
                "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": "C13",
                "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": "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": "C02O02",
                "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": "43eab8eaa6bfd82f"
      },
      {
        "scene_index": 4,
        "heading": "S#4. 옥탑방 / D",
        "beat_title": "불안감을 키우는 미제 사건 보도",
        "representative_moment": "A distant overhead view of the sun-bleached rooftop room and crowded neighborhood alleys.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "High oblique overhead wide shot, muted pale daytime palette",
            "t2i_prompt": "Photorealistic cinematic still. From a high oblique overhead position above the old multi-family villa, the static wide frame keeps the rooftop room and surrounding neighborhood visible together. The flat rooftop yard sits slightly off-center, anchored by a weathered door, a stair bulkhead, and a faded window. The aged concrete surfaces are marked by a rusted pipe, a drain, and an AC unit, enclosed by a low parapet. Across the crowded neighboring rooftop structures, a water tank, a simple post, and a thin laundry line stretch under the hard daytime sun. The light is muted into a dry, pale palette, washing the sun-bleached exterior walls in beige-gray, casting deep shadows into the narrow alleys below, maintaining a distant news-reporting detachment.",
            "outfit_assignments": [],
            "source_facts": [
              "S#4 action: 인천 변두리 부감, 오래된 빌라 옥탑방 전경.",
              "shot description: A sunlit daytime high-angle oblique overhead shot looking down at an old villa's rooftop room and the surrounding neighborhood."
            ],
            "visual_inferences": [
              "No characters are physically visible in the frame, serving as an establishing shot for the reporter's voiceover",
              "Narrow alleys in deep shadow contrast geometrically with the sunlit roof planes"
            ],
            "creative_decisions": [
              "Framing emphasizes isolation and density by placing the small rooftop room off-center among crowded neighboring buildings",
              "Desaturated beige-gray tones reflect the dry, anxious mood of the unresolved case reported in the voiceover"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "AC unit",
                "usage_kind": "anchor",
                "source_phrase": "and an AC unit"
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "anchored by a weathered door"
              },
              {
                "owned_token": "drain",
                "usage_kind": "anchor",
                "source_phrase": "a drain"
              },
              {
                "owned_token": "laundry line",
                "usage_kind": "anchor",
                "source_phrase": "and a thin laundry line stretch"
              },
              {
                "owned_token": "neighboring rooftop",
                "usage_kind": "anchor",
                "source_phrase": "Across the crowded neighboring rooftop structures"
              },
              {
                "owned_token": "parapet",
                "usage_kind": "anchor",
                "source_phrase": "enclosed by a low parapet"
              },
              {
                "owned_token": "pipe",
                "usage_kind": "anchor",
                "source_phrase": "marked by a rusted pipe"
              },
              {
                "owned_token": "post",
                "usage_kind": "anchor",
                "source_phrase": "a simple post"
              },
              {
                "owned_token": "rooftop yard",
                "usage_kind": "anchor",
                "source_phrase": "The flat rooftop yard sits slightly off-center"
              },
              {
                "owned_token": "stair bulkhead",
                "usage_kind": "anchor",
                "source_phrase": "a stair bulkhead"
              },
              {
                "owned_token": "water tank",
                "usage_kind": "anchor",
                "source_phrase": "a water tank"
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "and a faded window"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b3b0e21bd08b2f5f",
              "owned_hash": "30f18ca3242b7870",
              "camera_direction_hash": "61f191260e1067a0",
              "owned_usage_hash": "86d5472dfed54cb6",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "AC unit",
                  "violating_phrase": "and an AC unit",
                  "reason": "The prompt references the AC unit as a surface detail to establish the scene's aged texture, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "anchored by a weathered door",
                  "reason": "The door is mentioned as a spatial anchor to establish the layout of the rooftop yard, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "drain",
                  "violating_phrase": "a drain",
                  "reason": "The drain is referenced passively as a concrete surface marker to define the background's layout, in line with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "laundry line",
                  "violating_phrase": "and a thin laundry line stretch",
                  "reason": "The laundry line is mentioned as a structural element stretching across rooftops to establish background depth, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "neighboring rooftop",
                  "violating_phrase": "Across the crowded neighboring rooftop structures",
                  "reason": "Neighboring rooftops are used as a spatial reference for composition and background depth, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "parapet",
                  "violating_phrase": "enclosed by a low parapet",
                  "reason": "The parapet is described as a boundary layout feature to anchor the composition, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pipe",
                  "violating_phrase": "marked by a rusted pipe",
                  "reason": "The pipe is referenced as a textural detail on the concrete surfaces, serving as a background anchor in line with the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "post",
                  "violating_phrase": "a simple post",
                  "reason": "The post is mentioned passively as part of the background environment to ground the shot, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rooftop yard",
                  "violating_phrase": "The flat rooftop yard sits slightly off-center",
                  "reason": "The rooftop yard is referenced to guide the camera's composition and framing, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "stair bulkhead",
                  "violating_phrase": "a stair bulkhead",
                  "reason": "The stair bulkhead is used as a spatial marker for scene anchoring, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "water tank",
                  "violating_phrase": "a water tank",
                  "reason": "The water tank is referenced as a background element to establish environmental scale and context, in line with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "and a faded window",
                  "reason": "The window is mentioned as a static landmark to anchor the layout of the rooftop, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "voiceover",
        "dependent_scene_index": -1,
        "dependency_reason": "No visual dependency on prior scenes; this is an independent establishing shot.",
        "_shot_index": 1,
        "visible_entities": [
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 4,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From a high oblique overhead position above the old multi-family villa, the static wide frame keeps the rooftop room and surrounding neighborhood visible together. The rooftop structure sits slightly off-center among crowded roofs, water tanks, narrow alleys, and sun-bleached exterior walls, maintaining a distant news-reporting detachment rather than character intimacy.",
            "lighting_mood": "Hard daytime sun is muted into a dry, pale palette, with old concrete surfaces washed in beige-gray and little romantic 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": "L04B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "AC unit",
              "door",
              "drain",
              "laundry line",
              "neighboring rooftop",
              "parapet",
              "pipe",
              "post",
              "rooftop yard",
              "stair bulkhead",
              "water tank",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "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": "L04B02",
                "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": "7fac5b0b2070bead"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "불안한 뉴스 시청",
        "representative_moment": "C04가 주방 카운터 너머로 심각한 표정을 지으며 켜진 TV 화면을 응시하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level observer shot pushing across the foreground counter, compressing the space with a muted gray-blue ambient and pulsing TV light.",
            "t2i_prompt": "Photorealistic cinematic still. At standing eye level near the kitchenette threshold, the camera looks across the foreground kitchen counter and sink. C04O04 in a knit cardigan and apron, a Korean woman in her 40s, occupies the right-center, her upper body visible. She stands at a three-quarter angle from the left, leaning slightly forward with shoulders drawn tight, her tense features bathed in cool light, eyes fixed off-screen. The edge of the damp kitchen counter runs diagonally across the lower-left foreground, where a boiling pot on the cooktop vents a steady stream of steam upward. In the background, a lit TV casts indistinct brightness from its front face angled partly toward the camera. A closed sliding window with hazy glass admits thin pale daylight. The cool TV spill mixes with the weak daylight and steam, flattening the cramped interior into a subdued, anxious gray-blue tone.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "거실에 난 작은 창으로 햇살에 가늘게 비친다",
              "싱크대 수도꼭지에 흐르는 물",
              "냄비의 물이 끓어 달그락거리는 소리… 김이 피어오르고",
              "앞치마를 두른 채 TV 뉴스를 뚫어지게 바라보는 민숙 표정이 어둡다"
            ],
            "visual_inferences": [
              "fixed_element rooftop_interior_environment: muted gray-blue ambient tones flattening the domestic space",
              "The kitchen counter across the foreground compresses the physical space, emphasizing the cramped nature of the apartment",
              "Cool pulsing light from the TV highlights her tense, anxious state"
            ],
            "creative_decisions": [
              "Used a diagonal foreground element (the counter) to create depth without opening the room too widely",
              "Contrasted the hazy pale daylight from the small window with the artificial cool TV light on C04O04's face"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "usage_kind": "anchor",
                "source_phrase": "a lit TV casts indistinct brightness"
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coat rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "anchor",
                "source_phrase": "on the cooktop"
              },
              {
                "owned_token": "cup",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor cushion",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "framed photo",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "anchor",
                "source_phrase": "the foreground kitchen counter"
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "anchor",
                "source_phrase": "and sink"
              },
              {
                "owned_token": "sliding window",
                "usage_kind": "anchor",
                "source_phrase": "A closed sliding window with hazy glass"
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "teapot",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tray",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e0bb559918947ccf",
              "owned_hash": "940a8f9495ca9a84",
              "camera_direction_hash": "5f98d81950d7d844",
              "owned_usage_hash": "dfe786adc0fc65b5",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "TV",
                  "violating_phrase": "In the background, a lit TV casts indistinct brightness from its front face angled partly toward the camera.",
                  "reason": "The TV is referenced solely as a background light source casting ambient brightness, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "cooktop",
                  "violating_phrase": "on the cooktop vents a steady stream of steam",
                  "reason": "The cooktop acts as a spatial reference for the boiling pot without any instructions to redraw or alter the cooktop itself, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "kitchen counter",
                  "violating_phrase": "the camera looks across the foreground kitchen counter... The edge of the damp kitchen counter",
                  "reason": "The kitchen counter is used to establish the camera's composition and diagonal perspective, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sink",
                  "violating_phrase": "looks across the foreground kitchen counter and sink",
                  "reason": "The sink is mentioned as a foreground compositional anchor, which is consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sliding window",
                  "violating_phrase": "A closed sliding window with hazy glass admits thin pale daylight.",
                  "reason": "The window is described as an environmental source of light and atmosphere, fitting the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "C04",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At standing eye level near the kitchenette threshold, the camera finishes its slow push about six feet from Minsuk, angled across the sink-and-stove line toward the living-room TV area. She occupies the right-center in a medium upper-body frame, apron visible, shoulders drawn tight as the TV glow grazes her face without opening the room too widely.",
            "lighting_mood": "Cool TV light pulses over Minsuk's tense features while thin daylight and kitchen steam flatten the room into a muted, anxious gray-blue.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C04",
                "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": "background_ref_attached",
            "bg_id": "L05B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "chair",
              "coat rack",
              "cooktop",
              "cup",
              "curtain",
              "dining table",
              "door",
              "floor cushion",
              "framed photo",
              "kitchen counter",
              "refrigerator",
              "shoe cabinet",
              "sink",
              "sliding window",
              "smartphone",
              "sofa",
              "teapot",
              "tray",
              "wall shelf"
            ],
            "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_interior_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a cramped, modest modern South Korean rooftop apartment. The space is continuously bathed in thin, pale daylight from a small window, which mixes with muted gray-blue ambient tones. This soft, cool-toned lighting flattens the domestic environment, creating a slightly sickly and visually subdued background.",
                "applies_to_shots": [
                  2,
                  6,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "거실에 난 작은 창으로 햇살에 가늘게 비친다",
                  "thin daylight and kitchen steam flatten the room into a muted, anxious gray-blue",
                  "Pale daylight from the small window mixes with residual cool TV spill",
                  "Thin daylight catches the skin... against an otherwise soft, muted interior background"
                ],
                "visual_inferences": [
                  "The small living space feels tightly packed, emphasizing the modest living conditions of the characters.",
                  "The continuous presence of weak, cool lighting binds the different angles and close-ups together into a single cohesive, slightly anxious atmosphere."
                ],
                "creative_decisions": [
                  "Using a muted gray-blue color palette to maintain a visually flat and emotionally distant domestic backdrop across both medium shots and inserts."
                ],
                "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": "C04O04",
                "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": "c0a1f97db1e99ca0"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "알바 가기 전 투정",
        "representative_moment": "수리영(C01)이 식탁에 앉아 불만스러운 표정으로 컵을 내려다보는 중간 컷",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "seated eye-level medium shot across the table, soft flat focus",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a Korean woman in her early 20s, perched at the edge of the dining table at a three-quarter angle from the right, upper body in frame, looking down with a dissatisfied expression at the cup held near the lower middle. The plain dining table crosses the lower foreground, separating her from the camera. Behind her, the cramped rooftop apartment interior is steeped in thin, pale daylight filtering through the hazy sliding window, mixing with residual cool light. The soft background features a dim kitchen counter, flattening the domestic space in muted gray-blue ambient tones.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "딸, 수리영이 방문을 열고 기지개를 켜며 나오자",
              "수리영 (식탁에 앉으며)",
              "수리영 (마시고 나서) 아, 진짜 맛 없어...(투정)"
            ],
            "visual_inferences": [
              "fixed_element rooftop_interior_environment: cramped, muted gray-blue ambient, thin pale daylight",
              "Suriyoung looks down at the cup with a dissatisfied expression, holding it near her lower torso"
            ],
            "creative_decisions": [
              "Eye-level medium framing anchors the viewer across the table, emphasizing her slightly hunched, weary morning posture",
              "Muted gray-blue light from the sliding window creates a sickly, flat atmosphere"
            ],
            "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": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coat rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cup",
                "usage_kind": "redraw",
                "source_phrase": "cup held near the lower middle"
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "anchor",
                "source_phrase": "plain dining table crosses the lower foreground"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor cushion",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "framed photo",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "anchor",
                "source_phrase": "dim kitchen counter"
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding window",
                "usage_kind": "anchor",
                "source_phrase": "hazy sliding window"
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "teapot",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tray",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "faf930317705d8b8",
              "owned_hash": "940a8f9495ca9a84",
              "camera_direction_hash": "4040d1f15b903897",
              "owned_usage_hash": "68f1b065faa6ee1c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "dining table",
                  "violating_phrase": "perched at the edge of the dining table",
                  "reason": "The dining table is referenced as a spatial guide for the character's posture and a composition separator, functioning as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "cup",
                  "violating_phrase": "looking down with a dissatisfied expression at the cup held near the lower middle",
                  "reason": "The prompt refers to 'the cup' as the target of the character's gaze and posture rather than instructing it to be newly generated or modified, making it an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sliding window",
                  "violating_phrase": "filtering through the hazy sliding window",
                  "reason": "The sliding window is mentioned as a background element filtering ambient daylight, acting as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "kitchen counter",
                  "violating_phrase": "a dim kitchen counter",
                  "reason": "The kitchen counter is described as a soft background feature to establish the domestic setting, acting as an anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "같은 옥탑방 내부 공간의 배경 및 회색빛/푸른빛 조명 연속성 유지",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At seated eye level from the far side of the small dining table, the tracking move settles into a steadier medium frame toward Suriyoung's front. She is framed slightly off-center with the cup held near the lower middle of the image, her dissatisfied expression and hunched table posture carrying the beat while the cramped kitchen-living space stays softly present behind her.",
            "lighting_mood": "Pale daylight from the small window mixes with residual cool TV spill, making the domestic space feel cramped and slightly sickly rather than warm.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "L05"
            ],
            "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": [
              "TV",
              "chair",
              "coat rack",
              "cooktop",
              "cup",
              "curtain",
              "dining table",
              "door",
              "floor cushion",
              "framed photo",
              "kitchen counter",
              "refrigerator",
              "shoe cabinet",
              "sink",
              "sliding window",
              "smartphone",
              "sofa",
              "teapot",
              "tray",
              "wall shelf"
            ],
            "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_interior_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a cramped, modest modern South Korean rooftop apartment. The space is continuously bathed in thin, pale daylight from a small window, which mixes with muted gray-blue ambient tones. This soft, cool-toned lighting flattens the domestic environment, creating a slightly sickly and visually subdued background.",
                "applies_to_shots": [
                  2,
                  6,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "거실에 난 작은 창으로 햇살에 가늘게 비친다",
                  "thin daylight and kitchen steam flatten the room into a muted, anxious gray-blue",
                  "Pale daylight from the small window mixes with residual cool TV spill",
                  "Thin daylight catches the skin... against an otherwise soft, muted interior background"
                ],
                "visual_inferences": [
                  "The small living space feels tightly packed, emphasizing the modest living conditions of the characters.",
                  "The continuous presence of weak, cool lighting binds the different angles and close-ups together into a single cohesive, slightly anxious atmosphere."
                ],
                "creative_decisions": [
                  "Using a muted gray-blue color palette to maintain a visually flat and emotionally distant domestic backdrop across both medium shots and inserts."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "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": "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": "e9ef1c86e747042a"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "외출 전 드러난 표식",
        "representative_moment": "C04의 손목 안쪽에 새겨진 선명한 붉은 원형 표식 P01 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Insert close-up at low hand height, angled downward, soft gray-blue ambient tones",
            "t2i_prompt": "Photorealistic cinematic still. C04 in a knit cardigan sleeve, a Korean middle-aged woman looking off-screen, presents the Minsuk wrist mark in the middle-center foreground. The camera is positioned at low hand height beside her, angled downward into an extreme insert shot so faces and the upper body are entirely excluded. The inner wrist surface faces the camera directly, displaying P01, a small, sharply defined circular mark centered on the bare skin. A narrow strip of the slightly wrinkled sleeve cuff curves around the wrist edge, its fabric side facing the camera. Thin pale daylight catches the skin, making the mark unnervingly crisp. The background is a soft, muted gray-blue environment where a defocused, blurred door serves as an out-of-focus edge reference.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "힐끗, 민숙 손목에 보이는 작은 원(이하 표식)을 본다.",
              "오늘따라 유난히 또렷해 보이지만 워낙 어릴 적부터 봐온 터라"
            ],
            "visual_inferences": [
              "fixed_element: muted gray-blue ambient tones flattening the domestic environment",
              "The camera tightly isolates the wrist to exclude faces, focusing entirely on the mark's distinctness"
            ],
            "creative_decisions": [
              "Used an extreme insert framing scaled solely to the wrist to heighten the unnerving clarity of the mark against the mundane background",
              "Included a blurred door from the exact_background reference to provide depth without distracting from the primary subject"
            ],
            "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": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coat rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cup",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "a defocused, blurred door serves as an out-of-focus edge reference"
              },
              {
                "owned_token": "floor cushion",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "framed photo",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "teapot",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tray",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f0423d02111f5644",
              "owned_hash": "940a8f9495ca9a84",
              "camera_direction_hash": "a4d140b4c9d8a6cd",
              "owned_usage_hash": "ff891095b7aeef7b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "a defocused, blurred door serves as an out-of-focus edge reference",
                  "reason": "The door is mentioned only as a defocused background reference for framing, which matches the producer's anchor classification and does not trigger a redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "S5_Shot2 exact_background continuity (same room, muted gray-blue lighting mood carried over).",
        "_shot_index": 9,
        "visible_entities": [
          "C04",
          "P01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At low hand height beside Minsuk, the camera tightens into an insert less than a foot from the inside of her wrist, angled downward so faces are excluded. The small circular mark sits centered on the skin surface, with only a narrow strip of sleeve and blurred entryway color at the edges for scale.",
            "lighting_mood": "Thin daylight catches the skin and makes the circular mark unnervingly crisp against an otherwise soft, muted interior background.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "Minsuk wrist mark",
                  "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",
              "P01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C04",
                "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": "C04",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "The shot isolates only Minsuk's wrist and mark, excluding her face and full outlook. A base identity reference is enough to preserve character continuity without forcing an outlook-specific facial match."
              }
            ],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject 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": [
              "TV",
              "chair",
              "coat rack",
              "cooktop",
              "cup",
              "curtain",
              "dining table",
              "door",
              "floor cushion",
              "framed photo",
              "kitchen counter",
              "refrigerator",
              "shoe cabinet",
              "sink",
              "sliding window",
              "smartphone",
              "sofa",
              "teapot",
              "tray",
              "wall shelf"
            ],
            "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_interior_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a cramped, modest modern South Korean rooftop apartment. The space is continuously bathed in thin, pale daylight from a small window, which mixes with muted gray-blue ambient tones. This soft, cool-toned lighting flattens the domestic environment, creating a slightly sickly and visually subdued background.",
                "applies_to_shots": [
                  2,
                  6,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "거실에 난 작은 창으로 햇살에 가늘게 비친다",
                  "thin daylight and kitchen steam flatten the room into a muted, anxious gray-blue",
                  "Pale daylight from the small window mixes with residual cool TV spill",
                  "Thin daylight catches the skin... against an otherwise soft, muted interior background"
                ],
                "visual_inferences": [
                  "The small living space feels tightly packed, emphasizing the modest living conditions of the characters.",
                  "The continuous presence of weak, cool lighting binds the different angles and close-ups together into a single cohesive, slightly anxious atmosphere."
                ],
                "creative_decisions": [
                  "Using a muted gray-blue color palette to maintain a visually flat and emotionally distant domestic backdrop across both medium shots and inserts."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "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",
                "id": "C04",
                "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": "77d4c8af8160fe84"
      },
      {
        "scene_index": 6,
        "heading": "S#6. 해안가 도로 / D",
        "beat_title": "해안가 도로를 달리며 활기를 띠는 수리영",
        "representative_moment": "밝은 해안가 도로 위에서 자전거 핸들을 쥐고 먼 곳을 응시하며 미소 짓는 C01의 상체 스틸컷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tracking medium upper-body frame just ahead and slightly left, clear desaturated daylight",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a Korean young woman in her 20s, as Suriyoung riding a bicycle in the middle-center midground, moving toward the forward along the coastal road. The camera tracks at handlebar height from just ahead and slightly left, capturing her in a medium upper-body frame at a three-quarter angle from the left. Her hands lock firmly around the bicycle handlebar in the lower third of the frame, the bicycle frame and front wheel visible below. She gazes into the distance with a bright smile, white earphones visible in her ears. Her black hair flows backward in the direction opposite to motion. [L06: The sunlit coastal road runs diagonally behind and beneath the bicycle, receding in the direction of travel, bordered by a bright weathered roadside guardrail sliding past the background.] Clear daylight provides a lively, slightly desaturated tone, sea haze softening highlights against the breezy coastal horizon.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#6 action: '수리영 자전거를 타고 해안가 도로를 달린다. 이어폰을 끼고 바다냄새를 실컷 마신다.'",
              "shot description: 밝은 낮의 해안가 도로, 이어폰을 낀 수리영이 자전거 핸들을 쥔 채 미소 짓고 있으며, 주행 추진력으로 인해 머리카락이 뒤로 흩날리는 상체"
            ],
            "visual_inferences": [
              "Bicycle frame and front wheel visible below to anchor the handlebars to a physical vehicle.",
              "Hair flowing backward in the direction opposite to motion captures the mid-action freeze of riding."
            ],
            "creative_decisions": [
              "Clear daylight with slightly desaturated tone and sea haze emphasizes the lively open atmosphere.",
              "Medium upper-body tracking shot from just ahead and slightly left enhances the feeling of forward movement."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "473f2cfb9b161291",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "2abb304d2da33672",
              "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": [
          "C01",
          "L06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 6,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Mounted or tracking just ahead and slightly left of the bicycle at handlebar height, the camera moves parallel with Suriyoung in a medium upper-body frame. Her hands grip the handlebar along the lower third, earphones visible, hair blown backward by speed, and the bright coastal road sliding past behind her without widening fully away from her smile.",
            "lighting_mood": "Clear daylight is lively but slightly desaturated, with sea haze softening highlights and wind giving the shot a clean, open contrast to the darker preceding scenes.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": "forward along coastal road",
                  "label": "Suriyoung 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": [
              "C01",
              "L06"
            ],
            "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": "9e06f6db2b36f02f"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "수리영의 눈빛 제압",
        "representative_moment": "C01 stares fiercely at an off-camera dog, her pale face dominating the frame under cold blue-white light.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight frontal face close-up, eye-level, cold blue-white fluorescent lighting",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a young Korean woman, occupies the middle-center foreground, facing the camera and looking toward the off-camera Rottweiler. Her pale face, framed by black hair, fills the center two-thirds of the shot, chin held still, deep eyes fixed forward with intense focus. Cold blue-white shelter fluorescents cast a sharp highlight across her skin and eyes. At the outer edges of the frame, [: out-of-focus metallic kennel bars and damp concrete walls] are reduced to a soft, muted gray-green blur right behind her shoulders.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#7 action: '맹견의 눈을 노려보는 수리영.'",
              "shot description: Eye-level and only two feet from 수리영, tight frontal face close-up",
              "the dog is kept off-frame so its pressure exists only in her locked eyeline"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: facing the camera with chin held still",
              "Cold shelter fluorescents cast a hard blue-white edge without physically cutting the body",
              "kennel space compressed into a soft, metallic blur at the edges to support skipped_close_framing background rule"
            ],
            "creative_decisions": [
              "Placed C01O01 squarely in the middle-center foreground to fulfill the frame_spatial_contract",
              "Replaced forbidden L01 ID with L02 to describe the frame-edge background surfaces directly",
              "Integrated stable traits (pale face, black hair, deep eyes) directly into the facial close-up description"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "cffb2d91f313c1d4",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "f15707f7f361bda7",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "Independent close-up shot focusing entirely on the character's face; no prior visual dependency required.",
        "_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": "Eye-level and only two feet from 수리영, the camera holds a tight frontal face close-up from just beyond the 로트와일러’s shoulder line, but the dog is kept off-frame so its pressure exists only in her locked eyeline. Her face occupies the center two-thirds of the frame, with the kennel space compressed into a soft, metallic blur at the edges; the composition feels almost like the animal is being pinned by her stare rather than by force.",
            "lighting_mood": "Cold shelter fluorescents carve her eyes with a hard blue-white edge, while the kennel background falls into muted gray-green dampness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "off-camera Rottweiler",
                  "label": "수리영",
                  "screen_zone": "middle_center",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "shelter_metallic_kennels",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the animal shelter features rows of metallic kennels, wire cages, and heavy metal doors. The space is illuminated by cold, flat blue-white fluorescent lighting that creates a muted gray-green, slightly damp atmosphere.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "kennel space compressed into a soft, metallic blur",
                  "Cold shelter fluorescents",
                  "muted gray-green dampness",
                  "caged dogs and metal doors",
                  "Flat blue fluorescent light is softened by kennel haze"
                ],
                "visual_inferences": [
                  "The facility consists of continuous rows of functional metallic enclosures for the animals, reflecting a practical and industrial design."
                ],
                "creative_decisions": [
                  "A cool, blue-white color palette is maintained across the shots to emphasize the clinical and slightly bleak reality of the shelter environment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_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": "0d0c2e9639684b74"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "연락 닿지 않는 엄마에 대한 의문",
        "representative_moment": "보호소 한편에서 스마트폰을 귀에 댄 채 미간을 찌푸린 수리영(C01)의 상체 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At chest height beside the kennel row, medium upper-body frame, shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. Captured at chest height beside the kennel row. C01O01 in a navy windbreaker, a Korean woman in her early 20s with black hair, pale complexion, and deep-set eyes, sitting right of center in an upper-body frame, positioned at a three-quarter angle from the left. P03 pressed to her ear, the side edge and dark front face of the smartphone partly visible against her cheek with no readable screen content. Her shoulders are tense, brow furrowed, gazing into the distance. The interior of the animal shelter features rows of metallic kennels, wire cages, and heavy metal doors angled diagonally away behind her shoulder, dissolving into a soft, out-of-focus background blur. The scene is illuminated by cold, flat blue-white fluorescent overhead lighting creating a muted gray-green, slightly damp atmosphere, softened by kennel haze, with a faint amber practical light spill from deeper in the aisle.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영, 갇혀있는 개들 보면서 한숨 후~ 늦을 거 같다. 민숙에게 연락을 취해보지만, 받지 않는다.",
              "Shot description: 수리영이 귀에 스마트폰을 댄 채 미간을 찌푸린 상체"
            ],
            "visual_inferences": [
              "fixed_element shelter_metallic_kennels applied as the background",
              "shallow depth of field used to blur the caged dogs and metal doors into a soft background",
              "upper-body frame seated right of center"
            ],
            "creative_decisions": [
              "Chest-height camera framing to capture her tense shoulders and facial expression alongside the smartphone",
              "Cold blue-white fluorescent light contrasted with a faint amber spill to emphasize the bleak shelter atmosphere"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "7b0fb029c815818a",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "0680c6e0614182a1",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 7,
        "dependency_reason": "같은 씬 내 S7_Shot2의 동물 보호소 내부 배경(exact_background) 연속성 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "P03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "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 chest height beside the kennel row, the camera continues the aisle pan but settles slightly higher into an upper-body frame of 수리영 with the smartphone pressed to her ear. She sits right of center, shoulders tense and brow furrowed, while caged dogs and metal doors dissolve into a soft, restless background rather than competing for attention.",
            "lighting_mood": "Flat blue fluorescent light is softened by kennel haze, with a faint amber practical spill from deeper in the shelter aisle.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "P03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "shelter_metallic_kennels",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the animal shelter features rows of metallic kennels, wire cages, and heavy metal doors. The space is illuminated by cold, flat blue-white fluorescent lighting that creates a muted gray-green, slightly damp atmosphere.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "kennel space compressed into a soft, metallic blur",
                  "Cold shelter fluorescents",
                  "muted gray-green dampness",
                  "caged dogs and metal doors",
                  "Flat blue fluorescent light is softened by kennel haze"
                ],
                "visual_inferences": [
                  "The facility consists of continuous rows of functional metallic enclosures for the animals, reflecting a practical and industrial design."
                ],
                "creative_decisions": [
                  "A cool, blue-white color palette is maintained across the shots to emphasize the clinical and slightly bleak reality of the shelter environment."
                ],
                "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": [],
            "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": "fbf9ed7758bbb951"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "엇갈린 만남과 당혹감",
        "representative_moment": "마트 진열대 앞에서 예상치 못한 직원의 말에 눈을 동그랗게 뜬 C01.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "over-the-shoulder medium framing at chest height with mixed fluorescent and dusk-blue spill lighting",
            "t2i_prompt": "Photorealistic cinematic still. Shot at chest height, an over-the-shoulder medium framing captures two figures sharing a narrow mart aisle. A middle-aged Korean woman in a worker uniform occupies the partial foreground, bracing beside the product display with her back to the camera, her gaze fixed on the main subject. In the clearer plane, C01O01 in a casual navy windbreaker, a young Korean woman in her 20s with dark hair, a pale complexion, and deep eyes, stands at a three-quarter angle from the right. C01O01 is leaning toward the shared display shelf, her deep eyes widened in confusion, fixed on the employee. The mart ceiling lights cast a clean fluorescent white overhead wash. In the background, the storefront and sliding door are softly visible, allowing a deep dusk-blue spill to mix with the interior lighting. Muted red packaging accents on the heavily stocked display shelves form tight vertical lanes around the figures.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영’s widened eyes sit just above the shelf line, upper body turned toward the employee",
              "Inside the mart aisle, the camera dollies in from slightly over the 한국인 여성 직원’s shoulder at chest height"
            ],
            "visual_inferences": [
              "fixed_element suriyoung_base_appearance: Wears comfortable and ordinary modern casual clothing appropriate for cycling",
              "fixed_element dusk_mart_lighting: A stark mix of bright, clean fluorescent lighting from the mart and deep blue dusk shadows"
            ],
            "creative_decisions": [
              "Utilized tight vertical lanes of product shelves to visually box in C01, emphasizing her feeling of confusion and isolation despite the bright everyday space."
            ],
            "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": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bike rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crosswalk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "delivery van",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lane marking",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "neon sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "service cart",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "signboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding door",
                "usage_kind": "anchor",
                "source_phrase": "the storefront and sliding door are softly visible"
              },
              {
                "owned_token": "stall table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storefront",
                "usage_kind": "anchor",
                "source_phrase": "the storefront and sliding door are softly visible"
              },
              {
                "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": "1bed29655aeb2d86",
              "owned_hash": "2fd5607af9218c09",
              "camera_direction_hash": "7e969c09f0959b33",
              "owned_usage_hash": "fb817d8e3c50d2a3",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "sliding door",
                  "violating_phrase": "the storefront and sliding door are softly visible",
                  "reason": "The sliding door is mentioned as softly visible in the background for atmospheric lighting mix, acting as a spatial anchor rather than being redrawn. This matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "storefront",
                  "violating_phrase": "the storefront and sliding door are softly visible",
                  "reason": "The storefront is referenced as softly visible in the background to provide context, without any command to redraw or modify its appearance. This matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual carry-over from a specific prior frame is structurally declared in previous_shot_refs.",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L09"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the mart aisle, the camera dollies in from slightly over the 한국인 여성 직원’s shoulder at chest height, holding 수리영 in the clearer plane while the employee remains a partial foreground presence. 수리영’s widened eyes sit just above the shelf line, upper body turned toward the employee, with product displays forming tight vertical lanes around her confusion.",
            "lighting_mood": "The mart is lit by clean fluorescent white, but dusk-blue spill from the entrance and muted red packaging accents make the everyday space feel uneasy.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "L09"
            ],
            "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": "L08B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "awning",
              "bicycle",
              "bike rack",
              "bollard",
              "crate",
              "crosswalk",
              "curb",
              "delivery van",
              "door",
              "lane marking",
              "neon sign",
              "service cart",
              "signboard",
              "sliding door",
              "stall table",
              "storefront",
              "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": [
              {
                "element_id": "suriyoung_base_appearance",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A young Korean woman dressed in casual, practical clothing suitable for safely riding a bicycle in a busy city. Her physical demographic features and overall attire remain strictly consistent.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "능숙하게 자전거를 모는 수리영",
                  "수리영 마트 밖을 나오면서"
                ],
                "visual_inferences": [
                  "Wears comfortable and ordinary modern casual clothing appropriate for cycling and running daily errands."
                ],
                "creative_decisions": [
                  "Kept her clothing simple and grounded in the contemporary Korean setting to maintain visual focus on her emotional shifts and confusion."
                ],
                "confidence": "medium"
              },
              {
                "element_id": "dusk_mart_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The ambient environment is characterized by a stark mix of bright, clean fluorescent lighting from the mart and deep blue dusk shadows from the evening street. This contrasting light is present both inside near the entrance and immediately outside the storefront.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "해질 무렵",
                  "dusk-blue spill from the entrance",
                  "Blue dusk shadows wrap her profile while storefront fluorescents"
                ],
                "visual_inferences": [
                  "The harsh white lighting of the mart physically spills out into the dark blue evening, creating a visual bridge between the interior and exterior settings."
                ],
                "creative_decisions": [
                  "Using the contrasting mixed lighting to subtly emphasize the protagonist's feelings of confusion and isolation in the otherwise busy area."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L08B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "1978cd5051e4f888"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "엇갈린 만남과 짙어지는 의구심",
        "representative_moment": "마트 밖에서 C01이 어두운 P03 화면을 내려다보며 혼란스러운 표정으로 서 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "shoulder-high medium profile shot, slightly angled downward, mixed deep dusk and stark fluorescent lighting",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a young Korean woman in her 20s with black hair, a pale complexion, and deep-set eyes, stands in the middle-left midground, looking toward the dark P03 smartphone screen. Shoulder-high observer camera angled slightly down toward her hands, framing her left profile from the chest up, with the P03 held in the lower third of the frame. She is hunched over the phone. The unlit front glass of the P03 faces upward toward the lens, showing a blank black call screen with a faint neon reflection. [L08: The exact background from the prior shot is preserved, featuring the bright storefront and its sliding door running parallel to the camera along frame right, with a soft blurred red-blue neon sign, a stall table, and a delivery van positioned behind her along the road axis]. Stark, clean fluorescent light spills from the mart interior, contrasting with deep blue dusk shadows wrapping her side profile. Smeared amber-red neon light skims the phone glass.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영 마트 밖을 나오면서 연락을 취해보지만 받지않는다.",
              "Shot description: 마트 밖 거리, 수리영이 어두운 스마트폰 화면을 내려다보고 있는 측면"
            ],
            "visual_inferences": [
              "fixed_element suriyoung_base_appearance: wears comfortable modern casual clothing appropriate for daily errands",
              "fixed_element dusk_mart_lighting: mixed bright fluorescent spill and deep blue dusk shadows",
              "Her pale complexion and deep-set eyes become visually prominent under the cool-toned dusk shadows."
            ],
            "creative_decisions": [
              "Framed the character in the middle-left midground to isolate her against the passing urban blur.",
              "Placed the dark smartphone in the lower third frame to visually anchor her downward gaze and convey her anxiety over the unanswered call.",
              "Utilized blurred neon reflections on the blank screen to connect the isolated prop with the surrounding busy atmosphere."
            ],
            "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": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bike rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crosswalk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "delivery van",
                "usage_kind": "redraw",
                "source_phrase": "a delivery van positioned behind her"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lane marking",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "neon sign",
                "usage_kind": "anchor",
                "source_phrase": "a soft blurred red-blue neon sign"
              },
              {
                "owned_token": "service cart",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "signboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding door",
                "usage_kind": "anchor",
                "source_phrase": "its sliding door"
              },
              {
                "owned_token": "stall table",
                "usage_kind": "anchor",
                "source_phrase": "a stall table"
              },
              {
                "owned_token": "storefront",
                "usage_kind": "anchor",
                "source_phrase": "the bright storefront"
              },
              {
                "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": "e0d1f222e6b1a685",
              "owned_hash": "2fd5607af9218c09",
              "camera_direction_hash": "d963887329ebd956",
              "owned_usage_hash": "a105b9e9b8092f41",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "delivery van",
                  "violating_phrase": "a delivery van positioned behind her along the road axis",
                  "reason": "The delivery van is mentioned as part of the preserved background elements from the prior shot within the L08 block, acting as an anchor rather than a redraw request. The producer's echo incorrectly declared it as redraw.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "neon sign",
                  "violating_phrase": "a soft blurred red-blue neon sign",
                  "reason": "The neon sign is mentioned as a preserved background element from the previous shot to anchor the background composition.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sliding door",
                  "violating_phrase": "its sliding door",
                  "reason": "The sliding door of the storefront is mentioned to anchor its position running parallel to the camera, with no redraw intent.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "stall table",
                  "violating_phrase": "a stall table",
                  "reason": "The stall table is referenced as an existing background element from the prior shot, functioning as a spatial anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "storefront",
                  "violating_phrase": "the bright storefront",
                  "reason": "The storefront is mentioned to describe the source of fluorescent light and to anchor the background setting preserved from the prior shot.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "Same exact background location as the prior shot, carrying over the ambient lighting and spatial layout outside the mart.",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "P03",
          "L08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Outside the mart, the camera locks shoulder-high but drops the lens line slightly toward 수리영’s hands so the dark smartphone screen reads in the lower third while her side profile stays sharp above it. She is framed parallel to the storefront, left-facing in profile, isolated against a busy evening street that streaks into neon blur behind her.",
            "lighting_mood": "Blue dusk shadows wrap her profile while storefront fluorescents and smeared amber-red neon skim the phone glass.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "dark smartphone screen",
                  "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",
              "P03",
              "L08"
            ],
            "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": "L08B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "awning",
              "bicycle",
              "bike rack",
              "bollard",
              "crate",
              "crosswalk",
              "curb",
              "delivery van",
              "door",
              "lane marking",
              "neon sign",
              "service cart",
              "signboard",
              "sliding door",
              "stall table",
              "storefront",
              "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": [
              {
                "element_id": "suriyoung_base_appearance",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A young Korean woman dressed in casual, practical clothing suitable for safely riding a bicycle in a busy city. Her physical demographic features and overall attire remain strictly consistent.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "능숙하게 자전거를 모는 수리영",
                  "수리영 마트 밖을 나오면서"
                ],
                "visual_inferences": [
                  "Wears comfortable and ordinary modern casual clothing appropriate for cycling and running daily errands."
                ],
                "creative_decisions": [
                  "Kept her clothing simple and grounded in the contemporary Korean setting to maintain visual focus on her emotional shifts and confusion."
                ],
                "confidence": "medium"
              },
              {
                "element_id": "dusk_mart_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The ambient environment is characterized by a stark mix of bright, clean fluorescent lighting from the mart and deep blue dusk shadows from the evening street. This contrasting light is present both inside near the entrance and immediately outside the storefront.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "해질 무렵",
                  "dusk-blue spill from the entrance",
                  "Blue dusk shadows wrap her profile while storefront fluorescents"
                ],
                "visual_inferences": [
                  "The harsh white lighting of the mart physically spills out into the dark blue evening, creating a visual bridge between the interior and exterior settings."
                ],
                "creative_decisions": [
                  "Using the contrasting mixed lighting to subtly emphasize the protagonist's feelings of confusion and isolation in the otherwise busy area."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "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": "L08B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "e0a7143c5f91eaee"
      },
      {
        "scene_index": 9,
        "heading": "S#9. 해안가 / N",
        "beat_title": "다급한 귀가",
        "representative_moment": "어둠이 짙게 깔린 해안도로에서 수리영(C01)이 굳은 표정으로 자전거 페달을 힘차게 밟고 있는 측면 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height tracking observer view with motion blur",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a Korean woman in her early 20s with black hair, pale complexion, and deep-set eyes, occupies the middle-left midground in right profile, moving toward the dark coastal road ahead in the middle-right background. She is captured mid-pedal, torso lowered and one foot driving the downstroke, facing off-screen with a hardened expression, her hair flying back in the direction opposite to motion. The wet handlebar and down tube of the bicycle are visible in the lower foreground. The damp coastal road and dense sea fog streak horizontally behind her, amplifying the feeling of speed. Cold blue night ambient light dominates the scene, broken by thin amber roadside glints catching on her cheekbone and the blurred dots of distant roadside reflectors.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#9 action: '해안도로를 자전거를 타고 바삐 집으로 달려가는 수리영.'",
              "shot description: 수리영이 굳은 표정으로 자전거 페달을 밟아 내리는 찰나, 상체를 숙인 채 머리카락이 뒤로 날리는 측면",
              "DP instruction: The camera tracks tight beside 수리영 at chest height",
              "DP instruction: Cold blue night and sea fog dominate, broken only by thin amber roadside glints"
            ],
            "visual_inferences": [
              "motion blur applied to the road and fog behind her to convey rapid lateral movement",
              "wet sheen on the bicycle frame and road surface reflecting the ambient blue night"
            ],
            "creative_decisions": [
              "chest-height framing anchors the bicycle's down tube and her driving foot in the lower half to emphasize physical exertion",
              "strong contrast between the cold blue ambient night and the thin amber highlights to heighten the sense of urgency"
            ],
            "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": "593a9baa953349a3",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "e74fc5982dcaccf0",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 6,
        "dependency_reason": "동일한 해안가 도로(L06) 배경의 연속성 및 시각적 분위기(cold blue night, sea fog) 유지",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "L06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 9,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera tracks tight beside 수리영 at chest height, about 1.5 meters from the bicycle, catching the exact instant her foot drives the pedal downward. Her hardened side profile and lowered torso occupy the left half of the frame, while the handlebar, spinning wheel edge, and black coastal road smear horizontally behind her to amplify speed.",
            "lighting_mood": "Cold blue night and sea fog dominate, broken only by thin amber roadside glints sliding across her hair and cheekbone.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "dark coastal road ahead",
                  "screen_zone": "middle_right",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "moves_toward",
                  "gesture_target_label": "dark coastal road ahead",
                  "label": "수리영 on bicycle",
                  "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",
              "L06"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "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": "c7fa675619d805ba"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "침입의 순간, 현관 앞 멈춰 선 구두와 그림자",
        "representative_moment": "C10의 낡은 신발이 옥탑방 철문 앞에 멈춰 서고, 그의 짙은 그림자가 문을 향해 길게 드리운다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "ankle height insert framing, underexposed blue-black night with weak amber side light",
            "t2i_prompt": "Photorealistic cinematic still. C10 in dark trousers, an Asian man, with his old shoes in the lower-center foreground, a long shadow across the roof deck in the middle-center midground, and the closed iron entrance door in the upper-center background. At ankle height, the low camera focuses on the worn shoes and the ground, entirely excluding the character's face and upper body. The figure stands with back to camera, feet stopped near the door. A muted amber side light cuts through the severely underexposed cold blue-black night atmosphere, throwing the heavy black mass of the shadow diagonally across the gritty damp roof deck. The flat metal face of the door looms directly above the shoes.",
            "outfit_assignments": [
              {
                "character_id": "C10",
                "outlook_id": "O09"
              }
            ],
            "source_facts": [
              "Shoes stop in front of the rooftop iron door.",
              "A long shadow stretches diagonally toward the door.",
              "An advertising flyer is stuck in the door gap."
            ],
            "visual_inferences": [
              "fixed_element unknown_man_dark_presence: obscured dark figure, underexposed heavy black mass.",
              "fixed_element rooftop_night_atmosphere: cold blue-black night, weak amber light.",
              "The ankle-height camera completely excludes the upper body and face."
            ],
            "creative_decisions": [
              "Using insert framing at ankle height to emphasize the eerie intrusion without revealing the character's identity.",
              "High-contrast lighting with muted amber to highlight the rough texture of the shoes and the door."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002",
              "fsc_003"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bulkhead",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "the closed iron entrance door in the upper-center background"
              },
              {
                "owned_token": "laundry line",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "parapet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pipe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "post",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "roof deck",
                "usage_kind": "anchor",
                "source_phrase": "across the gritty damp roof deck"
              },
              {
                "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": "66fb3878269e3aa6",
              "owned_hash": "c735782f8104ee91",
              "camera_direction_hash": "132654e22ee130a4",
              "owned_usage_hash": "9f510295282021df",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "the closed iron entrance door in the upper-center background",
                  "reason": "The prompt references the door as a background framing anchor for spatial composition and character positioning, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "roof deck",
                  "violating_phrase": "a long shadow across the roof deck",
                  "reason": "The prompt utilizes the roof deck as a surface for casting shadows and describing environment texture, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "exact_background of the same location (L04B03)",
        "_shot_index": 2,
        "visible_entities": [
          "C10",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At ankle height, the camera finishes its low track across the rooftop floor and holds before the closed iron entrance door, excluding the 낯선 한국인 남성’s face entirely. His worn shoes stop near the lower center of frame, the long shadow stretches diagonally toward the door, and the door’s flat metal face looms above without taking over the frame.",
            "lighting_mood": "Underexposed blue rooftop night is cut by a muted amber side light that throws the man’s shadow unnaturally long toward 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": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "closed iron entrance door",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "long shadow across rooftop floor",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_003",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "낯선 한국인 남성's old shoes",
                  "screen_zone": "lower_center",
                  "target_id": "C10",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C10",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C10",
                "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": 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": "C10",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "Only the lower legs and old shoes are visible; the face and full outlook must not be forced into the image."
              }
            ],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject 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": [
              "bulkhead",
              "door",
              "laundry line",
              "light",
              "parapet",
              "pipe",
              "post",
              "roof deck",
              "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_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The rooftop exterior is enveloped in a severely underexposed, cold blue-black night atmosphere. A muted, weak amber light cuts through the heavy darkness, casting unnatural shadows and highlighting the stark, rough textures of the building walls.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Underexposed blue rooftop night is cut by a muted amber side light",
                  "The frame is deliberately underexposed in cold blue-black",
                  "only a weak interior amber smear"
                ],
                "visual_inferences": [
                  "The combination of deep blue and weak amber creates a stark, high-contrast environment that swallows most of the fine architectural details into darkness."
                ],
                "creative_decisions": [
                  "Using a consistent dual-tone lighting scheme (cold blue-black with amber accents) across the exterior sequence to emphasize an eerie, threatening mood."
                ],
                "confidence": "high"
              },
              {
                "element_id": "unknown_man_dark_presence",
                "element_type": "character_state",
                "character_name": "낯선 한국인 남성",
                "description": "The unknown Korean man is consistently rendered as an obscured, dark figure devoid of recognizable facial or clothing details. Whether seen from the ankles down or as a reflected upper-body silhouette, his physical form remains an underexposed, heavy black mass that blends seamlessly with the surrounding shadows.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "excluding the unknown man’s face entirely",
                  "the long shadow stretches diagonally",
                  "The reflected silhouette of the unknown man",
                  "both forms underexposed and broken by grime"
                ],
                "visual_inferences": [
                  "His clothing is uniformly dark and nondescript, offering no reflective surfaces to catch the weak ambient light."
                ],
                "creative_decisions": [
                  "Concealing the character's identity completely by treating him as a physical manifestation of darkness, using extreme underexposure and selective framing."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character",
                "id": "C10",
                "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": "bf8766daaa624a49"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "창문에 비친 잔혹한 그림자",
        "representative_moment": "거대한 남성의 실루엣이 창문 반사 속에서 쓰러진 민숙의 어깨를 덮치고 있는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Outside the window at chest height, off-axis reflection framing",
            "t2i_prompt": "Photorealistic cinematic still. Outside the window at chest height, the dirty exterior window glass anchors the composition, reflecting an adult Korean man as a reflected attacking silhouette in the middle-center midground, bending over an early 40s Korean woman appearing as a reflected collapsed figure in the lower-center midground. The camera stays slightly off-axis, making the glass the primary image surface. The reflecting surface of the window glass shows the dim room interior doubled with faint rooftop darkness, obscuring clear facial detail. The attacking initiator is at a three-quarter angle from the left, his physical form an underexposed, heavy black mass blending seamlessly with the surrounding shadows, body volume preserved against the weak ambient fill but devoid of recognizable facial or clothing details, eyes fixed on the constrained woman below him. He is the figure exerting force, pinning the other down from above. The constrained woman, in right profile, is collapsed under his weight, unconscious, slack and limp, with eyes closed. The frame is deliberately underexposed in a cold blue-black night atmosphere, cut by a weak interior amber smear and a muted blood-red undertone catching the condensation-streaked glass. The dim bedroom wall and curtain edge appear as dark vertical blocks within the reflection, completing the shared reflected interior space they both occupy.",
            "outfit_assignments": [],
            "source_facts": [
              "S#10 action: '창문에 비친 그림자. 민숙을 덮쳐 어깨를 물어뜯는 듯한 모습'",
              "Shot description: 거대한 남성의 형상이 쓰러진 민숙의 어깨 부근을 덮누른 어두운 실루엣이 창문에 비친 모습",
              "DP direction: Outside the window at chest height, the camera stays slightly off-axis so the glass becomes the image surface"
            ],
            "visual_inferences": [
              "fixed_element rooftop_night_atmosphere: Underexposed cold blue-black night atmosphere cut by a weak amber light",
              "fixed_element unknown_man_dark_presence: The man's form is an underexposed heavy black mass devoid of recognizable facial details",
              "The violence is depicted purely through the reflection on the dirty, fogged window glass"
            ],
            "creative_decisions": [
              "Used role asymmetry tokens ('figure exerting force', 'pinning the other down') to clearly depict the violent intent within the reflection",
              "Employed generic demographic descriptors without character IDs, adhering to the reproduction surface rule for faces within a reflection",
              "Added condensation and streaks on the glass to distort the reflected bodies and enhance the eerie, threatening mood"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bulkhead",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "laundry line",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "parapet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pipe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "post",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "roof deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "water tank",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "the dirty exterior window glass anchors the composition"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8182f743a746ec2f",
              "owned_hash": "c735782f8104ee91",
              "camera_direction_hash": "c3a35c4c099978ba",
              "owned_usage_hash": "fb122f84b0b783a0",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "window",
                  "violating_phrase": "Outside the window at chest height, the dirty exterior window glass anchors the composition",
                  "reason": "The prompt uses the window glass as a reflecting surface and composition anchor without requesting any redrawing or modification of the physical window itself, which is consistent with the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "S4_Shot1의 L04 옥탑방 배경 참조 (exact_background 일관성 유지)",
        "_shot_index": 5,
        "visible_entities": [
          "C10",
          "C04",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Outside the window at chest height, the camera stays slightly off-axis so the glass becomes the image surface rather than a clean view inside. The reflected silhouette of the 낯선 한국인 남성 bends over 민숙 near her shoulder in the middle of the frame, both forms underexposed and broken by grime, making the violence read as a threatening reflection instead of explicit interior detail.",
            "lighting_mood": "The frame is deliberately underexposed in cold blue-black, with only a weak interior amber smear and a muted blood-red undertone catching the glass.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "reflected collapsed 민숙",
                  "screen_zone": "lower_center",
                  "target_id": "C04",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "reflected attacking silhouette",
                  "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": [
              "C10",
              "C04",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C10",
                "outlook_id": "O09"
              },
              {
                "character_id": "C04",
                "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": "background_ref_attached",
            "bg_id": "L04B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bulkhead",
              "door",
              "laundry line",
              "light",
              "parapet",
              "pipe",
              "post",
              "roof deck",
              "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_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The rooftop exterior is enveloped in a severely underexposed, cold blue-black night atmosphere. A muted, weak amber light cuts through the heavy darkness, casting unnatural shadows and highlighting the stark, rough textures of the building walls.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Underexposed blue rooftop night is cut by a muted amber side light",
                  "The frame is deliberately underexposed in cold blue-black",
                  "only a weak interior amber smear"
                ],
                "visual_inferences": [
                  "The combination of deep blue and weak amber creates a stark, high-contrast environment that swallows most of the fine architectural details into darkness."
                ],
                "creative_decisions": [
                  "Using a consistent dual-tone lighting scheme (cold blue-black with amber accents) across the exterior sequence to emphasize an eerie, threatening mood."
                ],
                "confidence": "high"
              },
              {
                "element_id": "unknown_man_dark_presence",
                "element_type": "character_state",
                "character_name": "낯선 한국인 남성",
                "description": "The unknown Korean man is consistently rendered as an obscured, dark figure devoid of recognizable facial or clothing details. Whether seen from the ankles down or as a reflected upper-body silhouette, his physical form remains an underexposed, heavy black mass that blends seamlessly with the surrounding shadows.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "excluding the unknown man’s face entirely",
                  "the long shadow stretches diagonally",
                  "The reflected silhouette of the unknown man",
                  "both forms underexposed and broken by grime"
                ],
                "visual_inferences": [
                  "His clothing is uniformly dark and nondescript, offering no reflective surfaces to catch the weak ambient light."
                ],
                "creative_decisions": [
                  "Concealing the character's identity completely by treating him as a physical manifestation of darkness, using extreme underexposure and selective framing."
                ],
                "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": "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": "8424e42aa86f310e"
      },
      {
        "scene_index": 11,
        "heading": "S#11. 옥탑 방 밖 / N",
        "beat_title": "반쯤 열린 현관문 앞의 얼어붙은 수리영",
        "representative_moment": "C01이 옥상에 도착해 반쯤 열린 현관문 틈새의 불빛을 보며 얼어붙은 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight front close-up at eye level, cold blue night wash with amber rim light",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a Korean woman in her early 20s with black hair, a pale face, and deep eyes, occupies the middle-center foreground, looking off-screen toward the half-open metal door sliver in the middle-right background. Captured in a tight front close-up at eye level, she is facing the camera, frozen at the landing with widened eyes fixed just past the camera edge. A cold blue rooftop wash freezes her face, while a weak amber leak from the unseen open doorway grazes one cheek. The immediate area behind her consists of [: a dark, stained, damp stairwell wall sitting close behind her shoulders, flattening the space, with the narrow outer edge of the iron door blurred at the frame right edge]. Hazy, cold night air surrounds her.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#11 action: '옥상에 올라와 보니 반쯤 열린 현관 철문.'",
              "shot description: 수리영 frozen reaction in a tight front close-up at the rooftop landing",
              "DP direction: cold blue rooftop wash, weak amber leak from doorway, stairwell exit wall behind her"
            ],
            "visual_inferences": [
              "tight close-up emphasizes facial reaction with widened eyes",
              "amber light grazes the cheek to show the direction of the open door without revealing the inside"
            ],
            "creative_decisions": [
              "applied frame spatial contract strictly in the first sentence to lock subject in middle-center and door sliver in middle-right",
              "used close framing rules to omit the wider background and focus entirely on the subject and the immediate frame-edge wall surface"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "grate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "landing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "latch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "parapet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pipe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "13a00e78ba6df316",
              "owned_hash": "8d1896b0005010b7",
              "camera_direction_hash": "182323b972537232",
              "owned_usage_hash": "7d9cee05b8e93775",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "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 rooftop landing just beyond the stair exit, the camera waits eye-level less than a meter in front of 수리영 and receives her frozen reaction in a tight front close-up. Her widened eyes look just past the camera edge toward the half-open iron door, which is only suggested by a sliver of dark metal blur at frame right.",
            "lighting_mood": "A cold blue rooftop wash freezes her face, while a weak amber leak from the open doorway grazes one cheek without revealing what she sees.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": "half-open metal door sliver",
                  "screen_zone": "middle_right",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "half-open metal door",
                  "label": "수리영",
                  "screen_zone": "middle_center",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L11B02",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "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": "9ac5dfc2ddbe1642"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "엄마의 방 안 핏자국 목격",
        "representative_moment": "반쯤 열린 방문 틈으로 보이는 바닥의 핏자국과 커튼으로 이어진 발자국",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "voyeuristic low-to-mid height wide framing with deep shadows",
            "t2i_prompt": "Photorealistic cinematic still. Through the half-open bedroom door gap in the middle-left foreground, the pre-existing bloody footprints on the floor in the lower-center midground are visible, leading toward the dim window curtain at the end of the trail in the upper-center background. The camera is positioned at low-to-mid height just outside the doorway, establishing a voyeuristic perspective. The inner edge of the door cuts vertically to mask the left foreground, leaving only a narrow view into the room. The pre-existing wet, dark red pool of blood on the floor is visible at the lower frame, with its texture kept muted and realistic rather than glossy. The heavy closed curtain's long folds drape down to rest directly against the blood-stained ground. The [L05: bedroom interior] is enveloped in a cold night-blue darkness leaking from the obscured window, broken only by a faint, muted amber light spilling from the adjacent room. This weak living-room spill skims the pre-existing wet blood, casting deep, sickly shadows across the space.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: Just outside the bedroom doorway, the camera presses close to the half-open door gap at low-to-mid height",
              "shot description: blood-soaked floor spreads from the lower frame",
              "shot description: bloody footprints lead the eye toward the dim curtain near the window in the background",
              "scene text: 여기저기 핏자국. 바닥에 흥건한 혈흔. 피묻은 발자국은 커튼으로 이어져 있다"
            ],
            "visual_inferences": [
              "fixed_element bloody_bedroom_floor: dark red pool of blood kept muted and realistic",
              "fixed_element window_curtain: heavy curtain draping down to the floor enclosing the space",
              "fixed_element dim_two_tone_lighting: night-blue darkness mixed with muted amber spill from the adjacent room"
            ],
            "creative_decisions": [
              "Used a voyeuristic wide frame from a low-to-mid height to emphasize the chilling trail of blood without revealing the whole room.",
              "The half-open door acts as a foreground mask (middle-left), naturally compressing the viewer's focus toward the curtain at the end of the trail.",
              "Lighting contrasts the sickly amber spill against the cold blue night, maximizing the horror atmosphere."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002",
              "fsc_003"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bloodstain",
                "usage_kind": "anchor",
                "source_phrase": "The pre-existing wet, dark red pool of blood on the floor"
              },
              {
                "owned_token": "circle mark",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "anchor",
                "source_phrase": "the heavy closed curtain's long folds"
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "Through the half-open bedroom door gap"
              },
              {
                "owned_token": "dresser",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "on the floor in the lower-center midground"
              },
              {
                "owned_token": "footprint",
                "usage_kind": "anchor",
                "source_phrase": "the pre-existing bloody footprints on the floor"
              },
              {
                "owned_token": "light switch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "outlet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pillow",
                "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": "anchor",
                "source_phrase": "leaking from the obscured window"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f3e83962c9b9a254",
              "owned_hash": "6fdca8f7622dd2f9",
              "camera_direction_hash": "6b23a478a8d4c94b",
              "owned_usage_hash": "fdb9a98a84d96fd7",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "Through the half-open bedroom door gap in the middle-left foreground",
                  "reason": "The door is used strictly as a spatial framing element to establish perspective, matching the producer's declaration of an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "footprint",
                  "violating_phrase": "the pre-existing bloody footprints on the floor",
                  "reason": "The footprints are explicitly noted as pre-existing and serve as a visual guide in the midground, aligning with the anchor usage.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "on the floor in the lower-center midground",
                  "reason": "The floor is referenced as a spatial anchor where other elements like footprints and bloodstains are located.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curtain",
                  "violating_phrase": "the heavy closed curtain's long folds drape down",
                  "reason": "The curtain is described as an existing background element interacting with light and ground, functioning purely as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "leaking from the obscured window",
                  "reason": "The window serves as a source for the background ambient light, acting as a spatial anchor with no redraw request.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bloodstain",
                  "violating_phrase": "The pre-existing wet, dark red pool of blood on the floor",
                  "reason": "The blood pool is explicitly described as pre-existing and is referenced for lighting reflection details, confirming it as an anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "같은 공간(옥탑방 내부, L05)의 배경 레이아웃과 벽면, 조명 분위기를 그대로 이어받음 (exact_background)",
        "_shot_index": 4,
        "visible_entities": [
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "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 outside the bedroom doorway, the camera presses close to the half-open door gap at low-to-mid height and begins a creeping dolly inward across the floor. The door edge masks the left foreground, while the blood-soaked floor spreads from the lower frame and the bloody footprints lead the eye toward the dim curtain near the window in the background.",
            "lighting_mood": "A weak living-room spill and cold night-blue window leak skim the wet blood, with the red kept muted and realistic rather than glossy.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "bloody footprints across floor",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "half-open bedroom door gap",
                  "screen_zone": "middle_left",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_003",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "window curtain at end of trail",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L05"
            ],
            "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": "L05B07",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bed",
              "bloodstain",
              "circle mark",
              "curtain",
              "door",
              "dresser",
              "floor",
              "footprint",
              "light switch",
              "outlet",
              "photograph",
              "pillow",
              "wall",
              "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": "bloody_bedroom_floor",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The bedroom floor is extensively covered in a wet, dark red pool of blood. Distinct bloody footprints track across the surface, leading directly toward the window area. The red of the blood is kept muted and realistic rather than glossy or overly bright.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "blood-soaked floor spreads from the lower frame",
                  "bloody footprints lead the eye toward the dim curtain near the window",
                  "blood on the floor"
                ],
                "visual_inferences": [
                  "The footprints clearly establish a path leading up to the hidden space by the window, setting a grim and horrific spatial layout."
                ],
                "creative_decisions": [
                  "The blood is rendered in dark, muted crimson to maintain a heavy, realistic horror atmosphere without looking like shiny paint."
                ],
                "confidence": "high"
              },
              {
                "element_id": "window_curtain",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dim, heavy curtain hangs by the window in the background of the bedroom. The fabric's long folds drape down to the floor, resting directly against the blood-stained ground and visually enclosing the area beneath it.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "dim curtain near the window in the background",
                  "curtain folds enclosing her"
                ],
                "visual_inferences": [
                  "The curtain is long enough to reach the floor and is positioned to create a shadowed alcove that initially hides the body."
                ],
                "creative_decisions": [
                  "The curtain material is heavy and dark, absorbing the weak room light to heighten the feeling of a trapped, claustrophobic space."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dim_two_tone_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is enveloped in a cold, night-blue darkness leaking from the window. This cool ambient shadow is broken only by a faint, muted amber light spilling from the adjacent room, casting deep, sickly shadows across the space.",
                "applies_to_shots": [
                  4,
                  6,
                  11,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "weak living-room spill and cold night-blue window leak skim the wet blood",
                  "Cold blue window spill outlines the corpse while a faint amber room lamp leaves the wounds in a sickly shadow",
                  "Cold blue darkness is broken by a faint muted amber spill from the room",
                  "The room remains cold blue-black"
                ],
                "visual_inferences": [
                  "The lighting establishes a sharp color temperature contrast between the freezing, indifferent night air outside and the dying warmth of the domestic household."
                ],
                "creative_decisions": [
                  "Shadows are kept extremely deep to obscure the most gruesome details, turning the wet blood into a dark, almost black-red hue under the blue light."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L05B07",
                "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": "448661a87f510528"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "참혹하게 훼손된 엄마의 시신",
        "representative_moment": "어깨가 참혹하게 뜯겨 바닥에 쓰러져 죽어있는 C04의 모습",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "lower than waist height, angled down at close distance, dim two-tone lighting",
            "t2i_prompt": "Photorealistic cinematic still. C04O14's slumped body occupies the middle-center in the midground, a Korean middle-aged woman in a bloodied cardigan and apron, lying motionless, lifeless at three-quarter angle from the right with eyes closed. Positioned lower than waist height and angled down at close distance, the framing strictly isolates her torso and the immediate ground. Her dropped head remains in deep shadow, while her brutally torn shoulder and collarbone sit in the clearest part of the frame, exposing deep, raw tissue. [L05: The bedroom floor directly beneath her is extensively covered in a wet, dark red pool of blood, the muted crimson smeared around her knees and hip.] Just behind her, the dark vertical enclosure of a dim, heavy curtain rests against the blood-stained ground, its long, rumpled folds narrowing the space around her shoulders. A cold, night-blue darkness leaks from the hidden window through the curtain edges, contrasting with a faint amber spill from the adjacent room that leaves the wounds in a sickly, restrained red-brown shadow.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O14"
              }
            ],
            "source_facts": [
              "앉은 채로 고개를 떨군 채 죽어있는 엄마",
              "살점이 뜯긴 어깨와 쇄골, 마치 동물에게 물어뜯긴 듯한 거친 상처",
              "바닥에 흥건한 혈흔"
            ],
            "visual_inferences": [
              "fixed_element bloody_bedroom_floor: muted, wet dark red pool smeared around her lower body",
              "fixed_element window_curtain: dim, heavy fabric draping to the blood-stained floor, visually enclosing the corpse",
              "fixed_element dim_two_tone_lighting: cold night-blue darkness leaking from the curtain edges, faint amber spill from the room"
            ],
            "creative_decisions": [
              "Close framing focusing on the torn shoulder and collarbone while keeping the face shadowed to heighten horror without clinical forensic exposure",
              "Muted red-brown tones for the blood to maintain grounded realism",
              "Low downward angle to emphasize her slumped, lifeless state against the dark floor"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bloodstain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "circle mark",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dresser",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "footprint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light switch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "outlet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pillow",
                "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": "44c9135b430f5d44",
              "owned_hash": "6fdca8f7622dd2f9",
              "camera_direction_hash": "3d802f426a5eab24",
              "owned_usage_hash": "69341cf821002152",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "옥탑방 내부 공간 설정 참조 (단, 본 샷은 close framing으로 배경 이미지를 직접 생략하고 [L05] 블록으로 국소 묘사함)",
        "_shot_index": 6,
        "visible_entities": [
          "C04",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the bedroom near the window side, the camera holds lower than waist height and angles down at close distance toward 민숙’s slumped body on the floor. Her dropped head stays shadowed, but her torn shoulder and collarbone sit in the clearest part of the frame, with blood on the floor and curtain folds enclosing her without turning the shot into a clean forensic view.",
            "lighting_mood": "Cold blue window spill outlines the corpse while a faint amber room lamp leaves the wounds in a sickly, restrained red-brown shadow.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "민숙's slumped body",
                  "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",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C04",
                "outlook_id": "O14"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L05B07",
            "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": "bloody_bedroom_floor",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The bedroom floor is extensively covered in a wet, dark red pool of blood. Distinct bloody footprints track across the surface, leading directly toward the window area. The red of the blood is kept muted and realistic rather than glossy or overly bright.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "blood-soaked floor spreads from the lower frame",
                  "bloody footprints lead the eye toward the dim curtain near the window",
                  "blood on the floor"
                ],
                "visual_inferences": [
                  "The footprints clearly establish a path leading up to the hidden space by the window, setting a grim and horrific spatial layout."
                ],
                "creative_decisions": [
                  "The blood is rendered in dark, muted crimson to maintain a heavy, realistic horror atmosphere without looking like shiny paint."
                ],
                "confidence": "high"
              },
              {
                "element_id": "window_curtain",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dim, heavy curtain hangs by the window in the background of the bedroom. The fabric's long folds drape down to the floor, resting directly against the blood-stained ground and visually enclosing the area beneath it.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "dim curtain near the window in the background",
                  "curtain folds enclosing her"
                ],
                "visual_inferences": [
                  "The curtain is long enough to reach the floor and is positioned to create a shadowed alcove that initially hides the body."
                ],
                "creative_decisions": [
                  "The curtain material is heavy and dark, absorbing the weak room light to heighten the feeling of a trapped, claustrophobic space."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dim_two_tone_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is enveloped in a cold, night-blue darkness leaking from the window. This cool ambient shadow is broken only by a faint, muted amber light spilling from the adjacent room, casting deep, sickly shadows across the space.",
                "applies_to_shots": [
                  4,
                  6,
                  11,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "weak living-room spill and cold night-blue window leak skim the wet blood",
                  "Cold blue window spill outlines the corpse while a faint amber room lamp leaves the wounds in a sickly shadow",
                  "Cold blue darkness is broken by a faint muted amber spill from the room",
                  "The room remains cold blue-black"
                ],
                "visual_inferences": [
                  "The lighting establishes a sharp color temperature contrast between the freezing, indifferent night air outside and the dying warmth of the domestic household."
                ],
                "creative_decisions": [
                  "Shadows are kept extremely deep to obscure the most gruesome details, turning the wet blood into a dark, almost black-red hue under the blue light."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "4ba517cdfbb4e3f1"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "민숙의 손에 쥐여진 사진",
        "representative_moment": "민숙(C04)의 피 묻은 뻣뻣한 손이 구겨진 낡은 사진(P02)을 꽉 쥐고 있는 바닥 근처의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low floor-level insert framing, shallow depth of field, dim two-tone lighting (cold blue and faint amber) to emphasize the bloodied hand and photo",
            "t2i_prompt": "Photorealistic cinematic still. Positioned directly at floor level, C04 in a bloodied sleeve, a Korean middle-aged woman lying lifeless, is mostly out of view with only her rigid hand occupying the center-right of the frame. The stiff fingers of her hand rest touching P02, the existing crumpled old photograph already on the damp floor. A cold, night-blue darkness envelops the floor, broken only by a faint, muted amber light spilling across the hand and the pre-existing photograph P02. This dim two-tone lighting casts deep, sickly shadows, highlighting the wet blood on her hand against the scene, while the surrounding floor and a nearby hem of fabric blur into a soft blue-black darkness.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O14"
              }
            ],
            "source_facts": [
              "엄마 손안에 구겨진 사진 한 장이 보인다.",
              "바닥에 흥건한 혈흔.",
              "앉은 채로 고개를 떨군 채 죽어있는 엄마",
              "DP instruction: The crumpled old photograph sits in the center-right of frame, caught between stiff fingers."
            ],
            "visual_inferences": [
              "fixed_element dim_two_tone_lighting: cold night-blue window leak mixed with faint amber room lamp creates high-contrast shadows.",
              "Focus is entirely on the hand and the photograph, leaving the rest of the body and room out of the frame."
            ],
            "creative_decisions": [
              "Insert framing exactly at floor level to match the DP instructions and isolate the evidence.",
              "Shallow depth of field blurring the floor and hem to keep the grip visually dominant.",
              "Strict adherence to base_id_required policy: using only bare C04 ID due to the framing focusing exclusively on the hand."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "prop",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bloodstain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "circle mark",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dresser",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "already on the damp floor"
              },
              {
                "owned_token": "footprint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light switch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "outlet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "anchor",
                "source_phrase": "the existing crumpled old photograph already on the damp floor"
              },
              {
                "owned_token": "pillow",
                "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": "a706a280556ac6c0",
              "owned_hash": "6fdca8f7622dd2f9",
              "camera_direction_hash": "373e946180a97f67",
              "owned_usage_hash": "4467f496f436e4e1",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "floor",
                  "violating_phrase": "already on the damp floor",
                  "reason": "The floor is mentioned as an existing surface to establish spatial placement, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "photograph",
                  "violating_phrase": "the existing crumpled old photograph already on the damp floor",
                  "reason": "The pre-existing photograph (P02) is referenced as an environmental anchor to establish contact with the character's fingers, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "Same exact location (Min-sook's room) as shot 6, maintaining the established background layout and lighting.",
        "_shot_index": 11,
        "visible_entities": [
          "C04",
          "P02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the flow’s very low position beside 민숙’s body, the lens tightens into an insert at floor level, within arm’s length of her bloodied fingers. The crumpled old photograph sits in the center-right of frame, caught between stiff fingers, while the damp floor and hem of fabric fall away into shallow, blue-black blur so only the grip and evidence register.",
            "lighting_mood": "Cold blue darkness is broken by a faint muted amber spill from the room, making the wet blood read almost black-red against the photograph’s faded paper.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "P02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C04",
                "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": "C04",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "Only 민숙’s hand is framed in an insert; a full outlook reference would be misleading because the face and body are not visible."
              }
            ],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject 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": "L05B07",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bed",
              "bloodstain",
              "circle mark",
              "curtain",
              "door",
              "dresser",
              "floor",
              "footprint",
              "light switch",
              "outlet",
              "photograph",
              "pillow",
              "wall",
              "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": "dim_two_tone_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is enveloped in a cold, night-blue darkness leaking from the window. This cool ambient shadow is broken only by a faint, muted amber light spilling from the adjacent room, casting deep, sickly shadows across the space.",
                "applies_to_shots": [
                  4,
                  6,
                  11,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "weak living-room spill and cold night-blue window leak skim the wet blood",
                  "Cold blue window spill outlines the corpse while a faint amber room lamp leaves the wounds in a sickly shadow",
                  "Cold blue darkness is broken by a faint muted amber spill from the room",
                  "The room remains cold blue-black"
                ],
                "visual_inferences": [
                  "The lighting establishes a sharp color temperature contrast between the freezing, indifferent night air outside and the dying warmth of the domestic household."
                ],
                "creative_decisions": [
                  "Shadows are kept extremely deep to obscure the most gruesome details, turning the wet blood into a dark, almost black-red hue under the blue light."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character",
                "id": "C04",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L05B07",
                "policy": "required"
              },
              {
                "kind": "prop",
                "id": "P02",
                "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": [
                  11
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P02",
                  "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": "d5ae7e0d347887f1"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "기이한 붉은 원의 출현",
        "representative_moment": "침대 위 어두운 벽면에 거친 붓으로 그린 듯한 붉은 원형 표식 P01이 뚜렷하게 떠오르는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height off-center upward tilt with dim two-tone lighting",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from a chest-height, slightly off-center position looking up, P01, a rough red circle, holds the upper-middle of the frame against [L05: a dark, bare bedroom wall enveloped in cold night-blue darkness]. The uneven, brush-like edges of P01 are clearly legible, carrying a wet, newly formed texture that catches a muted ritual red presence. In the lower frame, a small slice of the foot-side edge of a dim bed serves as a grounded foreground anchor. The surrounding air is foggy-dark and unmoving, shaped by deep blue-black ambient shadows and a faint, sickly amber light spilling from the lower boundary.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: red circle appearing on the dark wall above the bed",
              "The red circle has brush-like edges and looks wet and newly formed"
            ],
            "visual_inferences": [
              "fixed_element dim_two_tone_lighting: cold night-blue darkness mixed with a faint amber spill",
              "The foot-side edge of the bed occupies the lower frame to anchor the bedroom space"
            ],
            "creative_decisions": [
              "Emphasized the wet, uneven texture of the red mark to highlight the eerie, supernatural appearance without making it glow artificially",
              "Used deep blue-black shadows and a foggy-dark atmosphere to maintain the oppressive stillness of the room"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bloodstain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "circle mark",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dresser",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "footprint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light switch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "outlet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pillow",
                "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": "96423462dbed6d80",
              "owned_hash": "6fdca8f7622dd2f9",
              "camera_direction_hash": "b217991407131037",
              "owned_usage_hash": "69341cf821002152",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "같은 공간(수리영의 옥탑방 안방)에서 이어지는 상황이며 배경 분위기 일관성 유지 (background reference skipped due to close framing, but location ID L05 applies)",
        "_shot_index": 14,
        "visible_entities": [
          "P01",
          "L05"
        ],
        "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": "Completing the upward tilt from the bed line, the camera settles at chest height slightly off-center, looking up at the dark wall above the bed. The rough red circle holds the upper-middle of frame, its brush-like edges clearly legible, while the bed edge remains low and small as a grounded reference point.",
            "lighting_mood": "The room remains cold blue-black, but the red circle emits or catches a muted ritual red presence that feels wet and newly formed without becoming overtly magical.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": [
              "P01",
              "L05"
            ],
            "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": "L05B07",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dim_two_tone_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is enveloped in a cold, night-blue darkness leaking from the window. This cool ambient shadow is broken only by a faint, muted amber light spilling from the adjacent room, casting deep, sickly shadows across the space.",
                "applies_to_shots": [
                  4,
                  6,
                  11,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "weak living-room spill and cold night-blue window leak skim the wet blood",
                  "Cold blue window spill outlines the corpse while a faint amber room lamp leaves the wounds in a sickly shadow",
                  "Cold blue darkness is broken by a faint muted amber spill from the room",
                  "The room remains cold blue-black"
                ],
                "visual_inferences": [
                  "The lighting establishes a sharp color temperature contrast between the freezing, indifferent night air outside and the dying warmth of the domestic household."
                ],
                "creative_decisions": [
                  "Shadows are kept extremely deep to obscure the most gruesome details, turning the wet blood into a dark, almost black-red hue under the blue light."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "a90b241023e22047"
      },
      {
        "scene_index": 13,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "패닉에 빠진 수리영과 그녀를 붙잡는 혜수",
        "representative_moment": "C02O02 gripping the shoulders of a panicked C01O01 in the foggy, siren-lit outdoor space.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "handheld over-the-shoulder close framing, eye-to-chest height, alternating blue and amber police siren flashes",
            "t2i_prompt": "Photorealistic cinematic still. Shot from eye-to-chest height, an over-the-shoulder framing places C01O01 in a navy windbreaker, a Korean woman in her 20s, as a partial shoulder and head slice in the foreground-right edge, standing stiff under a tight grip in the shared foggy alley space, eyes fixed on C02O02. Across the short distance between them, C02O02 in a dark leather jacket, a Korean middle-aged woman, fills the center-left frame in three-quarter left angle. C02O02 maintains a steady, locked gaze toward C01O01 directly in front of her. Her worried face and both hands—visibly gripping the shoulders of C01O01—are heavily and intermittently illuminated by the flashing blue and weak amber lights of police sirens. [: A dark outdoor environment heavily shrouded in nighttime shadows and thick drifting coastal fog. The surrounding space is struck by alternating, harsh blue and muted amber flashes from nearby police sirens, completely underexposing the deep background and blurring the stair-side wall].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "비명을 지르며 옥탑방을 빠져나오는 수리영",
              "동시에 사이렌이 울리고",
              "차에서 내린 혜수(40대 중반, 여자, 경위) 초점을 잃고 멍하니 서있는 수리영의 모습을 발견하고 달려간다."
            ],
            "visual_inferences": [
              "fixed_element hye_su_steady_gaze applied: C02's locked gaze and face illuminated by siren flashes",
              "fixed_element foggy_police_siren_environment applied: thick fog isolating the characters",
              "C01's stiff posture resulting from panic and C02's tight grip"
            ],
            "creative_decisions": [
              "Close over-the-shoulder framing to emphasize the tense emotional connection and physical grip between the two characters",
              "Using thick coastal fog and underexposed background to remove distractions and focus entirely on the siren-lit faces"
            ],
            "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": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boundary wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "front door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "garden strip",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "intercom keypad",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp post",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pavement",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pedestrian gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "police car",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "porch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "siren light bar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "step",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "018f0aef5e26b610",
              "owned_hash": "51171ee411368460",
              "camera_direction_hash": "d29ff17ef5b94780",
              "owned_usage_hash": "cfecd2c80e3b97c9",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "Refers to the outdoor coastal alley environment established in Scene 11, but utilizes a close framing that deliberately skips detailed background reference to focus on the immediate character interaction.",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "C02"
        ],
        "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": "Carried from the close confrontation flow, the handheld camera stays beside 수리영’s shoulder at eye-to-chest height, angled toward 혜수’s worried face and both hands. 혜수 fills the center-left, her fingers visibly pressing into 수리영’s shoulders in the foreground-right edge, making the frame feel crowded and breathless.",
            "lighting_mood": "Blue police flashes and weak amber street spill alternate over their faces, heightening 혜수’s urgency while keeping the background fog-heavy and underexposed.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L11B01",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "hye_su_steady_gaze",
                "element_type": "character_state",
                "character_name": "혜수",
                "description": "A mid-40s female police lieutenant standing outdoors at night. She maintains a steady, locked gaze toward the person directly in front of her. Her face is heavily and intermittently illuminated by the flashing blue and red or amber lights of police sirens against the dark background.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "close",
                "source_facts": [
                  "혜수(40대 중반, 여자, 경위)",
                  "gaze=looks_at_character→C01",
                  "Blue police flashes",
                  "cold blue flash cuts across eyes"
                ],
                "visual_inferences": [
                  "Despite her changing emotional expressions between the two moments, the angle of her head and her fixed eye direction toward the other person remain completely static."
                ],
                "creative_decisions": [
                  "The siren lights dynamically map across her facial features to emphasize her intense focus and the ongoing emergency."
                ],
                "confidence": "high"
              },
              {
                "element_id": "foggy_police_siren_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark outdoor environment heavily shrouded in nighttime shadows and thick fog. The surrounding space is struck by alternating, harsh blue and muted red or amber flashes from nearby police sirens, completely underexposing the deep background.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "동시에 사이렌이 울리고",
                  "Blue police flashes and weak amber street spill",
                  "fog-heavy and underexposed",
                  "trembling police color and darkness"
                ],
                "visual_inferences": [
                  "The ambient darkness and heavy fog strongly contrast with the vivid, rhythmic police siren lights, establishing a chaotic and enclosed nighttime emergency atmosphere."
                ],
                "creative_decisions": [
                  "The fog is kept thick enough to isolate the characters from the surrounding neighborhood, making the siren lights bloom dramatically in the darkness."
                ],
                "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"
              },
              {
                "kind": "character_outlook",
                "id": "C02O02",
                "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": "73df37a8f5494c45"
      },
      {
        "scene_index": 13,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "충격에 빠진 혜수",
        "representative_moment": "수리영의 말을 듣고 경악하며 시선이 고정된 혜수의 정면 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Centered, less-than-one-meter frontal close-up at eye height, freezing the subject in hard unstable night color",
            "t2i_prompt": "Photorealistic cinematic still. C02O02 in a dark leather jacket, a Korean mid-40s woman with a middle-aged face and neat black hair, occupies the middle-center foreground, her shocked face captured in a centered frontal close-up. Facing the camera at eye height, she stands frozen mid-breath. Her distinct, widened eyes maintain a steady, locked gaze toward an off-screen person directly in front of her. A cold blue police siren flash illuminates a band across the surface of her eyes, while a muted red pulse grazes her cheek, bathing her skin in hard, unstable night colors. [: The immediate frame-edge space behind her is heavily shrouded in nighttime shadows and thick fog, completely underexposing the background and isolating her figure against trembling blue and red light blooming in the mist].",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "혜수(40대 중반, 여자, 경위) 초점을 잃고 멍하니 서있는 수리영의 모습을 발견하고 달려간다",
              "혜수: (놀라) 뭐?!",
              "Blue police flashes and weak amber street spill",
              "fog-heavy and underexposed"
            ],
            "visual_inferences": [
              "fixed_element hye_su_steady_gaze: She maintains a steady, locked gaze toward the person directly in front of her",
              "fixed_element foggy_police_siren_environment: A dark outdoor environment heavily shrouded in nighttime shadows and thick fog",
              "She is frozen mid-breath with widened eyes reflecting her shock in a tight close-up"
            ],
            "creative_decisions": [
              "Extremely tight frontal close-up to isolate her reaction from the background, compressing the space",
              "Applied harsh blue and muted red light directly onto her facial surfaces to convey the chaotic emergency atmosphere without relying on background details",
              "Replaced 'cuts across' with 'illuminates a band across the surface of' to avoid the T2I model interpreting the lighting as a physical mutilation"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boundary wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "front door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "garden strip",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "intercom keypad",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp post",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pavement",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pedestrian gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "police car",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "porch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "siren light bar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "step",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "485e01f92bc61109",
              "owned_hash": "51171ee411368460",
              "camera_direction_hash": "98cff703ecd43d3f",
              "owned_usage_hash": "cfecd2c80e3b97c9",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 13,
        "dependency_reason": "같은 씬의 이전 샷(Shot 4)에서 설정된 경찰 사이렌 조명과 짙은 안개 환경의 연속성을 유지하되 클로즈업 구도로 변환",
        "_shot_index": 6,
        "visible_entities": [
          "C02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera follows the flow into a centered, less-than-one-meter frontal close-up of 혜수 at eye height, compressing the space until 수리영 becomes only an off-screen presence. 혜수’s face occupies most of the frame, her widened eyes locked just past the lens line, with the background reduced to trembling police color and darkness.",
            "lighting_mood": "A cold blue flash cuts across 혜수’s eyes while a muted red pulse grazes one cheek, freezing her shock in hard, unstable night color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "혜수 shocked face",
                  "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L11B01",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "hye_su_steady_gaze",
                "element_type": "character_state",
                "character_name": "혜수",
                "description": "A mid-40s female police lieutenant standing outdoors at night. She maintains a steady, locked gaze toward the person directly in front of her. Her face is heavily and intermittently illuminated by the flashing blue and red or amber lights of police sirens against the dark background.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "close",
                "source_facts": [
                  "혜수(40대 중반, 여자, 경위)",
                  "gaze=looks_at_character→C01",
                  "Blue police flashes",
                  "cold blue flash cuts across eyes"
                ],
                "visual_inferences": [
                  "Despite her changing emotional expressions between the two moments, the angle of her head and her fixed eye direction toward the other person remain completely static."
                ],
                "creative_decisions": [
                  "The siren lights dynamically map across her facial features to emphasize her intense focus and the ongoing emergency."
                ],
                "confidence": "high"
              },
              {
                "element_id": "foggy_police_siren_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark outdoor environment heavily shrouded in nighttime shadows and thick fog. The surrounding space is struck by alternating, harsh blue and muted red or amber flashes from nearby police sirens, completely underexposing the deep background.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "동시에 사이렌이 울리고",
                  "Blue police flashes and weak amber street spill",
                  "fog-heavy and underexposed",
                  "trembling police color and darkness"
                ],
                "visual_inferences": [
                  "The ambient darkness and heavy fog strongly contrast with the vivid, rhythmic police siren lights, establishing a chaotic and enclosed nighttime emergency atmosphere."
                ],
                "creative_decisions": [
                  "The fog is kept thick enough to isolate the characters from the surrounding neighborhood, making the siren lights bloom dramatically in the darkness."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 13,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_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": "C02O02",
                "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": "f5e3188f7408afe8"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "완벽하게 지워진 현장",
        "representative_moment": "An unnervingly pristine bedroom, bathed in cold blue night light, showing no traces of the expected gruesome crime.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide eye-level observer view from the doorway, cold blue night palette with weak amber spill",
            "t2i_prompt": "Photorealistic cinematic still. A wide observer view from the doorway at eye level, focusing on the impeccably clean room. The tidy bed occupies the lower foreground, perfectly made with spotless sheets. Beyond it, the bare bedroom floor stretches perfectly clean without a trace of disturbance. At the rear wall, the closed window curtain hangs completely calm and still, facing the camera. The wall above the bed is entirely blank, shadowed and undisturbed. A pervasive cold blue night light filters into the space, casting chilling shadows across the room, subtly counterbalanced by a weak amber domestic spill, highlighting the unnatural, pristine emptiness of the space.",
            "outfit_assignments": [],
            "source_facts": [
              "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
              "침대 위에 붉은 표식은 물론 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
              "Shot description: spotless sheets, clean floor, calm curtains occupy the room exactly where blood and a body should have broken the geometry."
            ],
            "visual_inferences": [
              "fixed_element pristine_bedroom_curtain_area: area near the curtains remains impeccably bare and clean",
              "fixed_element cold_blue_night_lighting: pervasive cold blue night light counterbalanced by weak amber domestic glow"
            ],
            "creative_decisions": [
              "Wide eye-level framing from the doorway to capture the stark contrast of the spotless bed and curtains against the horrific expectations",
              "Use cold blue light against a weak amber domestic spill to emphasize the clinical stillness and psychological disorientation of the empty room"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "baseboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bed",
                "usage_kind": "anchor",
                "source_phrase": "The tidy bed occupies the lower foreground"
              },
              {
                "owned_token": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "anchor",
                "source_phrase": "closed window curtain hangs completely calm"
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "bare bedroom floor stretches perfectly clean"
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mattress",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "outlet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pillow",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "switch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "anchor",
                "source_phrase": "At the rear wall"
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "closed window curtain"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1d993a17979b9c5d",
              "owned_hash": "a9a6686040b6f823",
              "camera_direction_hash": "e59d61bf81693f0d",
              "owned_usage_hash": "6f48e7d13d5738f3",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "from the doorway",
                  "reason": "The prompt mentions 'doorway' to establish the camera's eye-level viewpoint, acting as a spatial anchor rather than instructing to redraw the door. The producer incorrectly declared it as absent.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bed",
                  "violating_phrase": "The tidy bed occupies the lower foreground, perfectly made with spotless sheets",
                  "reason": "The prompt describes the clean, tidy state and positioning of the bed in the foreground to anchor the composition, which matches the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "the bare bedroom floor stretches perfectly clean",
                  "reason": "The prompt describes the clean state of the existing bedroom floor, acting as a background anchor, which matches the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "At the rear wall, the closed window curtain hangs... The wall above the bed is entirely blank",
                  "reason": "The prompt mentions the walls to describe their blank, shadowed, and undisturbed states to anchor the scene, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curtain",
                  "violating_phrase": "closed window curtain hangs completely calm and still",
                  "reason": "The prompt describes the undisturbed, calm state of the existing curtains as a background anchor, which matches the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "closed window curtain",
                  "reason": "The window is mentioned contextually in relation to the curtains' positioning, serving as an spatial anchor, which matches the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "S12_Shot4 establishes the exact room layout and background elements, which must now be rendered immaculately clean and devoid of blood or bodies.",
        "_shot_index": 4,
        "visible_entities": [
          "L05"
        ],
        "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": "From the bedroom doorway at eye level, the camera holds a slightly wider reveal as it begins the flow’s inward dolly, framing the bed in the lower foreground and the window curtains at the back. The composition is unnervingly balanced: spotless sheets, clean floor, and calm curtains occupy the room exactly where blood and a body should have broken the geometry.",
            "lighting_mood": "The cold blue night palette remains, but the absence of blood makes the room feel clinically still, with only a weak amber domestic spill softening the impossible cleanliness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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"
            ],
            "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": "L05B08",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "baseboard",
              "bed",
              "ceiling light",
              "chair",
              "curtain",
              "dining table",
              "door",
              "floor",
              "kitchen counter",
              "mattress",
              "outlet",
              "pillow",
              "refrigerator",
              "shoe cabinet",
              "smartphone",
              "sofa",
              "switch",
              "wall",
              "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": "pristine_bedroom_curtain_area",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The bedroom floor near the window curtains is immaculately clean, showing no traces of blood or disturbance. The curtains hang calmly, creating an unnervingly spotless and tidy space exactly where a gruesome scene was previously expected.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
                  "spotless sheets, clean floor, and calm curtains (Shot 4)",
                  "clean curtain-side floor (Shot 5)"
                ],
                "visual_inferences": [
                  "The area near the curtains serves as the focal point for the missing evidence, remaining impeccably bare and clean."
                ],
                "creative_decisions": [
                  "The stark contrast between the expected horror and the actual pristine condition highlights the psychological disorientation of the scene."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_blue_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pervasive cold blue night light filters into the interior spaces, casting chilling shadows across the rooms. This dominant cool tone is slightly counterbalanced by a weak, restrained amber glow from domestic light sources, creating a tense and clinical atmosphere.",
                "applies_to_shots": [
                  4,
                  5,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "The cold blue night palette (Shot 4)",
                  "Cold window-blue light (Shot 5)",
                  "blue night shadows / restrained amber domestic glow (Shot 9)"
                ],
                "visual_inferences": [
                  "The consistent bi-color lighting scheme bridges the bedroom and the main living area, unifying the visual tone of the entire sequence."
                ],
                "creative_decisions": [
                  "The interplay between the cold exterior blue and the fragile amber interior light visually represents the clash between the horrific reality she perceived and the normal domestic facade."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "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": "L05B08",
                "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": "b6c87ab1dd862f52"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "현장 증발과 혼란",
        "representative_moment": "C01이 시신과 핏자국이 흔적 없이 사라진 커튼 뒤의 깨끗한 바닥을 허망하게 내려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium framing, slightly oblique side perspective, cold blue dominant lighting",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a Korean young woman in her 20s, stands in the middle-left midground at a three-quarter angle from the right, looking down toward the clean floor behind the curtains located in the lower-center background. Upper body visible, leaning toward the curtain. Her remarkably pale face, dark hair, and deep eyes reflect a continuous state of shock, her complexion drained by pervasive cold window-blue night lighting. The immaculately clean, dry floor occupies the lower-center frame, bathed in a flat, lifeless grey tone. The still curtain panels form a vertical background frame behind the empty area, while the bed's foot-side corner cuts into the lower edge obliquely as a foreground anchor. A weak, restrained amber domestic glow slightly counterbalances the chilling blue shadows across the room.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "얼굴이 파리해진 수리영이 텅 빈 커튼 뒤의 깨끗한 바닥을 멍하게 내려다보는 상체",
              "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고"
            ],
            "visual_inferences": [
              "fixed_element suriyoung_pale_shocked_visage: noticeably pale and drained facial complexion, continuous state of shock, gaze fixed downward",
              "fixed_element pristine_bedroom_curtain_area: immaculately clean floor, curtains hang calmly",
              "fixed_element cold_blue_night_lighting: pervasive cold blue night light, restrained amber glow"
            ],
            "creative_decisions": [
              "Positioned Su-ri-young in the middle-left midground and the pristine floor in the lower-center background to fulfill the spatial contract and capture the uneasy geometry of her stare.",
              "Used the bed corner at the lower edge as a foreground anchor to provide depth to the medium framing without cluttering the clean floor area."
            ],
            "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": "baseboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bed",
                "usage_kind": "anchor",
                "source_phrase": "the bed's foot-side corner cuts into the lower edge obliquely"
              },
              {
                "owned_token": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "anchor",
                "source_phrase": "The still curtain panels form a vertical background frame behind the empty area"
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "the clean floor behind the curtains located in the lower-center background"
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mattress",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "outlet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pillow",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "switch",
                "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": "4304a7fd4b051456",
              "owned_hash": "a9a6686040b6f823",
              "camera_direction_hash": "1939c29baf87a7e1",
              "owned_usage_hash": "64496ff740b67f57",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bed",
                  "violating_phrase": "the bed's foot-side corner cuts into the lower edge obliquely as a foreground anchor",
                  "reason": "The bed is mentioned solely as a compositional foreground anchor with no instructions to redraw or alter it, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curtain",
                  "violating_phrase": "The still curtain panels form a vertical background frame behind the empty area",
                  "reason": "The curtains are used as a background framing element and spatial reference for the character's posture, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "The immaculately clean, dry floor occupies the lower-center frame, bathed in a flat, lifeless grey tone",
                  "reason": "The floor is described for composition and ambient lighting reference rather than being redrawn, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "동일 옥탑방 세트의 환경 연속성 및 조명 톤 유지 (previous_shot_refs 참조)",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "L05"
        ],
        "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": "Just inside the bedroom near the foot of the bed, the camera tightens from the flow’s side position into an upper-body frame of 수리영, keeping the clean curtain-side floor low in the composition. Her pale face sits in the upper-left while the empty floor occupies the lower-center, so her stare and the missing body are held in the same uneasy geometry.",
            "lighting_mood": "Cold window-blue light drains 수리영’s face while the clean floor catches a flat, lifeless grey tone, denying the red horror of the previous scene.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "clean floor behind the curtains",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "clean floor behind the curtains",
                  "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",
              "L05"
            ],
            "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": "L05B08",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "baseboard",
              "bed",
              "ceiling light",
              "chair",
              "curtain",
              "dining table",
              "door",
              "floor",
              "kitchen counter",
              "mattress",
              "outlet",
              "pillow",
              "refrigerator",
              "shoe cabinet",
              "smartphone",
              "sofa",
              "switch",
              "wall",
              "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": "pristine_bedroom_curtain_area",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The bedroom floor near the window curtains is immaculately clean, showing no traces of blood or disturbance. The curtains hang calmly, creating an unnervingly spotless and tidy space exactly where a gruesome scene was previously expected.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
                  "spotless sheets, clean floor, and calm curtains (Shot 4)",
                  "clean curtain-side floor (Shot 5)"
                ],
                "visual_inferences": [
                  "The area near the curtains serves as the focal point for the missing evidence, remaining impeccably bare and clean."
                ],
                "creative_decisions": [
                  "The stark contrast between the expected horror and the actual pristine condition highlights the psychological disorientation of the scene."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suriyoung_pale_shocked_visage",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A close visual focus on a young woman named Su-ri-young, highlighting her noticeably pale and drained facial complexion. Her gaze is fixed downward in a continuous state of shock, maintaining this disoriented and bewildered expression across different interactions.",
                "applies_to_shots": [
                  5,
                  9
                ],
                "element_scope": "close",
                "source_facts": [
                  "얼굴이 파리해지는 수리영",
                  "gaze=down (Shot 5, Shot 9)"
                ],
                "visual_inferences": [
                  "Her pale face and downward stare persist even as her overall body posture shifts from looking at the floor to being comforted."
                ],
                "creative_decisions": [
                  "Isolating her facial expression and gaze direction to anchor her internal confusion, separating her emotional trauma from the physical movements of her torso."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_blue_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pervasive cold blue night light filters into the interior spaces, casting chilling shadows across the rooms. This dominant cool tone is slightly counterbalanced by a weak, restrained amber glow from domestic light sources, creating a tense and clinical atmosphere.",
                "applies_to_shots": [
                  4,
                  5,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "The cold blue night palette (Shot 4)",
                  "Cold window-blue light (Shot 5)",
                  "blue night shadows / restrained amber domestic glow (Shot 9)"
                ],
                "visual_inferences": [
                  "The consistent bi-color lighting scheme bridges the bedroom and the main living area, unifying the visual tone of the entire sequence."
                ],
                "creative_decisions": [
                  "The interplay between the cold exterior blue and the fragile amber interior light visually represents the clash between the horrific reality she perceived and the normal domestic facade."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L05B08",
                "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": "dc904b7386adfd70"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "Police conclude it's an illusion from overwork; Su-ri-young remains in shock",
        "representative_moment": "C02 gently holds the shoulders of a pale and shocked C01, bathed in dual amber and blue light.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height medium shot favoring Hye-soo's eyeline with tense bi-color lighting",
            "t2i_prompt": "Photorealistic cinematic still. Captured at chest height with torso and arms in frame, C02O02 in a dark leather jacket, a Korean middle-aged woman at three-quarter angle from the left, shares the center floor space with C01O01. C02O02's hands gently cup both shoulders of C01O01 in a navy windbreaker, a Korean young woman at three-quarter angle from the right, who is sagging into the physical touch. C02O02's eyes are fixed on C01O01, while C01O01 looks down with a noticeably pale and drained facial complexion in a continuous state of shock. A restrained amber domestic glow warms C02O02's hands and face against the pervasive cold blue night light that casts chilling shadows across the figures. In the background blur, the wall and a door are dimly lit, and the side edge of a dining table is partially visible.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "혜수(수리영 어깨를 어루만지며) 영아",
              "얼굴이 파리해지는 수리영",
              "The cold blue night palette (Shot 4)"
            ],
            "visual_inferences": [
              "fixed_element suriyoung_pale_shocked_visage: downward stare persists while being comforted",
              "fixed_element cold_blue_night_lighting: bi-color lighting scheme unifying the visual tone in the room"
            ],
            "creative_decisions": [
              "Chest-height medium framing captures the shared physical contact while maintaining full torso visibility without isolating body parts.",
              "Using background blur on the dining table to de-emphasize the missing evidence and anchor the exact background from the prior shot."
            ],
            "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": "baseboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ceiling light",
                "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": "anchor",
                "source_phrase": "the side edge of a dining table is partially visible"
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "the wall and a door are dimly lit"
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "shares the center floor space with C01O01"
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mattress",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "outlet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pillow",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "switch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "anchor",
                "source_phrase": "the wall and a door are dimly lit"
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8682308c5790c5f2",
              "owned_hash": "a9a6686040b6f823",
              "camera_direction_hash": "493328c0a2e4ffec",
              "owned_usage_hash": "f572a37f680ac14a",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "dining table",
                  "violating_phrase": "the side edge of a dining table is partially visible",
                  "reason": "The dining table is mentioned as partially visible in the blurred background to establish context, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "the wall and a door are dimly lit",
                  "reason": "The door is mentioned as dimly lit in the background blur to set the scene, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "shares the center floor space with C01O01",
                  "reason": "The floor is used solely as a spatial anchor to position the characters, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "the wall and a door are dimly lit",
                  "reason": "The wall is referenced as dimly lit in the background to provide atmosphere, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "Exact background reference from earlier shot in the same scene to maintain room consistency.",
        "_shot_index": 9,
        "visible_entities": [
          "C01",
          "C02",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 9
          },
          "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 chest height, the camera settles into the flow’s steady medium close-up in front of 혜수 and 수리영, favoring 혜수’s eyeline. 혜수’s hands wrap gently around 수리영’s shoulders at the lower center, while 수리영 is held slightly turned away in the right foreground, isolating comfort from the earlier accusation.",
            "lighting_mood": "A restrained amber domestic glow warms 혜수’s hands and face against the persistent blue night shadows, giving the comfort a fragile, temporary softness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject 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": "L05B08",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "baseboard",
              "bed",
              "ceiling light",
              "chair",
              "curtain",
              "dining table",
              "door",
              "floor",
              "kitchen counter",
              "mattress",
              "outlet",
              "pillow",
              "refrigerator",
              "shoe cabinet",
              "smartphone",
              "sofa",
              "switch",
              "wall",
              "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": "suriyoung_pale_shocked_visage",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "A close visual focus on a young woman named Su-ri-young, highlighting her noticeably pale and drained facial complexion. Her gaze is fixed downward in a continuous state of shock, maintaining this disoriented and bewildered expression across different interactions.",
                "applies_to_shots": [
                  5,
                  9
                ],
                "element_scope": "close",
                "source_facts": [
                  "얼굴이 파리해지는 수리영",
                  "gaze=down (Shot 5, Shot 9)"
                ],
                "visual_inferences": [
                  "Her pale face and downward stare persist even as her overall body posture shifts from looking at the floor to being comforted."
                ],
                "creative_decisions": [
                  "Isolating her facial expression and gaze direction to anchor her internal confusion, separating her emotional trauma from the physical movements of her torso."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_blue_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pervasive cold blue night light filters into the interior spaces, casting chilling shadows across the rooms. This dominant cool tone is slightly counterbalanced by a weak, restrained amber glow from domestic light sources, creating a tense and clinical atmosphere.",
                "applies_to_shots": [
                  4,
                  5,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "The cold blue night palette (Shot 4)",
                  "Cold window-blue light (Shot 5)",
                  "blue night shadows / restrained amber domestic glow (Shot 9)"
                ],
                "visual_inferences": [
                  "The consistent bi-color lighting scheme bridges the bedroom and the main living area, unifying the visual tone of the entire sequence."
                ],
                "creative_decisions": [
                  "The interplay between the cold exterior blue and the fragile amber interior light visually represents the clash between the horrific reality she perceived and the normal domestic facade."
                ],
                "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": "C02O02",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L05B08",
                "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": "7c622aa89cd72b8b"
      },
      {
        "scene_index": 15,
        "heading": "S#15. 해안가. 버스정류장 부근 / N",
        "beat_title": "혼란 속에서 옥탑방으로 돌아갈 결심을 하는 수리영",
        "representative_moment": "어두운 밤바다를 배경으로, 수리영(C01)이 나트륨 가로등 불빛 아래 버스정류장 벤치에 멍하니 앞을 보며 앉아 있는 넓은 측면 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Wide side-profile shot at bench height, highlighting the character's isolation against the vast, dark environment",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a Korean young woman with black hair, pale face, and deep-set eyes, in strict right profile, sitting hunched on the edge of the stationary bus stop bench, gazing into the distance across the dark water. The camera is positioned a short distance to the side at bench height, framing her small against the horizon line, centered slightly left. The simple bus stop bench cuts horizontally through the lower frame, its side parallel to the shoreline, while the empty night road stretches on the opposite side. A desolate coastal area and a vast, blue-black moonless sea stretch behind her, the dark water barely rippling beneath low, cold drifting coastal fog. The thin dark vertical posts of the unlit bus stop shelter frame stand near the bench. Blue-black moonless sea tones dominate the cold atmosphere, punctuated by a faint, muted sodium-amber light spilling over the area, catching the bench surface and the rim of C01O01's profile, creating weak pools of illumination against the heavy darkness.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "해안가. 버스정류장 부근 / N",
              "어두운 밤바다",
              "바다를 바라보며 멍한 채로 앉아있는 수리영"
            ],
            "visual_inferences": [
              "The bus stop is isolated on the edge of the coastal road",
              "The bench runs laterally across the lower frame",
              "Low, cold drifting coastal fog separating the bench area from the sea"
            ],
            "creative_decisions": [
              "Wide framing to make C01 appear small and dwarfed by the environment",
              "Contrasting the weak, warm amber light against the expansive blue-black sea to emphasize vulnerability",
              "Positioning the camera at bench height to ground the character horizontally"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c6041db45cd0bde3",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "dbd796a98904554c",
              "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": [
          "C01",
          "L12"
        ],
        "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": "At bench height about eight feet to the side, the static camera holds 수리영 in strict side profile with the dark sea stretching behind her. She sits small against the horizon line, centered slightly left, while the bus stop bench cuts horizontally through the lower frame and the empty night road breathes on the opposite side.",
            "lighting_mood": "Blue-black moonless sea tones dominate, with only a faint sodium-amber bus stop spill catching the bench and the edge of 수리영’s 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": [
              "C01",
              "L12"
            ],
            "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 desolate coastal bus stop and empty road beside a vast, blue-black moonless sea at night. The cold and dark atmosphere is punctuated only by a faint, muted sodium-amber light spilling over the bus stop area, creating weak pools of illumination against the darkness.",
                "applies_to_shots": [
                  1,
                  3,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "해안가. 버스정류장 부근 / N",
                  "어두운 밤바다",
                  "dark sea stretching behind",
                  "Blue-black moonless sea tones",
                  "faint sodium-amber bus stop spill",
                  "weak amber pools around the bus stop"
                ],
                "visual_inferences": [
                  "The bus stop is isolated on the edge of the coastal road, serving as the sole source of warm light in the cold surroundings."
                ],
                "creative_decisions": [
                  "Contrasting the weak, warm amber light against the expansive blue-black sea to emphasize a sense of vulnerability and isolation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "bus_stop_bench",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A simple, stationary bus stop bench positioned near the edge of the coastal road. It sits directly within the spill of the muted sodium-amber stop light.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "close",
                "source_facts": [
                  "버스정류장 벤치에 멍하니 앞을 보며 앉아있는",
                  "bus stop bench cuts horizontally",
                  "vertical break from the bench"
                ],
                "visual_inferences": [
                  "The bench is a basic outdoor seating structure typical of rural coastal stops, providing a physical anchor for the characters."
                ],
                "creative_decisions": [
                  "Using the stationary bench to establish a horizontal grounding point that highlights the sudden movements of 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": "3c74ecfbfa9ea4aa"
      },
      {
        "scene_index": 15,
        "heading": "S#15. 해안가. 버스정류장 부근 / N",
        "beat_title": "수리영의 혼란과 결심",
        "representative_moment": "C01이 벤치에서 갑자기 몸을 일으키며 혜수를 단호하게 쳐다보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level tracking wide composition with cold blue and muted amber contrast",
            "t2i_prompt": "Photorealistic cinematic still. A damp bus stop bench anchors the lower-left foreground, while C01O01 in a navy windbreaker, a Korean woman in her early 20s with a pale face, is caught in mid-rise off the bench, her full body occupying the middle-left foreground at a three-quarter angle from the right. C01O01's eyes are fixed on a Korean middle-aged woman standing mid-right in left profile across the shared bench area, holding out canned drinks with her eyes fixed on C01O01. A muted sodium-amber stop light illuminates C01O01's sudden vertical break, casting weak warm pools against the desolate coastal night environment. Behind them, the dark sea horizon stretches into a vast blue-black void under a moonless sky, and the wet, empty coastal road recedes diagonally away toward the darker right frame edge.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#15 action: 훅 일어나며 집에 가봐야 겠어.",
              "shot description: 수리영이 벤치에서 몸을 벌떡 일으킨 채 단호한 표정으로 혜수를 쳐다보는 전신",
              "혜수, 사온 음료수를 수리영에게 건네며"
            ],
            "visual_inferences": [
              "fixed_element coastal_night_environment: blue-black moonless sea and faint sodium-amber light.",
              "fixed_element bus_stop_bench: stationary bench acting as a physical anchor for the sudden movement.",
              "혜수 is an unregistered extra, rendered as a Korean middle-aged woman."
            ],
            "creative_decisions": [
              "Wide eye-level framing to capture C01's full vertical break from the bench alongside the isolated extra.",
              "Contrasting warm amber spill against the cold blue-black sea void to emphasize emotional vulnerability."
            ],
            "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": "1cdc6ed7ff438833",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9389ed1fb66255f6",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 15,
        "dependency_reason": "Same coastal bus stop location, exact background atmosphere carryover from Scene 15 Shot 1.",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "L12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 15,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From standing eye level ten to twelve feet from the bench, the tracking camera widens enough to catch 수리영’s full body as she springs up, with 혜수 kept to the side as the eyeline target rather than the center. 수리영 occupies the middle-left in a sudden vertical break from the bench, while 혜수 remains mid-right with the drinks, the sea line still dark behind them.",
            "lighting_mood": "Cold blue sea darkness surrounds the figures while a muted amber stop light catches 수리영’s sudden movement, making her resolve feel exposed and vulnerable.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "bus stop bench",
                  "screen_zone": "lower_left",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "수리영 rising from bench",
                  "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",
              "L12"
            ],
            "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 desolate coastal bus stop and empty road beside a vast, blue-black moonless sea at night. The cold and dark atmosphere is punctuated only by a faint, muted sodium-amber light spilling over the bus stop area, creating weak pools of illumination against the darkness.",
                "applies_to_shots": [
                  1,
                  3,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "해안가. 버스정류장 부근 / N",
                  "어두운 밤바다",
                  "dark sea stretching behind",
                  "Blue-black moonless sea tones",
                  "faint sodium-amber bus stop spill",
                  "weak amber pools around the bus stop"
                ],
                "visual_inferences": [
                  "The bus stop is isolated on the edge of the coastal road, serving as the sole source of warm light in the cold surroundings."
                ],
                "creative_decisions": [
                  "Contrasting the weak, warm amber light against the expansive blue-black sea to emphasize a sense of vulnerability and isolation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "bus_stop_bench",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A simple, stationary bus stop bench positioned near the edge of the coastal road. It sits directly within the spill of the muted sodium-amber stop light.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "close",
                "source_facts": [
                  "버스정류장 벤치에 멍하니 앞을 보며 앉아있는",
                  "bus stop bench cuts horizontally",
                  "vertical break from the bench"
                ],
                "visual_inferences": [
                  "The bench is a basic outdoor seating structure typical of rural coastal stops, providing a physical anchor for the characters."
                ],
                "creative_decisions": [
                  "Using the stationary bench to establish a horizontal grounding point that highlights the sudden movements of 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": "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": "adeee239fe3099f5"
      },
      {
        "scene_index": 15,
        "heading": "S#15. 해안가. 버스정류장 부근 / N",
        "beat_title": "어둠 속으로 달려가는 수리영과 지켜보는 불길한 시선",
        "representative_moment": "어둠 속 높은 감시자의 시선에서, 하염없이 멀어지는 수리영(C01)과 소리치는 혜수(C02)가 버스정류장 주변을 수놓는 광경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "elevated concealed high angle voyeur POV, surveillant tension",
            "t2i_prompt": "Photorealistic cinematic still. C02O02 in a dark leather jacket, an Asian middle-aged woman with neat black hair, stands in the lower-left midground looking toward fleeing Suriyoung, while C01O01 in a navy windbreaker, an Asian young woman with a pale face, appears in the upper-right background moving toward the dark road, with the wet dark road extending into the upper-right background. Both figures share the same desolate asphalt stretch of the coastal road. Viewed from far back in the darkness at an elevated concealed high angle, the camera looks down like an unseen watcher. C02O02 is seen at a three-quarter angle from the right, both hands cupped to her mouth shouting, eyes fixed on C01O01. C01O01 is captured with her back to camera, mid-stride running away into the gloom, one foot lifted off the ground, fabric flowing back opposite to her motion. A desolate coastal bus stop stands beside a vast, blue-black moonless sea at night. The view is mostly blue-black, punctuated by faint, muted sodium-amber light spilling weak pools of illumination around the bus stop area. Faint red-blue residual glints are swallowed by thin, drifting blue-grey coastal fog. Opaque black foreground darkness encloses the outer frame edges, creating a heavy surveillant menace.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#15 action: '수리영 (달려간다)', '혜수 (등 뒤에 대고 소리친다)'",
              "S#15 action: '두 사람을 지켜보는 듯한 카메라 시선'",
              "fixed_element: 'A desolate coastal bus stop and empty road beside a vast, blue-black moonless sea at night.'"
            ],
            "visual_inferences": [
              "The scene captures a mid-stride freeze of C01 running away with back to camera, while C02 stands shouting in the amber light.",
              "The voyeur POV uses an elevated distant angle wrapped in foreground darkness to emphasize the presence of an unseen watcher."
            ],
            "creative_decisions": [
              "Opaque black foreground darkness used on the frame edges to organically simulate a concealed vantage point without naming camera hardware.",
              "Contrasting the weak sodium-amber pools near C02 with the deep blue-grey fog swallowing C01's escape path to visually separate their emotional states."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002",
              "fsc_003"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "fa62d44c6793af94",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9fd8322f77cc391e",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 15,
        "dependency_reason": "Same environment (S#15 Shot 3) with consistent coastal night atmosphere and bus stop layout, sharing the fixed_element lighting data.",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "C02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 15,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From far back in the darkness at an elevated concealed angle, the static camera looks down like an unseen watcher over the bus stop and road edge. 혜수 is small in the lower-left with both hands cupped to her mouth, while 수리영 is farther upper-right, caught mid-stride running toward the dark road, the distance between them stretched by the high-angle frame.",
            "lighting_mood": "The high distant view is mostly blue-black, with weak amber pools around the bus stop and faint red-blue residual glints swallowed by fog, giving the frame a surveillant menace.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "dark road",
                  "screen_zone": "upper_right",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "background",
                  "gesture_action": "moves_toward",
                  "gesture_target_label": "dark road",
                  "label": "수리영 running away",
                  "screen_zone": "upper_right",
                  "target_id": "C01",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_003",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "fleeing Suriyoung",
                  "label": "혜수 calling after her",
                  "screen_zone": "lower_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": [
              "C01",
              "C02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject 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 desolate coastal bus stop and empty road beside a vast, blue-black moonless sea at night. The cold and dark atmosphere is punctuated only by a faint, muted sodium-amber light spilling over the bus stop area, creating weak pools of illumination against the darkness.",
                "applies_to_shots": [
                  1,
                  3,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "해안가. 버스정류장 부근 / N",
                  "어두운 밤바다",
                  "dark sea stretching behind",
                  "Blue-black moonless sea tones",
                  "faint sodium-amber bus stop spill",
                  "weak amber pools around the bus stop"
                ],
                "visual_inferences": [
                  "The bus stop is isolated on the edge of the coastal road, serving as the sole source of warm light in the cold surroundings."
                ],
                "creative_decisions": [
                  "Contrasting the weak, warm amber light against the expansive blue-black sea to emphasize a sense of vulnerability and isolation."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 15,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_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": "C02O02",
                "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": "0d560779239dd015"
      },
      {
        "scene_index": 16,
        "heading": "경찰서 사무실 / N",
        "beat_title": "불길함을 직감한 혜수, 무관심한 형사에게 증거를 들이밀다",
        "representative_moment": "혜수의 손이 위치 추적을 요구하며 P03 스마트폰 화면을 C05(김형사)의 눈앞으로 들이민다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level object close-up with shallow depth of field, focused intensely on the smartphone screen",
            "t2i_prompt": "Photorealistic cinematic still. An over-the-shoulder arm of a Korean middle-aged woman thrusts the P03 smartphone into the middle foreground, while C05 in a gray field jumper, a Korean man in his 30s, forms Kim's implied seated eye line in the middle-center background. The P03 smartphone's lit front glass face is aimed squarely toward the camera, occupying most of the frame to show a saved phone number. C05 is seated leaning back at a three-quarter angle from the left, looking down at the screen, his face intentionally out of focus due to the shallow depth of field. [L13B02: A solid police duty desk edge crosses the lower frame as a dark horizontal strip, serving as the shared surface that separates the foreground hand from the dim fluorescent-lit institutional background]. Cold office fluorescents flatten the room, while the device casts a small, hard glow onto the damp-looking skin of the gripping hand and the desk edge.",
            "outfit_assignments": [
              {
                "character_id": "C05",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "혜수가 핸드폰에 저장된 민숙번호 보여주며 위치 좀 따봐 라고 요구",
              "사무실 안에는 김형사 혼자 당직 근무 중이다",
              "Cold blue-gray office light is cut by muted amber desk spill"
            ],
            "visual_inferences": [
              "Only Hye-su's thrusting hand and forearm are meaningfully visible from the camera's angle.",
              "Detective Kim remains consistently seated during the conversation, placed slightly out of focus to emphasize the smartphone as the primary foreground evidence."
            ],
            "creative_decisions": [
              "Use a compressed, shallow depth of field to render the smartphone as a visual pressure point.",
              "Employ the desk edge as a horizontal shared anchor to physically separate the characters while linking them in the same space."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "blind",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "case photo",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "computer monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk phone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "evidence board",
                "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": "notepad",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "partition divider",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pen",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "printer copier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "security monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall clock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5f06101bf209e96d",
              "owned_hash": "096590bdcf0f7f80",
              "camera_direction_hash": "2e2bdd10fc72ee9c",
              "owned_usage_hash": "e38fde84d95a8529",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "C02",
          "C05",
          "P03"
        ],
        "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": "From the front edge of the duty desk just above 김형사's seated eye line, the camera is pushed into an almost object-level close-up: 혜수's extended hand drives the smartphone into the middle foreground, its lit number screen occupying most of the frame while 김형사's blurred eye line sits just behind it. The angle stays eye-level but compressed and shallow, making the phone feel like evidence shoved into his personal space rather than a neutral insert.",
            "lighting_mood": "Cold office fluorescents flatten the room while the smartphone casts a small hard glow onto damp-looking skin and the desk 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": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "Kim's implied seated eye line",
                  "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": [
              "C02",
              "C05",
              "P03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "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": "C02",
                "policy_type": "identity_reference",
                "policy": "generic_descriptor_allowed",
                "reason": "Only 혜수's thrusting hand and forearm are meaningfully visible, so a full outlook reference would over-specify the frame."
              },
              {
                "subject_id": "C05",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "김형사 is only partially present as a blurred seated eye line behind the phone, making full outlook alignment unnecessary."
              }
            ],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject 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": "L13B02",
            "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": "detective_kim_seated_position",
                "element_type": "character_state",
                "character_name": "Detective Kim",
                "description": "A Korean male police detective is seated in an office chair behind a duty desk. He remains in this lower, seated position throughout the interaction while the woman stands over him.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "김형사 혼자 당직 근무 중이다",
                  "seated leaning back",
                  "seated shoulders drawn"
                ],
                "visual_inferences": [
                  "He remains consistently seated during the conversation, creating a physical height dynamic between his seated form and the standing woman."
                ],
                "creative_decisions": [
                  "Emphasize his defensive and passive posture by keeping him anchored to the chair, visually contrasting with the woman's aggressive stance."
                ],
                "confidence": "high"
              },
              {
                "element_id": "police_office_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a police station office at night. The environment is dominated by cold, flat fluorescent lighting, which is accented by a faint, muted amber spill around the desk area.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "경찰서 사무실 / N",
                  "Cold office fluorescents flatten the room",
                  "Cold blue-gray office light is cut by muted amber desk spill"
                ],
                "visual_inferences": [
                  "The surrounding office space is mostly empty and shadowed, directing focus to the illuminated desk area where the characters interact."
                ],
                "creative_decisions": [
                  "Use the contrast between the bleak room light and the warm desk spill to isolate the characters and heighten the tension."
                ],
                "confidence": "high"
              },
              {
                "element_id": "police_duty_desk",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A solid police duty desk situated between the two characters. It functions as a physical barrier and the primary surface anchoring the scene's blocking.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "front edge of the duty desk",
                  "planted hands form a hard diagonal across the lower frame while the detective sits lower on the opposite side"
                ],
                "visual_inferences": [
                  "The desk surface is consistently visible as the spatial divider, bearing the weight of the standing woman's hands and framing the interaction."
                ],
                "creative_decisions": [
                  "Treat the desk as a grounding element that visually anchors the shifting power dynamic 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",
                "id": "C05",
                "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": "15400b23ac0c1045"
      },
      {
        "scene_index": 16,
        "heading": "S#16. 경찰서 사무실 / N",
        "beat_title": "위치 추적을 강권하는 혜수와 방어적인 김형사",
        "representative_moment": "혜수가 책상에 양손을 짚고 몸을 기울여 김형사를 압박하며, 김형사는 의자에 앉아 방어적으로 응시하는 팽팽한 측면 구도",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "mid-height side-profile pressure composition with cold fluorescent and warm amber desk spill contrast",
            "t2i_prompt": "Photorealistic cinematic still. At hip height beside the desk, upper bodies and arms occupying the frame in a side-profile pressure composition. C02O02 in a dark leather jacket, a Korean middle-aged woman, in right profile, leaning forward with palms firmly braced on the front edge of the shared desk, arms forming a hard diagonal. Her eyes are fixed on C05O05. C05O05 in a gray field jumper, a Korean man in his 30s, in left profile, seated lower in the chair behind the same desk, shoulders drawn back, looking up at C02O02. The solid desk anchors the space between them in the lower frame. The room is illuminated by a cold blue-gray fluorescent light, contrasting with a faint muted amber desk spill that grounds the tense profiles against the dim office background.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "혜수 (핸드폰에 저장된 민숙번호 보여주며) 이 번호 위치 좀 따봐.",
              "사무실 안에는 김형사 혼자 당직 근무 중이다.",
              "혜수's planted hands form a hard diagonal across the lower frame while 김형사 sits lower on the opposite side"
            ],
            "visual_inferences": [
              "fixed_element detective_kim_seated_position: He remains consistently seated during the conversation, creating a physical height dynamic.",
              "fixed_element police_duty_desk: The desk surface is consistently visible as the spatial divider.",
              "fixed_element police_office_night_lighting: The environment is dominated by cold, flat fluorescent lighting accented by a muted amber desk spill."
            ],
            "creative_decisions": [
              "Placed the camera at hip height perpendicular to the desk to capture the vertical power dynamic and the physical barrier separating the characters.",
              "Emphasized the hard diagonal of C02's arms against the defensive, withdrawn posture of C05.",
              "Used the contrast between the institutional cold fluorescent light and the warm desk spill to isolate their interaction in the dim room."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "blind",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "case photo",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "anchor",
                "source_phrase": "seated lower in the chair"
              },
              {
                "owned_token": "computer monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "anchor",
                "source_phrase": "the shared desk"
              },
              {
                "owned_token": "desk phone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "evidence board",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "filing cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fluorescent light",
                "usage_kind": "anchor",
                "source_phrase": "cold blue-gray fluorescent light"
              },
              {
                "owned_token": "notepad",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "partition divider",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pen",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "printer copier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "security monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall clock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "ac905423e7814aea",
              "owned_hash": "096590bdcf0f7f80",
              "camera_direction_hash": "2f9c4be0cf93030c",
              "owned_usage_hash": "f400de5d52114f2f",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "chair",
                  "violating_phrase": "seated lower in the chair",
                  "reason": "The prompt mentions the chair as a spatial reference for C05O05's posture, which is a valid anchor reference and matches the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "desk",
                  "violating_phrase": "the shared desk",
                  "reason": "The desk is used to anchor the physical interaction and spatial positioning of the two characters, representing a valid anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fluorescent light",
                  "violating_phrase": "cold blue-gray fluorescent light",
                  "reason": "The fluorescent light is referenced as an ambient light source to set the scene's mood, which constitutes an anchor reference rather than a redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 16,
        "dependency_reason": "exact_background from prior shot, preserving the established lighting, desk position, and room layout",
        "_shot_index": 5,
        "visible_entities": [
          "C02",
          "C05",
          "L13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera has slid to the side of the duty desk and settles perpendicular to both figures at mid height, holding a side-profile pressure composition. 혜수's planted hands form a hard diagonal across the lower frame while 김형사 sits lower on the opposite side, his chair and desk height emphasizing that she is physically and morally bearing down on him.",
            "lighting_mood": "Cold blue-gray office light is cut by muted amber desk spill, leaving the side profiles tense and grounded rather than theatrical.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "C05",
              "L13"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "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": "L13B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "blind",
              "case photo",
              "chair",
              "computer monitor",
              "counter",
              "desk",
              "desk phone",
              "door",
              "evidence board",
              "filing cabinet",
              "fluorescent light",
              "notepad",
              "partition divider",
              "pen",
              "printer copier",
              "security monitor",
              "wall clock",
              "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": "detective_kim_seated_position",
                "element_type": "character_state",
                "character_name": "Detective Kim",
                "description": "A Korean male police detective is seated in an office chair behind a duty desk. He remains in this lower, seated position throughout the interaction while the woman stands over him.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "김형사 혼자 당직 근무 중이다",
                  "seated leaning back",
                  "seated shoulders drawn"
                ],
                "visual_inferences": [
                  "He remains consistently seated during the conversation, creating a physical height dynamic between his seated form and the standing woman."
                ],
                "creative_decisions": [
                  "Emphasize his defensive and passive posture by keeping him anchored to the chair, visually contrasting with the woman's aggressive stance."
                ],
                "confidence": "high"
              },
              {
                "element_id": "police_office_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a police station office at night. The environment is dominated by cold, flat fluorescent lighting, which is accented by a faint, muted amber spill around the desk area.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "경찰서 사무실 / N",
                  "Cold office fluorescents flatten the room",
                  "Cold blue-gray office light is cut by muted amber desk spill"
                ],
                "visual_inferences": [
                  "The surrounding office space is mostly empty and shadowed, directing focus to the illuminated desk area where the characters interact."
                ],
                "creative_decisions": [
                  "Use the contrast between the bleak room light and the warm desk spill to isolate the characters and heighten the tension."
                ],
                "confidence": "high"
              },
              {
                "element_id": "police_duty_desk",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A solid police duty desk situated between the two characters. It functions as a physical barrier and the primary surface anchoring the scene's blocking.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "front edge of the duty desk",
                  "planted hands form a hard diagonal across the lower frame while the detective sits lower on the opposite side"
                ],
                "visual_inferences": [
                  "The desk surface is consistently visible as the spatial divider, bearing the weight of the standing woman's hands and framing the interaction."
                ],
                "creative_decisions": [
                  "Treat the desk as a grounding element that visually anchors the shifting power dynamic of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 16,
                "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": "C02O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C05O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L13B02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "40284e5cc04f9e03"
      },
      {
        "scene_index": 17,
        "heading": "S#17. 옥탑방 / 동틀무렵",
        "beat_title": "새벽 옥탑방과 검은 고양이",
        "representative_moment": "A black cat in left profile stares at a lit rooftop window in the predawn fog.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium framing, low-angle observer perspective parallel to the wall, cool predawn blue and warm amber contrast",
            "t2i_prompt": "Photorealistic cinematic still. A black cat with solid black fur, bright eyes, pointed ears, a small face, and a distinct feline silhouette, positioned in left profile, its haunches coiled still on a wet, rough-textured parapet in the lower frame. The cat's gaze is fixed on a closed, lit window in the upper background. Blue predawn fog surrounds the exterior, swallowing the rooftop. The window leaks a muted amber square of warm interior light through slightly fogged glass, casting faint amber reflections on the damp wall running parallel to the camera. The low-angle observer viewpoint anchors the cat and the wall against the cold atmospheric depth.",
            "outfit_assignments": [],
            "source_facts": [
              "scene text: 검은 고양이가 불이 켜져 있는 옥탑 방을 슬쩍 보더니 담을 넘는다 (moment before moving)",
              "DP instruction: black cat profile_left, haunches coiled still, gaze fixed at B01 lit window",
              "DP instruction: blue predawn fog, muted amber square from window"
            ],
            "visual_inferences": [
              "cat positioned on the parapet/wall in the lower frame, aligned with the low-angle shoulder height observer perspective",
              "amber light reflecting faintly on the damp wall and the cat's fur, creating depth contrast against the blue fog"
            ],
            "creative_decisions": [
              "placed the lit window in the upper background to establish a spatial diagonal from the cat in the lower foreground",
              "used heavy atmospheric fog to emphasize the isolation and cold mood of the dawn exterior"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bulkhead",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "concrete floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "laundry line",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "parapet",
                "usage_kind": "anchor",
                "source_phrase": "on a wet, rough-textured parapet in the lower frame"
              },
              {
                "owned_token": "post",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rooftop",
                "usage_kind": "anchor",
                "source_phrase": "swallowing the rooftop"
              },
              {
                "owned_token": "wall",
                "usage_kind": "anchor",
                "source_phrase": "damp wall running parallel to the camera"
              },
              {
                "owned_token": "water tank",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "closed, lit window in the upper background"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8629b3decc20c99c",
              "owned_hash": "2b163985eed0e9b5",
              "camera_direction_hash": "9789a088d2524db7",
              "owned_usage_hash": "85d714760135db8e",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "parapet",
                  "violating_phrase": "on a wet, rough-textured parapet in the lower frame",
                  "reason": "The parapet is used as a physical anchor to position the cat, which matches the producer's anchor declaration with no redraw commands.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rooftop",
                  "violating_phrase": "swallowing the rooftop",
                  "reason": "The rooftop is referenced environmentally to describe the fog's movement, acting as an atmospheric anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "casting faint amber reflections on the damp wall running parallel to the camera",
                  "reason": "The wall is mentioned to receive reflections and establish perspective, which serves as a compositional anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "closed, lit window in the upper background... The window leaks a muted amber square of warm interior light",
                  "reason": "The window acts as the spatial target for the cat's gaze and a source of environmental light, serving as a key anchor rather than a structural redrawing request.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "exact_background usage referencing the established exterior rooftop location",
        "_shot_index": 2,
        "visible_entities": [
          "C14"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 17,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At black-cat shoulder height beside the wall, the camera tracks parallel to the wall but holds the profile longer, keeping the 검은 고양이 in the lower side plane and the lit rooftop-room window fixed beyond its gaze. The low angle makes the wall feel like a damp barrier, with the window glowing in the upper background as the only warm target in the fog-blue dawn.",
            "lighting_mood": "Blue predawn fog swallows the exterior while the rooftop window leaks a muted amber square that pins the cat's attention.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": [
              "C14"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C14",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [
              {
                "subject_id": "C14",
                "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": "background_ref_attached",
            "bg_id": "L04B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bulkhead",
              "concrete floor",
              "door",
              "laundry line",
              "parapet",
              "post",
              "rooftop",
              "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": [],
            "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": "L04B01",
                "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": "41d108e329fa0b66"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "사라진 시신과 깨끗한 방",
        "representative_moment": "수리영(C01)이 시신이 없는 깨끗한 방바닥을 넋을 잃고 내려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Slightly low observer perspective with pale blue washed dawn light",
            "t2i_prompt": "Photorealistic cinematic still. The camera is positioned slightly below eye level and behind the subject's left side, framing her from the waist up. C01O01 in a navy windbreaker, a Korean female in her early 20s with black hair, pale complexion, and deep-set eyes, her hair slightly messy, stands at the right edge of the frame in left profile. She leans slightly forward, looking down at the spotless floor that claims the empty center of the room. Behind her in the background, the opened curtain folds face inward toward the camera, pulled apart toward both sides of the closed sliding window. The glass is pale with daylight filtering in from beyond. Washed dawn daylight turns the room pale blue, draining the space of comforting warmth and casting cool forensic tones across the over-neat background.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Suri-young wears the casual indoor clothing she slept in the previous night.",
              "창문에 다가가 커튼을 확 열어젖힌다. 시신은 없다.",
              "Washed dawn light turns the room pale blue, with no comforting warmth"
            ],
            "visual_inferences": [
              "She stands in left profile at the right edge of the frame, leaning over and looking down at the floor.",
              "The spotless floor claims the center of the frame as primary negative evidence.",
              "Her appearance is exhausted and slightly messy, reflecting her sleepless night and psychological strain."
            ],
            "creative_decisions": [
              "Using a medium framing scale with the camera slightly below eye level to emphasize the unnatural emptiness of the center floor while holding the subject at the right edge.",
              "Cool blue daylight unifies the forensic, tense atmosphere of the excessively clean room."
            ],
            "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": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coat rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "anchor",
                "source_phrase": "the opened curtain folds face inward toward the camera"
              },
              {
                "owned_token": "cushion",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dresser",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "the spotless floor that claims the empty center of the room"
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photo frame",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pillow",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding window",
                "usage_kind": "anchor",
                "source_phrase": "toward both sides of the closed sliding window"
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tea tray",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "29c4ff32dd79c5d7",
              "owned_hash": "0cf8920bfde0b00a",
              "camera_direction_hash": "9833e095c538e95a",
              "owned_usage_hash": "aba7e625e6344ea9",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "curtain",
                  "violating_phrase": "the opened curtain folds face inward toward the camera, pulled apart toward both sides of the closed sliding window",
                  "reason": "The prompt describes the state and placement of the existing curtain in the background as a spatial reference, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "looking down at the spotless floor that claims the empty center of the room",
                  "reason": "The floor is mentioned to establish the subject's gaze direction and spatial layout, acting as a background anchor without requiring a redesign.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sliding window",
                  "violating_phrase": "toward both sides of the closed sliding window. The glass is pale with daylight",
                  "reason": "The window is referenced as a structural anchor to position the curtains and describe daylight transmission, with no redraw intention.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "S14_Shot5 establishes the previous state of the room which must now be shown as excessively clean with the exact same background layout.",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Just inside 수리영's room, the camera sits slightly below her eye line and behind her left side, lowered enough that the spotless floor claims the center of the frame while her tense side profile remains at the right edge as witness. The opened curtains and over-neat room stretch into the background, making the absence of the expected body feel unnaturally staged.",
            "lighting_mood": "Washed dawn light turns the room pale blue, with no comforting warmth, making the excessive cleanliness feel forensic.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "L05"
            ],
            "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": "L05B05",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "bed",
              "chair",
              "coat rack",
              "cooktop",
              "curtain",
              "cushion",
              "dining table",
              "door",
              "dresser",
              "floor",
              "kitchen counter",
              "photo frame",
              "pillow",
              "refrigerator",
              "shelf",
              "shoe cabinet",
              "sink",
              "sliding window",
              "smartphone",
              "sofa",
              "tea tray",
              "wall",
              "wardrobe"
            ],
            "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_morning_appearance",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "Suri-young wears the casual indoor clothing she slept in the previous night. Her hair is slightly messy, and her overall appearance is visibly disheveled and tired from staying awake and waiting all night. She retains this exhausted, unkempt look as she moves from her bedroom to the bathroom.",
                "applies_to_shots": [
                  5,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "밤새 엄마를 기다리다 깜박 졸았다",
                  "얼굴을 씻고 거울을 보며"
                ],
                "visual_inferences": [
                  "She did not change clothes after waking up abruptly, retaining her slept-in casual wear.",
                  "Her hair and posture reflect her lack of proper sleep and growing anxiety."
                ],
                "creative_decisions": [
                  "Keeping her appearance distinctly tired and unkempt to physically anchor her psychological strain and the passage of a sleepless night."
                ],
                "confidence": "high"
              },
              {
                "element_id": "pale_apartment_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A washed, pale morning daylight filters into the interior of the apartment, draining the space of any comforting warmth. This cool illumination casts pale blue and cool tones across the different rooms, connecting the spaces with a tense, unnerving atmosphere.",
                "applies_to_shots": [
                  5,
                  9,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "Washed dawn light turns the room pale blue, with no comforting warmth",
                  "Cool bathroom light turns green-blue",
                  "Pale household daylight drains the table of warmth"
                ],
                "visual_inferences": [
                  "The early morning daylight affects all rooms of the house similarly, establishing a unified time of day."
                ],
                "creative_decisions": [
                  "Using a universally cool, drained color palette across the house to visually connect the isolated rooms and match the character's escalating dread."
                ],
                "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": "background",
                "id": "L05B05",
                "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": "fbaaedf0cb5e3cf7"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 욕실 안 / D",
        "beat_title": "거울 속 붉은 원 환각과 공포",
        "representative_moment": "C01의 어깨너머 거울 속 욕실 벽면에 거친 붉은 원 표식이 나타난 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Over-the-shoulder close-up pushing into the mirror reflection, cool pale blue-green lighting",
            "t2i_prompt": "Photorealistic cinematic still. A rough red circle reflected on the bathroom wall dominates the middle-center background. In the foreground, C01O01 in a wrinkled navy windbreaker, a young Korean woman in her 20s, stands with her back to the camera at mirror height, her right shoulder forming a cropped, dark, out-of-focus edge along the side, her lower body implied beyond the bottom frame. Just beyond her shoulder, the shared bathroom mirror anchors the view, its glass slightly streaked and cold with moisture, its side frame barely visible. Inside the mirror reflection, [L05: a pale green-blue tiled bathroom wall] fills the view, centering the muted red ritual stain. Near the bottom edge of the glass, the reflection of a young Korean woman's pale, disheveled face with dark eyes and messy hair appears softly out of focus, gazing at the camera with an exhausted expression. Washed pale morning daylight mixes with cool green-blue ambient light, hitting the wet tiles and mirror streaks, draining the tight space of comforting warmth and emphasizing the tense, unnatural mark.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "거울에 비친 욕실 벽에 갑자기 또 발생하는 붉은 원.",
              "얼굴을 씻고 거울을 보며",
              "호흡이 가빠지고... 훅 고개를 돌려 벽을 보는 수리영"
            ],
            "visual_inferences": [
              "The camera acts as an observer positioned just behind Suri-young's right shoulder.",
              "The red circle is seen through the reflection, establishing the mirror as the primary viewing surface.",
              "Her morning appearance reflects a lack of sleep, remaining in her wrinkled nightclothes."
            ],
            "creative_decisions": [
              "Using a shallow depth of field to keep the foreground physical shoulder out of focus while sharpening the reflected red mark on the wall.",
              "Applying a cold, washed green-blue tone to enhance the unnerving, drained atmosphere of the bathroom and contrast the muted red mark."
            ],
            "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": "bathroom mirror",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coat rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor cushion",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photo frame",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shower",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tea tray",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "toilet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall mark",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1ab094dc0b977ed3",
              "owned_hash": "eda9679da757d7f3",
              "camera_direction_hash": "7560effe56ec6745",
              "owned_usage_hash": "1763180fb057ccd9",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 18,
        "dependency_reason": "Same continuous timeline and overall house environment as earlier in Scene 18 (Shot 5), but framed tightly within the bathroom.",
        "_shot_index": 9,
        "visible_entities": [
          "C01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From just behind 수리영's right shoulder at mirror height, the camera pushes into the mirror image until her shoulder becomes a cropped dark edge and the reflected bathroom wall fills the center. The mirror frame remains barely visible along one side, confirming the left-right reversed view as the rough red circle blooms on the wall behind her reflection.",
            "lighting_mood": "Cool bathroom light turns green-blue on tile and mirror streaks, while the red circle reads as a muted ritual stain rather than bright gore.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": "rough red circle reflected on bathroom 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": [
              "C01",
              "L05"
            ],
            "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": "L05B06",
            "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_morning_appearance",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "Suri-young wears the casual indoor clothing she slept in the previous night. Her hair is slightly messy, and her overall appearance is visibly disheveled and tired from staying awake and waiting all night. She retains this exhausted, unkempt look as she moves from her bedroom to the bathroom.",
                "applies_to_shots": [
                  5,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "밤새 엄마를 기다리다 깜박 졸았다",
                  "얼굴을 씻고 거울을 보며"
                ],
                "visual_inferences": [
                  "She did not change clothes after waking up abruptly, retaining her slept-in casual wear.",
                  "Her hair and posture reflect her lack of proper sleep and growing anxiety."
                ],
                "creative_decisions": [
                  "Keeping her appearance distinctly tired and unkempt to physically anchor her psychological strain and the passage of a sleepless night."
                ],
                "confidence": "high"
              },
              {
                "element_id": "pale_apartment_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A washed, pale morning daylight filters into the interior of the apartment, draining the space of any comforting warmth. This cool illumination casts pale blue and cool tones across the different rooms, connecting the spaces with a tense, unnerving atmosphere.",
                "applies_to_shots": [
                  5,
                  9,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "Washed dawn light turns the room pale blue, with no comforting warmth",
                  "Cool bathroom light turns green-blue",
                  "Pale household daylight drains the table of warmth"
                ],
                "visual_inferences": [
                  "The early morning daylight affects all rooms of the house similarly, establishing a unified time of day."
                ],
                "creative_decisions": [
                  "Using a universally cool, drained color palette across the house to visually connect the isolated rooms and match the character's escalating dread."
                ],
                "confidence": "high"
              }
            ],
            "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"
              }
            ],
            "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": "1027828a68c7f6ed"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "거실 식탁 위 기괴하게 일그러지는 사진 속 얼굴",
        "representative_moment": "거실 식탁 위에 놓인 P07 액자 속 여성의 얼굴이 붉은 핏빛으로 뭉개지며 흘러내리는 환각의 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up at tabletop height with soft background blur, isolating the hallucinated red distortion against pale daylight",
            "t2i_prompt": "Photorealistic cinematic still. An extreme close-up at low tabletop height focusing on the pre-existing photo frame P07 standing on the dining table. Inside the glass of P07, the portrait of a middle-aged Asian woman is visibly distorted; her face melting downward into a thick, pulsing red smear as if breaking reality. The glossy glass of P07 reflects faint tabletop light while showing the warped red face beneath it. In the peripheral foreground, a partly filled water glass sits out of focus. The surrounding room collapses into a soft blur. Washed, pale apartment daylight drains the dining table of warmth, leaving the red facial distortion as the only vibrant color in the frame.",
            "outfit_assignments": [],
            "source_facts": [
              "S#18 action: 거실로 튀어나와 물 한컵 마시고 식탁에 놓인 엄마와 수리영의 사진을 보는데... 환하게 웃는 엄마 얼굴이 뭉개져 흘러내린다",
              "shot description: At low tabletop height, extreme close-up on the framed photograph, isolating face area so the rest of the living room collapses into a soft blur.",
              "shot description: Pale household daylight drains the table of warmth"
            ],
            "visual_inferences": [
              "fixed_element pale_apartment_daylight: cool illumination draining the space of comforting warmth",
              "The glossy surface of the photo frame glass creates a reflection over the distorted portrait underneath."
            ],
            "creative_decisions": [
              "Used generic demographic descriptor ('middle-aged Asian woman') for the reproduced face due to reproduction_surface_rule applying inside the photo frame.",
              "Emphasized the contrast between the cold, washed-out daylight and the vivid red smear to heighten the hallucinatory horror."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "prop",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bathroom mirror",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coat rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "anchor",
                "source_phrase": "standing on the dining table"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor cushion",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photo frame",
                "usage_kind": "anchor",
                "source_phrase": "focusing on the pre-existing photo frame P07"
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shower",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tea tray",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "toilet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall mark",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "167ba37dc092ffd8",
              "owned_hash": "eda9679da757d7f3",
              "camera_direction_hash": "3de06e78872d0608",
              "owned_usage_hash": "b953dd64936d4c27",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "dining table",
                  "violating_phrase": "standing on the dining table",
                  "reason": "The dining table is mentioned solely as a spatial anchor for the photo frame and to describe the room's daylight casting over it, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "photo frame",
                  "violating_phrase": "focusing on the pre-existing photo frame P07",
                  "reason": "The prompt explicitly targets the pre-existing photo frame P07 as a focal point to describe details inside its glass and reflections without requesting a new frame to be drawn, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "동일한 아파트 거실 배경(exact_background)의 조명과 구조를 유지하며, 국소적인 환각 효과(zoom_in_detail/insert)를 구현하기 위함",
        "_shot_index": 12,
        "visible_entities": [
          "P07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At low tabletop height, the dolly-in finishes as an extreme close-up on the framed photograph, isolating 민숙's face area so the rest of the living room collapses into a soft blur. The camera remains level with the table surface, letting the red distortion seem to seep downward across the glossy photo rather than appear as a separate effect.",
            "lighting_mood": "Pale household daylight drains the table of warmth while the red facial smear pulses as the only ritual color in the frame.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": 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": [
              "P07"
            ],
            "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": "L05B06",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "bathroom mirror",
              "chair",
              "coat rack",
              "cooktop",
              "curtain",
              "dining table",
              "door",
              "floor cushion",
              "kitchen counter",
              "photo frame",
              "refrigerator",
              "shelf",
              "shoe cabinet",
              "shower",
              "sink",
              "smartphone",
              "sofa",
              "tea tray",
              "toilet",
              "wall mark",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "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": "pale_apartment_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A washed, pale morning daylight filters into the interior of the apartment, draining the space of any comforting warmth. This cool illumination casts pale blue and cool tones across the different rooms, connecting the spaces with a tense, unnerving atmosphere.",
                "applies_to_shots": [
                  5,
                  9,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "Washed dawn light turns the room pale blue, with no comforting warmth",
                  "Cool bathroom light turns green-blue",
                  "Pale household daylight drains the table of warmth"
                ],
                "visual_inferences": [
                  "The early morning daylight affects all rooms of the house similarly, establishing a unified time of day."
                ],
                "creative_decisions": [
                  "Using a universally cool, drained color palette across the house to visually connect the isolated rooms and match the character's escalating dread."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "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": "L05B06",
                "policy": "required"
              },
              {
                "kind": "prop",
                "id": "P07",
                "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": 18,
                "shot_indices": [
                  12
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P07",
                  "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": "86164ae9a62125fb"
      },
      {
        "scene_index": 19,
        "heading": "S#19. 마트 / D",
        "beat_title": "CCTV 위치 확인",
        "representative_moment": "수리영(C01)이 처마 밑에서 위를 올려다보며 마트 외벽에 달린 CCTV 카메라를 확인한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium shot, low angle from shoulder height, observer POV",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a young Korean woman in her 20s with dark hair, pale skin, and deep eyes, stands in the middle-left midground, looking toward the ceiling-mounted CCTV camera. Viewed from an observer at shoulder height angling upward, her torso and head are visible in right profile, her neck craned upward. The exterior space is sheltered beneath the weathered awning. Muted morning daylight is cooled by the awning shade, contrasting with a faint warm amber glow spilling outward from the interior through the closed storefront and window behind her. The CCTV camera remains anchored to the underside of the awning in the upper frame, its lens angled diagonally downward.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S19 action: '마트 밖 엄마와 남자 직원CCTV 위치를 확인하다. 찍혔을 만한 위치다.'",
              "shot description: Outside under the mart awning, the camera holds 수리영 in side profile at shoulder height while angling upward",
              "lighting: Muted morning daylight is cooled by the awning shade, with faint amber shop spill caught in the glass behind her."
            ],
            "visual_inferences": [
              "fixed_element mart_exterior_awning_shade: cool, muted early morning shade contrasts with warm amber glow",
              "fixed_element ceiling_mounted_security_camera: affixed to the underside of the awning, commanding the upper frame",
              "C01 is in right profile looking up at the upper frame, representing the practical discovery of the clue"
            ],
            "creative_decisions": [
              "Low angle at shoulder height frames the character and the camera above simultaneously within a single medium shot",
              "Color contrast between cool daylight and amber interior lighting enhances the realistic morning mood"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "anchor",
                "source_phrase": "looking toward the ceiling-mounted CCTV camera / The CCTV camera remains anchored"
              },
              {
                "owned_token": "awning",
                "usage_kind": "anchor",
                "source_phrase": "sheltered beneath the weathered awning / cooled by the awning shade / underside of the awning"
              },
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bike rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crosswalk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "delivery van",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "service cart",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "service door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sidewalk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "signboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storefront",
                "usage_kind": "anchor",
                "source_phrase": "spilling outward from the interior through the closed storefront"
              },
              {
                "owned_token": "street",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "and window behind her"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "21e5253cf9f54a89",
              "owned_hash": "af3dd8a4f5d2d9d1",
              "camera_direction_hash": "2ec46e06e59d2266",
              "owned_usage_hash": "ad4d5db12fce63ca",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "CCTV camera",
                  "violating_phrase": "looking toward the ceiling-mounted CCTV camera / The CCTV camera remains anchored",
                  "reason": "The prompt references the CCTV camera to establish the character's line of sight and describes its existing position as an anchor, which aligns with the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "awning",
                  "violating_phrase": "sheltered beneath the weathered awning / cooled by the awning shade / underside of the awning",
                  "reason": "The prompt references the awning to set the lighting and spatial context of the scene without requesting any new creation or modifications, aligning with the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "storefront",
                  "violating_phrase": "spilling outward from the interior through the closed storefront",
                  "reason": "The prompt mentions the closed storefront as a background element through which light spills, acting as a spatial reference as declared by the producer.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "and window behind her",
                  "reason": "The window is used purely as a background spatial anchor to position the character, aligning with the producer's echo.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "배경 참조: S8_Shot4",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "L08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Outside under the mart awning, the camera holds 수리영 in side profile at shoulder height while angling upward enough for the ceiling-mounted CCTV camera to command the upper frame. Her body stays in the middle-left plane, neck craned toward the lens above, making the discovery feel like a practical clue rather than a dramatic revelation.",
            "lighting_mood": "Muted morning daylight is cooled by the awning shade, with faint amber shop spill caught in the glass behind her.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "ceiling-mounted CCTV camera",
                  "label": "수리영 looking up",
                  "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",
              "L08"
            ],
            "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": "L08B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "awning",
              "bicycle",
              "bike rack",
              "crate",
              "crosswalk",
              "curb",
              "delivery van",
              "service cart",
              "service door",
              "sidewalk",
              "signboard",
              "sliding door",
              "storefront",
              "street",
              "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": "mart_exterior_awning_shade",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior space immediately outside a contemporary South Korean mart, sheltered beneath an overhanging architectural awning. The area is enveloped in a cool, muted early morning shade that contrasts with a faint, warm amber glow spilling outward from the mart's interior through the glass windows behind.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Outside under the mart awning",
                  "Muted morning daylight is cooled by the awning shade, with faint amber shop spill caught in the glass behind her.",
                  "Cool exterior shade hardens her features, with a thin muted shop glow"
                ],
                "visual_inferences": [
                  "The ambient light confirms it is early morning before direct sunlight hits the building facade",
                  "The glass storefront reveals typical modern retail interior lighting"
                ],
                "creative_decisions": [
                  "Emphasizing the color contrast between the cool blue ambient morning shade and the warm amber interior spill to enhance the realistic, slightly tense morning atmosphere"
                ],
                "confidence": "high"
              },
              {
                "element_id": "ceiling_mounted_security_camera",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A standard security camera affixed to the underside of the mart's exterior awning. It remains anchored to the upper architectural structure along the awning line, serving as a physically present surveillance device above the character.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "ceiling-mounted CCTV camera to command the upper frame",
                  "with the awning edge clipped along the top, keeping the earlier clue physically present"
                ],
                "visual_inferences": [
                  "The camera is a visible dome or bullet style device commonly used in modern retail exteriors",
                  "It is positioned near the outer edge of the awning ceiling so it remains partially visible even in tighter framing"
                ],
                "creative_decisions": [
                  "Maintaining the presence of the camera housing near the top edge of the frame to serve as a continuous visual anchor for the character's realization"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "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": "L08B02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "55c4c68dbca59aaf"
      },
      {
        "scene_index": 19,
        "heading": "S#19. 마트 / D",
        "beat_title": "수리영의 긴급한 통화",
        "representative_moment": "C01이 마트 어닝 아래에서 굳은 표정으로 어딘가를 응시하며 P03(스마트폰)으로 전화를 걸고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight medium shot focusing on the character's tense expression, contrasting cool ambient exterior shade with warm interior spill.",
            "t2i_prompt": "Photorealistic cinematic still. Captured from a tight medium position slightly in front of the subject. C01O01 in a navy windbreaker, a young Korean woman, stands at three-quarter angle from the left, pressing P03 to her ear. Her eyes are gazing into the distance. The front lip of the awning cuts across the upper frame, with a ceiling-mounted CCTV camera anchored to the underside above her. Behind her, the storefront, featuring a window and a sliding door, reflects pale street light while revealing a dim warm amber interior glow. The space is enveloped in cool, muted early morning shade that hardens her features, creating a tense atmosphere contrasting with the faint shop spill.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영, 혜수에게 전화 걸어 상황을 설명한다.",
              "CCTV 위치를 확인하다.",
              "이른 아침, 아직은 한산한 마트 안."
            ],
            "visual_inferences": [
              "fixed_element mart_exterior_awning_shade: cool muted early morning shade contrasting with warm amber interior glow",
              "fixed_element ceiling_mounted_security_camera: standard security camera anchored to the awning above the character",
              "The background consists of the mart's storefront with glass elements."
            ],
            "creative_decisions": [
              "Positioned the awning edge and the CCTV camera in the upper frame to anchor the character visually to the surveillance context.",
              "Utilized a tight medium framing to emphasize the character's facial tension and the contrast between the cold exterior and warm interior light."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "anchor",
                "source_phrase": "ceiling-mounted CCTV camera anchored to the underside"
              },
              {
                "owned_token": "awning",
                "usage_kind": "anchor",
                "source_phrase": "front lip of the awning cuts across the upper frame"
              },
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bike rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crosswalk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "delivery van",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "service cart",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "service door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sidewalk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "signboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sliding door",
                "usage_kind": "anchor",
                "source_phrase": "featuring a window and a sliding door"
              },
              {
                "owned_token": "storefront",
                "usage_kind": "anchor",
                "source_phrase": "the storefront, featuring a window and a sliding door"
              },
              {
                "owned_token": "street",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "featuring a window and a sliding door"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "0cb0439aee8c6cc0",
              "owned_hash": "af3dd8a4f5d2d9d1",
              "camera_direction_hash": "d156546448b32d82",
              "owned_usage_hash": "9295c18f815bcd39",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "CCTV camera",
                  "violating_phrase": "ceiling-mounted CCTV camera anchored to the underside",
                  "reason": "The prompt mentions the CCTV camera as a compositional anchor point in the frame, aligning with the producer's anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "awning",
                  "violating_phrase": "front lip of the awning cuts across the upper frame",
                  "reason": "The awning is mentioned to define the upper framing of the shot, which is a structural anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sliding door",
                  "violating_phrase": "featuring a window and a sliding door",
                  "reason": "The sliding door is mentioned as part of the background storefront to establish reflections, serving as an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "storefront",
                  "violating_phrase": "the storefront, featuring a window and a sliding door",
                  "reason": "The storefront is described as a background element reflecting light, serving as an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "featuring a window and a sliding door",
                  "reason": "The window is mentioned as a background detail on the storefront, serving as an anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "마트 외부 배경과 어닝, CCTV 카메라의 공간적 연속성 유지 (exact_background)",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "P03"
        ],
        "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": "The camera drops from the CCTV axis into a tight medium position slightly in front of 수리영 near the awning line, holding steady as she presses the smartphone to her ear. Her face occupies the central frame with the awning edge clipped along the top, keeping the earlier clue physically present while her expression hardens into action.",
            "lighting_mood": "Cool exterior shade hardens her features, with a thin muted shop glow giving the frame a tense early-morning realism.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "P03"
            ],
            "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": "L08B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "awning",
              "bicycle",
              "bike rack",
              "crate",
              "crosswalk",
              "curb",
              "delivery van",
              "service cart",
              "service door",
              "sidewalk",
              "signboard",
              "sliding door",
              "storefront",
              "street",
              "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": "mart_exterior_awning_shade",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior space immediately outside a contemporary South Korean mart, sheltered beneath an overhanging architectural awning. The area is enveloped in a cool, muted early morning shade that contrasts with a faint, warm amber glow spilling outward from the mart's interior through the glass windows behind.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Outside under the mart awning",
                  "Muted morning daylight is cooled by the awning shade, with faint amber shop spill caught in the glass behind her.",
                  "Cool exterior shade hardens her features, with a thin muted shop glow"
                ],
                "visual_inferences": [
                  "The ambient light confirms it is early morning before direct sunlight hits the building facade",
                  "The glass storefront reveals typical modern retail interior lighting"
                ],
                "creative_decisions": [
                  "Emphasizing the color contrast between the cool blue ambient morning shade and the warm amber interior spill to enhance the realistic, slightly tense morning atmosphere"
                ],
                "confidence": "high"
              },
              {
                "element_id": "ceiling_mounted_security_camera",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A standard security camera affixed to the underside of the mart's exterior awning. It remains anchored to the upper architectural structure along the awning line, serving as a physically present surveillance device above the character.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "ceiling-mounted CCTV camera to command the upper frame",
                  "with the awning edge clipped along the top, keeping the earlier clue physically present"
                ],
                "visual_inferences": [
                  "The camera is a visible dome or bullet style device commonly used in modern retail exteriors",
                  "It is positioned near the outer edge of the awning ceiling so it remains partially visible even in tighter framing"
                ],
                "creative_decisions": [
                  "Maintaining the presence of the camera housing near the top edge of the frame to serve as a continuous visual anchor for the character's realization"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "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": "L08B02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "1c3ff44c628fa043"
      },
      {
        "scene_index": 20,
        "heading": "S#20. 마트 총무과 / 실내",
        "beat_title": "불안 속 모니터 주시",
        "representative_moment": "C01과 C02, 그리고 보안직원이 사무실 책상에 모여 어두운 CCTV 모니터를 뚫어지게 바라보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "standing eye-level wide shot near the entrance",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 stands in the upper-center background, C02O02 sits in the lower-center midground, and a Korean adult man sits in the lower-left midground. C01O01 in a navy windbreaker jacket, a Korean young woman in her 20s with a pale face, is at three-quarter angle from the left, hovering anxiously behind the swivel chair. C02O02 in a dark leather jacket, a Korean middle-aged woman, is seen over the shoulder, leaning toward the monitor. The Korean adult man in a security worker uniform, with short dark hair, is at three-quarter angle from the right, hunched at the keyboard. They all occupy the same admin desk space, sharing a single line of sight converging on the monitor. The front screen of the monitor faces the seated pair, partly visible to the camera. Flat office fluorescent light mixes with the monitor's cold blue cast, illuminating the room and casting sharp, cool-toned reflections on their faces. [L10B01: closed-in general-affairs office doorway and walls behind them, practical but underlit at the corners].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#20 action: '보안팀 직원과 혜수, 뒤에서 초조한 모습으로 화면을 주시하는 수리영'",
              "shot description: from near the general-affairs office entrance at standing eye level, the camera holds a wide view of the desk"
            ],
            "visual_inferences": [
              "fixed_element office_monitor_lighting: cold blue glow from the monitor contrasting with dull fluorescent ceiling lights",
              "Su-ri-young positioned behind the seated pair creates an elevated depth and conveys psychological pressure over their shoulders"
            ],
            "creative_decisions": [
              "Wide layered framing uses the office furniture (admin desk, swivel chairs) as shared anchors for the three subjects' spatial relationship",
              "Sharp blue light reflection on the subjects' faces to accentuate their focused gazes in the dimly lit environment"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002",
              "fsc_003"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "DVR recorder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "admin desk",
                "usage_kind": "anchor",
                "source_phrase": "occupy the same admin desk space"
              },
              {
                "owned_token": "blind",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cable",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "filing cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fluorescent light",
                "usage_kind": "anchor",
                "source_phrase": "Flat office fluorescent light"
              },
              {
                "owned_token": "hard drive",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "keyboard",
                "usage_kind": "anchor",
                "source_phrase": "hunched at the keyboard"
              },
              {
                "owned_token": "monitor",
                "usage_kind": "anchor",
                "source_phrase": "leaning toward the monitor, converging on the monitor, the front screen of the monitor faces, monitor's cold blue cast"
              },
              {
                "owned_token": "mouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "printer scanner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "swivel chair",
                "usage_kind": "anchor",
                "source_phrase": "hovering anxiously behind the swivel chair"
              },
              {
                "owned_token": "visitor chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "798f8d3733492f7c",
              "owned_hash": "906524a45112302a",
              "camera_direction_hash": "31cb38a76088a883",
              "owned_usage_hash": "b90589e1723bcc02",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "admin desk",
                  "violating_phrase": "occupy the same admin desk space",
                  "reason": "The prompt references the admin desk space to establish the spatial arrangement of the characters, which is a valid anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fluorescent light",
                  "violating_phrase": "Flat office fluorescent light mixes with",
                  "reason": "The fluorescent light is mentioned to describe the ambient lighting and color cast on the characters, acting as a valid lighting anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "keyboard",
                  "violating_phrase": "hunched at the keyboard",
                  "reason": "The keyboard is used as a physical anchor to describe the posture and positioning of the security worker.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "monitor",
                  "violating_phrase": "leaning toward the monitor, converging on the monitor, the front screen of the monitor",
                  "reason": "The monitor is referenced to direct the characters' line of sight and describe the screen's orientation and glow, which acts as a valid spatial and lighting anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "swivel chair",
                  "violating_phrase": "hovering anxiously behind the swivel chair",
                  "reason": "The swivel chair serves as a spatial reference point to define where the character C01O01 is standing, acting as a valid anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "L10",
          "C15",
          "C02",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 20,
            "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 near the general-affairs office entrance at standing eye level, the camera holds a wide view of the desk: 한국인 남성 보안직원 and 혜수 sit facing the monitor while 수리영 hovers behind them, all sightlines converging on the same screen. The office furniture frames them in layers, with the seated pair lower in the foreground-midground and 수리영 elevated behind, showing her anxiety pressing over their shoulders.",
            "lighting_mood": "Flat office fluorescents mix with the monitor's cold blue cast, leaving the room practical but uneasy and underlit at the corners.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": "수리영 standing behind the seated pair",
                  "screen_zone": "upper_center",
                  "target_id": "C01",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "혜수 seated beside monitor",
                  "screen_zone": "lower_center",
                  "target_id": "C02",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_003",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "security employee seated at monitor",
                  "screen_zone": "lower_left",
                  "target_id": "C15",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L10",
              "C15",
              "C02",
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C02",
                "outlook_id": "O02"
              },
              {
                "character_id": "C15",
                "outlook_id": "O13"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [
              {
                "subject_id": "C15",
                "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": "background_ref_attached",
            "bg_id": "L10B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "DVR recorder",
              "admin desk",
              "blind",
              "cable",
              "desk",
              "door",
              "filing cabinet",
              "fluorescent light",
              "hard drive",
              "keyboard",
              "monitor",
              "mouse",
              "printer scanner",
              "swivel chair",
              "visitor chair",
              "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": "office_monitor_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The office environment is illuminated by dull, flat fluorescent ceiling lights that create a practical but somewhat airless atmosphere. In stark contrast, a noticeable cold blue glow radiates from the unseen computer monitor, casting sharp, cool-toned reflections onto the immediate viewing area and the subjects facing it.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "Flat office fluorescents mix with the monitor's cold blue cast",
                  "The monitor's cold blue reflection sharpens her eyes while the surrounding fluorescent wash stays dull and airless"
                ],
                "visual_inferences": [
                  "The contrast between the warm or neutral dull room light and the sharp blue screen glow acts as a persistent environmental anchor across different camera angles."
                ],
                "creative_decisions": [
                  "Using the cold blue monitor light as a prominent environmental feature to visually underscore the characters' focus and the scene's anxious undertone."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O02",
                "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": "69ec563cf3e690a8"
      },
      {
        "scene_index": 20,
        "heading": "S#20. 마트 총무과 / 실내",
        "beat_title": "CCTV 화면을 식별할 수 없어 깊어지는 수리영의 불안",
        "representative_moment": "C01이 극심한 불안감으로 미간을 찌푸린 채 모니터의 푸른 빛을 받으며 화면을 응시하는 클로즈업 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "close framing isolating the primary subject's reaction with sharp blue screen reflection",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a Korean young woman with black hair, pale complexion, and deep-set eyes, occupies the middle-center foreground at a three-quarter angle from the right. She leans forward slightly over unseen chairbacks, her eyes fixed on an off-screen monitor, her brow visibly knitted in anxiety. The same environment is preserved, illuminated by a dull, flat fluorescent ambient wash, while a sharp, cold blue glow from the unseen screen below-left strikes her face and reflects sharply in her eyes. The close frame isolates her anxious reaction, with two soft, dark, out-of-focus shoulder shapes visible at the extreme lower edge, representing seated figures sharing the line of sight. The background is a compressed, featureless muted wall.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영 불안이 깊어지고.",
              "The monitor's cold blue reflection sharpens her eyes while the surrounding fluorescent wash stays dull and airless."
            ],
            "visual_inferences": [
              "fixed_element office_monitor_lighting applied: sharp blue monitor glow against flat ambient light",
              "two soft, dark, out-of-focus shoulder shapes at the extreme lower frame edge represent the seated pair (보안직원 and 혜수) to preserve continuity without breaking close framing"
            ],
            "creative_decisions": [
              "close framing isolates C01's face to emphasize her anxiety, omitting complex background elements",
              "cold blue screen light strikes from below-left to heighten the tension in her deep-set eyes"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "DVR recorder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "admin desk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blind",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cable",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "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": "hard drive",
                "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": "printer scanner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "swivel chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "visitor chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6914258d4edfa409",
              "owned_hash": "906524a45112302a",
              "camera_direction_hash": "1e92c68f31aa3fe5",
              "owned_usage_hash": "fcbf0a2c177ac487",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 20,
        "dependency_reason": "S20_Shot1과 같은 공간, 같은 인물 시선 방향 유지 (zoom in detail, background skipped in close frame)",
        "_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": "From just behind and beside the seated pair, the camera tracks to 수리영's face height and tightens into a close frame on her knitted brow and eyes as she stares past them toward the unseen monitor. The seated figures are reduced to soft dark shoulder shapes at the extreme edge, isolating her reaction without breaking the shared viewing direction.",
            "lighting_mood": "The monitor's cold blue reflection sharpens her eyes while the surrounding fluorescent wash stays dull 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": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "수리영 isolated anxious close-up",
                  "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": 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": "office_monitor_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The office environment is illuminated by dull, flat fluorescent ceiling lights that create a practical but somewhat airless atmosphere. In stark contrast, a noticeable cold blue glow radiates from the unseen computer monitor, casting sharp, cool-toned reflections onto the immediate viewing area and the subjects facing it.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "Flat office fluorescents mix with the monitor's cold blue cast",
                  "The monitor's cold blue reflection sharpens her eyes while the surrounding fluorescent wash stays dull and airless"
                ],
                "visual_inferences": [
                  "The contrast between the warm or neutral dull room light and the sharp blue screen glow acts as a persistent environmental anchor across different camera angles."
                ],
                "creative_decisions": [
                  "Using the cold blue monitor light as a prominent environmental feature to visually underscore the characters' focus and the scene's anxious undertone."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 20,
                "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": "a4fbca37722e269d"
      },
      {
        "scene_index": 21,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "경악하는 수리영",
        "representative_moment": "C01이 텅 빈 경찰서 책상에 앉아 흩어진 참혹한 사진들을 내려다보며 극도의 충격으로 굳어버린 클로즈업 샷",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight close-up from a low position over the desk edge, shallow depth of field, sterile cold cyan grading",
            "t2i_prompt": "Photorealistic cinematic still. Framed in a tight close-up from a low position over the front edge of the desk, C01O01 in a navy windbreaker, a Korean woman in her early 20s, is seated frozen, hunched over the detective office desk at a three-quarter angle from the left. Her upper body posture is rigid with shoulders tense and locked, her pale and ashen face occupying the upper center of the frame. Her wide, terrified eyes are looking down, her slightly parted lips holding a frozen breath. In the lower foreground, scattered crime photographs lie upward on the dark laminated desk surface, their pale edges and dark shapes visible only as an out-of-focus blurred strip catching a faint muted amber light and dust. Cold blue-white office fluorescence washes over her, draining her skin tone, while shallow depth of field isolates her, flattening the space behind into a sterile, airless blue-gray blur [: empty police office desks and chair backs receding in soft focus].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "사색이 된 수리영",
              "Cold blue-white office fluorescence drains her skin tone",
              "her ashen face sits centered, shoulders locked",
              "혜수 책상위에는 살인사건 확대 사진들이 어지럽게 널려있다"
            ],
            "visual_inferences": [
              "Soo-ri-young is seated frozen at the police office desk, upper body posture rigid",
              "The desk acts as a physical boundary in the foreground catching faint spills of light",
              "The surrounding office falls into a muted, airless blur due to shallow depth of field"
            ],
            "creative_decisions": [
              "Framing isolates her upper body in a tight close-up to emphasize psychological shock",
              "Scattered photographs are kept out of focus as a blurred strip in the lower frame to make the horror psychological",
              "Low camera position over the desk edge compresses the frame and anchors the terror"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "blind",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "copier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "filing cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "folder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "keyboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mug",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "notepad",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "paper",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "partition",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pen",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "phone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photo board",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "printer",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "security monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall clock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e09bf71df6fb9717",
              "owned_hash": "7d5aca1c6ee0eb4f",
              "camera_direction_hash": "4694ecde0a58df55",
              "owned_usage_hash": "a2cf2b200881f1de",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 16,
        "dependency_reason": "zoom_in_detail of the police office desk scene to preserve same location and lighting mood",
        "_shot_index": 6,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From a low position over the front edge of the desk, the camera completes the desk-level push-in into a tight close-up of 수리영, with her face occupying the upper center and the scattered photographs only implied as a blurred strip below frame. The angle is slightly low and intimate, using shallow depth of field so her widened eyes and frozen breath feel trapped between the desk surface and the empty police office beyond.",
            "lighting_mood": "Cold blue-white office fluorescence drains her skin tone, with a faint muted amber desk spill catching damp paper texture and dust.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": "L13B01",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sooriyoung_shocked_upper_body",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "Soo-ri-young is seated frozen at the police office desk. Her skin tone is pale and ashen, drained by the stark lighting. Her upper body posture is rigid, with her shoulders tense and locked as she faces the grim discoveries in front of her.",
                "applies_to_shots": [
                  6,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "사색이 된 수리영",
                  "Cold blue-white office fluorescence drains her skin tone",
                  "her ashen face sits centered, shoulders locked"
                ],
                "visual_inferences": [
                  "She wears ordinary, subdued modern clothing appropriate for an abrupt visit to a police station.",
                  "Her facial expression remains consistently wide-eyed and terrified across these moments."
                ],
                "creative_decisions": [
                  "The framing isolates her upper body to emphasize her psychological shock and physical paralysis upon learning the horrific truth."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_fluorescent_office_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The police station office is washed in a sterile, cold blue-gray fluorescent light. The ambient lighting flattens the surrounding room into a muted, airless blur, while casting a stark cyan or blue-white pallor over the desk area.",
                "applies_to_shots": [
                  6,
                  10,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "Cold blue-white office fluorescence",
                  "overhead fluorescent light flattens the room into a sterile, airless blue-gray",
                  "surrounding office falls into muted gray-blue blur"
                ],
                "visual_inferences": [
                  "The overall environment feels uninviting, harsh, and clinical, reflecting standard late-night or artificial lighting in a modern Korean police station."
                ],
                "creative_decisions": [
                  "Color grading heavily leans into cool cyan and blue-gray tones to visually express the chilling nature of the murder case and the character's isolation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "detective_office_desk_surface",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A standard detective's office desk serving as the physical anchor in the foreground. Its flat surface catches faint spills of cold light and provides a base for the character's interactions and mounting terror.",
                "applies_to_shots": [
                  6,
                  10,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "혜수 책상위에는...",
                  "desk-level push-in",
                  "hands barely visible near the desk edge",
                  "insert at hand height above the desk"
                ],
                "visual_inferences": [
                  "The desk is likely made of a dark laminated or metallic material typical of Korean government offices, structurally sturdy and wide."
                ],
                "creative_decisions": [
                  "The desk acts as a visual boundary, trapping the character between the horrific information presented on it and the empty office space behind her."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 16,
                "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": "f51376b6f0be46d4"
      },
      {
        "scene_index": 21,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "사색이 된 수리영",
        "representative_moment": "수리영(C01)은 모니터 화면을 보며 사색이 된 얼굴로 굳어 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Placed just beyond the computer monitor at seated eye height, holding a close medium frontal upper-body frame.",
            "t2i_prompt": "Photorealistic cinematic still. In the lower foreground, the dark rim and faint glow of the monitor skim the edge of the desk. Across the shared desk surface, C01O01 in a navy windbreaker, a Korean woman in her 20s with black hair, a pale face, and deep-set eyes, is seated frozen, facing the camera. She is looking directly at the camera with wide-eyed terror, her upper body posture rigid and shoulders tense. The monitor's faint light casts a cold cyan pallor onto her ashen skin, while her hands remain barely visible near the desk edge. Behind her, [L13B01: a sterile, cold blue-gray fluorescent police station office falls into a muted, airless blur, with empty partition edges facing diagonally toward the camera]. The overall ambient lighting flattens the background space.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "사색이 된 수리영",
              "The monitor casts a cold cyan pallor onto her face",
              "overhead fluorescent light flattens the room into a sterile, airless blue-gray",
              "hands barely visible near the desk edge"
            ],
            "visual_inferences": [
              "fixed_element sooriyoung_shocked_upper_body: seated frozen, upper body posture rigid, shoulders tense",
              "fixed_element detective_office_desk_surface: flat desk surface acts as the physical anchor",
              "fixed_element cold_fluorescent_office_lighting: muted, airless blur in the background"
            ],
            "creative_decisions": [
              "Placed the camera just beyond the monitor to create an object POV as if the screen is staring back at her",
              "Used the desk as a shared physical anchor to separate the foreground monitor rim and midground character",
              "Incorporated stable traits (black hair, pale face, deep-set eyes) directly into the character descriptor"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "blind",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "copier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "anchor",
                "source_phrase": "skim the edge of the desk. Across the shared desk surface"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "filing cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "folder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "keyboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "monitor",
                "usage_kind": "anchor",
                "source_phrase": "the dark rim and faint glow of the monitor"
              },
              {
                "owned_token": "mouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mug",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "notepad",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "paper",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "partition",
                "usage_kind": "anchor",
                "source_phrase": "with empty partition edges facing diagonally toward the camera"
              },
              {
                "owned_token": "pen",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "phone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photo board",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "printer",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "security monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall clock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "43cb6fb359c38dec",
              "owned_hash": "7d5aca1c6ee0eb4f",
              "camera_direction_hash": "cfe1c5b0c95d92ba",
              "owned_usage_hash": "4984370d06bb1cbd",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "desk",
                  "violating_phrase": "skim the edge of the desk. Across the shared desk surface",
                  "reason": "The desk is used solely as a spatial and compositional reference to position the character, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "monitor",
                  "violating_phrase": "the dark rim and faint glow of the monitor",
                  "reason": "The monitor is used in the foreground as a framing device and a light source, serving as an anchor reference as declared.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "partition",
                  "violating_phrase": "with empty partition edges facing diagonally toward the camera",
                  "reason": "The partition is mentioned in the background description to establish depth and layout, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "Scene 21 Shot 6의 경찰서 사무실 배경(exact_background) 연속성 유지 및 이전 샷의 인물 상태(fixed_elements) 보존",
        "_shot_index": 10,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Placed just beyond the computer monitor at seated eye height, the camera holds a close medium frontal upper-body frame of 수리영 as if the screen itself is staring back at her. The monitor is not the main subject; its dark rim and faint glow skim the lower foreground while her ashen face sits centered, shoulders locked and hands barely visible near the desk edge.",
            "lighting_mood": "The monitor casts a cold cyan pallor onto her face while overhead fluorescent light flattens the room into a sterile, airless blue-gray.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L13B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "blind",
              "chair",
              "copier",
              "counter",
              "desk",
              "door",
              "filing cabinet",
              "folder",
              "keyboard",
              "lamp",
              "monitor",
              "mouse",
              "mug",
              "notepad",
              "paper",
              "partition",
              "pen",
              "phone",
              "photo board",
              "photograph",
              "printer",
              "security monitor",
              "wall clock",
              "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": "sooriyoung_shocked_upper_body",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "Soo-ri-young is seated frozen at the police office desk. Her skin tone is pale and ashen, drained by the stark lighting. Her upper body posture is rigid, with her shoulders tense and locked as she faces the grim discoveries in front of her.",
                "applies_to_shots": [
                  6,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "사색이 된 수리영",
                  "Cold blue-white office fluorescence drains her skin tone",
                  "her ashen face sits centered, shoulders locked"
                ],
                "visual_inferences": [
                  "She wears ordinary, subdued modern clothing appropriate for an abrupt visit to a police station.",
                  "Her facial expression remains consistently wide-eyed and terrified across these moments."
                ],
                "creative_decisions": [
                  "The framing isolates her upper body to emphasize her psychological shock and physical paralysis upon learning the horrific truth."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_fluorescent_office_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The police station office is washed in a sterile, cold blue-gray fluorescent light. The ambient lighting flattens the surrounding room into a muted, airless blur, while casting a stark cyan or blue-white pallor over the desk area.",
                "applies_to_shots": [
                  6,
                  10,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "Cold blue-white office fluorescence",
                  "overhead fluorescent light flattens the room into a sterile, airless blue-gray",
                  "surrounding office falls into muted gray-blue blur"
                ],
                "visual_inferences": [
                  "The overall environment feels uninviting, harsh, and clinical, reflecting standard late-night or artificial lighting in a modern Korean police station."
                ],
                "creative_decisions": [
                  "Color grading heavily leans into cool cyan and blue-gray tones to visually express the chilling nature of the murder case and the character's isolation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "detective_office_desk_surface",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A standard detective's office desk serving as the physical anchor in the foreground. Its flat surface catches faint spills of cold light and provides a base for the character's interactions and mounting terror.",
                "applies_to_shots": [
                  6,
                  10,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "혜수 책상위에는...",
                  "desk-level push-in",
                  "hands barely visible near the desk edge",
                  "insert at hand height above the desk"
                ],
                "visual_inferences": [
                  "The desk is likely made of a dark laminated or metallic material typical of Korean government offices, structurally sturdy and wide."
                ],
                "creative_decisions": [
                  "The desk acts as a visual boundary, trapping the character between the horrific information presented on it and the empty office space behind her."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_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": "L13B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "e33870733ac9f557"
      },
      {
        "scene_index": 21,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "좌표 확인과 은밀한 결심",
        "representative_moment": "수리영이 책상 위 메모지에 조심스럽게 펜촉을 대며 해상 좌표를 적으려는 손",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "insert from above at hand height, cold desk light against sterile blue-gray blur",
            "t2i_prompt": "Photorealistic cinematic still. Framed from above at hand height, isolating the tense fingers of C01 in a navy windbreaker, an Asian young woman, her face entirely excluded from the frame. The hand enters from the upper right, holding the pre-existing pen angled diagonally toward the lower left. The metal tip of this pen presses lightly against the top face of the pre-existing P09 paper, which rests on the existing desk in the lower third. A narrow pool of cold desk light highlights the metal tip and the paper fibers. The surrounding police station office falls into a muted, airless blue-gray blur in the background, washed in a sterile, cold blue-white fluorescent light.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S21 action: 사색이 된 수리영, 필기도구를 찾아 좌표를 메모 한다.",
              "Shot description: 수리영이 메모지 위에 펜촉을 맞댄 손의 클로즈업",
              "shot staging: hand enters from the upper right, memo sits in the lower third, top face visible"
            ],
            "visual_inferences": [
              "fixed_element: cold_fluorescent_office_lighting (sterile, cold blue-gray fluorescent light, muted airless blur)",
              "fixed_element: detective_office_desk_surface (flat surface catching faint spills of cold light)"
            ],
            "creative_decisions": [
              "Insert scale framing isolates the tension in the fingers and the pen tip, emphasizing the secrecy and weight of the coordinates.",
              "A focused pool of light on the memo paper contrasts with the out-of-focus background to keep the viewer's attention entirely on the writing action."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "blind",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "copier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "anchor",
                "source_phrase": "the existing desk"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "filing cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "folder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "keyboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mug",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "notepad",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "paper",
                "usage_kind": "anchor",
                "source_phrase": "the pre-existing P09 paper"
              },
              {
                "owned_token": "partition",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pen",
                "usage_kind": "anchor",
                "source_phrase": "holding the pre-existing pen"
              },
              {
                "owned_token": "phone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photo board",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "printer",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "security monitor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall clock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "615252f44490ab24",
              "owned_hash": "7d5aca1c6ee0eb4f",
              "camera_direction_hash": "321a82e43663004a",
              "owned_usage_hash": "95eb575d12821dc4",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "desk",
                  "violating_phrase": "rests on the existing desk",
                  "reason": "The desk is referred to as existing and acts as a physical surface anchoring the scene, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "paper",
                  "violating_phrase": "the pre-existing P09 paper",
                  "reason": "The paper is designated as pre-existing and serves as a reference target for the pen tip, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pen",
                  "violating_phrase": "holding the pre-existing pen",
                  "reason": "The pen is explicitly described as pre-existing and held by the hand, serving as a functional object anchor, which matches the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "previous_shot_refs=exact_background",
        "_shot_index": 11,
        "visible_entities": [
          "C01",
          "P09"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera tilts down into an insert at hand height above the desk, isolating 수리영’s tense fingers as the pen tip touches the memo paper. Her face is excluded; the hand enters from the upper right, the memo sits in the lower third, and the pen point arrests on the blank surface as if the coordinates are too dangerous to write.",
            "lighting_mood": "A narrow pool of cold desk light catches the pen metal and paper fibers, while the surrounding office falls into muted gray-blue blur.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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 수리영’s hand and writing action are visible; a full outlook reference would not align with this isolated insert."
              }
            ],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L13B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "blind",
              "chair",
              "copier",
              "counter",
              "desk",
              "door",
              "filing cabinet",
              "folder",
              "keyboard",
              "lamp",
              "monitor",
              "mouse",
              "mug",
              "notepad",
              "paper",
              "partition",
              "pen",
              "phone",
              "photo board",
              "photograph",
              "printer",
              "security monitor",
              "wall clock",
              "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": "cold_fluorescent_office_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The police station office is washed in a sterile, cold blue-gray fluorescent light. The ambient lighting flattens the surrounding room into a muted, airless blur, while casting a stark cyan or blue-white pallor over the desk area.",
                "applies_to_shots": [
                  6,
                  10,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "Cold blue-white office fluorescence",
                  "overhead fluorescent light flattens the room into a sterile, airless blue-gray",
                  "surrounding office falls into muted gray-blue blur"
                ],
                "visual_inferences": [
                  "The overall environment feels uninviting, harsh, and clinical, reflecting standard late-night or artificial lighting in a modern Korean police station."
                ],
                "creative_decisions": [
                  "Color grading heavily leans into cool cyan and blue-gray tones to visually express the chilling nature of the murder case and the character's isolation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "detective_office_desk_surface",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A standard detective's office desk serving as the physical anchor in the foreground. Its flat surface catches faint spills of cold light and provides a base for the character's interactions and mounting terror.",
                "applies_to_shots": [
                  6,
                  10,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "혜수 책상위에는...",
                  "desk-level push-in",
                  "hands barely visible near the desk edge",
                  "insert at hand height above the desk"
                ],
                "visual_inferences": [
                  "The desk is likely made of a dark laminated or metallic material typical of Korean government offices, structurally sturdy and wide."
                ],
                "creative_decisions": [
                  "The desk acts as a visual boundary, trapping the character between the horrific information presented on it and the empty office space behind her."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 10,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character",
                "id": "C01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L13B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "24dc3c81ccc19b3b"
      },
      {
        "scene_index": 22,
        "heading": "S#22. 경찰서 밖 / D",
        "beat_title": "자전거에 올라타 질주를 준비하는 수리영",
        "representative_moment": "C01이 굳은 표정으로 자전거 안장에 올라앉아 먼 곳을 응시하는 전신 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide full-body frame at standing eye level, cool desaturated daylight",
            "t2i_prompt": "Photorealistic cinematic still. At standing eye level across the police station frontage, a wide full-body frame. C01O01 in a navy windbreaker, a Korean young woman in her early 20s with black hair, pale complexion, and deep-set eyes, sits on the existing bicycle. Her hands are in position to ride, and her feet rest on the pavement ready for a sudden push-off. Her expression is rigid, gazing into the distance with a held breath. Behind her, the building features an open glass door, spilling faint amber interior light that fails to soften the cool, desaturated daylight washing over the concrete.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#22 action: '주차된 자전거를 타고 이내 달리는 수리영'",
              "shot description: 경찰서 건물 앞, 수리영이 굳은 표정으로 자전거 안장에 올라앉은 전신"
            ],
            "visual_inferences": [
              "hands grip the handlebars",
              "feet resting over the pavement",
              "bicycle frame and front wheel visibly anchored to ground"
            ],
            "creative_decisions": [
              "wide full-body frame to emphasize the held breath before sudden movement",
              "contrast of cool daylight and amber interior spill to highlight emotional tension"
            ],
            "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": "bicycle",
                "usage_kind": "anchor",
                "source_phrase": "sits on the existing bicycle"
              },
              {
                "owned_token": "bicycle rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "building",
                "usage_kind": "anchor",
                "source_phrase": "the building features an open glass door"
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "an open glass door"
              },
              {
                "owned_token": "pavement",
                "usage_kind": "anchor",
                "source_phrase": "feet rest on the pavement"
              },
              {
                "owned_token": "planter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ramp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "step",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "street",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "28045d393a632986",
              "owned_hash": "097aedf9cdc0ab7a",
              "camera_direction_hash": "6dee2b2fd97f0810",
              "owned_usage_hash": "940921c74898b656",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bicycle",
                  "violating_phrase": "sits on the existing bicycle",
                  "reason": "The prompt refers to the character sitting on the existing bicycle to anchor her pose without redrawing or altering the object, matching the producer's 'anchor' declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "building",
                  "violating_phrase": "the building features an open glass door",
                  "reason": "The building is mentioned as background context to establish the setting and lighting, aligning with the producer's 'anchor' declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "an open glass door",
                  "reason": "The door is referenced only to describe light spilling from the background, serving as a background anchor in line with the 'anchor' declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pavement",
                  "violating_phrase": "feet rest on the pavement",
                  "reason": "The pavement is used solely as a spatial reference point for the character's feet, confirming the producer's 'anchor' declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "L14"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 22,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At standing eye level across the police station frontage, the camera holds a slightly wide full-body frame about seven meters from 수리영 on the parked bicycle. She is centered-left on the saddle with the station entrance behind her, the bicycle angled slightly toward the road so the static frame feels like a held breath before the push-off.",
            "lighting_mood": "Cool daylight is desaturated against the station concrete, with a faint amber interior spill behind the doors unable to soften her rigid expression.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L14"
            ],
            "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": "L14B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "bicycle",
              "bicycle rack",
              "bollard",
              "building",
              "curb",
              "door",
              "pavement",
              "planter",
              "ramp",
              "sign",
              "step",
              "street",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L14B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "981a91ca3547da60"
      },
      {
        "scene_index": 23,
        "heading": "S#23. 어느 PC방 / 실내",
        "beat_title": "PC방에서 좌표 검색",
        "representative_moment": "C01이 PC방 모니터 화면을 뚫어지게 응시하며 앉아있는 상체 샷",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "seated eye-level medium shot across the desk, cold cyan and stale fluorescent lighting",
            "t2i_prompt": "Photorealistic cinematic still. In a seated eye-level composition across the desk, C01O01 in a navy windbreaker, a Korean young woman in her early 20s with black hair, pale skin, and deep eyes, is hunched at the computer facing the camera. She is centered in the frame, upper body visible, her deep eyes looking directly at the camera toward the unseen monitor. Cold cyan monitor glow bleeds along the lower foreground desk edge, illuminating her face and contrasting with stale fluorescent white light from above. Behind her lies [L15: a lit PC room interior, computer booths and partition sides receding diagonally into the background, harsh overhead light panels casting pale rectangular reflections].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#23 action: 모니터 화면에 앉아있는 수리영",
              "shot description: 실내 불빛이 켜진 PC방 안, 수리영이 모니터 화면을 뚫어지게 응시한 채 앉아있는 상체"
            ],
            "visual_inferences": [
              "C01 is hunched at the desk, facing the camera to capture her intense stare.",
              "Cold cyan monitor light mixed with stale fluorescent room light reflects off her face.",
              "Background shows repetitive PC booths receding into depth."
            ],
            "creative_decisions": [
              "Medium framing keeps her upper body centered while capturing the environmental depth of the PC room.",
              "Lighting emphasizes the cold, uneasy mood of her intense search."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c2cb18f1d492cd82",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "ea137c37268af46a",
              "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": [
          "C01",
          "L15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 23,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the lit PC room, the camera sits at seated eye level about two meters across the desk from 수리영, holding steady on her upper body as she stares past the lens toward the monitor area. The composition keeps her in the center with monitor glow bleeding along the lower foreground and rows of computers receding behind her, emphasizing concentration before the later inward move.",
            "lighting_mood": "Bright but uneasy PC-room lighting mixes cold monitor cyan with stale fluorescent white, stripping warmth from her fixed stare.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "L15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "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": "c09cf106a1cca547"
      },
      {
        "scene_index": 24,
        "heading": "S#24. 해안가 / 소나기",
        "beat_title": "폭우 속을 질주하는 결연한 의지",
        "representative_moment": "쏟아지는 폭우 속에서 자전거 페달을 거칠게 밟으며 굳은 표정으로 질주하는 C01.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight side-tracking close framing at upper-torso height, storm-dark blue daylight",
            "t2i_prompt": "Photorealistic cinematic still. Observed from a tight side-tracking position at upper-torso height, C01O01 in a navy windbreaker, a Korean woman in her 20s, in left profile, leaning over the handlebars, eyes fixed off-screen. Her pale face and deep-set eyes are resolute, wet black hair blown backward across the right side of the image in the direction opposite to her forward motion. She is seated in mid-pedal, the downward stroke and her foot caught at the lower frame edge, hands gripping the handlebar, the bicycle frame and wet metal visible below her. The scene is set against [: a motion-blurred dark coastal road edge streaking laterally], illuminated by storm-dark blue daylight sliced by heavy driving diagonal rain, with cold rain highlights and muted silver flashes catching on her wet cheek and the bicycle.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#24 action: '자전거를 타고 빗속을 달리는 수리영'",
              "shot description: 세찬 비바람에 젖은 머리카락이 뒤로 흩날리는 가운데, 자전거 페달을 힘껏 밟아 누르는 mid-stroke 순간 수리영의 굳은 옆얼굴"
            ],
            "visual_inferences": [
              "fixed_element pose: profile_left, leaning over handlebars, gaze=off_screen",
              "motion blur effect on the lateral background to convey high speed",
              "rain-slick textures on skin and bicycle reflecting storm-dark lighting"
            ],
            "creative_decisions": [
              "Tight side-tracking close framing to emphasize her rain-lashed profile while barely catching the pedal action at the frame edge",
              "Use of heavy diagonal rain and cold silver highlights to contrast the dark blue storm ambiance"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "71b52b87d568f1f3",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9570978b7c3fc1dc",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 9,
        "dependency_reason": "앞선 씬의 해안가 도로(S9)와 동일한 위치적 맥락 유지",
        "_shot_index": 2,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 24,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "In a tight side-tracking position less than a meter from the bicycle, the camera runs alongside 수리영 at upper-torso height, favoring her rain-lashed profile while the lower edge catches the pedal at the downward mid-stroke. The frame stays compressed and handheld-feeling, with her wet hair blown backward across the right side of the image and the road streaking laterally behind her.",
            "lighting_mood": "Storm-dark blue daylight is sliced by cold rain highlights, with occasional muted silver flashes on her cheek and bicycle metal.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": [],
            "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_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": "e87df62d6e85247d"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "붉은 표식과 사진의 발견",
        "representative_moment": "열린 방문 틈으로 어지럽혀진 방 안쪽 벽면의 붉은 원형 표식을 엿보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Shoulder-height voyeuristic dolly shot through a narrow doorway gap with L05 background.",
            "t2i_prompt": "Photorealistic cinematic still. Through the partially open bedroom door gap in the middle-center foreground, P01, a rough red circle on the bedroom wall, sits in the middle-center background. The rough red wall mark features uneven hand-painted edges and a dull red color. Pinned at its center is a small photograph, showing visible paper grain and slight warping. The dark doorframe masks both sides of the image, narrowing the view into the disturbed room. Scattered belongings and displaced furniture fill the dim interior behind the threshold. Dusk-blue ambient light leaks into the space, keeping the room cool and damp, while the dull red mark catches a muted ritual color, remaining visually separate from the deep blue shadows.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 3: 열린 방문 틈 사이로, 방 안쪽 벽면에 붉은 원이 거칠게 그려져 있는 구도",
              "Scene text: 집안에서 뭔가를 찾기 위해 가재도구를 온통 헤집은 것으로 보인다.",
              "Scene text: 벽에 또 붉은 원이 그려져있다. 그 가운데 꽂혀있는 피묻은 사진 한 장."
            ],
            "visual_inferences": [
              "fixed_element mark_alpha: uneven hand-painted edges and dull red color, physically painted on the wall",
              "fixed_element object_beta: an aged black-and-white photograph prop pinned at the center",
              "fixed_element space_gamma: rooftop room interior remains visibly disturbed with scattered items",
              "fixed_element light_delta: dusk-blue ambient light fills the room, making the red mark look dull and bruised"
            ],
            "creative_decisions": [
              "Used the doorframe on both sides of the frame to create a narrow, voyeuristic slit, emphasizing the feeling of discovering a contaminated room.",
              "Kept the photograph small relative to the frame to match the 'discovered before anything pinned at its center can dominate' instruction."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coat rack",
                "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": "cushion",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "partially open bedroom door gap"
              },
              {
                "owned_token": "footprint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "anchor",
                "source_phrase": "small photograph"
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "television",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tray",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall mark",
                "usage_kind": "anchor",
                "source_phrase": "rough red wall mark"
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "bb49ee4d8298b91e",
              "owned_hash": "0658a4a8af6cf151",
              "camera_direction_hash": "eeb749227e452618",
              "owned_usage_hash": "7fa49a2af8a4ee75",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "partially open bedroom door gap",
                  "reason": "The door is used as a foreground framing element and spatial anchor to establish the camera's perspective, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall mark",
                  "violating_phrase": "rough red wall mark",
                  "reason": "The wall mark is mentioned as the location of P01 and described using adjectives like 'uneven hand-painted edges', which serves as an anchor reference to focus on P01.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "photograph",
                  "violating_phrase": "small photograph, showing visible paper grain and slight warping",
                  "reason": "The photograph is described in terms of its texture and state as a background element pinned to the wall mark, serving as an anchor reference with no intent to redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "동일한 공간인 옥탑방 내부(L05)를 이전 씬(S12_Shot14)과 일관성 있게 유지하면서 현재의 어지럽혀진 상태를 묘사하기 위함.",
        "_shot_index": 3,
        "visible_entities": [
          "P01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From shoulder height just outside the partially open bedroom door, the camera dollies inward through the narrow gap so the doorframe masks both sides of the image. The rough red circle sits in the middle background on the inner wall, discovered before anything pinned at its center can dominate; the composition feels like spying into a contaminated room.",
            "lighting_mood": "Dusk-blue ambient light leaks through the room while the red wall mark catches a dead, muted ritual color against damp shadow.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "partially open bedroom door gap",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "rough red circle 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": [
              "P01",
              "L05"
            ],
            "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": "L05B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bed",
              "chair",
              "coat rack",
              "cooktop",
              "counter",
              "curtain",
              "cushion",
              "door",
              "footprint",
              "photograph",
              "refrigerator",
              "shelf",
              "shoe cabinet",
              "sink",
              "smartphone",
              "sofa",
              "table",
              "television",
              "tray",
              "wall mark",
              "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,
                  7
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Keep the mark visually legible in both a doorway discovery composition and a wider bedroom composition without turning it into a glowing supernatural effect."
                ],
                "description": "A rough red circle is painted on the inner bedroom wall, remaining on the same wall area across the room views. The circle has uneven hand-painted edges and a dull red color, reading as a physical wall mark rather than light or energy. It should remain visually separate from the blue dusk shadows around it.",
                "element_id": "mark_alpha",
                "element_scope": "close",
                "element_type": "environment_state",
                "source_facts": [
                  "Scene text: \"벽에 또 붉은 원이 그려져있다.\"",
                  "Shot 3: \"방 안쪽 벽면에 붉은 원이 거칠게 그려져 있는 구도.\"",
                  "Shot 3 camera: \"The rough red circle sits in the middle background on the inner wall.\"",
                  "Shot 7 camera/lighting: \"the red-marked wall\" and \"the red circle dull and bruised against the wall.\""
                ],
                "visual_inferences": [
                  "The red circle should keep the same wall placement and painted texture between the doorway view and the later wide bedroom view."
                ]
              },
              {
                "applies_to_shots": [
                  3,
                  6
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Treat the insert as a physical aged photograph prop, not as a transition into a living flashback scene."
                ],
                "description": "An aged black-and-white photograph prop keeps the same printed image and worn paper surface whenever it appears. The paper shows visible photographic grain, scratches, and slight warping, with red stage-paint staining associated with the clue. The printed image shows a 1970s–1980s-looking rural restaurant with a circular roof sign like a cross, and two Korean girls about twelve years old seated in front facing the camera.",
                "element_id": "object_beta",
                "element_scope": "close",
                "element_type": "persistent_prop",
                "source_facts": [
                  "Scene text: \"그 가운데 꽂혀있는 붉은 물감이 묻은 사진 한 장.\"",
                  "Scene text: \"7-80년대 쯤 보이는 시골 식당과 지붕위에 둥근 원이 설치된 (마치 십자가처럼) 식당 앞에는 어린 여자애 둘(12살)이 앉아있다.\"",
                  "Shot 3 camera: \"before anything pinned at its center can dominate.\"",
                  "Shot 6 description: \"낡은 흑백 사진 속, 지붕에 둥근 원 표식이 있는 식당 건물 앞에 한국인 어린 여자아이 둘이 앉아있는 이미지 클로즈업.\"",
                  "Shot 6 camera: \"paper grain, scratches, and slight warping remind us this is a physical photograph.\""
                ],
                "visual_inferences": [
                  "The pinned object glimpsed at the wall mark and the macro insert are the same physical photograph prop."
                ]
              },
              {
                "applies_to_shots": [
                  3,
                  7
                ],
                "character_name": "",
                "confidence": "medium",
                "creative_decisions": [
                  "Allow clutter to frame the character and wall mark without adding new story-specific objects not mentioned in the text."
                ],
                "description": "The rooftop room interior remains visibly disturbed, with household belongings displaced rather than neatly arranged. The room should feel recently searched through, with scattered items and an unsettled layout surrounding the wall mark. This disorder stays consistent between the doorway view and the later wide bedroom view.",
                "element_id": "space_gamma",
                "element_scope": "full",
                "element_type": "environment_state",
                "source_facts": [
                  "Scene text: \"집안에서 뭔가를 찾기 위해 가재도구를 온통 헤집은 것으로 보인다.\"",
                  "Shot 3 camera: \"the composition feels like spying into a disturbed room.\"",
                  "Shot 7 camera: \"small against the disturbed room\" and \"scattered belongings allowed to breathe around her stunned stillness.\""
                ],
                "visual_inferences": [
                  "The disorder visible in the bedroom view is part of the same broader ransacked rooftop-room condition described in the scene text."
                ]
              },
              {
                "applies_to_shots": [
                  3,
                  7
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Maintain a muted dusk atmosphere rather than bright interior illumination."
                ],
                "description": "Blue dusk ambient light fills the room in both views, keeping the interior cool and dim. The red wall mark remains muted under this light, with no strong glow or saturated theatrical spotlight. A faint warm residue may exist off-frame, but the dominant room tone is dusk-blue shadow.",
                "element_id": "light_delta",
                "element_scope": "full",
                "element_type": "environment_state",
                "source_facts": [
                  "Scene heading: \"해질 무렵.\"",
                  "Shot 3 lighting: \"Dusk-blue ambient light leaks through the room.\"",
                  "Shot 7 lighting: \"Blue dusk seeps through the room with a weak amber residue from outside the frame.\""
                ],
                "visual_inferences": [
                  "The same late-day exterior light source should visually connect the doorway shot and the later bedroom-wide shot."
                ]
              }
            ],
            "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": "L05B04",
                "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": "c76e606a2834db19"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "벽에 꽂힌 피 묻은 과거 사진 발견",
        "representative_moment": "Extreme macro view of the physical photograph P02, revealing a weathered rural restaurant and two young girls inside the printed image.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "extreme macro insert shot with flat lighting",
            "t2i_prompt": "Photorealistic cinematic still. Extreme macro view directly in front of the existing old black-and-white photograph P02, focusing closely on its surface. The camera isolates the pre-existing printed contents of the photograph P02. On the worn physical surface of the photograph P02, the pre-existing red bloodstain is captured in sharp close-up focus alongside the pre-existing paper scratches and slight warping. Flat macro light reveals a faint cold sheen across the surface of the existing print P02.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene text: \"그 가운데 꽂혀있는 피묻은 사진 한 장!\"",
              "Shot 6 description: \"낡은 흑백 사진 속, 지붕에 둥근 원 표식이 있는 식당 건물 앞에 한국인 어린 여자아이 둘이 앉아있는 이미지 클로즈업.\""
            ],
            "visual_inferences": [
              "fixed_element object_beta: The printed image shows a rural restaurant, a circular roof sign, and two Korean girls seated facing the camera.",
              "The girls inside the photo are depicted using generic descriptors as dictated by the reproduction surface rule, avoiding entity IDs."
            ],
            "creative_decisions": [
              "Use extreme macro framing to emphasize the physical paper texture, scratches, and grain.",
              "Ensure the bloodstain and wear of the photograph remind the viewer it is an evidence prop rather than a living flashback."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "prop"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bloodstain",
                "usage_kind": "anchor",
                "source_phrase": "the pre-existing red bloodstain"
              },
              {
                "owned_token": "circle mark",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "footprint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mattress",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "anchor",
                "source_phrase": "the existing old black-and-white photograph P02"
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6755f37af4051194",
              "owned_hash": "17a1e21edb9df0a9",
              "camera_direction_hash": "46fd6efd1ca497ed",
              "owned_usage_hash": "d63cf627dfad70a3",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "photograph",
                  "violating_phrase": "the existing old black-and-white photograph P02",
                  "reason": "The prompt treats the photograph as a pre-existing object to position the camera in front of, which is a valid anchor reference that matches the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bloodstain",
                  "violating_phrase": "the pre-existing red bloodstain",
                  "reason": "The prompt explicitly notes the bloodstain is pre-existing and merely focuses the camera on its texture, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "Location reference from the prior shot, maintaining continuity of the discovered photograph.",
        "_shot_index": 6,
        "visible_entities": [
          "P02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A hard cut lands on an extreme macro view directly in front of the old black-and-white photograph, isolating the printed contents as an investigative insert. The rural restaurant sits in the upper half with the circular roof sign visible, while two young girls are seated low in the frame; paper grain, scratches, and slight warping remind us this is a physical photograph, not a living scene.",
            "lighting_mood": "Flat macro light reveals silver-black photographic grain with a faint cold sheen, while the circular roof mark reads as a subdued omen rather than a supernatural effect.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": [
              "P02"
            ],
            "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": "L05B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bed",
              "bloodstain",
              "circle mark",
              "floor",
              "footprint",
              "mattress",
              "photograph",
              "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": [
              {
                "applies_to_shots": [
                  3,
                  6
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Treat the insert as a physical aged photograph prop, not as a transition into a living flashback scene."
                ],
                "description": "An aged black-and-white photograph prop keeps the same printed image and worn paper surface whenever it appears. The paper shows visible photographic grain, scratches, and slight warping, with red stage-paint staining associated with the clue. The printed image shows a 1970s–1980s-looking rural restaurant with a circular roof sign like a cross, and two Korean girls about twelve years old seated in front facing the camera.",
                "element_id": "object_beta",
                "element_scope": "close",
                "element_type": "persistent_prop",
                "source_facts": [
                  "Scene text: \"그 가운데 꽂혀있는 붉은 물감이 묻은 사진 한 장.\"",
                  "Scene text: \"7-80년대 쯤 보이는 시골 식당과 지붕위에 둥근 원이 설치된 (마치 십자가처럼) 식당 앞에는 어린 여자애 둘(12살)이 앉아있다.\"",
                  "Shot 3 camera: \"before anything pinned at its center can dominate.\"",
                  "Shot 6 description: \"낡은 흑백 사진 속, 지붕에 둥근 원 표식이 있는 식당 건물 앞에 한국인 어린 여자아이 둘이 앉아있는 이미지 클로즈업.\"",
                  "Shot 6 camera: \"paper grain, scratches, and slight warping remind us this is a physical photograph.\""
                ],
                "visual_inferences": [
                  "The pinned object glimpsed at the wall mark and the macro insert are the same physical photograph prop."
                ]
              }
            ],
            "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": "background",
                "id": "L05B02",
                "policy": "required"
              },
              {
                "kind": "prop",
                "id": "P02",
                "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": 25,
                "shot_indices": [
                  6
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P02",
                  "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": "c030dfa4e47e05f0"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "충격에 빠진 수리영",
        "representative_moment": "C01이 엉망이 된 방 안에서 붉은 표식이 그려진 벽을 등지고 침대 가장자리에 주저앉아 넋을 잃고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low chest-height wide composition with cool blue dusk ambient lighting",
            "t2i_prompt": "Photorealistic cinematic still. Captured at low chest height, the wide composition shows the sitting figure fully visible from head to foot, the floor stretching below her shoes. C01O01 in a navy windbreaker, a Korean woman in her early 20s with black hair, pale complexion, and deep-set eyes, sits full-body on the edge of the bed in the midground. She is positioned at a three-quarter angle from the right, her posture slumped on the rumpled mattress, gazing into the distance with stunned stillness. The rooftop room interior remains visibly disturbed, with scattered belongings and an unsettled layout surrounding her. On the inner wall behind and beside her, the rough red circle remains visible as a physical wall mark, its uneven edges and dull red color visually separate from the shadows. Blue dusk ambient light fills the room, keeping the space cool and dim, with a weak amber residue catching the shadowed open door.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Scene text: \"침대에 털썩 주저앉는 수리영. 연속해서 벌어지는 기이한 상황에 정신이 혼미한 엉망이 된 집 안을 한번 획 둘러보는 수리영\"",
              "Shot 7 description: 충격에 빠져 침대 가장자리에 주저앉은 채 넋이 나간 수리영의 전신",
              "Shot 7 camera: Inside the bedroom near the foot of the bed, the camera settles from the dolly-out into a low chest-height wide composition, slightly diagonal to 수리영. She sits full-body on the bed edge in the midground, small against the disturbed room.",
              "Shot 7 lighting: Blue dusk seeps through the room with a weak amber residue from outside the frame."
            ],
            "visual_inferences": [
              "fixed_element mark_alpha: The rough red circle has uneven hand-painted edges and a dull red color, remaining visually separate from the blue dusk shadows.",
              "fixed_element space_gamma: The rooftop room interior remains visibly disturbed with scattered items and an unsettled layout.",
              "fixed_element light_delta: Blue dusk ambient light fills the room, keeping the interior cool and dim."
            ],
            "creative_decisions": [
              "Applied a wide chest-height framing to capture the full seated figure while exposing the floor beneath her shoes, geometrically grounding the low camera angle.",
              "Anchored the character to the rumpled bed edge to emphasize her emotional collapse and weight.",
              "Maintained the exact background elements and mood (blue dusk, disturbed room, red mark) to ensure continuity with the prior shot."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bed",
                "usage_kind": "anchor",
                "source_phrase": "the edge of the bed"
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coat rack",
                "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": "cushion",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "open door"
              },
              {
                "owned_token": "footprint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "television",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tray",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall mark",
                "usage_kind": "anchor",
                "source_phrase": "a physical wall mark"
              },
              {
                "owned_token": "wardrobe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "cc91ecc94cf86008",
              "owned_hash": "0658a4a8af6cf151",
              "camera_direction_hash": "ac84850829ede3bb",
              "owned_usage_hash": "847d1b510e7b7089",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bed",
                  "violating_phrase": "sits full-body on the edge of the bed",
                  "reason": "The character sits on the edge of the bed, which serves as a spatial anchor for her position, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "the shadowed open door",
                  "reason": "The door is mentioned only in relation to ambient light catching it, functioning as an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall mark",
                  "violating_phrase": "the rough red circle remains visible as a physical wall mark",
                  "reason": "The pre-existing wall mark is described as remaining visible on the inner wall, acting as a background anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 18,
        "dependency_reason": "같은 옥탑방 공간의 배경 일관성 유지 (L05B04 사용)",
        "_shot_index": 7,
        "visible_entities": [
          "C01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the bedroom near the foot of the bed, the camera settles from the dolly-out into a low chest-height wide composition, slightly diagonal to 수리영. She sits full-body on the bed edge in the midground, small against the disturbed room, with the red-marked wall and scattered belongings allowed to breathe around her stunned stillness.",
            "lighting_mood": "Blue dusk seeps through the room with a weak amber residue from outside the frame, leaving the red circle dull and bruised against the wall.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "L05"
            ],
            "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": "L05B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bed",
              "chair",
              "coat rack",
              "cooktop",
              "counter",
              "curtain",
              "cushion",
              "door",
              "footprint",
              "photograph",
              "refrigerator",
              "shelf",
              "shoe cabinet",
              "sink",
              "smartphone",
              "sofa",
              "table",
              "television",
              "tray",
              "wall mark",
              "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,
                  7
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Keep the mark visually legible in both a doorway discovery composition and a wider bedroom composition without turning it into a glowing supernatural effect."
                ],
                "description": "A rough red circle is painted on the inner bedroom wall, remaining on the same wall area across the room views. The circle has uneven hand-painted edges and a dull red color, reading as a physical wall mark rather than light or energy. It should remain visually separate from the blue dusk shadows around it.",
                "element_id": "mark_alpha",
                "element_scope": "close",
                "element_type": "environment_state",
                "source_facts": [
                  "Scene text: \"벽에 또 붉은 원이 그려져있다.\"",
                  "Shot 3: \"방 안쪽 벽면에 붉은 원이 거칠게 그려져 있는 구도.\"",
                  "Shot 3 camera: \"The rough red circle sits in the middle background on the inner wall.\"",
                  "Shot 7 camera/lighting: \"the red-marked wall\" and \"the red circle dull and bruised against the wall.\""
                ],
                "visual_inferences": [
                  "The red circle should keep the same wall placement and painted texture between the doorway view and the later wide bedroom view."
                ]
              },
              {
                "applies_to_shots": [
                  3,
                  7
                ],
                "character_name": "",
                "confidence": "medium",
                "creative_decisions": [
                  "Allow clutter to frame the character and wall mark without adding new story-specific objects not mentioned in the text."
                ],
                "description": "The rooftop room interior remains visibly disturbed, with household belongings displaced rather than neatly arranged. The room should feel recently searched through, with scattered items and an unsettled layout surrounding the wall mark. This disorder stays consistent between the doorway view and the later wide bedroom view.",
                "element_id": "space_gamma",
                "element_scope": "full",
                "element_type": "environment_state",
                "source_facts": [
                  "Scene text: \"집안에서 뭔가를 찾기 위해 가재도구를 온통 헤집은 것으로 보인다.\"",
                  "Shot 3 camera: \"the composition feels like spying into a disturbed room.\"",
                  "Shot 7 camera: \"small against the disturbed room\" and \"scattered belongings allowed to breathe around her stunned stillness.\""
                ],
                "visual_inferences": [
                  "The disorder visible in the bedroom view is part of the same broader ransacked rooftop-room condition described in the scene text."
                ]
              },
              {
                "applies_to_shots": [
                  3,
                  7
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Maintain a muted dusk atmosphere rather than bright interior illumination."
                ],
                "description": "Blue dusk ambient light fills the room in both views, keeping the interior cool and dim. The red wall mark remains muted under this light, with no strong glow or saturated theatrical spotlight. A faint warm residue may exist off-frame, but the dominant room tone is dusk-blue shadow.",
                "element_id": "light_delta",
                "element_scope": "full",
                "element_type": "environment_state",
                "source_facts": [
                  "Scene heading: \"해질 무렵.\"",
                  "Shot 3 lighting: \"Dusk-blue ambient light leaks through the room.\"",
                  "Shot 7 lighting: \"Blue dusk seeps through the room with a weak amber residue from outside the frame.\""
                ],
                "visual_inferences": [
                  "The same late-day exterior light source should visually connect the doorway shot and the later bedroom-wide shot."
                ]
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 18,
                "shot_index": 9,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L05B04",
                "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": "92aac8427565a5b5"
      },
      {
        "scene_index": 26,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "지친 수리영과 안개 낀 빈 포구",
        "representative_moment": "짙은 안개와 푸르스름한 해질녘 조명 속, 비에 젖어 지친 수리영(C01)이 갯바위에 앉아 텅 빈 바다를 등지고 앉아 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A wide low angle highlighting negative space with a cold blue-gray post-storm dusk color palette",
            "t2i_prompt": "Photorealistic cinematic still. A wide low camera from the wet harbor edge captures an empty harbor quay receding from the lower left toward the foggy background. C01O01 in a navy windbreaker, a young Korean woman in her early 20s, appears small in the lower right-midground, with back to camera, slumped on the slick dark harbor rocks. She exhibits a visibly damp and slightly disheveled appearance following a heavy rain shower, moisture lingering on her dark hair and clothing as she sits in deep exhaustion, gazing into the distance across the flat, obscured water. A dense, heavy sea fog completely blankets the environment during dusk. The ambient lighting is a diffused, cold blue-gray that flattens the fog-covered sea into a blank, damp expanse, muting all distant details with almost no warm light. Faint highlights catch on the wet rocks against the cold suspended silence, the vast negative space of the foggy port overwhelming the figure.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "비는 그치고 안개가 자욱하다.",
              "텅 빈 포구. 안개로 인해 배는 보이지 않고.",
              "갯바위에 앉아있는 수리영."
            ],
            "visual_inferences": [
              "post_storm_thick_fog element: cold blue-gray ambient flattening the background",
              "suriyoung_exhausted_damp_state element: damp and slightly disheveled appearance, moisture lingering on hair"
            ],
            "creative_decisions": [
              "Used a wide low camera angle to emphasize the vast negative space of the fog, making the character appear small and isolated in the lower right-midground.",
              "Applied a muted cold blue-gray palette to reflect the damp, post-storm suspended silence without warm light."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e59ae59f650da4fa",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "a09a9d41867c8692",
              "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": [
          "C01",
          "L16"
        ],
        "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": "A wide low camera holds from the wet harbor edge, roughly twenty-five meters from the rocks, facing the fog-covered sea with the empty port spread across the frame. 수리영 appears small in the lower right-midground, slumped on the rocks and looking out into the blank water, while the harbor’s negative space overwhelms her before any movement toward the boat begins.",
            "lighting_mood": "Post-storm blue-gray dusk is diffused by fog, with damp rock highlights and almost no warm light, creating a cold suspended silence.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "L16"
            ],
            "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": "post_storm_thick_fog",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, heavy sea fog completely blankets the environment during dusk. The ambient lighting is a diffused, cold blue-gray that flattens the background into a blank, damp expanse, muting all distant details.",
                "applies_to_shots": [
                  1,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "비는 그치고 안개가 자욱하다.",
                  "Post-storm blue-gray dusk is diffused by fog",
                  "Cold blue dusk and sea fog flatten the background"
                ],
                "visual_inferences": [
                  "The heavy fog obscures the horizon completely, blending the sea and sky into a uniform cold tone.",
                  "The overall environment feels highly humid and damp."
                ],
                "creative_decisions": [
                  "Enhancing the blue-gray tint to visually emphasize the isolation and cold atmosphere of the empty harbor."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suriyoung_exhausted_damp_state",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "The young woman exhibits a visibly damp and slightly disheveled appearance following a heavy rain shower, with moisture lingering on her hair and clothing. Her expression and overall demeanor consistently convey deep exhaustion, while her distant gaze remains fixed toward the foggy sea.",
                "applies_to_shots": [
                  1,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "소나기가 한차례 퍼 붓는가 싶더니",
                  "포구를 몇 시간째 돌아다니다 지친",
                  "gaze=distant",
                  "giving her face a tired, human warmth"
                ],
                "visual_inferences": [
                  "Her clothing and hair show clear signs of being wet from the recent storm.",
                  "Her physical presence lacks energy due to prolonged wandering, carrying a persistent sense of fatigue."
                ],
                "creative_decisions": [
                  "Applying a subtle damp sheen to her hair and face to ground her firmly in the post-rain weather conditions without specifying a single frozen posture."
                ],
                "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": "13bca8477ddfce72"
      },
      {
        "scene_index": 26,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "안개 낀 바다를 향해 음성 메시지를 남기는 수리영",
        "representative_moment": "짙은 안개가 깔린 배 위에서 C01이 P03을 입가에 댄 채 먼 바다를 바라보며 음성 메시지를 남긴다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium upper-body observer view from chest height with a slight upward angle, cold blue-gray dusk with a muted amber reflection",
            "t2i_prompt": "Photorealistic cinematic still. An upper-body observer view at chest height with a slight upward angle. C01O01 in a navy windbreaker, an Asian young woman in her early 20s, framed just left of center at a three-quarter angle from the right. Her black hair, pale face, and deep eyes exhibit a visibly damp and slightly disheveled appearance, moisture lingering on her hair and clothing. Her expression conveys deep exhaustion. P03, a smartphone, is held raised close to her mouth in the lower-right of her face line. She is gazing into the distance past the camera-right edge. A dense, heavy sea fog completely blankets the background during dusk, hanging behind her shoulder and swallowing the horizon into a diffused, cold blue-gray damp expanse. A faint muted amber reflection from the dark, scuffed wooden boat deck below casts a tired, human warmth on her face. A slick wet bow rail runs diagonally away toward the foggy sea on the side.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영, 떠나기전, 바다를 바라보며 음성메시지를 남긴다.",
              "gaze=distant, state=alive, three_quarter_right, phone near mouth",
              "비는 그치고 안개가 자욱하다."
            ],
            "visual_inferences": [
              "fixed_element suriyoung_exhausted_damp_state: visibly damp and slightly disheveled, deep exhaustion",
              "fixed_element post_storm_thick_fog: heavy sea fog, cold blue-gray ambient lighting",
              "wooden boat deck reflects faint amber light onto her face"
            ],
            "creative_decisions": [
              "Placed C01 slightly off-center to allow the fog and boat rail to establish the depth of the sea",
              "Contrasted the cold blue fog with a warm amber reflection to highlight the character's tired face"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8ac2b093133dd94c",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "525ec3a3e21271f0",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 26,
        "dependency_reason": "같은 공간(포구)의 시간적/환경적(안개, 해질녘) 연속성 유지",
        "_shot_index": 10,
        "visible_entities": [
          "C01",
          "P03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the boat deck near the bow, the camera holds at chest height about 1.5 meters from 수리영, tightened into an upper-body observer view with a slight upward angle so the foggy sea hangs behind her shoulder. 수리영 sits/stands framed just left of center, her smartphone raised close to her mouth in the lower-right of her face line, while her gaze travels past camera-right into the blank fog rather than toward us.",
            "lighting_mood": "Cold blue dusk and sea fog flatten the background, with only a faint muted amber reflection from the deck giving her face a tired, human 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": [
              "C01",
              "P03"
            ],
            "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": "post_storm_thick_fog",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, heavy sea fog completely blankets the environment during dusk. The ambient lighting is a diffused, cold blue-gray that flattens the background into a blank, damp expanse, muting all distant details.",
                "applies_to_shots": [
                  1,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "비는 그치고 안개가 자욱하다.",
                  "Post-storm blue-gray dusk is diffused by fog",
                  "Cold blue dusk and sea fog flatten the background"
                ],
                "visual_inferences": [
                  "The heavy fog obscures the horizon completely, blending the sea and sky into a uniform cold tone.",
                  "The overall environment feels highly humid and damp."
                ],
                "creative_decisions": [
                  "Enhancing the blue-gray tint to visually emphasize the isolation and cold atmosphere of the empty harbor."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suriyoung_exhausted_damp_state",
                "element_type": "character_state",
                "character_name": "수리영",
                "description": "The young woman exhibits a visibly damp and slightly disheveled appearance following a heavy rain shower, with moisture lingering on her hair and clothing. Her expression and overall demeanor consistently convey deep exhaustion, while her distant gaze remains fixed toward the foggy sea.",
                "applies_to_shots": [
                  1,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "소나기가 한차례 퍼 붓는가 싶더니",
                  "포구를 몇 시간째 돌아다니다 지친",
                  "gaze=distant",
                  "giving her face a tired, human warmth"
                ],
                "visual_inferences": [
                  "Her clothing and hair show clear signs of being wet from the recent storm.",
                  "Her physical presence lacks energy due to prolonged wandering, carrying a persistent sense of fatigue."
                ],
                "creative_decisions": [
                  "Applying a subtle damp sheen to her hair and face to ground her firmly in the post-rain weather conditions without specifying a single frozen posture."
                ],
                "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": "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": "c2fa92258a1f4004"
      },
      {
        "scene_index": 27,
        "heading": "S#27. 옥탑방 안 / 해질 무렵",
        "beat_title": "수리영의 녹음메시지를 확인하고 불안해하는 혜수",
        "representative_moment": "혜수가 스마트폰을 귀에 댄 채 심각한 표정으로 서 있는 전신",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide eye-level observer view, cold blue-grey dusk lighting, low-contrast half-shadow",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from an eye-level observer position, capturing a wide room, the figure's shoes resting on the floor in the lower frame and her head extending toward the upper frame. C02O02 in a dark leather jacket, an Asian middle-aged woman, stands slightly right of center at a three-quarter left angle. She is seen with the smartphone P03 held to her ear, gazing into the distance with a tense expression. The rooftop room living area is enveloped in a cold, blue-grey dusk with a complete absence of warm artificial light. The empty floor and an unlit sofa surround her in dim, low-contrast shadows. A closed, smeared window in the background faintly glows with the blue twilight. The surrounding negative space isolates the figure in a cold half-shadow.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#27 action: '수리영의 녹음메시지를 확인하는 혜수'",
              "shot description: 혜수가 스마트폰을 귀에 댄 채 심각한 표정으로 서 있는 전신",
              "Blue-grey dusk leaks through the room while practical warmth is nearly absent"
            ],
            "visual_inferences": [
              "fixed_element rooftop_room_environment: empty floor and dusk-dark furniture",
              "C02 holds P03 (smartphone) to her ear",
              "cold evening tint accentuates the bleakness of the room"
            ],
            "creative_decisions": [
              "wide framing with negative space to amplify isolation and anxiety",
              "eye-level observer angle to place her full body in the cold environment"
            ],
            "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": "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": "coat rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor cushion",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "framed photo",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "anchor",
                "source_phrase": "with the smartphone P03 held to her ear"
              },
              {
                "owned_token": "sofa",
                "usage_kind": "anchor",
                "source_phrase": "an unlit sofa surround her"
              },
              {
                "owned_token": "tea tray",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "A closed, smeared window in the background"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "025769d48f965158",
              "owned_hash": "a43e0eea328f8a22",
              "camera_direction_hash": "3f5a0b4db3b162da",
              "owned_usage_hash": "96f8bce19cb07f80",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "smartphone",
                  "violating_phrase": "with the smartphone P03 held to her ear",
                  "reason": "The smartphone is referenced as an anchor to define the character's pose, matching the producer's declaration of anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sofa",
                  "violating_phrase": "an unlit sofa surround her",
                  "reason": "The sofa is mentioned as a dark background element to anchor the scene, matching the producer's declaration of anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "A closed, smeared window in the background",
                  "reason": "The window in the background is described to set the dim twilight ambiance, matching the producer's declaration of anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "같은 공간(옥탑방 내부)의 배경 연속성 유지 (exact_background)",
        "_shot_index": 1,
        "visible_entities": [
          "C02",
          "P03",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the rooftop room living area, the eye-level camera stays about 4 meters front-left of 혜수, holding her full body within a wide, dim room before the later lateral move begins. 혜수 is placed slightly right of center with empty floor and dusk-dark furniture around her, the smartphone pressed to her ear as the room’s negative space makes the unanswered message feel heavier.",
            "lighting_mood": "Blue-grey dusk leaks through the room while practical warmth is nearly absent, leaving 혜수 in a low-contrast, anxious half-shadow.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "P03",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject 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": "L05B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "bathroom door",
              "bedroom door",
              "chair",
              "coat rack",
              "cooktop",
              "curtain",
              "dining table",
              "door",
              "floor cushion",
              "framed photo",
              "kitchen counter",
              "refrigerator",
              "shoe cabinet",
              "sink",
              "smartphone",
              "sofa",
              "tea tray",
              "wall shelf",
              "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_room_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The rooftop living room is enveloped in a cold, blue-grey dusk. There is a complete absence of warm artificial light, leaving the sparse, dusk-dark furniture and the empty floor shrouded in dim, low-contrast shadows.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "Blue-grey dusk leaks through the room while practical warmth is nearly absent",
                  "empty floor and dusk-dark furniture",
                  "Cold dusk fills the room",
                  "no comforting warm light"
                ],
                "visual_inferences": [
                  "The bleakness of the room is accentuated by the unlit, shadowy interior and the cold evening tint."
                ],
                "creative_decisions": [
                  "Strictly maintaining a blue-grey color palette with no warm tones to visually amplify the sense of isolation and anxiety."
                ],
                "confidence": "high"
              }
            ],
            "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": "C02O02",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L05B03",
                "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": "3b47c3ef6b0748f0"
      },
      {
        "scene_index": 27,
        "heading": "S#27. 옥탑방 안 / 해질 무렵",
        "beat_title": "불길한 예감",
        "representative_moment": "혜수(C02)가 불안한 얼굴로 김형사(C05)를 바라보는 가운데, 뒤쪽 현관문이 덜컹거린다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level wide composition, frontally facing the room with cold blue dusk lighting",
            "t2i_prompt": "Photorealistic cinematic still. C02O02 in a dark leather jacket, a Korean middle-aged woman, occupies the lower-left midground, facing C05O05 in a grey field jacket, a Korean man in his 30s, standing in the lower-right midground, with the existing entrance door positioned in the upper-center background. C02O02 stands in right profile, one hand lowered slightly, her neat black hair catching the dim light and her clear eyes fixed on C05O05. C05O05 stands in left profile, weight sunk on his heel, his angular face and indifferent eyes fixed on C02O02. They share the same empty floor of the dimly lit room. The rooftop room environment is enveloped in a cold, blue-grey dusk with a complete absence of warm artificial light, leaving the sparse, dusk-dark furniture shrouded in dim, low-contrast shadows. The existing door and shadowed rear wall behind them compress the interior space.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "Shot description: 거실에 선 혜수와 김형사 뒤로 바람에 흔들린 현관문이 미세하게 벌어진 구도",
              "C02 angle/state: profile_right, phone lowered slightly, gaze=looks_at_character→C05",
              "C05 angle/state: profile_left, weight sunk on heel, gaze=looks_at_character→C02",
              "Lighting: Cold dusk fills the room, with the doorway outlined by a thin, dirty blue rim and no comforting warm light to soften the rattle."
            ],
            "visual_inferences": [
              "fixed_element rooftop_room_environment applied: cold blue-grey dusk, complete absence of warm artificial light, empty floor, dusk-dark furniture"
            ],
            "creative_decisions": [
              "Employed a wide frontal composition placing characters in the lower corners (midground) to emphasize the threatening central background entrance door",
              "Used low-contrast shadows on the furniture to highlight the stark empty floor between the characters"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002",
              "fsc_003"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "TV",
                "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": "coat rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooktop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "with the existing entrance door positioned in the upper-center background"
              },
              {
                "owned_token": "floor cushion",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "framed photo",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "kitchen counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sink",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tea tray",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b7d04b3b4ee46ed2",
              "owned_hash": "a43e0eea328f8a22",
              "camera_direction_hash": "91c9b392653b3da6",
              "owned_usage_hash": "e69ee32df345f027",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "with the existing entrance door positioned in the upper-center background",
                  "reason": "The prompt refers to the door as 'existing' and uses it purely for positioning and composition, which aligns with the producer's anchor classification.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 27,
        "dependency_reason": "exact_background: 씬 27의 동일한 옥탑방 배경(L05B03)을 사용하며, 시간대와 조명 무드 일관성 유지",
        "_shot_index": 4,
        "visible_entities": [
          "C02",
          "C05",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From opposite the entrance, the camera holds eye-level about 3.5 meters away, widened enough to bind 혜수 and 김형사 in the midground while the entrance door sits readable behind them. The composition is almost frontal to the room rather than to the people: the figures occupy the lower left and lower right, and the faintly opening door behind them becomes the only moving axis.",
            "lighting_mood": "Cold dusk fills the room, with the doorway outlined by a thin, dirty blue rim and no comforting warm light to soften the rattle.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": "wind-shaken entrance door",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "혜수",
                  "screen_zone": "lower_left",
                  "target_id": "C02",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_003",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "김형사",
                  "screen_zone": "lower_right",
                  "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": [
              "C02",
              "C05",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "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": "L05B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "bathroom door",
              "bedroom door",
              "chair",
              "coat rack",
              "cooktop",
              "curtain",
              "dining table",
              "door",
              "floor cushion",
              "framed photo",
              "kitchen counter",
              "refrigerator",
              "shoe cabinet",
              "sink",
              "smartphone",
              "sofa",
              "tea tray",
              "wall shelf",
              "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_room_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The rooftop living room is enveloped in a cold, blue-grey dusk. There is a complete absence of warm artificial light, leaving the sparse, dusk-dark furniture and the empty floor shrouded in dim, low-contrast shadows.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "Blue-grey dusk leaks through the room while practical warmth is nearly absent",
                  "empty floor and dusk-dark furniture",
                  "Cold dusk fills the room",
                  "no comforting warm light"
                ],
                "visual_inferences": [
                  "The bleakness of the room is accentuated by the unlit, shadowy interior and the cold evening tint."
                ],
                "creative_decisions": [
                  "Strictly maintaining a blue-grey color palette with no warm tones to visually amplify the sense of isolation and anxiety."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 27,
                "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": "C02O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C05O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L05B03",
                "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": "39cfe5abc9f6a19e"
      },
      {
        "scene_index": 28,
        "heading": "S#28. 바다 + 갑판 / 해질 무렵",
        "beat_title": "지도를 보고 충격에 빠진 인우",
        "representative_moment": "갑판 위 수리영(C01)이 내민 지도를 본 인우(C03)가 시선을 떨구고 당황하는 순간",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Wide standing eye-level shot, cold blue twilight contrasted by amber-red sunset trace",
            "t2i_prompt": "Photorealistic cinematic still. From a wide deck position near the outer rail at standing eye height, the camera captures a single still moment across the shared deck of a small fishing boat. C01O01 in a navy windbreaker, a Korean woman in her early 20s with black hair, pale face, and deep eyes, is seated in the left-midground at a three-quarter angle from the right, her eyes fixed on C03O03, her hand caught in the still instant of thrusting P06 forward. C03O03 in worn fisher workwear, a Korean man in his mid-20s with dark hair, a handsome face, and calm eyes, sits farther right on the same deck geography, perched near the rail at a three-quarter angle from the left. His eyes are directed steadily downward, fixing his gaze below the level of the camera lens to look intently at P06. P06, a creased paper map damp at the edges, crosses the air between them, its content-bearing face angled toward C03O03 and partly toward the camera with printed route lines visible. The environment is heavily dominated by cold blue twilight lighting over the darkening, empty open sea, starkly contrasted by a thin, amber-red sunset trace grazing the wet, chipped outer rail and the map edges.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "The scene takes place on the deck of a small fishing boat surrounded by the open sea at dusk.",
              "gaze=down explicitly noted in both Shot 1 and Shot 4",
              "Suri-young is seated in the left-midground, thrusting the paper map forward",
              "In-woo sits farther right within the same deck geography"
            ],
            "visual_inferences": [
              "The environment is heavily dominated by cold blue twilight lighting, starkly contrasted by a thin, amber-red sunset trace",
              "The man's eyes are directed steadily downward, fixing his gaze below the level of the camera lens to look at an object in his lower field of vision."
            ],
            "creative_decisions": [
              "Positioning the outer rail diagonally to clearly separate the deck from the wide open sea in the background",
              "Maintaining a wide framing scale to display both figures and establish the tense spatial distance between Suri-young's extended hand and In-woo's reaction"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background",
              "prop"
            ],
            "owned_object_usage": [
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "anchor",
                "source_phrase": "across the shared deck of a small fishing boat"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hatch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "map",
                "usage_kind": "redraw",
                "source_phrase": "a creased paper map damp at the edges"
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rail",
                "usage_kind": "anchor",
                "source_phrase": "grazing the wet, chipped outer rail"
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "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": "2bfb902aa306650c",
              "owned_hash": "f401730157ccc686",
              "camera_direction_hash": "c0b2db465d3fb5b8",
              "owned_usage_hash": "bb0a5bda4a054c95",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "deck",
                  "violating_phrase": "across the shared deck of a small fishing boat",
                  "reason": "The deck is mentioned to establish the spatial layout of the characters on the vessel, serving as an anchor reference as declared.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rail",
                  "violating_phrase": "grazing the wet, chipped outer rail",
                  "reason": "The rail is used to anchor the camera position and character placement, and receives ambient sunset lighting, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "map",
                  "violating_phrase": "P06, a creased paper map damp at the edges",
                  "reason": "The prompt explicitly instructs the generation of the map as a dynamic prop crossing the air with detailed physical attributes, confirming a redraw violation. Deterministic prop-owned namespace reconciliation: visible prop P06 owns token map; prompt uses P06 in the source phrase.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct prior scene dependency for this specific visual moment.",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "C03",
          "P06",
          "L17"
        ],
        "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 a wide deck position near the outer rail at standing eye height, the camera looks across the small fishing boat with the open sea behind 수리영 and 인우. 수리영 is seated in the left-midground, caught in the still instant of thrusting the paper map forward, while 인우 sits farther right within the same deck geography so the distance between her hand and his reaction stays tense.",
            "lighting_mood": "The deck is washed in cold blue twilight with a thin amber-red sunset line grazing the rail and map 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": 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",
              "P06",
              "L17"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": 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": "L17B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "crate",
              "deck",
              "door",
              "gate",
              "hatch",
              "lamp",
              "map",
              "mast",
              "net",
              "photograph",
              "rail",
              "rope",
              "table",
              "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": "fishing_boat_twilight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene takes place on the deck of a small fishing boat surrounded by the open sea at dusk. The environment is heavily dominated by cold blue twilight lighting, which is starkly contrasted by a thin, amber-red sunset trace that faintly illuminates the boat's textures and the characters' surroundings.",
                "applies_to_shots": [
                  1,
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "deck washed in cold blue twilight with a thin amber-red sunset line",
                  "cold dusk key... muted red sunset trace cuts faintly",
                  "Cold sea-blue dusk dominates... faint red-orange afterglow",
                  "blurred dusk and boat texture"
                ],
                "visual_inferences": [
                  "The residual sunlight originates from a very low angle, catching the edges of the boat's structures while the rest of the setting falls into blue shadows."
                ],
                "creative_decisions": [
                  "Utilizing the contrasting cold blue and warning red lighting to visually amplify the psychological tension and danger of the revelation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "inwoo_downward_gaze",
                "element_type": "character_state",
                "character_name": "인우",
                "description": "The man's eyes are directed steadily downward, fixing his gaze below the level of the camera lens. This downward visual focus is maintained as he intently looks at an object held in his lower field of vision.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "gaze=down explicitly noted in both Shot 1 and Shot 4",
                  "eyes widened and fixed slightly below lens level"
                ],
                "visual_inferences": [
                  "His head may be slightly tilted forward to naturally accommodate his intense downward stare at the presented map or photograph."
                ],
                "creative_decisions": [
                  "Locking the character's eye line downward to emphasize his internal processing, confusion, and shock before he physically erupts into action."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O03",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L17B01",
                "policy": "required"
              },
              {
                "kind": "prop",
                "id": "P06",
                "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": 28,
                "shot_indices": [
                  1
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P06",
                  "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": "65c62ee39ffbe5bb"
      },
      {
        "scene_index": 28,
        "heading": "S#28. 바다 + 갑판 / 해질 무렵",
        "beat_title": "사진을 확인한 인우의 발작적 당황",
        "representative_moment": "인우(C03)가 사진을 확인한 뒤 눈을 크게 뜨고 사색이 되어 정면 아래를 응시하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Frontal close-up at face height with cold twilight and muted red sunset trace",
            "t2i_prompt": "Photorealistic cinematic still. C03O03 in worn workwear, a Korean man in his 20s, is framed in the middle-center foreground for an isolated reaction. Facing the camera in a clean frontal close-up at face height, his face occupies the center of the frame. C03O03's eyes are widened and directed steadily downward, fixing his gaze below the level of the camera lens, jaw locked rigid to hold his shock squarely. A cold dusk key catches the whites of his eyes, while a muted red sunset trace cuts faintly along one cheek. [: The immediate surrounding environment is heavily dominated by cold blue twilight lighting, leaving only dark, indistinct, blurred damp deck shadows and an out-of-focus blue-grey sea dusk as a thin cool backdrop behind his head].",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "Inwoo looking at the photo, reacting with shock and panic",
              "eyes widened and fixed slightly below lens level",
              "facing the camera, jaw locked rigid",
              "cold dusk key catches the whites of his eyes while a muted red sunset trace cuts faintly along one cheek"
            ],
            "visual_inferences": [
              "fixed_element inwoo_downward_gaze: eyes are directed steadily downward, fixing his gaze below the level of the camera lens",
              "fixed_element fishing_boat_twilight_environment: cold blue twilight lighting dominating the scene",
              "The photograph is held below the lower frame edge, maintaining strict focus on his facial reaction"
            ],
            "creative_decisions": [
              "Tight frontal close-up to isolate the character and amplify his internal shock",
              "Soft, abstract background using blurred deck shadows and blue-grey dusk to keep full attention on his eyes"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hatch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "map",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "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": "1706d689f2ba048f",
              "owned_hash": "f401730157ccc686",
              "camera_direction_hash": "c311a3846335a95b",
              "owned_usage_hash": "a88d3513e5d04475",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 28,
        "dependency_reason": "Same scene, maintaining the established twilight environment lighting and character state from prior shots.",
        "_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 인우’s face height, the camera cuts into a clean frontal close-up tight enough to exclude most of the deck, holding his shock squarely without giving the photograph much space. His face occupies the center of the frame, eyes widened and fixed slightly below lens level, with only blurred dusk and boat texture behind him.",
            "lighting_mood": "A cold dusk key catches the whites of his eyes while a muted red sunset trace cuts faintly along one cheek, making the recognition feel dangerous.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "인우 isolated 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": "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": "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": "fishing_boat_twilight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene takes place on the deck of a small fishing boat surrounded by the open sea at dusk. The environment is heavily dominated by cold blue twilight lighting, which is starkly contrasted by a thin, amber-red sunset trace that faintly illuminates the boat's textures and the characters' surroundings.",
                "applies_to_shots": [
                  1,
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "deck washed in cold blue twilight with a thin amber-red sunset line",
                  "cold dusk key... muted red sunset trace cuts faintly",
                  "Cold sea-blue dusk dominates... faint red-orange afterglow",
                  "blurred dusk and boat texture"
                ],
                "visual_inferences": [
                  "The residual sunlight originates from a very low angle, catching the edges of the boat's structures while the rest of the setting falls into blue shadows."
                ],
                "creative_decisions": [
                  "Utilizing the contrasting cold blue and warning red lighting to visually amplify the psychological tension and danger of the revelation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "inwoo_downward_gaze",
                "element_type": "character_state",
                "character_name": "인우",
                "description": "The man's eyes are directed steadily downward, fixing his gaze below the level of the camera lens. This downward visual focus is maintained as he intently looks at an object held in his lower field of vision.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "gaze=down explicitly noted in both Shot 1 and Shot 4",
                  "eyes widened and fixed slightly below lens level"
                ],
                "visual_inferences": [
                  "His head may be slightly tilted forward to naturally accommodate his intense downward stare at the presented map or photograph."
                ],
                "creative_decisions": [
                  "Locking the character's eye line downward to emphasize his internal processing, confusion, and shock before he physically erupts into action."
                ],
                "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": "C03O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "d6620e512aaf0b40"
      },
      {
        "scene_index": 28,
        "heading": "S#28. 바다 + 갑판 / 해질 무렵",
        "beat_title": "조타실을 향해 몸을 일으키는 인우",
        "representative_moment": "C03이 사진을 본 후 발작적으로 몸을 반쯤 일으켜 조타실 쪽으로 고개를 확 돌린다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "waist-height wide framing with cold blue dusk and faint red-orange afterglow",
            "t2i_prompt": "Photorealistic cinematic still. C03O03 in worn fisher workwear, an Asian man in his 20s, is caught half-rising in the lower-left midground, looking toward the wheelhouse in the upper-right background. Observed from a waist-height perspective along the deck, his lower legs and one bent knee occupy the lower frame, his upper body extending upward in right profile, his head snapped sharply off-screen toward the destination. Cold sea-blue dusk deeply shadows the open environment, starkly contrasted by a thin amber-red sunset trace that faintly illuminates the wet deck planks and the rusted side rail. The distant wheelhouse stands dark against the twilight, its window glass holding a faint red-orange afterglow.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "C03 is caught half-rising from the deck, his head snapped sharply toward the wheelhouse as an escape vector.",
              "The camera begins from a low-to-waist-height deck position, widening to keep his full body and the wheelhouse in one frame.",
              "Cold sea-blue dusk dominates, with the wheelhouse windows holding a faint red-orange afterglow."
            ],
            "visual_inferences": [
              "fixed_element fishing_boat_twilight_environment: cold blue twilight lighting is contrasted by an amber-red sunset trace.",
              "The wet deck planks and rusted rail reflect the dim light, visually reinforcing the unstable and narrow walkway."
            ],
            "creative_decisions": [
              "Applied a waist-height wide framing to ground C03's sudden upward movement firmly on the deck while maintaining clear spatial line of sight to the background wheelhouse.",
              "Utilized the stark color contrast between the deep blue ambient shadow and the red-orange window reflection to build psychological tension."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "anchor",
                "source_phrase": "waist-height perspective along the deck"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hatch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "map",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rail",
                "usage_kind": "anchor",
                "source_phrase": "rusted side rail"
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "anchor",
                "source_phrase": "looking toward the wheelhouse in the upper-right background"
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "window glass holding a faint red-orange afterglow"
              },
              {
                "owned_token": "windshield",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8cf78ed310abb7e9",
              "owned_hash": "f401730157ccc686",
              "camera_direction_hash": "e2240ab7562dc18d",
              "owned_usage_hash": "96c7d3db125c326b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "deck",
                  "violating_phrase": "perspective along the deck",
                  "reason": "The deck is used as a spatial and lighting anchor to establish the camera perspective and describe the light on the deck planks.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rail",
                  "violating_phrase": "rusted side rail",
                  "reason": "The side rail is referenced passively as a background element illuminated by the sunset trace.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wheelhouse",
                  "violating_phrase": "looking toward the wheelhouse in the upper-right background",
                  "reason": "The wheelhouse is mentioned to establish the character's line of sight and describe the distant background silhouette.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "window glass holding a faint red-orange afterglow",
                  "reason": "The window glass of the wheelhouse is described passively to capture the twilight reflection, acting as an anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 6,
        "visible_entities": [
          "C03",
          "L17"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 28,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera begins from a low-to-waist-height three-quarter deck position several meters from 인우, widening within the tracking move to keep his full body and the wheelhouse direction in one frame. 인우 is caught half-rising in the lower-left midground, one knee still bent and head snapped sharply toward the upper-right background where the wheelhouse waits as his escape vector.",
            "lighting_mood": "Cold sea-blue dusk dominates, with the wheelhouse windows holding a faint red-orange afterglow like a warning signal.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": "wheelhouse",
                  "screen_zone": "upper_right",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "wheelhouse",
                  "label": "인우",
                  "screen_zone": "lower_left",
                  "target_id": "C03",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C03",
              "L17"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L17B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "crate",
              "deck",
              "door",
              "gate",
              "hatch",
              "lamp",
              "map",
              "mast",
              "net",
              "photograph",
              "rail",
              "rope",
              "table",
              "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": "fishing_boat_twilight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene takes place on the deck of a small fishing boat surrounded by the open sea at dusk. The environment is heavily dominated by cold blue twilight lighting, which is starkly contrasted by a thin, amber-red sunset trace that faintly illuminates the boat's textures and the characters' surroundings.",
                "applies_to_shots": [
                  1,
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "deck washed in cold blue twilight with a thin amber-red sunset line",
                  "cold dusk key... muted red sunset trace cuts faintly",
                  "Cold sea-blue dusk dominates... faint red-orange afterglow",
                  "blurred dusk and boat texture"
                ],
                "visual_inferences": [
                  "The residual sunlight originates from a very low angle, catching the edges of the boat's structures while the rest of the setting falls into blue shadows."
                ],
                "creative_decisions": [
                  "Utilizing the contrasting cold blue and warning red lighting to visually amplify the psychological tension and danger of the revelation."
                ],
                "confidence": "high"
              }
            ],
            "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": "character_outlook",
                "id": "C03O03",
                "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": "c8a0f11700a5c3c7"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "수리영의 절박한 물리적 저지와 인우의 혼란",
        "representative_moment": "어두운 조타실 안, 붉은 노을빛이 스며드는 가운데 수리영(C01)이 조타기를 잡은 인우(C03)의 팔을 두 손으로 꽉 움켜쥐며 노려보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level observer view from the rear doorway forming a narrow tunnel, midground focus with cold blue-black ambient shadows and a sharp red dusk directional light.",
            "t2i_prompt": "Photorealistic cinematic still. From inside the cramped wheelhouse near the rear door, an eye-level camera faces forward, the shadowed door sides forming a narrow tunnel around the view. In the midground, C01O01 in a navy windbreaker, a Korean woman in her early 20s with a pale face, deep eyes, and black hair, stands at a three-quarter angle from the right. C01O01, the figure exerting force, has both hands tightly clamped around the forearm of C03O03. C03O03 in old fisher workwear, a Korean man in his mid 20s with dark hair, a handsome face, and calm eyes, stands at a three-quarter angle from the left, his body braced toward the dark wooden helm console. C03O03 grips the steering wheel and looks off-screen. C01O01 keeps her deep eyes fixed on C03O03. The wheelhouse interior is heavily shadowed in cold blue-black tones. A narrow, muted red glow from the setting sun bleeds through the dirty front window beyond the helm, casting an eerie directional light across the wooden surfaces.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "수리영이 조타기를 쥔 인우의 팔을 두 손으로 꽉 움켜쥔 구도",
              "붉은 노을 빛이 스며드는 어둑하고 좁은 조타실 안",
              "From inside the cramped wheelhouse near the rear doorway, the eye-level camera faces forward toward the helm from about 8 feet away",
              "C01: three_quarter_right, clutching his forearm, gaze=looks_at_character→C03",
              "C03: three_quarter_left, braced at helm, gaze=off_screen"
            ],
            "visual_inferences": [
              "The open rear doorframe naturally acts as a claustrophobic foreground framing device (tunnel effect) for the observer POV.",
              "C01 acting as the force initiator necessitates a firm grip posture locking C03 at the helm.",
              "The cold blue-black shadows contrast heavily against the muted red window glow, anchoring the psychological tension."
            ],
            "creative_decisions": [
              "Used 'shadowed door sides forming a narrow tunnel' to emphasize the physical trap described in the DP notes.",
              "Applied physical conflict rule vocabulary ('the figure exerting force') to ensure the T2I model does not interpret the close proximity as an embrace.",
              "Integrated entity_canon stable traits natively into the demographic descriptors to preserve consistency."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "captain chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "near the rear door, the shadowed door sides forming a narrow tunnel"
              },
              {
                "owned_token": "handset",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "helm console",
                "usage_kind": "anchor",
                "source_phrase": "braced toward the dark wooden helm console"
              },
              {
                "owned_token": "navigation display",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "painted circle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "radio microphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "anchor",
                "source_phrase": "grips the steering wheel"
              },
              {
                "owned_token": "storage bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "throttle lever",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "bleeds through the dirty front window"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "71342c0e906b5c38",
              "owned_hash": "30b0c26965899c20",
              "camera_direction_hash": "a66383a7cfe5ae1b",
              "owned_usage_hash": "12144251f1f328f3",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "near the rear door, the shadowed door sides forming a narrow tunnel",
                  "reason": "The door is used strictly as a spatial framing element for the camera, which is consistent with the producer's anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "helm console",
                  "violating_phrase": "braced toward the dark wooden helm console",
                  "reason": "The helm console serves as a posture anchor for the character's body positioning, with no instructions to redraw or alter it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "steering wheel",
                  "violating_phrase": "grips the steering wheel",
                  "reason": "The steering wheel is referenced as a physical anchor for the character's hand grip, which does not constitute a redraw command.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "bleeds through the dirty front window",
                  "reason": "The window is mentioned as a light source filter for the sunset glow, serving as an environmental lighting anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "C03",
          "L18"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From inside the cramped wheelhouse near the rear doorway, the eye-level camera faces forward toward the helm from about 8 feet away, held slightly wider to include the narrow walls, helm, and red dusk bleeding through the windows. 수리영 and 인우 are locked in the midground at the wheel, her two hands clamped around his arm while his body stays braced toward the controls, compressing the room into a physical trap.",
            "lighting_mood": "The wheelhouse is mostly cold blue-black, slashed by muted red sunset through dirty glass that stains the struggle with ritual unease.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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",
              "L18"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L18B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "captain chair",
              "door",
              "handset",
              "helm console",
              "navigation display",
              "painted circle",
              "photograph",
              "radio microphone",
              "shelf",
              "steering wheel",
              "storage bench",
              "throttle lever",
              "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": "wheelhouse_twilight_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the wheelhouse is heavily shadowed in cold blue-black tones. A narrow, muted red glow from the setting sun bleeds through the dirty windows, casting an eerie, contrasting directional light across the dark wooden surfaces.",
                "applies_to_shots": [
                  1,
                  4,
                  7,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "wheelhouse is mostly cold blue-black, slashed by muted red sunset through dirty glass",
                  "narrow red dusk glint... cold blue shadow",
                  "low ritual-like glow against cold blue-black wood",
                  "Cold interior shadow... muted red rim from the window"
                ],
                "visual_inferences": [
                  "The deep shadows and stark red light emphasize the confined space and escalating tension.",
                  "The dark wooden interior absorbs the cold light, making the red sunset stand out sharply."
                ],
                "creative_decisions": [
                  "Maintain consistent blue-black ambient shadows across all shots, punctuated by sharp red directional light to build visual unease."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O03",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L18B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "b1da0767c21be4b4"
      },
      {
        "beat_title": "사진 속 아이를 짚는 손끝",
        "dependency_reason": "Shot 4 keeps the same wheelhouse background and twilight lighting established in the earlier shot, but reframes into a tighter insert on the photograph and C01's hand.",
        "dependent_scene_index": 29,
        "heading": "S#29. Wheelhouse / dusk",
        "representative_moment": "C01's trembling finger presses P02 near the printed face of a Korean young girl.",
        "scene_index": 29,
        "scene_type": "normal",
        "t2i_variations": [
          {
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "camera_effect": "Chest-height insert beside the helm, angled downward onto the old photograph; shallow focus holds the finger, paper grain, and printed child's face sharp against cold blue wheelhouse shadow and a narrow red dusk glint.",
            "confidence": "high",
            "creative_decisions": [
              "Use a tight single-plane composition to keep the body-part framing consistent with the insert scale.",
              "Keep the wheelhouse background blurred and anchored to the attached background reference without introducing new room objects.",
              "Let the red dusk glint touch the paper surface only, contrasted against cold blue-black ambient shadow."
            ],
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "owned_object_usage": [
              {
                "owned_token": "captain chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "handset",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "helm console",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation display",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "painted circle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "anchor",
                "source_phrase": "P02, the old photograph already within the referenced wheelhouse"
              },
              {
                "owned_token": "radio microphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "throttle lever",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "red dusk glint from the dirty windows"
              }
            ],
            "reference_phrase_kinds": [
              "character",
              "background",
              "prop"
            ],
            "source_facts": [
              "Shot 4: 수리영의 떨리는 손가락이 낡은 사진 속 한국인 어린 여자아이의 얼굴을 짚은 클로즈업.",
              "Scene text: 수리영 says the child in the photograph is her mother.",
              "Scene text: the setting is the wheelhouse at dusk."
            ],
            "t2i_prompt": "Photorealistic cinematic still. C01's pointing hand in the lower-center foreground, a navy windbreaker sleeve visible, fingertip extended to the young girl's face in P02. C01, a Korean woman in her early 20s, is cropped to only this tense hand; her off-screen gaze is directed away beyond the frame, alive but unseen. P02, the old photograph already within the referenced wheelhouse, fills the sharp focus plane, aged, creased, slightly damp, with rough paper grain and mottled water stains visible. The front printed surface faces the camera, showing one Korean young girl's printed face beneath the flattened fingertip, no other printed faces emphasized. A narrow red dusk glint from the dirty windows grazes the photograph surface; the surrounding wheelhouse stays in cold blue-black shadow, with only a blurred dark helm-side edge behind the evidence.",
            "variant_label": "var_1",
            "visual_inferences": [
              "fixed_element wheelhouse_twilight_lighting: cold blue-black wheelhouse shadow with a muted red dusk glow through dirty windows.",
              "RenderPromptCard framing: insert angled downward beside the helm, focusing on C01's finger and the old photograph.",
              "The reproduced face inside the photograph is described only as a generic Korean young girl, not with a character ID."
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6d69207164cecb12",
              "owned_hash": "30b0c26965899c20",
              "camera_direction_hash": "7b077e3ec9aaabdf",
              "owned_usage_hash": "2f8a964a617c97e3",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "photograph",
                  "violating_phrase": "P02, the old photograph already within the referenced wheelhouse, fills the sharp focus plane",
                  "reason": "The prompt references and focuses closely on the existing photograph, detailing its paper texture and content as an anchor for the interaction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "red dusk glint from the dirty windows",
                  "reason": "The windows are mentioned purely as a background light source directing a glint onto the photograph, acting as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "helm console",
                  "violating_phrase": "blurred dark helm-side edge behind the evidence",
                  "reason": "The helm console area is referenced as a blurred background edge to frame the shot, which the producer incorrectly marked as absent.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "P02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Just beside the helm at chest height, the camera pushes tighter than the prior observation into an insert angled downward between the two bodies. 수리영’s trembling finger enters from the lower edge and presses the old photograph near the young girl’s face, with the creased paper texture and tiny printed features held sharp while the surrounding wheelhouse falls away.",
            "lighting_mood": "A narrow red dusk glint grazes the photograph while the rest falls into cold blue shadow, making the child’s printed face feel both factual and cursed.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": "points_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "reaches_for",
                  "gesture_target_label": "young girl's face in the old photograph",
                  "label": "수리영's pointing hand",
                  "screen_zone": "lower_center",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P02"
            ],
            "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": "The frame isolates 수리영’s hand and finger rather than her face or full body, so an outlook-based identity reference would not align reliably."
              }
            ],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L18B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "captain chair",
              "door",
              "handset",
              "helm console",
              "navigation display",
              "painted circle",
              "photograph",
              "radio microphone",
              "shelf",
              "steering wheel",
              "storage bench",
              "throttle lever",
              "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": "wheelhouse_twilight_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the wheelhouse is heavily shadowed in cold blue-black tones. A narrow, muted red glow from the setting sun bleeds through the dirty windows, casting an eerie, contrasting directional light across the dark wooden surfaces.",
                "applies_to_shots": [
                  1,
                  4,
                  7,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "wheelhouse is mostly cold blue-black, slashed by muted red sunset through dirty glass",
                  "narrow red dusk glint... cold blue shadow",
                  "low ritual-like glow against cold blue-black wood",
                  "Cold interior shadow... muted red rim from the window"
                ],
                "visual_inferences": [
                  "The deep shadows and stark red light emphasize the confined space and escalating tension.",
                  "The dark wooden interior absorbs the cold light, making the red sunset stand out sharply."
                ],
                "creative_decisions": [
                  "Maintain consistent blue-black ambient shadows across all shots, punctuated by sharp red directional light to build visual unease."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 29,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character",
                "id": "C01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L18B01",
                "policy": "required"
              },
              {
                "kind": "prop",
                "id": "P02",
                "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": [
                  4
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P02",
                  "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": "e85fb905ae654b83"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "조타실의 기이한 붉은 표식",
        "representative_moment": "An eye-level close-up of the grotesque P01 red painted circles on the dark L18 wheelhouse wall, with no people in frame.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye-level shallow-focus insert, lateral track simulation",
            "t2i_prompt": "Photorealistic cinematic still. An eye-level shallow-focus insert of the dark inner wall of the [L18: cramped wheelhouse]. The camera-facing plane is heavily shadowed in cold blue-black tones, with the camera tracking laterally close to the old, damp-stained wood, focusing on the pre-existing uneven [P01: painted circles]. These crude red symbols catch a low ritual-like glow. A thin rusted vertical seam with wet-speckled rivets catches a narrow, muted red glint from the setting sun along the frame edge. No people are visible in the frame.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: crops all people out, turning the wall itself into the subject",
              "grotesque red pigment circles slide across the frame... close enough to show brush drag and dried clots against cold blue-black wood",
              "narrow red dusk glint... cold blue shadow"
            ],
            "visual_inferences": [
              "fixed_element wheelhouse_twilight_lighting: cold blue-black tones and muted red glow",
              "fixed_element grotesque_red_wall_marks: crimson pigment with primitive clotted textures",
              "The wall surface features rusted seams and wet-speckled rivets to convey the aged, damp nature of the fishing boat interior."
            ],
            "creative_decisions": [
              "Use a shallow depth of field to isolate the visceral texture of the painted circles, creating an unstable, uneasy mood.",
              "Highlight the vertical seam at the frame edge to maintain spatial context of the cramped cabin without widening the shot."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "captain chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "handset",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "helm console",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation display",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "painted circle",
                "usage_kind": "anchor",
                "source_phrase": "focusing on the pre-existing uneven [P01: painted circles]"
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "radio microphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "throttle lever",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a01dc583be249f15",
              "owned_hash": "30b0c26965899c20",
              "camera_direction_hash": "bdea2496ead36a4b",
              "owned_usage_hash": "41187b8378472e9f",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "painted circle",
                  "violating_phrase": "focusing on the pre-existing uneven [P01: painted circles]",
                  "reason": "The prompt describes focusing on the 'pre-existing' painted circles as a camera anchor without demanding they be redrawn or modified, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 29,
        "dependency_reason": "zoom_in_detail of the same wheelhouse background established in prior shots, keeping the lighting consistent",
        "_shot_index": 7,
        "visible_entities": [
          "P01",
          "L18"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From a position just over and slightly behind where 인우 stands, the camera tracks laterally close to the inner wall but crops all people out, turning the wall itself into the subject. The grotesque red pigment circles slide across the frame at eye level in an uneasy, shallow-focus insert, close enough to show brush drag and dried clots but not so close that the dark wheelhouse surface loses scale.",
            "lighting_mood": "The red markings catch a low ritual-like glow against cold blue-black wood, with the lateral movement making the wall feel unstable without turning supernatural.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 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": [
              "P01",
              "L18"
            ],
            "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": "L18B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "captain chair",
              "door",
              "handset",
              "helm console",
              "navigation display",
              "painted circle",
              "photograph",
              "radio microphone",
              "shelf",
              "steering wheel",
              "storage bench",
              "throttle lever",
              "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": "wheelhouse_twilight_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the wheelhouse is heavily shadowed in cold blue-black tones. A narrow, muted red glow from the setting sun bleeds through the dirty windows, casting an eerie, contrasting directional light across the dark wooden surfaces.",
                "applies_to_shots": [
                  1,
                  4,
                  7,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "wheelhouse is mostly cold blue-black, slashed by muted red sunset through dirty glass",
                  "narrow red dusk glint... cold blue shadow",
                  "low ritual-like glow against cold blue-black wood",
                  "Cold interior shadow... muted red rim from the window"
                ],
                "visual_inferences": [
                  "The deep shadows and stark red light emphasize the confined space and escalating tension.",
                  "The dark wooden interior absorbs the cold light, making the red sunset stand out sharply."
                ],
                "creative_decisions": [
                  "Maintain consistent blue-black ambient shadows across all shots, punctuated by sharp red directional light to build visual unease."
                ],
                "confidence": "high"
              },
              {
                "element_id": "grotesque_red_wall_marks",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Numerous unsettling circular symbols are painted onto the dark wooden walls of the wheelhouse using thick, crimson pigment. The markings display coarse brush drags and dried, clotted textures, giving them a primitive and ritualistic appearance against the cold background.",
                "applies_to_shots": [
                  7,
                  11
                ],
                "element_scope": "close",
                "source_facts": [
                  "grotesque red pigment circles slide across the frame... close enough to show brush drag and dried clots against cold blue-black wood",
                  "wall marks behind him"
                ],
                "visual_inferences": [
                  "The circles look crude and ominous, painted directly onto the rough wood of the cabin walls."
                ],
                "creative_decisions": [
                  "Render the red markings with a dried, textured, blood-like appearance to heighten the eerie tone of the environment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 29,
                "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": "L18B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "724cc4acd0f8f076"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "의식을 잃고 인우에게 쓰러지는 수리영",
        "representative_moment": "C03이 자신의 어깨에 기절하여 쓰러진 C01을 서늘한 눈빛으로 내려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight side angle at shoulder height, observer POV, high contrast cold/red lighting",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a navy windbreaker, a young Korean woman unconscious and leaning on the other figure, rests in the lower-left foreground, while C03O03 in worn fisher workwear, a Korean man in his mid-20s looking down coldly, holds his shoulder rigid in the middle-right midground, sharing the confined space near the helm. Captured from a tight side angle at shoulder height, C03O03 is positioned in left profile dominating the upper frame, his eyes fixed on C01O01. C01O01 appears at a three-quarter angle from the left with eyes closed, her limp weight resting against his shoulder. Cold blue-black interior shadows envelop both bodies, while a narrow, muted red dusk glow from the oblique side window glass catches C03O03's eye and edges his profile. [L18B01: The shadowed, camera-facing wheelhouse wall behind them remains out of focus, showing faint dried crimson circular smears with coarse brush drags against the dark wood.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S#29 action: 의식이 혼미해지는 수리영. 수리영을 노려보는 인우의 어깨에 그대로 쓰러진다.",
              "shot description: 인우가 자신의 어깨에 무기력하게 기댄 수리영을 서늘한 눈빛으로 내려다보는 측면"
            ],
            "visual_inferences": [
              "fixed_element wheelhouse_twilight_lighting applied: cold blue-black tones dominate, emphasizing the narrow red dusk glint.",
              "fixed_element grotesque_red_wall_marks applied: crimson pigment circles visible on the background wall.",
              "C03's rigid shoulder actively supporting C01's collapsed weight creates an unbalanced tension in the tight framing."
            ],
            "creative_decisions": [
              "Positioned camera at shoulder height from the side to capture C03's cold profile dominating the upper frame while C01 sags into the lower-left foreground.",
              "Utilized the skipped_close_framing background block to blur the L18B01 wall edge, preventing the red marks from overtaking the characters' faces."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "captain chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "handset",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "helm console",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation display",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "painted circle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "photograph",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "radio microphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "throttle lever",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a7f4aea024834211",
              "owned_hash": "30b0c26965899c20",
              "camera_direction_hash": "ad0ba272a456f629",
              "owned_usage_hash": "b1791a186efa24dd",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 29,
        "dependency_reason": "exact_background continuity from Scene 29 Shot 1",
        "_shot_index": 11,
        "visible_entities": [
          "C01",
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Cut to a tight side angle at shoulder height about 3 feet from the pair, parallel to their bodies near the helm. 인우’s side-profile eyes dominate the upper frame as he looks down coldly, while 수리영’s limp weight rests against his shoulder in the lower foreground, her face partially collapsed out of strength rather than posed toward camera.",
            "lighting_mood": "Cold interior shadow holds both bodies while a muted red rim from the window catches 인우’s eyes and the wall marks behind him.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "수리영 leaning on 인우",
                  "screen_zone": "lower_left",
                  "target_id": "C01",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "인우 looking down",
                  "screen_zone": "middle_right",
                  "target_id": "C03",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "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": "skipped_close_framing",
            "bg_id": "L18B01",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "wheelhouse_twilight_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the wheelhouse is heavily shadowed in cold blue-black tones. A narrow, muted red glow from the setting sun bleeds through the dirty windows, casting an eerie, contrasting directional light across the dark wooden surfaces.",
                "applies_to_shots": [
                  1,
                  4,
                  7,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "wheelhouse is mostly cold blue-black, slashed by muted red sunset through dirty glass",
                  "narrow red dusk glint... cold blue shadow",
                  "low ritual-like glow against cold blue-black wood",
                  "Cold interior shadow... muted red rim from the window"
                ],
                "visual_inferences": [
                  "The deep shadows and stark red light emphasize the confined space and escalating tension.",
                  "The dark wooden interior absorbs the cold light, making the red sunset stand out sharply."
                ],
                "creative_decisions": [
                  "Maintain consistent blue-black ambient shadows across all shots, punctuated by sharp red directional light to build visual unease."
                ],
                "confidence": "high"
              },
              {
                "element_id": "grotesque_red_wall_marks",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Numerous unsettling circular symbols are painted onto the dark wooden walls of the wheelhouse using thick, crimson pigment. The markings display coarse brush drags and dried, clotted textures, giving them a primitive and ritualistic appearance against the cold background.",
                "applies_to_shots": [
                  7,
                  11
                ],
                "element_scope": "close",
                "source_facts": [
                  "grotesque red pigment circles slide across the frame... close enough to show brush drag and dried clots against cold blue-black wood",
                  "wall marks behind him"
                ],
                "visual_inferences": [
                  "The circles look crude and ominous, painted directly onto the rough wood of the cabin walls."
                ],
                "creative_decisions": [
                  "Render the red markings with a dried, textured, blood-like appearance to heighten the eerie tone of the environment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 29,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C03O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "dce639127cfb0aa7"
      },
      {
        "scene_index": 30,
        "heading": "S#30. 바다 / 해질 무렵",
        "beat_title": "세상과 단절되는 경계, 안개 속으로",
        "representative_moment": "소형 어선의 선수가 거대한 안개벽 속으로 반쯤 파묻힌 채 정지된 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "observer perspective from bow height at water level, holding completely still just outside the fog boundary, medium framing",
            "t2i_prompt": "Photorealistic cinematic still. The small fishing boat bow rests motionless in the lower-center midground, its front half swallowed by the towering dark fog wall occupying the middle-center background. Viewed from bow height at water level slightly off-center, the camera focuses on the wet, halted forward edge of the wooden prow as it cuts diagonally toward camera-left into the thick mist. The heavy, opaque fog rises as a massive vertical barrier, completely erasing the horizon line in occult darkness. In the foreground, the dark, damp sea surface lightly ripples. The rippled surface reflects muted amber sunset streaks and the blue-black underside of the fog, casting a cold blue dusk over the scene while weak amber light flattens against the wet hull.",
            "outfit_assignments": [],
            "source_facts": [
              "S#30 action: '세상과 경계를 지우는 것 같은 짙은 안개 띠. 서서히 안개 안으로 들어가는 인우의 배.'",
              "shot description: 작은 소형어선의 선수 부분이 거대한 짙은 안개벽 속으로 반쯤 파묻혀 있는 정지 순간"
            ],
            "visual_inferences": [
              "cold blue dusk dominates the mood with weak amber sunset reflections on the water",
              "the sea surface reflects the blue-black underside of the fog and the fading amber light",
              "the bow is wet, stationary, and positioned diagonally facing camera-left into the fog"
            ],
            "creative_decisions": [
              "placement of the boat bow in the lower-center to anchor the composition and emphasize the boundary",
              "highlighting the texture of the churning fog wall as a massive, horizon-erasing entity",
              "using reflections on the rippled water to ground the scale and enhance the cinematic cold tone"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a9419170c6e39d0c",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "681dc540560124db",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 30,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From bow height at water level, the camera holds completely still just outside the fog boundary, slightly off-center so the small fishing boat’s prow sits in the lower-middle frame with its front half disappearing into the dark wall. The composition feels like an arrested approach: cold water ripples in the foreground, the bow cuts diagonally inward, and the fog rises behind it as a vertical mass that nearly erases the horizon.",
            "lighting_mood": "Cold blue dusk dominates, with weak amber sunset reflections flattening against the wet bow while the fog absorbs most of the light into a heavy occult darkness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "small fishing boat bow",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "towering dark fog 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": [
              "L19"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [],
            "readiness_policy": "not_applicable",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "5404767625883cf2"
      }
    ],
    "consumed_bg_catalog_hash": "48e7af980424d9f6",
    "consumed_shot_binding_hash": "6ac16164f71a4163"
  },
  "step_id": "scene_detail",
  "run_id": "3803592b-9d41-4a2b-abc8-795ff40464bf",
  "resolved_model": "gemini-pro",
  "updated_at": "2026-05-22T23:53:06.394879+00:00",
  "project_config_snapshot": {}
}