{
 "group_id": "bg_rooftop_unit",
 "anchor_loc": "L04",
 "members": [
  {
   "loc_id": "L03",
   "label": "인천 변두리 낡은 빌라 옥탑방 옥상·현관 앞 외부",
   "shot_count": 6,
   "is_indoor": false,
   "summary": "낡은 다세대 빌라 꼭대기에 위치한 야외 공간. 물탱크, 흔들리는 빨랫줄, 평상 위 약초 건조 흔적, 낡은 철문 현관이 있다. (특징: 낡은 시멘트 바닥; 물탱크; 바람에 날리는 빨랫줄; 평상과 널려 있는 말린 약초(석창포); 전단지가 끼워진 철문 현관)"
  },
  {
   "loc_id": "L04",
   "label": "옥탑방 내부",
   "shot_count": 15,
   "is_indoor": true,
   "summary": "작은 창문으로 빛이 들어오는 낡은 주거 공간. 싱크대, 식탁, TV가 있는 거실과 침대, 커튼, 거울 등이 있는 방/욕실로 구성된다. 약초 끓이는 냄비 등 생활 소품이 있으며, 간헐적으로 벽면에 붉은 원 형태의 환영과 핏자국이 생겨난다. (특징: 작은 창문의 햇살; 싱크대와 약초(석창포); 가스레인지 위 끓는 냄비와 수증기; 거실 TV와 스탠드; 침대, 커튼, 거울; 벽과 거울 표면에 나타나는 붉은 원 환영; 바닥과 벽의 핏자국 (특정 시점); 어지럽혀진 가재도구 (특정 시점))"
  },
  {
   "loc_id": "L10",
   "label": "옥탑방 외곽 골목·시멘트 계단",
   "shot_count": 2,
   "is_indoor": false,
   "summary": "다세대 빌라 마당의 후미진 구석과 옥탑방으로 올라가는 가파르고 낡은 시멘트 계단. (특징: 다세대 빌라 입구 마당; 후미진 구석 공간; 낡고 가파른 시멘트 계단)"
  }
 ],
 "bgs": {
  "L03B01": {
   "bg_id": "L03B01",
   "loc_id": "L03",
   "space_key": "main",
   "time_phase": "dawn",
   "state_class": "quiet",
   "surface_role": "exterior_plate",
   "semantic_key": "L03|main|dawn|quiet",
   "depends_on_fp": [
    "fp_l03_rooftop_entry_main"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S17_Shot1"
   ],
   "sub_location_label": "새벽 옥탑방 창문 외부",
   "state_label_raw": "blue mist dawn rooftop exterior, yellow-lit window, black cat passing over wall"
  },
  "L03B02": {
   "bg_id": "L03B02",
   "loc_id": "L03",
   "space_key": "main",
   "time_phase": "day",
   "state_class": "quiet",
   "surface_role": "site_surface",
   "semantic_key": "L03|main|day|quiet",
   "depends_on_fp": [],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S4_Shot1"
   ],
   "sub_location_label": "옥탑방 외부 전경",
   "state_label_raw": "day aerial establishing view of old rooftop unit and surrounding worn villa exterior"
  },
  "L03B03": {
   "bg_id": "L03B03",
   "loc_id": "L03",
   "space_key": "main",
   "time_phase": "night",
   "state_class": "arrival",
   "surface_role": "exterior_plate",
   "semantic_key": "L03|main|night|arrival",
   "depends_on_fp": [
    "fp_l03_rooftop_entry_main"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S13_Shot3",
    "S13_Shot5"
   ],
   "sub_location_label": "옥탑방 외부 도착 지점",
   "state_label_raw": "night exterior arrival with siren mood, Hyesu finding dazed Suriyoung near rooftop unit"
  },
  "L03B04": {
   "bg_id": "L03B04",
   "loc_id": "L03",
   "space_key": "main",
   "time_phase": "night",
   "state_class": "intrusion",
   "surface_role": "transition_zone",
   "semantic_key": "L03|main|night|intrusion",
   "depends_on_fp": [
    "fp_l03_rooftop_entry_main"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S10_Shot5",
    "S10_Shot6"
   ],
   "sub_location_label": "옥상 현관 앞",
   "state_label_raw": "night rooftop entry with water tank, laundry line, ajar iron door, unseen intruder shadow at window"
  },
  "L04B01": {
   "bg_id": "L04B01",
   "loc_id": "L04",
   "space_key": "main",
   "time_phase": "dusk",
   "state_class": "evidence_display",
   "surface_role": "interior_room",
   "semantic_key": "L04|main|dusk|evidence_display",
   "depends_on_fp": [
    "fp_l04_rooftop_room_main"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S25_Shot4"
   ],
   "sub_location_label": "수리영 방 붉은 원과 사진",
   "state_label_raw": "dusk supernatural clue display: bloody old black-and-white photo pinned at the center of a red circle on wall"
  },
  "L04B02": {
   "bg_id": "L04B02",
   "loc_id": "L04",
   "space_key": "main",
   "time_phase": "dusk",
   "state_class": "ransacked",
   "surface_role": "interior_room",
   "semantic_key": "L04|main|dusk|ransacked",
   "depends_on_fp": [
    "fp_l04_rooftop_room_main"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S25_Shot8",
    "S27_Shot1"
   ],
   "sub_location_label": "난장판이 된 옥탑방 내부",
   "state_label_raw": "dusk ransacked rooftop room with footprints, open window, overturned chairs, scattered household items, door rattling in wind"
  },
  "L04B03": {
   "bg_id": "L04B03",
   "loc_id": "L04",
   "space_key": "main",
   "time_phase": "morning",
   "state_class": "clean_after",
   "surface_role": "interior_room",
   "semantic_key": "L04|main|morning|clean_after",
   "depends_on_fp": [
    "fp_l04_rooftop_room_main"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S18_Shot6"
   ],
   "sub_location_label": "아침의 정돈된 옥탑방 내부",
   "state_label_raw": "morning after waiting all night, empty silent house and spotless room with no corpse or traces"
  },
  "L04B04": {
   "bg_id": "L04B04",
   "loc_id": "L04",
   "space_key": "main",
   "time_phase": "morning",
   "state_class": "dream_or_vision_state",
   "surface_role": "interior_room",
   "semantic_key": "L04|main|morning|dream_or_vision_state",
   "depends_on_fp": [
    "fp_l04_rooftop_room_main"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S18_Shot15",
    "S18_Shot20"
   ],
   "sub_location_label": "욕실 거울과 식탁 사진 환시",
   "state_label_raw": "morning hallucination overlays: red circle appearing in bathroom mirror and mother's face melting in table photo"
  },
  "L04B05": {
   "bg_id": "L04B05",
   "loc_id": "L04",
   "space_key": "main",
   "time_phase": "morning",
   "state_class": "normal",
   "surface_role": "interior_room",
   "semantic_key": "L04|main|morning|normal",
   "depends_on_fp": [
    "fp_l04_rooftop_room_main"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S5_Shot3",
    "S5_Shot10",
    "S5_Shot12"
   ],
   "sub_location_label": "옥탑방 내부 거실 겸 주방",
   "state_label_raw": "morning interior routine with small window sunlight, TV news, sink herbs, table and wrist mark close-up"
  },
  "L04B06": {
   "bg_id": "L04B06",
   "loc_id": "L04",
   "space_key": "main",
   "time_phase": "night",
   "state_class": "blood_scene",
   "surface_role": "interior_room",
   "semantic_key": "L04|main|night|blood_scene",
   "depends_on_fp": [
    "fp_l04_rooftop_room_main"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S12_Shot4",
    "S12_Shot8",
    "S12_Shot15"
   ],
   "sub_location_label": "옥탑방 내부와 수리영 방",
   "state_label_raw": "night corpse discovery state with cooled pot, TV glow, spilled tea cups, blood floor, curtain trail, red circle on wall"
  },
  "L04B07": {
   "bg_id": "L04B07",
   "loc_id": "L04",
   "space_key": "main",
   "time_phase": "night",
   "state_class": "clean_after",
   "surface_role": "interior_room",
   "semantic_key": "L04|main|night|clean_after",
   "depends_on_fp": [
    "fp_l04_rooftop_room_main"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S14_Shot4",
    "S14_Shot6",
    "S14_Shot8"
   ],
   "sub_location_label": "깨끗해진 옥탑방 내부",
   "state_label_raw": "night aftermath where blood, corpse, red mark and tea cups have vanished; room overly neat and table clean"
  },
  "L10B01": {
   "bg_id": "L10B01",
   "loc_id": "L10",
   "space_key": "stairs",
   "time_phase": "night",
   "state_class": "arrival",
   "surface_role": "transition_zone",
   "semantic_key": "L10|stairs|night|arrival",
   "depends_on_fp": [
    "fp_l10_cement_stairs"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S11_Shot3"
   ],
   "sub_location_label": "옥탑방으로 오르는 시멘트 계단",
   "state_label_raw": "night concrete stair climb as Suriyoung arrives, stops mid-stair at sudden foul smell"
  },
  "L10B02": {
   "bg_id": "L10B02",
   "loc_id": "L10",
   "space_key": "exterior",
   "time_phase": "night",
   "state_class": "intrusion",
   "surface_role": "transition_zone",
   "semantic_key": "L10|exterior|night|intrusion",
   "depends_on_fp": [
    "fp_l10_exterior_alley"
   ],
   "depends_on_bg": [],
   "applies_to_shots": [
    "S11_Shot4"
   ],
   "sub_location_label": "옥상 외곽 현관 철문 앞",
   "state_label_raw": "night exterior landing view of the rooftop unit iron door left half open in darkness"
  }
 },
 "shots": {
  "S10_Shot5": {
   "scene_index": 10,
   "shot_index": 5,
   "loc_ids": [
    "L03"
   ],
   "is_indoor": false,
   "bg_ids": [
    "L03B04"
   ],
   "scene_heading": "S#10. 옥탑방 / N",
   "description": "철문이 미세하게 열린 틈 사이로 어두운 내부가 보이는 구도.",
   "characters": [],
   "staging": {
    "camera_direction": "At the end of the flow’s dolly-in, the lens freezes just outside the iron door at handle height, only inches from the seam, staring directly into the thin opening. The dark crack sits in the center like a vertical wound, with rough iron surfaces on both sides occupying the foreground while the interior beyond remains unreadable and almost lightless.",
    "character_angles": [],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "foreground",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "narrow iron door seam",
       "screen_zone": "middle_center",
       "target_id": "",
       "target_kind": "background"
      }
     ],
     "reason": "required_background_position"
    },
    "framing_scale": "insert",
    "key_bg_elements": [
     {
      "camera_use": "Primary focal aperture; turns the entry into a threatening slit rather than a normal doorway.",
      "directionality_class": "directional_3d",
      "element": "iron front door",
      "orientation": "The two heavy door edges face camera at close range, separated by a narrow central crack leading into darkness.",
      "state": "slightly open, scratched, cold metal"
     },
     {
      "camera_use": "Hides what is inside and makes the gap feel predatory.",
      "directionality_class": "non_directional",
      "element": "dark interior beyond the crack",
      "orientation": "",
      "state": "unlit, opaque, silent"
     },
     {
      "camera_use": "Adds tactile evidence of forced entry near the seam.",
      "directionality_class": "content_surface",
      "element": "creased advertisement flyer edge",
      "orientation": "Only the printed edge of the paper face is visible near the door seam, with partial color blocks and unreadable text.",
      "state": "bent, partly displaced, dirty"
     }
    ],
    "lighting_mood": "A thin blue rooftop ambient line skims the iron while the interior remains dead black, with only a trace of sickly amber leaking from somewhere unseen.",
    "perception_mode": "direct",
    "perspective": "voyeur",
    "pov_character": "",
    "scene_index": 10,
    "shot_index": 5,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Insert framing at handle height, deep blue-black night ambient contrasted with a faint sickly amber leak from the interior crack",
      "t2i_prompt": "Photorealistic cinematic still. The narrow iron door seam sits in the middle-center foreground. The heavy edges of the iron door face the camera at close range, occupying the outer framing with scratched, cold metal. Near the opening at handle height, a creased advertisement flyer edge is wedged in the gap, its bent and dirty paper face showing partial color blocks and unreadable text. Beyond the thin crack, the unlit interior remains entirely opaque, unreadable, and silent. A deep monochrome blue-black ambient night tone skims the outer rough iron surfaces, while a weak trace of sickly amber light leaks from somewhere unseen deep inside the dead black interior, casting a faint smear along the inner metal edge.",
      "outfit_assignments": [],
      "source_facts": [
       "Shot description: lens freezes just outside the iron door at handle height, staring directly into the thin opening.",
       "action: door slightly open, dark interior beyond.",
       "action: creased advertisement flyer edge wedged in the door seam."
      ],
      "visual_inferences": [
       "fixed_element scene_lighting_atmosphere: monochrome blue-black ambient night with sickly amber interior leak",
       "The voyeuristic focus makes the door gap feel like a vertical wound, heavily obscuring the interior."
      ],
      "creative_decisions": [
       "Insert framing scale emphasizes claustrophobia and tension by heavily cropping the door edges and leaving the interior dead black.",
       "Highlighting the scratch marks and cold metal texture to anchor the external reality against the pitch-black threat inside."
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001"
      ],
      "reference_phrase_kinds": [
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "bench",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "clothesline",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "anchor",
        "source_phrase": "The heavy edges of the iron door face the camera"
       },
       {
        "owned_token": "flyer",
        "usage_kind": "anchor",
        "source_phrase": "a creased advertisement flyer edge is wedged in the gap"
       },
       {
        "owned_token": "herb leaf",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "parapet",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "rooftop deck",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "rooftop room",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stair opening",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "water tank",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "cbfa6d4abf71d77f",
       "owned_hash": "43d69c13fefb7fb9",
       "camera_direction_hash": "8478a6c19c16a0bb",
       "owned_usage_hash": "5b13b2569008fc57",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "door",
         "violating_phrase": "The heavy edges of the iron door face the camera at close range",
         "reason": "The prompt references the pre-existing door to anchor the close-up composition, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "flyer",
         "violating_phrase": "a creased advertisement flyer edge is wedged in the gap",
         "reason": "The prompt describes the location and state of the pre-existing flyer within the door seam, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "L03"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 10,
      "shot_index": 5
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "insert",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "At the end of the flow’s dolly-in, the lens freezes just outside the iron door at handle height, only inches from the seam, staring directly into the thin opening. The dark crack sits in the center like a vertical wound, with rough iron surfaces on both sides occupying the foreground while the interior beyond remains unreadable and almost lightless.",
      "lighting_mood": "A thin blue rooftop ambient line skims the iron while the interior remains dead black, with only a trace of sickly amber leaking from somewhere unseen.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": {
       "reason": "required_background_position",
       "constraints": [
        {
         "constraint_id": "fsc_001",
         "depth_plane": "foreground",
         "gesture_action": "none",
         "gesture_target_label": "",
         "label": "narrow iron door seam",
         "screen_zone": "middle_center",
         "target_id": "",
         "target_kind": "background"
        }
       ]
      },
      "constraints": [
       "one prompt captures one still moment",
       "do not combine full-body framing and body-part close-up in one frame",
       "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
       "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
       "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
      ]
     },
     "id_policy": {
      "allowed_base_entity_ids": [
       "L03"
      ],
      "allowed_outlook_pairs": [],
      "must_use_composite_character_ids": true,
      "common_noun_required_when": [
       "a reproduced face inside any declared reproduction surface",
       "unregistered extra"
      ],
      "id_use_required_when": [
       "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
      ],
      "demographic_fallback_required": true,
      "face_identifiability_rule": {
       "use_entity_id_when": [
        "face identifiable: front, profile, three-quarter, or eyes closed",
        "OTS framing with any visible face"
       ],
       "common_noun_required_when": [
        "back to camera with no visible face",
        "silhouette or blurred outline only",
        "OTS with only back of head/shoulder, face entirely hidden"
       ],
       "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
       "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
      },
      "reproduction_surface_rule": {
       "applies": 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": "L03B04",
      "reference_usage": "exact_background",
      "owned_objects": [
       "bench",
       "clothesline",
       "door",
       "flyer",
       "herb leaf",
       "parapet",
       "rooftop deck",
       "rooftop room",
       "stair opening",
       "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": "scene_lighting_atmosphere",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The environment is characterized by a deep, almost monochrome blue-black ambient darkness representing the night. This cool darkness is contrasted by a faint, sickly amber light originating from inside the room, which leaks through structural gaps and casts a weak smear on surfaces.",
        "applies_to_shots": [
         5,
         6
        ],
        "element_scope": "full",
        "source_facts": [
         "Shot 5: thin blue rooftop ambient line skimming the iron while the interior remains dead black, with a trace of sickly amber leaking",
         "Shot 6: almost monochrome blue-black, broken by a weak amber practical smear"
        ],
        "visual_inferences": [
         "The interior space is illuminated by a single, dim amber practical light source that serves as a consistent visual motif linking the exterior view to the interior reflection."
        ],
        "creative_decisions": [
         "Unified the blue night ambient and the interior amber leak into a single cohesive lighting atmosphere to maintain visual continuity across entirely different camera setups."
        ],
        "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": "L03B04",
        "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"
      }
     }
    }
   }
  },
  "S10_Shot6": {
   "scene_index": 10,
   "shot_index": 6,
   "loc_ids": [
    "L03"
   ],
   "is_indoor": false,
   "bg_ids": [
    "L03B04"
   ],
   "scene_heading": "S#10. 옥탑방 / N",
   "description": "방 안 창문에 비친 그림자, 굽은 형태의 인영이 다른 사람 형상 위에 포개져 멈춘 찰나의 실루엣.",
   "characters": [],
   "staging": {
    "camera_direction": "Inside the room, the camera holds static near the side wall at shoulder height, angled so only the window glass carries the action as a reflection and the direct attack is never seen. The reflected silhouettes sit within the window frame: a bent 인영 in the upper-middle area lowers its head toward the shoulder of 사람, whose body buckles beneath it in a distorted, wavering mid-action shape.",
    "character_angles": [
     {
      "angle": "three_quarter_left",
      "body_pose": "hunched over shoulder",
      "character": "인영",
      "gaze_direction_kind": "looks_at_character",
      "gaze_target_id": "C20",
      "subject_state": "alive"
     },
     {
      "angle": "profile_left",
      "body_pose": "buckling under lunge",
      "character": "사람",
      "gaze_direction_kind": "off_screen",
      "gaze_target_id": null,
      "subject_state": "severely_injured"
     }
    ],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "midground",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "window reflection containing silhouettes",
       "screen_zone": "middle_center",
       "target_id": "",
       "target_kind": "background"
      }
     ],
     "reason": "required_background_position"
    },
    "framing_scale": "medium",
    "key_bg_elements": [
     {
      "camera_use": "Serves as the only visible surface for the attack, keeping violence indirect and distorted.",
      "directionality_class": "reflective_surface",
      "element": "room window glass",
      "orientation": "The glass reflects the bent 인영 and 사람 as warped dark silhouettes, with faint interior light streaks trembling across them.",
      "state": "closed, grimy, reflective in darkness"
     },
     {
      "camera_use": "Frames the reflection and prevents the viewer from seeing the real bodies directly.",
      "directionality_class": "directional_3d",
      "element": "window frame",
      "orientation": "The frame’s inner edges face camera and box the reflected action into a rigid rectangle.",
      "state": "old, chipped, motionless"
     },
     {
      "camera_use": "Adds low, diseased color to the reflected silhouettes.",
      "directionality_class": "directional_3d",
      "element": "dim interior practical light",
      "orientation": "The lamp’s shaded side is off-frame but its amber spill grazes the wall and window reflection.",
      "state": "on, weak, sickly amber"
     },
     {
      "camera_use": "Keeps the room claustrophobic around the window surface.",
      "directionality_class": "non_directional",
      "element": "dark side wall",
      "orientation": "",
      "state": "rough, stained, blue-gray shadowed"
     }
    ],
    "lighting_mood": "The reflected action is almost monochrome blue-black, broken by a weak amber practical smear and restrained crimson-brown shadow at the shoulder line.",
    "perception_mode": "reflection",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 10,
    "shot_index": 6,
    "subject_reference_policy": [
     {
      "policy": "generic_descriptor_allowed",
      "policy_type": "identity_reference",
      "reason": "The figure is seen only as a distorted reflected silhouette; no stable identity or outlook detail should be required.",
      "subject_id": "C19"
     },
     {
      "policy": "generic_descriptor_allowed",
      "policy_type": "identity_reference",
      "reason": "The attacked person is visible only as a vague reflected body shape, so a generic silhouette reference is more appropriate than an outlook-specific identity reference.",
      "subject_id": "C20"
     }
    ]
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "observer POV inside the room, static at shoulder height, medium framing focused purely on the window reflection",
      "t2i_prompt": "Photorealistic cinematic still. Captured at shoulder height beside a rough, stained dark side wall, a window reflection containing silhouettes is positioned in the middle-center midground. Framed by an old, chipped window, the glass reveals a warped reflection of a bent Korean adult man in three-quarter left angle, hunched over the shoulder of a Korean middle-aged woman in left profile. The woman buckles under the lunge, visibly wounded with a pained expression, her eyes looking off-screen, while the man lowers his head toward her shoulder. The scene is enveloped in a deep, almost monochrome blue-black ambient darkness, broken by a weak sickly amber practical smear that trembles across the glass, casting a restrained crimson-brown shadow at the shoulder line.",
      "outfit_assignments": [],
      "source_facts": [
       "S#10 action: '창문에 비친 그림자. 민숙을 덮쳐 어깨를 물어뜯는 듯한 모습'",
       "shot description: bent 인영 lowers its head toward the shoulder of 사람, whose body buckles beneath it in a distorted, wavering mid-action shape"
      ],
      "visual_inferences": [
       "fixed_element scene_lighting_atmosphere: deep, almost monochrome blue-black ambient darkness contrasted by a faint, sickly amber light leaking through structural gaps",
       "the physical attack is viewed entirely through the window glass reflection, maintaining indirect visual violence"
      ],
      "creative_decisions": [
       "framed the reflection tightly within the chipped window frame and adjacent dark wall to heighten the claustrophobic tension of the space",
       "emphasized the trembling amber light smear across the dark blue silhouettes to enhance the eerie occult thriller mood"
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001"
      ],
      "reference_phrase_kinds": [
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "bench",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "clothesline",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "flyer",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "herb leaf",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "parapet",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "rooftop deck",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "rooftop room",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stair opening",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "water tank",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "anchor",
        "source_phrase": "an old, chipped window"
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "f89c127f4e403768",
       "owned_hash": "43d69c13fefb7fb9",
       "camera_direction_hash": "7b8a9d47dfafb171",
       "owned_usage_hash": "5955c84772e2153e",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "window",
         "violating_phrase": "Framed by an old, chipped window",
         "reason": "The prompt describes the window as a framing device to contain the character reflections, aligning with the producer's declaration of it as an anchor reference.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "C06",
     "C04"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 10,
      "shot_index": 6
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "medium",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "Inside the room, the camera holds static near the side wall at shoulder height, angled so only the window glass carries the action as a reflection and the direct attack is never seen. The reflected silhouettes sit within the window frame: a bent 인영 in the upper-middle area lowers its head toward the shoulder of 사람, whose body buckles beneath it in a distorted, wavering mid-action shape.",
      "lighting_mood": "The reflected action is almost monochrome blue-black, broken by a weak amber practical smear and restrained crimson-brown shadow at the shoulder line.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 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": "window reflection containing silhouettes",
         "screen_zone": "middle_center",
         "target_id": "",
         "target_kind": "background"
        }
       ]
      },
      "constraints": [
       "one prompt captures one still moment",
       "do not combine full-body framing and body-part close-up in one frame",
       "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
       "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
       "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
      ]
     },
     "id_policy": {
      "allowed_base_entity_ids": [
       "C06",
       "C04"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C06",
        "outlook_id": "O08"
       },
       {
        "character_id": "C04",
        "outlook_id": "O05"
       }
      ],
      "must_use_composite_character_ids": true,
      "common_noun_required_when": [
       "a reproduced face inside any declared reproduction surface",
       "unregistered extra"
      ],
      "id_use_required_when": [
       "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
      ],
      "demographic_fallback_required": true,
      "face_identifiability_rule": {
       "use_entity_id_when": [
        "face identifiable: front, profile, three-quarter, or eyes closed",
        "OTS framing with any visible face"
       ],
       "common_noun_required_when": [
        "back to camera with no visible face",
        "silhouette or blurred outline only",
        "OTS with only back of head/shoulder, face entirely hidden"
       ],
       "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
       "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
      },
      "reproduction_surface_rule": {
       "applies": true,
       "id_use": "forbidden — generic descriptor with demographic only",
       "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
      },
      "demographic_descriptor_policy": {
       "required_on_first_appearance": true,
       "applies_to_id_forms": [
        "C##",
        "C##O##"
       ],
       "token_count_range": [
        1,
        2
       ],
       "components": {
        "ethnicity": [
         "Asian",
         "East Asian",
         "South Asian",
         "Southeast Asian",
         "Black",
         "Middle Eastern",
         "Hispanic",
         "Latina",
         "Latino",
         "Caucasian"
        ],
        "gender": [
         "man",
         "woman",
         "figure"
        ],
        "age_band": [
         "in his/her 20s",
         "in his/her 30s",
         "in his/her 40s",
         "young",
         "middle-aged",
         "elderly"
        ],
        "role_hint_from_outfit": [
         "in worker uniform",
         "in fisher workwear",
         "in detective coat",
         "in business suit"
        ]
       },
       "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
       "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
       "source_priority": [
        "visual_world_rules.region",
        "visual_world_rules.era",
        "shot context outfit hint"
       ],
       "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
       "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
      },
      "subject_reference_policy": [],
      "constraints": [
       "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
       "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
       "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
       "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
       "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject 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": "L03B04",
      "reference_usage": "exact_background",
      "owned_objects": [
       "bench",
       "clothesline",
       "door",
       "flyer",
       "herb leaf",
       "parapet",
       "rooftop deck",
       "rooftop room",
       "stair opening",
       "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": "scene_lighting_atmosphere",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The environment is characterized by a deep, almost monochrome blue-black ambient darkness representing the night. This cool darkness is contrasted by a faint, sickly amber light originating from inside the room, which leaks through structural gaps and casts a weak smear on surfaces.",
        "applies_to_shots": [
         5,
         6
        ],
        "element_scope": "full",
        "source_facts": [
         "Shot 5: thin blue rooftop ambient line skimming the iron while the interior remains dead black, with a trace of sickly amber leaking",
         "Shot 6: almost monochrome blue-black, broken by a weak amber practical smear"
        ],
        "visual_inferences": [
         "The interior space is illuminated by a single, dim amber practical light source that serves as a consistent visual motif linking the exterior view to the interior reflection."
        ],
        "creative_decisions": [
         "Unified the blue night ambient and the interior amber leak into a single cohesive lighting atmosphere to maintain visual continuity across entirely different camera setups."
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 10,
        "shot_index": 5,
        "ref_usage": "",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "background",
        "id": "L03B04",
        "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"
      }
     }
    }
   }
  },
  "S11_Shot3": {
   "scene_index": 11,
   "shot_index": 3,
   "loc_ids": [
    "L10"
   ],
   "is_indoor": false,
   "bg_ids": [
    "L10B01"
   ],
   "scene_heading": "S#11. 옥탑 방 밖 / N",
   "description": "계단 중간에 서서 심하게 코를 찡그린 수리영의 얼굴 클로즈업.",
   "characters": [
    "수리영"
   ],
   "staging": {
    "camera_direction": "Midway up the narrow concrete staircase, the camera holds static very close to 수리영 from the front-left at face height, tightening into an intense close-up that leaves only a sliver of stair texture behind her. Her nose wrinkles hard at the sudden smell, eyes lifting toward the unseen rooftop landing while her halted climb compresses her shoulders into the frame.",
    "character_angles": [
     {
      "angle": "three_quarter_left",
      "body_pose": "halted mid-stair climb",
      "character": "수리영",
      "gaze_direction_kind": "up",
      "gaze_target_id": null,
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": null,
    "framing_scale": "close",
    "key_bg_elements": [
     {
      "camera_use": "Minimal background texture that preserves the stair location without diluting the reaction.",
      "directionality_class": "directional_3d",
      "element": "narrow concrete staircase",
      "orientation": "Only the side edge and riser texture angle behind her cheek, indicating the upward path to the rooftop.",
      "state": "dark, damp, rough"
     },
     {
      "camera_use": "Creates a suffocating side boundary close to her face.",
      "directionality_class": "non_directional",
      "element": "stairwell wall",
      "orientation": "",
      "state": "stained, cold, blue-gray"
     },
     {
      "camera_use": "Suggests the unseen source direction through faint light above.",
      "directionality_class": "non_directional",
      "element": "rooftop darkness above the stairs",
      "orientation": "",
      "state": "unseen, heavy, foul implied"
     }
    ],
    "lighting_mood": "A cold blue-gray stairwell wash sculpts her face while a faint amber rooftop spill catches the bridge of her nose, making the smell reaction feel physical and ominous.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 11,
    "shot_index": 3,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Front-left static at face height, intense tight framing, cold blue-gray wash with sickly amber highlight",
      "t2i_prompt": "Photorealistic cinematic still. C01O01 in a dark active jacket, a Korean young woman in her early 20s, halted mid-stair climb, her shoulders compressed into the lower frame at a three-quarter left angle. Her face dominates the center, nose wrinkling hard in reaction to a sudden foul smell, eyes looking up toward the unseen upper landing. A cold, muted blue-gray darkness envelops the space, washing over her features, while a faint, sickly amber light spilling from above catches the bridge of her nose. [: A sliver of stained concrete stair riser and dark wall edge visible in the soft-focus background behind her cheek], leaving the rest of the environment obscured in deep shadow.",
      "outfit_assignments": [
       {
        "character_id": "C01",
        "outlook_id": "O01"
       }
      ],
      "source_facts": [
       "S#11 action: 수리영이 계단을 급히 오르다 갑자기 훅- 느껴지는 역겨운 냄새에 멈춤",
       "shot description: 계단 중간에 서서 심하게 코를 찡그린 수리영의 얼굴",
       "eyes lifting toward the unseen rooftop landing"
      ],
      "visual_inferences": [
       "fixed_element rooftop_lighting_atmosphere: The environment is enveloped in a cold, muted blue-gray darkness, with a faint sickly amber light from above.",
       "The skipped background reference requires framing to be tight enough that only a minimal frame-edge surface (stair riser and wall edge) is visible."
      ],
      "creative_decisions": [
       "Placed the sickly amber highlight specifically on the bridge of her wrinkling nose to physically ground the reaction to the smell.",
       "Compressed her shoulders into the lower frame to emphasize the sudden halt and the tension of the narrow stairwell.",
       "Replaced the forbidden L10 background ID with a generic L01 frame-edge surface description to maintain compliance while anchoring the tight framing."
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [],
      "reference_phrase_kinds": [
       "character"
      ],
      "owned_object_usage": [
       {
        "owned_token": "bicycle",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "gate",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "handrail",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "landing",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "light",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "parapet",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "wall",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "1595f5c14a127d20",
       "owned_hash": "01e82e8f25d492af",
       "camera_direction_hash": "c8ec4e868bc378d3",
       "owned_usage_hash": "000b15d2d05b67e4",
       "validator": "scene_detail_owned_objects.v1.close_skip",
       "violations": []
      }
     }
    ],
    "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": "Midway up the narrow concrete staircase, the camera holds static very close to 수리영 from the front-left at face height, tightening into an intense close-up that leaves only a sliver of stair texture behind her. Her nose wrinkles hard at the sudden smell, eyes lifting toward the unseen rooftop landing while her halted climb compresses her shoulders into the frame.",
      "lighting_mood": "A cold blue-gray stairwell wash sculpts her face while a faint amber rooftop spill catches the bridge of her nose, making the smell reaction feel physical and ominous.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": 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": "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": "rooftop_lighting_atmosphere",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The environment is enveloped in a cold, muted blue-gray darkness. Contrasting this ambient shadow, a faint and sickly amber light spills outward from the unseen or half-open rooftop door, casting an ominous and contaminated glow across the scene.",
        "applies_to_shots": [
         3,
         4
        ],
        "element_scope": "full",
        "source_facts": [
         "cold blue-gray stairwell wash (Shot 3)",
         "faint amber rooftop spill (Shot 3)",
         "Muted moon-blue darkness (Shot 4)",
         "thin sickly amber leak from inside (Shot 4)"
        ],
        "visual_inferences": [
         "The light source inside the rooftop room projects the same consistent sickly amber hue onto both the stairwell approach and the exterior landing."
        ],
        "creative_decisions": [
         "Established the cold blue ambient darkness and the amber light leak as a persistent environmental state to maintain tonal continuity between the reaction shot and the POV shot."
        ],
        "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"
      }
     }
    }
   }
  },
  "S11_Shot4": {
   "scene_index": 11,
   "shot_index": 4,
   "loc_ids": [
    "L10"
   ],
   "is_indoor": false,
   "bg_ids": [
    "L10B02"
   ],
   "scene_heading": "S#11. 옥탑 방 밖 / N",
   "description": "옥상 위, 어둠 속에 반쯤 열려 멈춰 있는 옥탑방 현관 철문의 정적 구도.",
   "characters": [],
   "staging": {
    "camera_direction": "After the hard eyeline cut, the camera adopts 수리영’s direct viewpoint from the rooftop landing, several meters from the entrance and at human eye level, facing the iron front door squarely. The half-open door is held in rigid symmetry at the center of the frame, surrounded by still rooftop darkness, with no figure entering to relieve the threat.",
    "character_angles": [],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "background",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "half-open rooftop iron door",
       "screen_zone": "middle_center",
       "target_id": "",
       "target_kind": "background"
      }
     ],
     "reason": "required_background_position"
    },
    "framing_scale": "wide",
    "key_bg_elements": [
     {
      "camera_use": "Central reveal and source of unease, held motionless after her smell reaction.",
      "directionality_class": "directional_3d",
      "element": "rooftop room iron front door",
      "orientation": "The door faces camera squarely but hangs half-open, exposing a narrow black interior gap along one side.",
      "state": "half-open, frozen, scratched"
     },
     {
      "camera_use": "Frames the doorway in isolated negative space.",
      "directionality_class": "non_directional",
      "element": "rooftop landing darkness",
      "orientation": "",
      "state": "still, damp, blue-black"
     },
     {
      "camera_use": "Adds rough domestic rooftop texture without drawing attention from the door.",
      "directionality_class": "directional_3d",
      "element": "low rooftop wall",
      "orientation": "Its top edge runs horizontally across the lower background, barely lit against the night.",
      "state": "wet-stained, concrete, motionless"
     }
    ],
    "lighting_mood": "Muted moon-blue darkness surrounds the door, with a thin sickly amber leak from inside making the opening feel contaminated rather than welcoming.",
    "perception_mode": "direct",
    "perspective": "subjective_pov",
    "pov_character": "수리영",
    "scene_index": 11,
    "shot_index": 4,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "human eye level subjective POV facing the iron front door squarely, muted moon-blue darkness with sickly amber light leak",
      "t2i_prompt": "Photorealistic cinematic still. The half-open rooftop iron door is positioned in the middle-center background, viewed squarely from a direct eye-level subjective viewpoint across the damp landing. The environment is enveloped in a cold, muted blue-gray darkness. Contrasting this ambient shadow, a faint and sickly amber light spills outward from the black interior gap along one side of the door, casting an ominous and contaminated glow across the wet-stained concrete wall and the horizontal edge of the low parapet in the lower frame. The camera focuses entirely on the motionless threshold, isolating the doorway within the silent negative space of the rooftop.",
      "outfit_assignments": [],
      "source_facts": [
       "S#11 action: '옥상에 올라와 보니 반쯤 열린 현관 철문.'",
       "shot description: subjective POV facing the iron front door squarely, held in rigid symmetry."
      ],
      "visual_inferences": [
       "fixed_element rooftop_lighting_atmosphere: cold, muted blue-gray darkness with a faint and sickly amber light spilling outward from the half-open door",
       "The subjective POV isolates the doorway to emphasize the motionless threat and the contaminated smell mentioned in the script."
      ],
      "creative_decisions": [
       "Utilized stark negative space and blue-black shadows to frame the sickly amber doorway at the center of the image, maintaining the precise background established in the prior shot."
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001"
      ],
      "reference_phrase_kinds": [
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "alley",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "clothesline post",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "anchor",
        "source_phrase": "half-open rooftop iron door"
       },
       {
        "owned_token": "landing",
        "usage_kind": "anchor",
        "source_phrase": "damp landing"
       },
       {
        "owned_token": "light fixture",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "parapet",
        "usage_kind": "anchor",
        "source_phrase": "low parapet"
       },
       {
        "owned_token": "stair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "threshold",
        "usage_kind": "anchor",
        "source_phrase": "motionless threshold"
       },
       {
        "owned_token": "wall",
        "usage_kind": "anchor",
        "source_phrase": "wet-stained concrete wall"
       },
       {
        "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": "1c0499c328e27796",
       "owned_hash": "801b9bc7302fbc1c",
       "camera_direction_hash": "6cb1f1454428fd50",
       "owned_usage_hash": "cd354c7a1b5fc216",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "door",
         "violating_phrase": "half-open rooftop iron door is positioned in the middle-center background",
         "reason": "The door is mentioned as the central focal point of the shot to align the composition, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "landing",
         "violating_phrase": "across the damp landing",
         "reason": "The landing is referred to as a spatial reference for the camera's viewpoint, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "wall",
         "violating_phrase": "wet-stained concrete wall",
         "reason": "The wall is mentioned only to describe how the light from the door spills across it, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "parapet",
         "violating_phrase": "low parapet",
         "reason": "The parapet is described as receiving the spilling light to anchor the lower frame composition, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "threshold",
         "violating_phrase": "motionless threshold",
         "reason": "The threshold is mentioned to specify the focus point of the camera, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "L03"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 11,
      "shot_index": 4
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "wide",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "After the hard eyeline cut, the camera adopts 수리영’s direct viewpoint from the rooftop landing, several meters from the entrance and at human eye level, facing the iron front door squarely. The half-open door is held in rigid symmetry at the center of the frame, surrounded by still rooftop darkness, with no figure entering to relieve the threat.",
      "lighting_mood": "Muted moon-blue darkness surrounds the door, with a thin sickly amber leak from inside making the opening feel contaminated rather than welcoming.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": {
       "reason": "required_background_position",
       "constraints": [
        {
         "constraint_id": "fsc_001",
         "depth_plane": "background",
         "gesture_action": "none",
         "gesture_target_label": "",
         "label": "half-open rooftop iron door",
         "screen_zone": "middle_center",
         "target_id": "",
         "target_kind": "background"
        }
       ]
      },
      "constraints": [
       "one prompt captures one still moment",
       "do not combine full-body framing and body-part close-up in one frame",
       "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
       "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
       "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
      ]
     },
     "id_policy": {
      "allowed_base_entity_ids": [
       "L03"
      ],
      "allowed_outlook_pairs": [],
      "must_use_composite_character_ids": true,
      "common_noun_required_when": [
       "a reproduced face inside any declared reproduction surface",
       "unregistered extra"
      ],
      "id_use_required_when": [
       "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
      ],
      "demographic_fallback_required": true,
      "face_identifiability_rule": {
       "use_entity_id_when": [
        "face identifiable: front, profile, three-quarter, or eyes closed",
        "OTS framing with any visible face"
       ],
       "common_noun_required_when": [
        "back to camera with no visible face",
        "silhouette or blurred outline only",
        "OTS with only back of head/shoulder, face entirely hidden"
       ],
       "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
       "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
      },
      "reproduction_surface_rule": {
       "applies": false,
       "id_use": "forbidden — generic descriptor with demographic only",
       "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
      },
      "demographic_descriptor_policy": {
       "required_on_first_appearance": true,
       "applies_to_id_forms": [
        "C##",
        "C##O##"
       ],
       "token_count_range": [
        1,
        2
       ],
       "components": {
        "ethnicity": [
         "Asian",
         "East Asian",
         "South Asian",
         "Southeast Asian",
         "Black",
         "Middle Eastern",
         "Hispanic",
         "Latina",
         "Latino",
         "Caucasian"
        ],
        "gender": [
         "man",
         "woman",
         "figure"
        ],
        "age_band": [
         "in his/her 20s",
         "in his/her 30s",
         "in his/her 40s",
         "young",
         "middle-aged",
         "elderly"
        ],
        "role_hint_from_outfit": [
         "in worker uniform",
         "in fisher workwear",
         "in detective coat",
         "in business suit"
        ]
       },
       "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
       "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
       "source_priority": [
        "visual_world_rules.region",
        "visual_world_rules.era",
        "shot context outfit hint"
       ],
       "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
       "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
      },
      "subject_reference_policy": [],
      "constraints": [
       "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
       "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
       "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
       "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
       "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
      ]
     },
     "background_binding": {
      "mode": "background_ref_attached",
      "bg_id": "L10B02",
      "reference_usage": "exact_background",
      "owned_objects": [
       "alley",
       "clothesline post",
       "door",
       "landing",
       "light fixture",
       "parapet",
       "stair",
       "threshold",
       "wall",
       "water tank",
       "window"
      ],
      "camera_reference": null,
      "close_framing_skips_background_ref": false,
      "constraints": [
       "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
       "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
      ]
     },
     "continuity_elements_used": {
      "fixed_elements": [
       {
        "element_id": "rooftop_lighting_atmosphere",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The environment is enveloped in a cold, muted blue-gray darkness. Contrasting this ambient shadow, a faint and sickly amber light spills outward from the unseen or half-open rooftop door, casting an ominous and contaminated glow across the scene.",
        "applies_to_shots": [
         3,
         4
        ],
        "element_scope": "full",
        "source_facts": [
         "cold blue-gray stairwell wash (Shot 3)",
         "faint amber rooftop spill (Shot 3)",
         "Muted moon-blue darkness (Shot 4)",
         "thin sickly amber leak from inside (Shot 4)"
        ],
        "visual_inferences": [
         "The light source inside the rooftop room projects the same consistent sickly amber hue onto both the stairwell approach and the exterior landing."
        ],
        "creative_decisions": [
         "Established the cold blue ambient darkness and the amber light leak as a persistent environmental state to maintain tonal continuity between the reaction shot and the POV shot."
        ],
        "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": "background",
        "id": "L10B02",
        "policy": "required"
       }
      ],
      "forbidden_refs": [],
      "readiness_policy": "block_if_missing",
      "constraints": [
       "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
       "if a required character_outlook ref is missing, scene image generation must block before the image stage"
      ]
     },
     "render_contracts": [],
     "_card_metadata": {
      "lift_status": {
       "rule_a_lifted": true,
       "rule_c_lifted": true,
       "rule_e_lifted": false,
       "rule_h_lifted": true,
       "id_policy_composite_lifted": true,
       "id_policy_close_framing_face_lifted": true,
       "id_policy_reproduction_surface_lifted": true,
       "continuity_cross_shot_id_substitution_lifted": true,
       "continuity_ref_usage_constraints_lifted": true,
       "continuity_view_consistency_lifted": true,
       "continuity_constraints_extended": true,
       "spatial_camera_frame_lifted": true,
       "spatial_fg_bg_shared_anchor_lifted": true,
       "spatial_primary_framing_lifted": true,
       "spatial_constraints_extended": true
      },
      "rule_source": {
       "camera_rule": "A",
       "owned_rule": "C",
       "close_skip_rule": "E",
       "demographic_rule": "H",
       "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
       "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
       "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
       "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
       "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
       "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
       "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
       "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
       "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
      }
     }
    }
   }
  },
  "S12_Shot15": {
   "scene_index": 12,
   "shot_index": 15,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B06"
   ],
   "scene_heading": "S#12. 옥탑방 안 / N",
   "description": "침대 위 어두운 벽면에 피가 번지듯 선명한 붉은색 원형 표식이 그려진 상태의 정지 구도.",
   "characters": [],
   "staging": {
    "camera_direction": "From low bedside height near the mattress edge, the camera completes its upward tilt and locks off on the dark wall above the bed, where a completed red circular mark sits in the upper middle of frame. The bed edge remains only as a thin lower strip for scale, while the wall becomes an oppressive flat plane; this is aligned with 수리영’s panicked perception, the image subtly treated as an occult hallucination rather than stable reality.",
    "character_angles": [],
    "frame_spatial_contract": null,
    "framing_scale": "medium",
    "key_bg_elements": [
     {
      "camera_use": "Primary occult surface holding the completed mark.",
      "directionality_class": "content_surface",
      "element": "dark wall above the bed",
      "orientation": "The camera-facing wall face is visible, carrying a vivid red circular mark at its center.",
      "state": "dark, stained-looking, marked"
     },
     {
      "camera_use": "Lower frame scale reference beneath the wall.",
      "directionality_class": "directional_3d",
      "element": "bed edge",
      "orientation": "The side edge of the mattress faces the camera from below, cropped into a narrow horizontal band.",
      "state": "dim, still, partly obscured"
     },
     {
      "camera_use": "Symbolic focal mark on the wall.",
      "directionality_class": "content_surface",
      "element": "red circular mark",
      "orientation": "The painted-looking face of the circle is fully visible to the camera, as if freshly drawn into the wall surface.",
      "state": "bright red, wet-looking, completed"
     }
    ],
    "lighting_mood": "The room falls into blue-black shadow while the red circle seems to bleed its own sick crimson glow against faint amber residue from off-screen practical light.",
    "perception_mode": "hallucination",
    "perspective": "subjective_pov",
    "pov_character": "수리영",
    "scene_index": 12,
    "shot_index": 15,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Low bedside subjective POV, locking onto the wall with hallucinatory crimson and cold blue-gray contrast",
      "t2i_prompt": "Photorealistic cinematic still. Captured from a low height near the mattress, looking upward at the dark bedroom wall dominating the frame as an oppressive flat plane. The bed edge is visible only as a thin horizontal strip along the lower frame boundary for scale. Centered on the wall is P03, a vivid, wet-looking red circular mark. The mark appears freshly completed, its empty center clearly exposed to the camera, bleeding its own sick crimson glow into the textured surface. The room is enveloped in deep, cold blue-gray darkness, heavy shadows swallowing the periphery. A weak, sickly amber light from an off-screen practical source casts faint, hallucinatory highlights across the dark wall.",
      "outfit_assignments": [],
      "source_facts": [
       "침대 위 어두운 벽면에 피가 번지듯 선명한 붉은색 원형 표식이 그려진 상태",
       "침대 위 벽에 붉은 원이 생겨난다",
       "소름끼치는 환각적 시점"
      ],
      "visual_inferences": [
       "fixed_element bedroom_dim_lighting: deep cold blue-gray darkness with sickly amber spill",
       "Subjective POV of Su Ri-young is achieved by framing from a low angle near the bed without showing her body",
       "The center of P03 is left visibly empty to accommodate the future zoom-in detail of the photograph"
      ],
      "creative_decisions": [
       "Used a thin strip of the bed at the lower edge to establish the low camera height and emphasize the oppressive scale of the wall",
       "Applied a hallucinatory color grade, contrasting the bleeding crimson glow of the mark against the cold blue-black shadows"
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [],
      "reference_phrase_kinds": [
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "TV",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "bed",
        "usage_kind": "anchor",
        "source_phrase": "The bed edge is visible only as a thin horizontal strip along the lower frame boundary"
       },
       {
        "owned_token": "chair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "counter",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "cup",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "curtain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "footprint",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "mark",
        "usage_kind": "redraw",
        "source_phrase": "red circular mark"
       },
       {
        "owned_token": "pot",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stand",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stove",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "wall",
        "usage_kind": "anchor",
        "source_phrase": "dark bedroom wall dominating the frame"
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "8b0e779f60d4e11f",
       "owned_hash": "ce439e241e99e1fa",
       "camera_direction_hash": "c0cde3dc1ce483a8",
       "owned_usage_hash": "8b5b7d8aa8c634da",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "bed",
         "violating_phrase": "The bed edge is visible only as a thin horizontal strip along the lower frame boundary for scale.",
         "reason": "The bed is used purely as a spatial anchor and scale reference, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "wall",
         "violating_phrase": "dark bedroom wall dominating the frame as an oppressive flat plane",
         "reason": "The wall is referred to as the pre-existing background surface to establish the camera perspective and anchor the composition.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "mark",
         "violating_phrase": "vivid, wet-looking red circular mark. The mark appears freshly completed, its empty center clearly exposed to the camera, bleeding its own sick crimson glow",
         "reason": "The rendering of the mark as freshly completed and glowing is permitted under Exception 1, as it is structurally required by the shot intent ('원형 표식이 환각처럼 완성되어 빛을 발하는 순간').",
         "verdict": "allowed_visual_state_change"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "P03",
     "L04"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 12,
      "shot_index": 15
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "medium",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "From low bedside height near the mattress edge, the camera completes its upward tilt and locks off on the dark wall above the bed, where a completed red circular mark sits in the upper middle of frame. The bed edge remains only as a thin lower strip for scale, while the wall becomes an oppressive flat plane; this is aligned with 수리영’s panicked perception, the image subtly treated as an occult hallucination rather than stable reality.",
      "lighting_mood": "The room falls into blue-black shadow while the red circle seems to bleed its own sick crimson glow against faint amber residue from off-screen practical light.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": 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": [
       "P03",
       "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": 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": "L04B06",
      "reference_usage": "exact_background",
      "owned_objects": [
       "TV",
       "bed",
       "chair",
       "counter",
       "cup",
       "curtain",
       "door",
       "footprint",
       "mark",
       "pot",
       "stain",
       "stand",
       "stove",
       "table",
       "wall",
       "window"
      ],
      "camera_reference": {
       "camera_position": "near number 15 (small bedroom door), looking from number 3 (shared area) into number 13 (small bedroom) toward number 16 (curtained window) and number 14 (bed)",
       "camera_height": "eye-level standing ~1.6m",
       "lens_hint": "28mm wide angle",
       "framing_notes": "show the route from the living table to the small bedroom: number 23 television glow, number 25 cooled pot, number 26 tea cups, number 27 floor stains, number 28 trail to curtain, number 29 behind curtain, and number 30 wall circle"
      },
      "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); do not enumerate forbidden phrasings here",
       "camera_reference specifies the framing under which the background was painted — match camera_position, camera_height, and framing",
       "if deviating from the reference framing (push-in, angle shift, ECU), state the deviation explicitly so the compositor can account for the scale difference"
      ]
     },
     "continuity_elements_used": {
      "fixed_elements": [
       {
        "element_id": "bedroom_dim_lighting",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior of the bedroom is enveloped in deep, cold blue-gray darkness. A weak, sickly amber light spills from an off-screen practical source, creating faint highlights against the heavy, oppressive shadows that swallow the room's edges and background.",
        "applies_to_shots": [
         4,
         8,
         15
        ],
        "element_scope": "full",
        "source_facts": [
         "Muted blue-gray shadows swallow the room while a sickly amber spill from the living area catches the wet blood",
         "Cold blue darkness wraps her face while a weak amber practical glints",
         "The room falls into blue-black shadow while the red circle seems to bleed... against faint amber residue from off-screen practical light."
        ],
        "visual_inferences": [
         "The consistent combination of cold blue shadows and weak amber spill serves as a unifying environmental condition that ties the separate physical locations (floor, close-up face, wall) into the same dark space."
        ],
        "creative_decisions": [
         "Maintaining a high-contrast, low-key lighting scheme where the background is almost entirely lost in darkness, using the sickly amber light to accentuate the horror elements without illuminating the whole room."
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 12,
        "shot_index": 4,
        "ref_usage": "atmosphere_reference",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [
       {
        "scene_index": 25,
        "shot_index": 4,
        "description": "붉은 원 한가운데에 피가 묻은 낡은 흑백 사진이 꽂혀 있는 클로즈업.",
        "keep_elements": [
         {
          "label": "bedroom wall surface",
          "kind": "environment",
          "subject_kind": "non_human_visual_element"
         }
        ]
       }
      ],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "background",
        "id": "L04B06",
        "policy": "required"
       }
      ],
      "forbidden_refs": [],
      "readiness_policy": "block_if_missing",
      "constraints": [
       "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
       "if a required character_outlook ref is missing, scene image generation must block before the image stage"
      ]
     },
     "render_contracts": [],
     "_card_metadata": {
      "lift_status": {
       "rule_a_lifted": true,
       "rule_c_lifted": true,
       "rule_e_lifted": false,
       "rule_h_lifted": true,
       "id_policy_composite_lifted": true,
       "id_policy_close_framing_face_lifted": true,
       "id_policy_reproduction_surface_lifted": true,
       "continuity_cross_shot_id_substitution_lifted": true,
       "continuity_ref_usage_constraints_lifted": true,
       "continuity_view_consistency_lifted": true,
       "continuity_constraints_extended": true,
       "spatial_camera_frame_lifted": true,
       "spatial_fg_bg_shared_anchor_lifted": true,
       "spatial_primary_framing_lifted": true,
       "spatial_constraints_extended": true
      },
      "rule_source": {
       "camera_rule": "A",
       "owned_rule": "C",
       "close_skip_rule": "E",
       "demographic_rule": "H",
       "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
       "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
       "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
       "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
       "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
       "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
       "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
       "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
       "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
      }
     }
    }
   }
  },
  "S12_Shot4": {
   "scene_index": 12,
   "shot_index": 4,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B06"
   ],
   "scene_heading": "S#12. 옥탑방 안 / N",
   "description": "열린 방문 틈으로 보이는 방바닥에 검붉은 핏자국이 흥건하게 고여 있는 정지 구도.",
   "characters": [],
   "staging": {
    "camera_direction": "From the low waist-height position outside the bedroom doorway, the camera holds completely still about three feet back, peering through the opened door gap toward the dark red blood pooled on the floor just beyond the threshold. The door edges form a narrow vertical frame on both sides, with the blood occupying the lower middle of the image and the dim bedroom receding into blue-gray darkness behind it; this is a neutral observer’s direct view, not a character POV.",
    "character_angles": [],
    "frame_spatial_contract": null,
    "framing_scale": "close",
    "key_bg_elements": [
     {
      "camera_use": "Foreground framing device that restricts the view into the room.",
      "directionality_class": "directional_3d",
      "element": "opened bedroom door",
      "orientation": "The inner edge of the door faces the camera at an oblique angle, creating a narrow gap into the room.",
      "state": "open, still, shadowed"
     },
     {
      "camera_use": "Primary visual focus on the floor just inside the doorway.",
      "directionality_class": "non_directional",
      "element": "dark red blood pool",
      "orientation": "",
      "state": "wet, thick, spread across the floor"
     },
     {
      "camera_use": "Texture under the blood and scale reference for the room.",
      "directionality_class": "non_directional",
      "element": "bedroom floor",
      "orientation": "",
      "state": "dirty, damp-looking, partially covered by blood"
     }
    ],
    "lighting_mood": "Muted blue-gray shadows swallow the room while a sickly amber spill from the living area catches the wet blood with restrained crimson highlights.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 12,
    "shot_index": 4,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Close framing from a low waist-height position outside a doorway, peering through a narrow vertical gap with cold blue-gray darkness and sickly amber spill.",
      "t2i_prompt": "Photorealistic cinematic still. Focus on the thick, dark red blood pooled on the damp floor in the lower-middle frame. [L04: Opened bedroom door edges form a narrow vertical frame on both the left and right sides from a low waist-height observer position just outside the threshold.] The interior of the bedroom beyond the blood recedes into deep, cold blue-gray darkness. A weak, sickly amber light spills from an off-screen practical source, creating faint restrained crimson highlights on the wet blood surface against the heavy, oppressive shadows that swallow the background.",
      "outfit_assignments": [],
      "source_facts": [
       "S#12 action: '바닥에 흥건한 혈흔.'",
       "shot description: opened bedroom door, dark red blood pool on the floor, neutral observer's direct view from low waist-height"
      ],
      "visual_inferences": [
       "fixed_element bedroom_dim_lighting: interior enveloped in deep, cold blue-gray darkness with a weak amber spill",
       "Blood occupies the lower middle of the frame due to the low waist-height perspective"
      ],
      "creative_decisions": [
       "Utilized door edges on both sides to form a narrow vertical frame, isolating the blood pool for a tight, voyeuristic glimpse",
       "Applied restrained crimson highlights on the blood to contrast against the cold blue-gray shadows, emphasizing the horror tone"
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [],
      "reference_phrase_kinds": [
       "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": "counter",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "cup",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "curtain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "footprint",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "mark",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "pot",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stand",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stove",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "wall",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "16e57a092e6c19a9",
       "owned_hash": "ce439e241e99e1fa",
       "camera_direction_hash": "8d66bcb388cf5337",
       "owned_usage_hash": "ad323abe664cd091",
       "validator": "scene_detail_owned_objects.v1.close_skip",
       "violations": []
      }
     }
    ],
    "visible_entities": [
     "L04"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 12,
      "shot_index": 4
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "close",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "From the low waist-height position outside the bedroom doorway, the camera holds completely still about three feet back, peering through the opened door gap toward the dark red blood pooled on the floor just beyond the threshold. The door edges form a narrow vertical frame on both sides, with the blood occupying the lower middle of the image and the dim bedroom receding into blue-gray darkness behind it; this is a neutral observer’s direct view, not a character POV.",
      "lighting_mood": "Muted blue-gray shadows swallow the room while a sickly amber spill from the living area catches the wet blood with restrained crimson highlights.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": null,
      "constraints": [
       "one prompt captures one still moment",
       "do not combine full-body framing and body-part close-up in one frame",
       "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
       "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
       "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
      ]
     },
     "id_policy": {
      "allowed_base_entity_ids": [
       "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": "skipped_close_framing",
      "bg_id": "L04B06",
      "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": "bedroom_dim_lighting",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior of the bedroom is enveloped in deep, cold blue-gray darkness. A weak, sickly amber light spills from an off-screen practical source, creating faint highlights against the heavy, oppressive shadows that swallow the room's edges and background.",
        "applies_to_shots": [
         4,
         8,
         15
        ],
        "element_scope": "full",
        "source_facts": [
         "Muted blue-gray shadows swallow the room while a sickly amber spill from the living area catches the wet blood",
         "Cold blue darkness wraps her face while a weak amber practical glints",
         "The room falls into blue-black shadow while the red circle seems to bleed... against faint amber residue from off-screen practical light."
        ],
        "visual_inferences": [
         "The consistent combination of cold blue shadows and weak amber spill serves as a unifying environmental condition that ties the separate physical locations (floor, close-up face, wall) into the same dark space."
        ],
        "creative_decisions": [
         "Maintaining a high-contrast, low-key lighting scheme where the background is almost entirely lost in darkness, using the sickly amber light to accentuate the horror elements without illuminating the whole room."
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 5,
        "shot_index": 3,
        "ref_usage": "",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [],
      "forbidden_refs": [
       {
        "kind": "background",
        "reason": "close framing skips chain_bg reference"
       }
      ],
      "readiness_policy": "skipped_by_policy",
      "constraints": [
       "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
       "if a required character_outlook ref is missing, scene image generation must block before the image stage"
      ]
     },
     "render_contracts": [],
     "_card_metadata": {
      "lift_status": {
       "rule_a_lifted": true,
       "rule_c_lifted": true,
       "rule_e_lifted": true,
       "rule_h_lifted": true,
       "id_policy_composite_lifted": true,
       "id_policy_close_framing_face_lifted": true,
       "id_policy_reproduction_surface_lifted": true,
       "continuity_cross_shot_id_substitution_lifted": true,
       "continuity_ref_usage_constraints_lifted": true,
       "continuity_view_consistency_lifted": true,
       "continuity_constraints_extended": true,
       "spatial_camera_frame_lifted": true,
       "spatial_fg_bg_shared_anchor_lifted": true,
       "spatial_primary_framing_lifted": true,
       "spatial_constraints_extended": true
      },
      "rule_source": {
       "camera_rule": "A",
       "owned_rule": "C",
       "close_skip_rule": "E",
       "demographic_rule": "H",
       "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
       "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
       "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
       "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
       "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
       "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
       "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
       "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
       "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
      }
     }
    }
   }
  },
  "S12_Shot8": {
   "scene_index": 12,
   "shot_index": 8,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B06"
   ],
   "scene_heading": "S#12. 옥탑방 안 / N",
   "description": "두 눈을 크게 뜨고 입을 벌린 채 굳어버린 수리영의 창백한 얼굴 클로즈업.",
   "characters": [
    "수리영"
   ],
   "staging": {
    "camera_direction": "At eye level directly in front of 수리영, the handheld camera compresses tighter than the stage distance until her pale face nearly fills the frame, backing away only a fraction as her shock freezes mid-recoil. The background is almost lost in darkness, with only a faint suggestion of the room’s black edges behind her; the view remains a direct observer angle, but the proximity feels invasive and breathless.",
    "character_angles": [
     {
      "angle": "facing_camera",
      "body_pose": "frozen mid-recoil",
      "character": "수리영",
      "gaze_direction_kind": "distant",
      "gaze_target_id": null,
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "foreground",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "수리영 terrified face",
       "screen_zone": "middle_center",
       "target_id": "C01",
       "target_kind": "character"
      }
     ],
     "reason": "primary_subject_isolation"
    },
    "framing_scale": "close",
    "key_bg_elements": [
     {
      "camera_use": "Nearly swallowed background plane behind her face.",
      "directionality_class": "non_directional",
      "element": "dark bedroom recess",
      "orientation": "",
      "state": "unlit, indistinct"
     },
     {
      "camera_use": "Soft edge shadow that isolates her head from the room.",
      "directionality_class": "directional_3d",
      "element": "bedroom doorway edge",
      "orientation": "A narrow side edge catches minimal spill light behind her shoulder.",
      "state": "partially visible, shadowed"
     }
    ],
    "lighting_mood": "Cold blue darkness wraps her face while a weak amber practical glints in her widened eyes, leaving her skin drained and waxy.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 12,
    "shot_index": 8,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Eye level tight close-up compressing the subject, handheld invasive proximity, with cold blue shadows and weak amber glints.",
      "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual dark jacket, a Korean young woman with an oval face and natural black long hair, occupies the middle-center foreground. Facing the camera and frozen mid-recoil, her terrified face nearly fills the frame, gazing into the distance with eyes wide open and mouth slightly agape. Cold blue darkness wraps her waxy skin, while a weak, sickly amber practical light glints in her widened pupils. [: A narrow, shadowed bedroom doorway edge is faintly visible behind her shoulder, completely swallowed by heavy, oppressive blue-gray darkness].",
      "outfit_assignments": [
       {
        "character_id": "C01",
        "outlook_id": "O01"
       }
      ],
      "source_facts": [
       "S12 action: 수리영 (놀라 뒤로 주춤) 어-어-어- 엄마….",
       "shot description: Close-up of Su-ri-young's pale face frozen in shock mid-recoil, eyes wide open, mouth agape."
      ],
      "visual_inferences": [
       "fixed_element bedroom_dim_lighting: interior is enveloped in deep, cold blue-gray darkness with a weak amber practical spill.",
       "The handheld camera feels breathless and invasive, filling the frame with her face to isolate her psychological terror."
      ],
      "creative_decisions": [
       "Used tight middle-center framing for the face to emphasize shock as dictated by the frame spatial contract.",
       "Applied waxy skin texture and amber eye-glints against cold blue ambient light to enhance the visceral horror tone."
      ],
      "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": "bed",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "chair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "counter",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "cup",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "curtain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "footprint",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "mark",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "pot",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stand",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stove",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "wall",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "97f6692aa887af39",
       "owned_hash": "ce439e241e99e1fa",
       "camera_direction_hash": "7833af5a85b781a6",
       "owned_usage_hash": "ad323abe664cd091",
       "validator": "scene_detail_owned_objects.v1.close_skip",
       "violations": []
      }
     }
    ],
    "visible_entities": [
     "C01"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 12,
      "shot_index": 8
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "close",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "At eye level directly in front of 수리영, the handheld camera compresses tighter than the stage distance until her pale face nearly fills the frame, backing away only a fraction as her shock freezes mid-recoil. The background is almost lost in darkness, with only a faint suggestion of the room’s black edges behind her; the view remains a direct observer angle, but the proximity feels invasive and breathless.",
      "lighting_mood": "Cold blue darkness wraps her face while a weak amber practical glints in her widened eyes, leaving her skin drained and waxy.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": {
       "reason": "primary_subject_isolation",
       "constraints": [
        {
         "constraint_id": "fsc_001",
         "depth_plane": "foreground",
         "gesture_action": "none",
         "gesture_target_label": "",
         "label": "수리영 terrified face",
         "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": "L04B06",
      "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": "bedroom_dim_lighting",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior of the bedroom is enveloped in deep, cold blue-gray darkness. A weak, sickly amber light spills from an off-screen practical source, creating faint highlights against the heavy, oppressive shadows that swallow the room's edges and background.",
        "applies_to_shots": [
         4,
         8,
         15
        ],
        "element_scope": "full",
        "source_facts": [
         "Muted blue-gray shadows swallow the room while a sickly amber spill from the living area catches the wet blood",
         "Cold blue darkness wraps her face while a weak amber practical glints",
         "The room falls into blue-black shadow while the red circle seems to bleed... against faint amber residue from off-screen practical light."
        ],
        "visual_inferences": [
         "The consistent combination of cold blue shadows and weak amber spill serves as a unifying environmental condition that ties the separate physical locations (floor, close-up face, wall) into the same dark space."
        ],
        "creative_decisions": [
         "Maintaining a high-contrast, low-key lighting scheme where the background is almost entirely lost in darkness, using the sickly amber light to accentuate the horror elements without illuminating the whole room."
        ],
        "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": "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"
      }
     }
    }
   }
  },
  "S13_Shot3": {
   "scene_index": 13,
   "shot_index": 3,
   "loc_ids": [
    "L03"
   ],
   "is_indoor": false,
   "bg_ids": [
    "L03B03"
   ],
   "scene_heading": "S#13. 옥탑방 외곽 / N",
   "description": "차에서 내린 혜수가 초점 없는 눈으로 멍하게 서 있는 수리영을 향해 시선을 고정한 찰나의 상체.",
   "characters": [
    "혜수",
    "수리영"
   ],
   "staging": {
    "camera_direction": "Beside the police car at chest height, the tracking move slows into a held upper-body frame on 혜수 as she has just stepped out, her body paused between the car and the alley. 수리영 appears farther down the alley in soft background focus, small and blank beneath flashing siren wash, while 혜수 occupies the left foreground in a tense three-quarter view; this is a direct observer view moving parallel with her discovery.",
    "character_angles": [
     {
      "angle": "three_quarter_right",
      "body_pose": "half-stepping from car",
      "character": "혜수",
      "gaze_direction_kind": "looks_at_character",
      "gaze_target_id": "C01",
      "subject_state": "alive"
     },
     {
      "angle": "three_quarter_left",
      "body_pose": "stalled mid-alley",
      "character": "수리영",
      "gaze_direction_kind": "distant",
      "gaze_target_id": null,
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "foreground",
       "gesture_action": "looks_toward",
       "gesture_target_label": "수리영 down the alley",
       "label": "혜수 by police car",
       "screen_zone": "middle_left",
       "target_id": "C02",
       "target_kind": "character"
      },
      {
       "depth_plane": "background",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "수리영 in alley",
       "screen_zone": "middle_right",
       "target_id": "C01",
       "target_kind": "character"
      }
     ],
     "reason": "shared_space_relation"
    },
    "framing_scale": "medium",
    "key_bg_elements": [
     {
      "camera_use": "Foreground context and flashing light source beside 혜수.",
      "directionality_class": "directional_3d",
      "element": "police car",
      "orientation": "The side of the car and open door angle toward the camera, framing 혜수’s exit.",
      "state": "parked, door open, siren lights active"
     },
     {
      "camera_use": "Depth corridor between 혜수 and 수리영.",
      "directionality_class": "directional_3d",
      "element": "narrow alley",
      "orientation": "The alley recedes diagonally from the police car toward 수리영 in the background.",
      "state": "wet, dark, foggy"
     },
     {
      "camera_use": "Intermittent color wash across faces and walls.",
      "directionality_class": "non_directional",
      "element": "siren light spill",
      "orientation": "",
      "state": "flashing red-blue across damp surfaces"
     }
    ],
    "lighting_mood": "Strobing police red-blue cuts through damp fog, mixing with dirty amber streetlight and cold coastal shadows.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 13,
    "shot_index": 3,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Medium chest-height tracking shot slowing to a held upper-body frame, strobing police lights cutting through damp fog",
      "t2i_prompt": "Photorealistic cinematic still. C02O03 in a detective coat, an Asian middle-aged woman with mature facial features and dark natural hair by the police car, occupies the middle-left foreground, looking toward a young Asian woman down the alley in the background across the same damp exterior alleyway they both occupy. C02O03 stands at a three-quarter angle from the right, upper body in frame at chest height, half-stepping from the parked vehicle, eyes fixed on the distant figure. The young Asian woman is softly focused in the rear, standing at a three-quarter angle from the left, stalled mid-alley, gazing into the distance. [L03: A damp exterior alleyway shrouded in cold misty fog and deep shadows, illuminated by strobing red and blue lights mixing with a weak amber street lamp to create colored reflections on the wet surfaces.] The open police vehicle side angles toward the camera on the left, framing C02O03's exit.",
      "outfit_assignments": [
       {
        "character_id": "C02",
        "outlook_id": "O03"
       }
      ],
      "source_facts": [
       "Shot 3: 차에서 내린 혜수가 초점 없는 눈으로 멍하게 서 있는 수리영을 향해 시선을 고정한 찰나의 상체.",
       "S#13 action: 차에서 내린 혜수(40대 중반, 여자, 경위) 초점을 잃고 멍하니 서있는 수리영의 모습을 발견하고 달려간다."
      ],
      "visual_inferences": [
       "fixed_element alley_fog_and_siren_lighting: damp exterior alleyway shrouded in cold misty fog, flashing red-blue police sirens mixing with weak amber street lamp",
       "C02 half-stepping out of the police vehicle with tense facial expression to capture the sudden encounter"
      ],
      "creative_decisions": [
       "Medium framing at chest height with the police vehicle framing C02O03 to anchor the observer's perspective",
       "Soft background focus on the distant figure to emphasize the spatial depth and psychological shock"
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001"
      ],
      "reference_phrase_kinds": [
       "character",
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "bench",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "clothesline",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "emergency light",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "parapet",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "rooftop deck",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "rooftop room",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "slipper",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "water tank",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "f687f00414b8ff3b",
       "owned_hash": "1bbf7175e6633836",
       "camera_direction_hash": "525d50bc961a0ac8",
       "owned_usage_hash": "16aaa93f1e84107d",
       "validator": "scene_detail_owned_objects.v1",
       "violations": []
      }
     }
    ],
    "visible_entities": [
     "C02",
     "L03"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 13,
      "shot_index": 3
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "medium",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "Beside the police car at chest height, the tracking move slows into a held upper-body frame on 혜수 as she has just stepped out, her body paused between the car and the alley. 수리영 appears farther down the alley in soft background focus, small and blank beneath flashing siren wash, while 혜수 occupies the left foreground in a tense three-quarter view; this is a direct observer view moving parallel with her discovery.",
      "lighting_mood": "Strobing police red-blue cuts through damp fog, mixing with dirty amber streetlight and cold coastal shadows.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": {
       "reason": "shared_space_relation",
       "constraints": [
        {
         "constraint_id": "fsc_001",
         "depth_plane": "foreground",
         "gesture_action": "looks_toward",
         "gesture_target_label": "수리영 down the alley",
         "label": "혜수 by police car",
         "screen_zone": "middle_left",
         "target_id": "C02",
         "target_kind": "character"
        }
       ]
      },
      "constraints": [
       "one prompt captures one still moment",
       "do not combine full-body framing and body-part close-up in one frame",
       "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
       "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
       "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
      ]
     },
     "id_policy": {
      "allowed_base_entity_ids": [
       "C02",
       "L03"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C02",
        "outlook_id": "O03"
       }
      ],
      "must_use_composite_character_ids": true,
      "common_noun_required_when": [
       "a reproduced face inside any declared reproduction surface",
       "unregistered extra"
      ],
      "id_use_required_when": [
       "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
      ],
      "demographic_fallback_required": true,
      "face_identifiability_rule": {
       "use_entity_id_when": [
        "face identifiable: front, profile, three-quarter, or eyes closed",
        "OTS framing with any visible face"
       ],
       "common_noun_required_when": [
        "back to camera with no visible face",
        "silhouette or blurred outline only",
        "OTS with only back of head/shoulder, face entirely hidden"
       ],
       "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
       "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
      },
      "reproduction_surface_rule": {
       "applies": false,
       "id_use": "forbidden — generic descriptor with demographic only",
       "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
      },
      "demographic_descriptor_policy": {
       "required_on_first_appearance": true,
       "applies_to_id_forms": [
        "C##",
        "C##O##"
       ],
       "token_count_range": [
        1,
        2
       ],
       "components": {
        "ethnicity": [
         "Asian",
         "East Asian",
         "South Asian",
         "Southeast Asian",
         "Black",
         "Middle Eastern",
         "Hispanic",
         "Latina",
         "Latino",
         "Caucasian"
        ],
        "gender": [
         "man",
         "woman",
         "figure"
        ],
        "age_band": [
         "in his/her 20s",
         "in his/her 30s",
         "in his/her 40s",
         "young",
         "middle-aged",
         "elderly"
        ],
        "role_hint_from_outfit": [
         "in worker uniform",
         "in fisher workwear",
         "in detective coat",
         "in business suit"
        ]
       },
       "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
       "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
       "source_priority": [
        "visual_world_rules.region",
        "visual_world_rules.era",
        "shot context outfit hint"
       ],
       "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
       "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
      },
      "subject_reference_policy": [],
      "constraints": [
       "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
       "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
       "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
       "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
       "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
      ]
     },
     "background_binding": {
      "mode": "background_ref_attached",
      "bg_id": "L03B03",
      "reference_usage": "exact_background",
      "owned_objects": [
       "bench",
       "clothesline",
       "door",
       "emergency light",
       "parapet",
       "rooftop deck",
       "rooftop room",
       "slipper",
       "stair",
       "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": "alley_fog_and_siren_lighting",
        "element_type": "environment_state",
        "character_name": "",
        "description": "A damp exterior alleyway shrouded in cold misty fog and deep shadows. The atmosphere is heavily defined by the flashing red and blue lights of unseen police sirens cutting through the fog. This strobing light mixes with a weak, dirty amber glow from a nearby street lamp, creating colored reflections on the wet surfaces of the alley.",
        "applies_to_shots": [
         3,
         5
        ],
        "element_scope": "full",
        "source_facts": [
         "Strobing police red-blue cuts through damp fog, mixing with dirty amber streetlight and cold coastal shadows (Shot 3)",
         "wet alley background blurs into dark blue-gray (Shot 5)",
         "Cold misty shadows dominate... interrupted by brief red-blue siren pulses and a weak amber street glow (Shot 5)"
        ],
        "visual_inferences": [
         "The ground and nearby walls are damp, reflecting the harsh red and blue pulses alongside the dim amber light.",
         "The fog naturally diffuses the light sources, making the ambient environment feel hazy and tense."
        ],
        "creative_decisions": [
         "Emphasize the stark color contrast between the chaotic, strobing police lights and the stagnant, weak amber street lamp to reflect the sudden intrusion of reality into the quiet, dark alley."
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 10,
        "shot_index": 5,
        "ref_usage": "",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "character_outlook",
        "id": "C02O03",
        "policy": "required"
       },
       {
        "kind": "background",
        "id": "L03B03",
        "policy": "required"
       }
      ],
      "forbidden_refs": [],
      "readiness_policy": "block_if_missing",
      "constraints": [
       "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
       "if a required character_outlook ref is missing, scene image generation must block before the image stage"
      ]
     },
     "render_contracts": [],
     "_card_metadata": {
      "lift_status": {
       "rule_a_lifted": true,
       "rule_c_lifted": true,
       "rule_e_lifted": false,
       "rule_h_lifted": true,
       "id_policy_composite_lifted": true,
       "id_policy_close_framing_face_lifted": true,
       "id_policy_reproduction_surface_lifted": true,
       "continuity_cross_shot_id_substitution_lifted": true,
       "continuity_ref_usage_constraints_lifted": true,
       "continuity_view_consistency_lifted": true,
       "continuity_constraints_extended": true,
       "spatial_camera_frame_lifted": true,
       "spatial_fg_bg_shared_anchor_lifted": true,
       "spatial_primary_framing_lifted": true,
       "spatial_constraints_extended": true
      },
      "rule_source": {
       "camera_rule": "A",
       "owned_rule": "C",
       "close_skip_rule": "E",
       "demographic_rule": "H",
       "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
       "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
       "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
       "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
       "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
       "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
       "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
       "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
       "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
      }
     }
    }
   }
  },
  "S13_Shot5": {
   "scene_index": 13,
   "shot_index": 5,
   "loc_ids": [
    "L03"
   ],
   "is_indoor": false,
   "bg_ids": [
    "L03B03"
   ],
   "scene_heading": "S#13. 옥탑방 외곽 / N",
   "description": "수리영이 고개를 들어 혜수의 얼굴을 올려다보는 정적 구도.",
   "characters": [
    "수리영",
    "혜수"
   ],
   "staging": {
    "camera_direction": "The camera sits low near 수리영’s eye level, about one meter away, tightened into a still close composition as she lifts her face toward 혜수 just above the frame. 수리영 holds the lower center of the image, her upward eyeline creating the unseen presence of 혜수, while the wet alley background blurs into dark blue-gray; this is a direct observer angle from the space between them.",
    "character_angles": [
     {
      "angle": "three_quarter_left",
      "body_pose": "chin lifted trembling",
      "character": "수리영",
      "gaze_direction_kind": "looks_at_character",
      "gaze_target_id": "C02",
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "foreground",
       "gesture_action": "looks_toward",
       "gesture_target_label": "혜수 just above frame",
       "label": "수리영 close low frame",
       "screen_zone": "middle_center",
       "target_id": "C01",
       "target_kind": "character"
      }
     ],
     "reason": "primary_subject_isolation"
    },
    "framing_scale": "close",
    "key_bg_elements": [
     {
      "camera_use": "Soft, dark background texture behind 수리영’s head.",
      "directionality_class": "non_directional",
      "element": "wet alley wall",
      "orientation": "",
      "state": "damp, shadowed, out of focus"
     },
     {
      "camera_use": "Atmospheric layer around her face.",
      "directionality_class": "non_directional",
      "element": "night fog",
      "orientation": "",
      "state": "thin, drifting, blue-gray"
     },
     {
      "camera_use": "Off-screen motivated color pulse on her skin.",
      "directionality_class": "non_directional",
      "element": "police siren spill",
      "orientation": "",
      "state": "intermittent, faint"
     }
    ],
    "lighting_mood": "Cold misty shadows dominate her face, interrupted by brief red-blue siren pulses and a weak amber street glow along her jaw.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 13,
    "shot_index": 5,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Direct observer low angle, tight close composition, out of focus background",
      "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a Korean young woman with an early 20s oval face and natural black long hair, positioned in the middle-center foreground. This 수리영 close low frame subject is at a three-quarter angle from the left, her trembling chin lifted, looking toward 혜수 just above frame. A shoulder slice of C02O03 in a detective coat, a Korean middle-aged woman with a mid-40s face and dark natural hair, enters the upper frame edge. The camera rests near C01O01's eye level, sharply focusing on her trembling facial expression. Cold misty shadows dominate C01O01's face, interrupted by intermittent red-blue siren pulses and a weak dirty amber street glow along her jaw. Behind them, [L03: a damp exterior alleyway shrouded in thin drifting blue-gray fog, out of focus, wet walls blurring into deep shadows, reflecting harsh red and blue light alongside the dim amber glow].",
      "outfit_assignments": [
       {
        "character_id": "C01",
        "outlook_id": "O01"
       },
       {
        "character_id": "C02",
        "outlook_id": "O03"
       }
      ],
      "source_facts": [
       "Shot description: Suyeong looking up at Haesu's face in a static composition.",
       "Beat action: Suyeong stands blankly and tells Haesu her mom is dead.",
       "DP instructions: Suyeong holds the lower center of the image, her upward eyeline creating the unseen presence of Haesu.",
       "Lighting: Cold misty shadows dominate her face, interrupted by brief red-blue siren pulses and a weak amber street glow along her jaw."
      ],
      "visual_inferences": [
       "fixed_element alley_fog_and_siren_lighting: damp alleyway heavily defined by flashing red and blue lights mixed with dirty amber glow on wet surfaces.",
       "C02's presence is strictly maintained through a partial shoulder slice to comply with the close framing rule while honoring the required character asset."
      ],
      "creative_decisions": [
       "Positioned C01 in the middle-center foreground to fulfill the low frame subject spatial constraint.",
       "Utilized a tight depth of field to blue-gray blur the alleyway background, isolating C01's emotional shock."
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001"
      ],
      "reference_phrase_kinds": [
       "character",
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "bench",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "clothesline",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "emergency light",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "parapet",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "rooftop deck",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "rooftop room",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "slipper",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "water tank",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "37476d4623b68c0f",
       "owned_hash": "1bbf7175e6633836",
       "camera_direction_hash": "8e7cd90592290ede",
       "owned_usage_hash": "16aaa93f1e84107d",
       "validator": "scene_detail_owned_objects.v1.close_skip",
       "violations": []
      }
     }
    ],
    "visible_entities": [
     "C01",
     "C02",
     "L03"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 13,
      "shot_index": 5
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "close",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "The camera sits low near 수리영’s eye level, about one meter away, tightened into a still close composition as she lifts her face toward 혜수 just above the frame. 수리영 holds the lower center of the image, her upward eyeline creating the unseen presence of 혜수, while the wet alley background blurs into dark blue-gray; this is a direct observer angle from the space between them.",
      "lighting_mood": "Cold misty shadows dominate her face, interrupted by brief red-blue siren pulses and a weak amber street glow along her jaw.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 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": "looks_toward",
         "gesture_target_label": "혜수 just above frame",
         "label": "수리영 close low frame",
         "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",
       "C02",
       "L03"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C01",
        "outlook_id": "O01"
       },
       {
        "character_id": "C02",
        "outlook_id": "O03"
       }
      ],
      "must_use_composite_character_ids": true,
      "common_noun_required_when": [
       "a reproduced face inside any declared reproduction surface",
       "unregistered extra"
      ],
      "id_use_required_when": [
       "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
      ],
      "demographic_fallback_required": true,
      "face_identifiability_rule": {
       "use_entity_id_when": [
        "face identifiable: front, profile, three-quarter, or eyes closed",
        "OTS framing with any visible face"
       ],
       "common_noun_required_when": [
        "back to camera with no visible face",
        "silhouette or blurred outline only",
        "OTS with only back of head/shoulder, face entirely hidden"
       ],
       "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
       "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
      },
      "reproduction_surface_rule": {
       "applies": false,
       "id_use": "forbidden — generic descriptor with demographic only",
       "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
      },
      "demographic_descriptor_policy": {
       "required_on_first_appearance": true,
       "applies_to_id_forms": [
        "C##",
        "C##O##"
       ],
       "token_count_range": [
        1,
        2
       ],
       "components": {
        "ethnicity": [
         "Asian",
         "East Asian",
         "South Asian",
         "Southeast Asian",
         "Black",
         "Middle Eastern",
         "Hispanic",
         "Latina",
         "Latino",
         "Caucasian"
        ],
        "gender": [
         "man",
         "woman",
         "figure"
        ],
        "age_band": [
         "in his/her 20s",
         "in his/her 30s",
         "in his/her 40s",
         "young",
         "middle-aged",
         "elderly"
        ],
        "role_hint_from_outfit": [
         "in worker uniform",
         "in fisher workwear",
         "in detective coat",
         "in business suit"
        ]
       },
       "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
       "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
       "source_priority": [
        "visual_world_rules.region",
        "visual_world_rules.era",
        "shot context outfit hint"
       ],
       "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
       "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
      },
      "subject_reference_policy": [],
      "constraints": [
       "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
       "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
       "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
       "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
       "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
      ]
     },
     "background_binding": {
      "mode": "skipped_close_framing",
      "bg_id": "L03B03",
      "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": "alley_fog_and_siren_lighting",
        "element_type": "environment_state",
        "character_name": "",
        "description": "A damp exterior alleyway shrouded in cold misty fog and deep shadows. The atmosphere is heavily defined by the flashing red and blue lights of unseen police sirens cutting through the fog. This strobing light mixes with a weak, dirty amber glow from a nearby street lamp, creating colored reflections on the wet surfaces of the alley.",
        "applies_to_shots": [
         3,
         5
        ],
        "element_scope": "full",
        "source_facts": [
         "Strobing police red-blue cuts through damp fog, mixing with dirty amber streetlight and cold coastal shadows (Shot 3)",
         "wet alley background blurs into dark blue-gray (Shot 5)",
         "Cold misty shadows dominate... interrupted by brief red-blue siren pulses and a weak amber street glow (Shot 5)"
        ],
        "visual_inferences": [
         "The ground and nearby walls are damp, reflecting the harsh red and blue pulses alongside the dim amber light.",
         "The fog naturally diffuses the light sources, making the ambient environment feel hazy and tense."
        ],
        "creative_decisions": [
         "Emphasize the stark color contrast between the chaotic, strobing police lights and the stagnant, weak amber street lamp to reflect the sudden intrusion of reality into the quiet, dark alley."
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 13,
        "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": "C02O03",
        "policy": "required"
       }
      ],
      "forbidden_refs": [
       {
        "kind": "background",
        "reason": "close framing skips chain_bg reference"
       }
      ],
      "readiness_policy": "skipped_by_policy",
      "constraints": [
       "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
       "if a required character_outlook ref is missing, scene image generation must block before the image stage"
      ]
     },
     "render_contracts": [],
     "_card_metadata": {
      "lift_status": {
       "rule_a_lifted": true,
       "rule_c_lifted": true,
       "rule_e_lifted": true,
       "rule_h_lifted": true,
       "id_policy_composite_lifted": true,
       "id_policy_close_framing_face_lifted": true,
       "id_policy_reproduction_surface_lifted": true,
       "continuity_cross_shot_id_substitution_lifted": true,
       "continuity_ref_usage_constraints_lifted": true,
       "continuity_view_consistency_lifted": true,
       "continuity_constraints_extended": true,
       "spatial_camera_frame_lifted": true,
       "spatial_fg_bg_shared_anchor_lifted": true,
       "spatial_primary_framing_lifted": true,
       "spatial_constraints_extended": true
      },
      "rule_source": {
       "camera_rule": "A",
       "owned_rule": "C",
       "close_skip_rule": "E",
       "demographic_rule": "H",
       "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
       "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
       "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
       "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
       "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
       "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
       "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
       "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
       "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
      }
     }
    }
   }
  },
  "S14_Shot4": {
   "scene_index": 14,
   "shot_index": 4,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B07"
   ],
   "scene_heading": "S#14. 옥탑방 안 / N",
   "description": "핏자국 하나 없이 깨끗하게 정돈된 수리영의 방 내부 정지 구도.",
   "characters": [],
   "staging": {
    "camera_direction": "Just inside 수리영’s bedroom doorway at eye level, the camera holds a wide, unmoving view inward toward the bed, bare wall, curtain, and spotless floor. The room is framed as evidence: the clean floor stretches across the lower half, the curtain line sits to one side where the body should have been, and the wall above the bed remains blank; this is a direct neutral observation of absence.",
    "character_angles": [],
    "frame_spatial_contract": null,
    "framing_scale": "wide",
    "key_bg_elements": [
     {
      "camera_use": "Primary proof of erased violence across the lower frame.",
      "directionality_class": "non_directional",
      "element": "spotless bedroom floor",
      "orientation": "",
      "state": "clean, dry, no blood marks"
     },
     {
      "camera_use": "Central room anchor and comparison point for the missing wall mark.",
      "directionality_class": "directional_3d",
      "element": "bed",
      "orientation": "The side and top plane of the bed face the camera from mid-frame.",
      "state": "neatly made, undisturbed"
     },
     {
      "camera_use": "Surface where the red circle should have been absent.",
      "directionality_class": "content_surface",
      "element": "wall above the bed",
      "orientation": "The camera-facing wall face is visible and completely bare, carrying no red circular mark.",
      "state": "clean, dark, unmarked"
     },
     {
      "camera_use": "Empty area where the hidden body had been discovered earlier.",
      "directionality_class": "directional_3d",
      "element": "curtain line",
      "orientation": "The front folds face the camera from the side of the room, concealing only darkness and empty space behind.",
      "state": "hanging still, clean, no body visible"
     }
    ],
    "lighting_mood": "The room is washed in unnaturally clean blue-gray shadow with thin sick amber spill, making the absence feel colder than darkness.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 14,
    "shot_index": 4,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "wide eye-level neutral observation, chilling cold blue-gray shadows with sickly amber spill",
      "t2i_prompt": "Photorealistic cinematic still. A wide, eye-level view from just inside the doorway looking inward at an empty bedroom. In the lower frame, a spotless floor stretches clean and dry. In the mid-ground, a neatly made bed faces the camera, accompanied by a hanging still curtain that conceals only empty space behind its folds. Above the bed, the camera-facing wall is completely bare, dark, and unmarked. The interior space is bathed in an unnaturally clean, cold blue-gray shadow mixed with a sickly, weak amber practical light spilling from a lamp, flattening the environment into a chilling, forensic absence.",
      "outfit_assignments": [],
      "source_facts": [
       "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고, 침대 위에 붉은 표식은 물론 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
       "Just inside 수리영’s bedroom doorway at eye level, the camera holds a wide, unmoving view inward toward the bed, bare wall, curtain, and spotless floor.",
       "The room is washed in unnaturally clean blue-gray shadow with thin sick amber spill"
      ],
      "visual_inferences": [
       "fixed_element rooftop_lighting_tone: cold blue-gray shadow mixed with a sickly, weak amber practical light flattening the environment"
      ],
      "creative_decisions": [
       "Used a stark wide frame to emphasize the chilling emptiness and heavily contrast with the previously violent state of the room",
       "Centered the bare wall and neatly made bed as visual anchors for the erased evidence"
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [],
      "reference_phrase_kinds": [
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "backpack",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "bed",
        "usage_kind": "anchor",
        "source_phrase": "a neatly made bed faces the camera"
       },
       {
        "owned_token": "chair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "curtain",
        "usage_kind": "anchor",
        "source_phrase": "a hanging still curtain that conceals only empty space behind its folds"
       },
       {
        "owned_token": "dining table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "doll",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "anchor",
        "source_phrase": "just inside the doorway"
       },
       {
        "owned_token": "lamp",
        "usage_kind": "anchor",
        "source_phrase": "spilling from a lamp"
       },
       {
        "owned_token": "wardrobe",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "87165c2110d06a09",
       "owned_hash": "141b68738f793500",
       "camera_direction_hash": "d4a2fae13a81c7e3",
       "owned_usage_hash": "9484ecbae715570f",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "bed",
         "violating_phrase": "a neatly made bed faces the camera",
         "reason": "The prompt describes the state and orientation of the existing bed in the room, aligning with the producer's declaration as an anchor reference.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "curtain",
         "violating_phrase": "a hanging still curtain that conceals only empty space behind its folds",
         "reason": "The prompt references the appearance and folds of the curtain to set the scene's cold atmosphere, confirming it is an anchor reference.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "door",
         "violating_phrase": "just inside the doorway",
         "reason": "The doorway is used strictly as a physical reference point for the camera position, matching the producer's declaration as an anchor reference.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "lamp",
         "violating_phrase": "spilling from a lamp",
         "reason": "The lamp is mentioned solely as the source of the spilling amber light, serving as a lighting anchor and aligning with the producer's declaration.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "L04"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 14,
      "shot_index": 4
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "wide",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "Just inside 수리영’s bedroom doorway at eye level, the camera holds a wide, unmoving view inward toward the bed, bare wall, curtain, and spotless floor. The room is framed as evidence: the clean floor stretches across the lower half, the curtain line sits to one side where the body should have been, and the wall above the bed remains blank; this is a direct neutral observation of absence.",
      "lighting_mood": "The room is washed in unnaturally clean blue-gray shadow with thin sick amber spill, making the absence feel colder than darkness.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": null,
      "constraints": [
       "one prompt captures one still moment",
       "do not combine full-body framing and body-part close-up in one frame",
       "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
       "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
       "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
      ]
     },
     "id_policy": {
      "allowed_base_entity_ids": [
       "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": 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": "L04B07",
      "reference_usage": "exact_background",
      "owned_objects": [
       "backpack",
       "bed",
       "chair",
       "curtain",
       "dining table",
       "doll",
       "door",
       "lamp",
       "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": "rooftop_lighting_tone",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior space is bathed in an unnaturally clean, cold blue-gray shadow mixed with a sickly, weak amber practical light. This lighting scheme flattens the environment, making the space feel forensic, unreal, and chilling.",
        "applies_to_shots": [
         4,
         6,
         8
        ],
        "element_scope": "full",
        "source_facts": [
         "The room is washed in unnaturally clean blue-gray shadow with thin sick amber spill",
         "A drained blue-gray wash flattens her skin while weak amber practical light grazes one cheek",
         "Sick amber practical light pools over the empty tabletop while blue-gray shadows isolate her profile"
        ],
        "visual_inferences": [],
        "creative_decisions": [
         "Using a stark contrast of blue-gray and weak amber tones to highlight the unnatural absence of the body and blood"
        ],
        "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": "L04B07",
        "policy": "required"
       }
      ],
      "forbidden_refs": [],
      "readiness_policy": "block_if_missing",
      "constraints": [
       "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
       "if a required character_outlook ref is missing, scene image generation must block before the image stage"
      ]
     },
     "render_contracts": [],
     "_card_metadata": {
      "lift_status": {
       "rule_a_lifted": true,
       "rule_c_lifted": true,
       "rule_e_lifted": false,
       "rule_h_lifted": true,
       "id_policy_composite_lifted": true,
       "id_policy_close_framing_face_lifted": true,
       "id_policy_reproduction_surface_lifted": true,
       "continuity_cross_shot_id_substitution_lifted": true,
       "continuity_ref_usage_constraints_lifted": true,
       "continuity_view_consistency_lifted": true,
       "continuity_constraints_extended": true,
       "spatial_camera_frame_lifted": true,
       "spatial_fg_bg_shared_anchor_lifted": true,
       "spatial_primary_framing_lifted": true,
       "spatial_constraints_extended": true
      },
      "rule_source": {
       "camera_rule": "A",
       "owned_rule": "C",
       "close_skip_rule": "E",
       "demographic_rule": "H",
       "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
       "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
       "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
       "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
       "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
       "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
       "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
       "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
       "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
      }
     }
    }
   }
  },
  "S14_Shot6": {
   "scene_index": 14,
   "shot_index": 6,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B07"
   ],
   "scene_heading": "S#14. 옥탑방 안 / N",
   "description": "수리영이 핏기가 가신 창백한 얼굴로 멍하니 빈 커튼 쪽을 응시하는 정면.",
   "characters": [
    "수리영"
   ],
   "staging": {
    "camera_direction": "Inside the bedroom near the bed and curtain side, the dolly-in ends in a frontal upper-body emphasis on 수리영, close enough that her pale face and rigid shoulders take most of the frame. She looks past the camera toward the empty curtain area, which is kept implied rather than shown, turning the direct observer view into a psychological confrontation with the missing evidence.",
    "character_angles": [
     {
      "angle": "facing_camera",
      "body_pose": "frozen mid-breath",
      "character": "수리영",
      "gaze_direction_kind": "off_screen",
      "gaze_target_id": null,
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "foreground",
       "gesture_action": "looks_toward",
       "gesture_target_label": "empty curtain area behind camera",
       "label": "수리영 frontal close frame",
       "screen_zone": "middle_center",
       "target_id": "C01",
       "target_kind": "character"
      }
     ],
     "reason": "primary_subject_isolation"
    },
    "framing_scale": "close",
    "key_bg_elements": [
     {
      "camera_use": "Blurred side texture suggesting where the corpse should have been.",
      "directionality_class": "directional_3d",
      "element": "curtain edge",
      "orientation": "Only a soft side fold is visible near the frame edge, with the empty area kept off-camera.",
      "state": "still, clean, partially out of focus"
     },
     {
      "camera_use": "Low background shape behind her shoulder.",
      "directionality_class": "directional_3d",
      "element": "bed corner",
      "orientation": "The near corner angles away behind 수리영, cropped and subdued.",
      "state": "neat, undisturbed"
     },
     {
      "camera_use": "Absence marker behind her expression.",
      "directionality_class": "content_surface",
      "element": "blank wall",
      "orientation": "The visible wall face behind her is bare and carries no red mark.",
      "state": "unmarked, dim"
     }
    ],
    "lighting_mood": "A drained blue-gray wash flattens her skin while weak amber practical light grazes one cheek, leaving the clean room feeling forensic and unreal.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 14,
    "shot_index": 6,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Eye-level frontal composition emphasizing the upper body and rigid shoulders, enveloped in cold blue-gray and weak amber lighting.",
      "t2i_prompt": "Photorealistic cinematic still. C01O01 in ordinary casual clothes, a Korean young woman with an oval face and natural black long hair, stands frozen mid-breath in the middle-center foreground, facing the camera and looking toward the empty curtain area behind the camera. Captured at eye level, her extremely pale, drained face and rigid shoulders dominate the upper-center frame. A cold, drained blue-gray wash flattens her skin, while a weak amber practical light grazes one cheek. [: The immediate frame edges reveal a bare, unmarked wall face directly behind her in dim shadow, the cropped, subdued near corner of a neat bed angling away over her shoulder, and a soft, blurred curtain side fold visible near the frame edge.]",
      "outfit_assignments": [
       {
        "character_id": "C01",
        "outlook_id": "O01"
       }
      ],
      "source_facts": [
       "S14 action: 얼굴이 파리해지는 수리영. 지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고, 침대 위에 붉은 표식은 물론 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
       "shot description: 수리영이 핏기가 가신 창백한 얼굴로 멍하니 빈 커튼 쪽을 응시하는 정면."
      ],
      "visual_inferences": [
       "fixed_element suriyoung_appearance: extremely pale, drained face reflecting deep exhaustion and shock, wearing ordinary casual clothes.",
       "fixed_element rooftop_lighting_tone: unnaturally clean, cold blue-gray shadow mixed with a sickly, weak amber practical light.",
       "Eye-level positioning correctly places her head and shoulders predominantly in the upper frame to capture the psychological shock."
      ],
      "creative_decisions": [
       "Close framing omits the broader room environment, strictly utilizing the L00 block for immediate frame-edge elements (bare wall, bed corner, blurred curtain edge) to heighten isolation.",
       "Contrasting blue-gray shadows and weak amber highlights accentuate her pale skin and rigid posture without dissecting her features physically."
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001"
      ],
      "reference_phrase_kinds": [
       "character"
      ],
      "owned_object_usage": [
       {
        "owned_token": "backpack",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "bed",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "chair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "curtain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "dining table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "doll",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "lamp",
        "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": "28fb40c98e6ee22a",
       "owned_hash": "141b68738f793500",
       "camera_direction_hash": "2ef80e4cb61185cb",
       "owned_usage_hash": "f65022acee823656",
       "validator": "scene_detail_owned_objects.v1.close_skip",
       "violations": []
      }
     }
    ],
    "visible_entities": [
     "C01"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 14,
      "shot_index": 6
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "close",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "Inside the bedroom near the bed and curtain side, the dolly-in ends in a frontal upper-body emphasis on 수리영, close enough that her pale face and rigid shoulders take most of the frame. She looks past the camera toward the empty curtain area, which is kept implied rather than shown, turning the direct observer view into a psychological confrontation with the missing evidence.",
      "lighting_mood": "A drained blue-gray wash flattens her skin while weak amber practical light grazes one cheek, leaving the clean room feeling forensic and unreal.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 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": "looks_toward",
         "gesture_target_label": "empty curtain area behind camera",
         "label": "수리영 frontal close frame",
         "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": "L04B07",
      "reference_usage": "skipped_close_framing",
      "owned_objects": [],
      "camera_reference": null,
      "close_framing_skips_background_ref": true,
      "constraints": [
       "this shot uses close framing — the background reference is intentionally omitted at composition time",
       "describe the close subject and its immediate surroundings without relying on the absent background reference",
       "use [L##: ...] block for frame-edge surface description"
      ]
     },
     "continuity_elements_used": {
      "fixed_elements": [
       {
        "element_id": "suriyoung_appearance",
        "element_type": "character_state",
        "character_name": "수리영",
        "description": "A young female student with an extremely pale, drained face reflecting deep exhaustion and shock. She wears ordinary casual clothes suitable for a hard-working student.",
        "applies_to_shots": [
         6,
         8
        ],
        "element_scope": "full",
        "source_facts": [
         "얼굴이 파리해지는 수리영",
         "학생",
         "네가 요즘 과로했잖아. 공부에다 알바까지"
        ],
        "visual_inferences": [
         "Wears everyday casual clothes suitable for her lifestyle as an exhausted student working part-time jobs"
        ],
        "creative_decisions": [
         "Her extremely pale complexion visually emphasizes the psychological horror and shock of discovering the missing evidence"
        ],
        "confidence": "high"
       },
       {
        "element_id": "rooftop_lighting_tone",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior space is bathed in an unnaturally clean, cold blue-gray shadow mixed with a sickly, weak amber practical light. This lighting scheme flattens the environment, making the space feel forensic, unreal, and chilling.",
        "applies_to_shots": [
         4,
         6,
         8
        ],
        "element_scope": "full",
        "source_facts": [
         "The room is washed in unnaturally clean blue-gray shadow with thin sick amber spill",
         "A drained blue-gray wash flattens her skin while weak amber practical light grazes one cheek",
         "Sick amber practical light pools over the empty tabletop while blue-gray shadows isolate her profile"
        ],
        "visual_inferences": [],
        "creative_decisions": [
         "Using a stark contrast of blue-gray and weak amber tones to highlight the unnatural absence of the body and blood"
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 12,
        "shot_index": 8,
        "ref_usage": "",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "character_outlook",
        "id": "C01O01",
        "policy": "required"
       }
      ],
      "forbidden_refs": [
       {
        "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"
      }
     }
    }
   }
  },
  "S14_Shot8": {
   "scene_index": 14,
   "shot_index": 8,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B07"
   ],
   "scene_heading": "S#14. 옥탑방 안 / N",
   "description": "식탁 앞에 선 수리영이 빈 식탁을 손가락으로 가리킨 채 멈춘 측면 상체.",
   "characters": [
    "수리영"
   ],
   "staging": {
    "camera_direction": "At chest height beside the dining table, the camera settles from the track into a brief still side composition perpendicular to 수리영’s body line. Her profile holds the left half of frame while her pointing hand cuts toward the bare tabletop on the right, keeping both the gesture and the missing teacups in one direct observational image.",
    "character_angles": [
     {
      "angle": "profile_right",
      "body_pose": "pointing over tabletop",
      "character": "수리영",
      "gaze_direction_kind": "down",
      "gaze_target_id": null,
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "foreground",
       "gesture_action": "points_to",
       "gesture_target_label": "bare dining tabletop",
       "label": "수리영 pointing beside table",
       "screen_zone": "middle_left",
       "target_id": "C01",
       "target_kind": "character"
      },
      {
       "depth_plane": "midground",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "bare dining tabletop",
       "screen_zone": "middle_right",
       "target_id": "",
       "target_kind": "background"
      }
     ],
     "reason": "points_to_anchor"
    },
    "framing_scale": "medium",
    "key_bg_elements": [
     {
      "camera_use": "Gesture target proving the vanished cups.",
      "directionality_class": "directional_3d",
      "element": "bare dining table",
      "orientation": "The clean top plane faces the camera at a shallow angle, with no cups where her finger indicates.",
      "state": "clean, empty, dry"
     },
     {
      "camera_use": "Dim living-room depth behind the table.",
      "directionality_class": "directional_3d",
      "element": "living room wall and doorway",
      "orientation": "The wall and doorway recede behind 수리영 in side view.",
      "state": "shadowed, quiet"
     },
     {
      "camera_use": "Soft ambient source in the room.",
      "directionality_class": "directional_3d",
      "element": "living room stand lamp",
      "orientation": "The lamp shade is seen from the side, its warm face turned slightly away from camera.",
      "state": "on, weak amber"
     }
    ],
    "lighting_mood": "Sick amber practical light pools over the empty tabletop while blue-gray shadows isolate her profile and trembling hand.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 14,
    "shot_index": 8,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "At chest height beside the dining table, still side composition perpendicular to the character's body line, medium framing.",
      "t2i_prompt": "Photorealistic cinematic still. C01O01 in everyday casual clothes, a Korean young woman with natural black long hair and an extremely pale drained face, stands in the middle-left foreground, pointing toward the bare dining table in the middle-right midground. Captured at chest height, she is seen in right profile holding the left half of the frame, torso and arms visible, gazing down at the clean empty tabletop. Her trembling hand cuts across the space toward the dry surface where no cups remain. The interior space is bathed in an unnaturally clean, cold blue-gray shadow that isolates her profile and flattens the environment. A sick, weak amber practical light from a nearby lamp pools over the dining table. The shadowed wall and door recede quietly in the dim living room depth behind her.",
      "outfit_assignments": [
       {
        "character_id": "C01",
        "outlook_id": "O01"
       }
      ],
      "source_facts": [
       "지나칠 정도로 깨끗하게 정돈된 방안",
       "얼굴이 파리해지는 수리영",
       "뛰쳐나가 식탁으로 가본다. 식탁 역시 깨끗한.",
       "여기 찻잔도 두 개 있었고..."
      ],
      "visual_inferences": [
       "fixed_element suriyoung_appearance: extremely pale, drained face reflecting deep exhaustion and shock",
       "fixed_element rooftop_lighting_tone: cold blue-gray shadow mixed with a sickly weak amber practical light"
      ],
      "creative_decisions": [
       "Medium framing at chest height capturing both her pointing gesture and the empty table in one composition",
       "Sick amber lighting emphasizing the unnerving absence of evidence and her isolated side profile"
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001",
       "fsc_002"
      ],
      "reference_phrase_kinds": [
       "character",
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "backpack",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "bed",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "chair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "curtain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "dining table",
        "usage_kind": "anchor",
        "source_phrase": "the bare dining table in the middle-right midground"
       },
       {
        "owned_token": "doll",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "anchor",
        "source_phrase": "The shadowed wall and door recede quietly"
       },
       {
        "owned_token": "lamp",
        "usage_kind": "anchor",
        "source_phrase": "from a nearby lamp"
       },
       {
        "owned_token": "wardrobe",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "4778bd46382aafb2",
       "owned_hash": "141b68738f793500",
       "camera_direction_hash": "227066f70274f0e3",
       "owned_usage_hash": "c42c59ab8b42a7b9",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "dining table",
         "violating_phrase": "the bare dining table in the middle-right midground",
         "reason": "The dining table is referenced as a target for the character's gesture and light, acting as a spatial anchor, which matches the producer's declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "door",
         "violating_phrase": "The shadowed wall and door recede quietly",
         "reason": "The door is mentioned as a background element that quietly recedes, serving as an anchor, which matches the producer's declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "lamp",
         "violating_phrase": "from a nearby lamp pools over",
         "reason": "The lamp is only referenced as a light source to establish atmosphere, acting as an anchor, which matches the producer's declaration.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "C01",
     "L04"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 14,
      "shot_index": 8
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "medium",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "At chest height beside the dining table, the camera settles from the track into a brief still side composition perpendicular to 수리영’s body line. Her profile holds the left half of frame while her pointing hand cuts toward the bare tabletop on the right, keeping both the gesture and the missing teacups in one direct observational image.",
      "lighting_mood": "Sick amber practical light pools over the empty tabletop while blue-gray shadows isolate her profile and trembling hand.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 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": "midground",
         "gesture_action": "none",
         "gesture_target_label": "",
         "label": "bare dining tabletop",
         "screen_zone": "middle_right",
         "target_id": "",
         "target_kind": "background"
        },
        {
         "constraint_id": "fsc_002",
         "depth_plane": "foreground",
         "gesture_action": "points_to",
         "gesture_target_label": "bare dining tabletop",
         "label": "수리영 pointing beside table",
         "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",
       "L04"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C01",
        "outlook_id": "O01"
       }
      ],
      "must_use_composite_character_ids": true,
      "common_noun_required_when": [
       "a reproduced face inside any declared reproduction surface",
       "unregistered extra"
      ],
      "id_use_required_when": [
       "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
      ],
      "demographic_fallback_required": true,
      "face_identifiability_rule": {
       "use_entity_id_when": [
        "face identifiable: front, profile, three-quarter, or eyes closed",
        "OTS framing with any visible face"
       ],
       "common_noun_required_when": [
        "back to camera with no visible face",
        "silhouette or blurred outline only",
        "OTS with only back of head/shoulder, face entirely hidden"
       ],
       "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
       "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
      },
      "reproduction_surface_rule": {
       "applies": false,
       "id_use": "forbidden — generic descriptor with demographic only",
       "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
      },
      "demographic_descriptor_policy": {
       "required_on_first_appearance": true,
       "applies_to_id_forms": [
        "C##",
        "C##O##"
       ],
       "token_count_range": [
        1,
        2
       ],
       "components": {
        "ethnicity": [
         "Asian",
         "East Asian",
         "South Asian",
         "Southeast Asian",
         "Black",
         "Middle Eastern",
         "Hispanic",
         "Latina",
         "Latino",
         "Caucasian"
        ],
        "gender": [
         "man",
         "woman",
         "figure"
        ],
        "age_band": [
         "in his/her 20s",
         "in his/her 30s",
         "in his/her 40s",
         "young",
         "middle-aged",
         "elderly"
        ],
        "role_hint_from_outfit": [
         "in worker uniform",
         "in fisher workwear",
         "in detective coat",
         "in business suit"
        ]
       },
       "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
       "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
       "source_priority": [
        "visual_world_rules.region",
        "visual_world_rules.era",
        "shot context outfit hint"
       ],
       "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
       "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
      },
      "subject_reference_policy": [],
      "constraints": [
       "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
       "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
       "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
       "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
       "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
      ]
     },
     "background_binding": {
      "mode": "background_ref_attached",
      "bg_id": "L04B07",
      "reference_usage": "exact_background",
      "owned_objects": [
       "backpack",
       "bed",
       "chair",
       "curtain",
       "dining table",
       "doll",
       "door",
       "lamp",
       "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_appearance",
        "element_type": "character_state",
        "character_name": "수리영",
        "description": "A young female student with an extremely pale, drained face reflecting deep exhaustion and shock. She wears ordinary casual clothes suitable for a hard-working student.",
        "applies_to_shots": [
         6,
         8
        ],
        "element_scope": "full",
        "source_facts": [
         "얼굴이 파리해지는 수리영",
         "학생",
         "네가 요즘 과로했잖아. 공부에다 알바까지"
        ],
        "visual_inferences": [
         "Wears everyday casual clothes suitable for her lifestyle as an exhausted student working part-time jobs"
        ],
        "creative_decisions": [
         "Her extremely pale complexion visually emphasizes the psychological horror and shock of discovering the missing evidence"
        ],
        "confidence": "high"
       },
       {
        "element_id": "rooftop_lighting_tone",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior space is bathed in an unnaturally clean, cold blue-gray shadow mixed with a sickly, weak amber practical light. This lighting scheme flattens the environment, making the space feel forensic, unreal, and chilling.",
        "applies_to_shots": [
         4,
         6,
         8
        ],
        "element_scope": "full",
        "source_facts": [
         "The room is washed in unnaturally clean blue-gray shadow with thin sick amber spill",
         "A drained blue-gray wash flattens her skin while weak amber practical light grazes one cheek",
         "Sick amber practical light pools over the empty tabletop while blue-gray shadows isolate her profile"
        ],
        "visual_inferences": [],
        "creative_decisions": [
         "Using a stark contrast of blue-gray and weak amber tones to highlight the unnatural absence of the body and blood"
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 14,
        "shot_index": 6,
        "ref_usage": "",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "character_outlook",
        "id": "C01O01",
        "policy": "required"
       },
       {
        "kind": "background",
        "id": "L04B07",
        "policy": "required"
       }
      ],
      "forbidden_refs": [],
      "readiness_policy": "block_if_missing",
      "constraints": [
       "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
       "if a required character_outlook ref is missing, scene image generation must block before the image stage"
      ]
     },
     "render_contracts": [],
     "_card_metadata": {
      "lift_status": {
       "rule_a_lifted": true,
       "rule_c_lifted": true,
       "rule_e_lifted": false,
       "rule_h_lifted": true,
       "id_policy_composite_lifted": true,
       "id_policy_close_framing_face_lifted": true,
       "id_policy_reproduction_surface_lifted": true,
       "continuity_cross_shot_id_substitution_lifted": true,
       "continuity_ref_usage_constraints_lifted": true,
       "continuity_view_consistency_lifted": true,
       "continuity_constraints_extended": true,
       "spatial_camera_frame_lifted": true,
       "spatial_fg_bg_shared_anchor_lifted": true,
       "spatial_primary_framing_lifted": true,
       "spatial_constraints_extended": true
      },
      "rule_source": {
       "camera_rule": "A",
       "owned_rule": "C",
       "close_skip_rule": "E",
       "demographic_rule": "H",
       "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
       "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
       "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
       "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
       "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
       "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
       "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
       "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
       "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
      }
     }
    }
   }
  },
  "S17_Shot1": {
   "scene_index": 17,
   "shot_index": 1,
   "loc_ids": [
    "L03"
   ],
   "is_indoor": false,
   "bg_ids": [
    "L03B01"
   ],
   "scene_heading": "S#17. 옥탑방 / 동틀무렵",
   "description": "짙고 푸른 안개가 깔린 새벽녘, 희미한 노란 불빛이 켜진 옥탑방 창문을 향해 검은 고양이 한 마리가 고개를 돌린 찰나의 측면.",
   "characters": [],
   "staging": {
    "camera_direction": "Low at the 검은 고양이’s shoulder height, roughly one meter away, the camera tracks parallel along the rooftop wall and then holds a brief side profile as the cat turns its head toward the lit rooftop-room window. The cat occupies the lower left-to-center band of the frame, while the faint yellow window hangs in the misty background line of sight above the wall.",
    "character_angles": [
     {
      "angle": "profile_left",
      "body_pose": "mid-stride head turn",
      "character": "검은 고양이",
      "gaze_direction_kind": "up",
      "gaze_target_id": null,
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "foreground",
       "gesture_action": "looks_toward",
       "gesture_target_label": "lit rooftop window",
       "label": "black cat",
       "screen_zone": "lower_left",
       "target_id": "C11",
       "target_kind": "character"
      },
      {
       "depth_plane": "background",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "lit rooftop window",
       "screen_zone": "upper_right",
       "target_id": "",
       "target_kind": "background"
      }
     ],
     "reason": "looks_to_anchor"
    },
    "framing_scale": "medium",
    "key_bg_elements": [
     {
      "camera_use": "distant visual lure for the cat’s head turn",
      "directionality_class": "transparent_surface",
      "element": "rooftop-room window",
      "orientation": "fogged glass shows a weak yellow interior glow beyond it",
      "state": "closed, lit from inside"
     },
     {
      "camera_use": "tracking guide and jump setup",
      "directionality_class": "directional_3d",
      "element": "low concrete rooftop wall",
      "orientation": "the long side face runs parallel to the camera movement, with its top edge rising toward the next action",
      "state": "damp, stained"
     },
     {
      "camera_use": "atmospheric veil separating cat and room",
      "directionality_class": "non_directional",
      "element": "blue dawn fog",
      "orientation": "",
      "state": "thick, cold, slowly moving"
     }
    ],
    "lighting_mood": "Blue dawn fog desaturates the rooftop while the sickly yellow window glow draws a small occult point of warmth behind the cat.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 17,
    "shot_index": 1,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Low tracking angle at shoulder height, holding a brief profile in blue dawn fog",
      "t2i_prompt": "Photorealistic cinematic still. Focusing on the pre-existing black cat in the lower-left foreground in left profile as it looks up toward the lit rooftop window in the upper-right background. The low camera at the cat's shoulder height captures its silhouette with faint rim-lit edges preserving body volume against the cool blue ambient fill. Thick dawn fog desaturates the damp concrete parapet running parallel behind the cat. The sickly yellow glow from the window hangs in the misty distance, creating a faint occult point of warmth near the rooftop room.",
      "outfit_assignments": [],
      "source_facts": [
       "S#17 action: A black cat looks at the lit rooftop room before jumping the wall.",
       "shot description: cat turns head toward the lit rooftop-room window in profile",
       "Blue dawn fog, sickly yellow window glow"
      ],
      "visual_inferences": [
       "low camera height emphasizes the cat's silhouette against the misty background",
       "concrete parapet acts as a horizontal anchor guiding the parallel frame",
       "faint rim light defines the cat's slender tail and body shape despite the dim lighting"
      ],
      "creative_decisions": [
       "frame_spatial_contract dictates cat in lower-left foreground and window in upper-right background to establish tension across the wide/medium frame",
       "cool blue fog strongly contrasts with the yellow occult point of warmth to reflect the thriller tone",
       "C11 uses generic descriptor policy, so C## tokens are completely omitted in favor of 'small black cat'"
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001",
       "fsc_002"
      ],
      "reference_phrase_kinds": [
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "bench",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "cat",
        "usage_kind": "anchor",
        "source_phrase": "Focusing on the pre-existing black cat"
       },
       {
        "owned_token": "clothesline",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "parapet",
        "usage_kind": "anchor",
        "source_phrase": "the damp concrete parapet running parallel behind the cat"
       },
       {
        "owned_token": "rooftop room",
        "usage_kind": "anchor",
        "source_phrase": "near the rooftop room"
       },
       {
        "owned_token": "stair opening",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "water tank",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "anchor",
        "source_phrase": "the lit rooftop window"
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "63099e687428386d",
       "owned_hash": "8abe96999261e26c",
       "camera_direction_hash": "927cfbcb8c052196",
       "owned_usage_hash": "1b64782e8dae605e",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "cat",
         "violating_phrase": "Focusing on the pre-existing black cat in the lower-left foreground",
         "reason": "The prompt describes the lighting, silhouette, and profile of the pre-existing cat, which aligns with the producer's anchor declaration as a focal reference.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "parapet",
         "violating_phrase": "the damp concrete parapet running parallel behind the cat",
         "reason": "The prompt references the parapet as a background element to describe the fog effect, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "rooftop room",
         "violating_phrase": "near the rooftop room",
         "reason": "The prompt uses the rooftop room purely as a spatial anchor for the point of warmth, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "window",
         "violating_phrase": "the lit rooftop window in the upper-right background",
         "reason": "The prompt references the window's location and light source as a background anchor, aligning with the producer's anchor declaration.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "C11",
     "L03"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 17,
      "shot_index": 1
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "medium",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "Low at the 검은 고양이’s shoulder height, roughly one meter away, the camera tracks parallel along the rooftop wall and then holds a brief side profile as the cat turns its head toward the lit rooftop-room window. The cat occupies the lower left-to-center band of the frame, while the faint yellow window hangs in the misty background line of sight above the wall.",
      "lighting_mood": "Blue dawn fog desaturates the rooftop while the sickly yellow window glow draws a small occult point of warmth behind the cat.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 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": "lit rooftop window",
         "screen_zone": "upper_right",
         "target_id": "",
         "target_kind": "background"
        },
        {
         "constraint_id": "fsc_002",
         "depth_plane": "foreground",
         "gesture_action": "looks_toward",
         "gesture_target_label": "lit rooftop window",
         "label": "black cat",
         "screen_zone": "lower_left",
         "target_id": "C11",
         "target_kind": "character"
        }
       ]
      },
      "constraints": [
       "one prompt captures one still moment",
       "do not combine full-body framing and body-part close-up in one frame",
       "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
       "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
       "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
      ]
     },
     "id_policy": {
      "allowed_base_entity_ids": [
       "C11",
       "L03"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C11",
        "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": "C11",
        "policy_type": "identity_reference",
        "policy": "generic_descriptor_allowed",
        "reason": "visible_shot_count=1 — selected-shot 저빈도 주변 subject"
       }
      ],
      "constraints": [
       "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
       "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
       "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
       "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
       "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
      ]
     },
     "background_binding": {
      "mode": "background_ref_attached",
      "bg_id": "L03B01",
      "reference_usage": "exact_background",
      "owned_objects": [
       "bench",
       "cat",
       "clothesline",
       "door",
       "parapet",
       "rooftop room",
       "stair opening",
       "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": 10,
        "shot_index": 5,
        "ref_usage": "",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "background",
        "id": "L03B01",
        "policy": "required"
       }
      ],
      "forbidden_refs": [],
      "readiness_policy": "block_if_missing",
      "constraints": [
       "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
       "if a required character_outlook ref is missing, scene image generation must block before the image stage"
      ]
     },
     "render_contracts": [],
     "_card_metadata": {
      "lift_status": {
       "rule_a_lifted": true,
       "rule_c_lifted": true,
       "rule_e_lifted": false,
       "rule_h_lifted": true,
       "id_policy_composite_lifted": true,
       "id_policy_close_framing_face_lifted": true,
       "id_policy_reproduction_surface_lifted": true,
       "continuity_cross_shot_id_substitution_lifted": true,
       "continuity_ref_usage_constraints_lifted": true,
       "continuity_view_consistency_lifted": true,
       "continuity_constraints_extended": true,
       "spatial_camera_frame_lifted": true,
       "spatial_fg_bg_shared_anchor_lifted": true,
       "spatial_primary_framing_lifted": true,
       "spatial_constraints_extended": true
      },
      "rule_source": {
       "camera_rule": "A",
       "owned_rule": "C",
       "close_skip_rule": "E",
       "demographic_rule": "H",
       "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
       "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
       "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
       "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
       "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
       "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
       "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
       "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
       "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
      }
     }
    }
   }
  },
  "S18_Shot15": {
   "scene_index": 18,
   "shot_index": 15,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B04"
   ],
   "scene_heading": "S#18. 안방 안 / D",
   "description": "거울 속 욕실 벽면에 선명한 붉은색 원형 표식이 맺혀 있는 정지 구도.",
   "characters": [],
   "staging": {
    "camera_direction": "Inside the bathroom, the camera is fixed at eye level about three feet from the mirror, tightened so the mirror reflection becomes the frame and the reflected rear wall sits centered. The red circular mark is isolated near the middle of the reflected wall, with only a sliver of mirror edge and damp tile context allowed to remain, making the apparition feel graphic and unavoidable.",
    "character_angles": [],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "midground",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "red circular mark in mirror reflection",
       "screen_zone": "middle_center",
       "target_id": "",
       "target_kind": "background"
      }
     ],
     "reason": "required_background_position"
    },
    "framing_scale": "insert",
    "key_bg_elements": [
     {
      "camera_use": "the shot’s perceptual surface and compositional border",
      "directionality_class": "reflective_surface",
      "element": "bathroom mirror",
      "orientation": "the mirror reflects the rear bathroom wall and the impossible red circular mark; a narrow mirror edge confirms this is a reflected view",
      "state": "slightly misted, cold"
     },
     {
      "camera_use": "surface on which the occult symbol appears within reflection",
      "directionality_class": "content_surface",
      "element": "reflected bathroom wall",
      "orientation": "the wall face visible in the mirror carries a sharp crimson circular mark at its center",
      "state": "pale tile surface, otherwise clean"
     },
     {
      "camera_use": "claustrophobic bathroom texture",
      "directionality_class": "non_directional",
      "element": "damp tile grout",
      "orientation": "",
      "state": "wet-looking, gray, stained"
     }
    ],
    "lighting_mood": "Washed blue bathroom light is poisoned by the crimson ring, which seems brighter and flatter than the room’s natural illumination.",
    "perception_mode": "mirror",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 18,
    "shot_index": 15,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Insert framing centered on the mirror reflection, cold blue-gray daylight with contrasting flat crimson",
      "t2i_prompt": "Photorealistic cinematic still. A P03 red circular mark in mirror reflection sits clearly in the middle-center midground. [L04: An insert framing captures the bathroom mirror, the narrow edge of the mirror forming the border of the composition. Inside the reflecting surface, the rear bathroom wall displays pale tiles with damp, gray grout. The enclosed space is bathed in a stark, cold blue-gray daylight wash, unnaturally poisoned by the flat, bright crimson hue of the P03 mark.]",
      "outfit_assignments": [],
      "source_facts": [
       "S18 action: A red circular mark suddenly appears on the bathroom wall reflected in the mirror.",
       "Shot description: The red circular mark is isolated near the middle of the reflected wall, with only a sliver of mirror edge and damp tile context allowed."
      ],
      "visual_inferences": [
       "fixed_element apartment_cold_daylight: The interior space is dominated by a cold, blue-gray daylight wash, making the setting feel sterile and unsettling.",
       "The perception is strictly a mirror reflection, emphasizing the flat, graphic nature of the occult symbol against the damp tiles."
      ],
      "creative_decisions": [
       "Used an insert framing strictly bounded by the mirror's narrow edge to create a claustrophobic and unavoidable focal point on the symbol.",
       "Contrasted the washed blue ambient light against the bright crimson of the mark to highlight the unnatural apparition."
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001"
      ],
      "reference_phrase_kinds": [
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "bathroom door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "chair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "dining table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "kitchenette",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "mirror",
        "usage_kind": "anchor",
        "source_phrase": "bathroom mirror"
       },
       {
        "owned_token": "photo",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "shower fixture",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "sink",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "toilet",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "81654433da816def",
       "owned_hash": "18d4d6edd0ef2213",
       "camera_direction_hash": "fcbaa95f888b7a03",
       "owned_usage_hash": "1952b8d10d6f0ee4",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "mirror",
         "violating_phrase": "the narrow edge of the mirror forming the border of the composition",
         "reason": "The prompt references the existing mirror as a compositional frame and anchor for the reflection rather than requesting to redraw or alter its structure, which matches the producer's declaration.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "P03",
     "L04"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 18,
      "shot_index": 15
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "insert",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "Inside the bathroom, the camera is fixed at eye level about three feet from the mirror, tightened so the mirror reflection becomes the frame and the reflected rear wall sits centered. The red circular mark is isolated near the middle of the reflected wall, with only a sliver of mirror edge and damp tile context allowed to remain, making the apparition feel graphic and unavoidable.",
      "lighting_mood": "Washed blue bathroom light is poisoned by the crimson ring, which seems brighter and flatter than the room’s natural illumination.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": {
       "reason": "required_background_position",
       "constraints": [
        {
         "constraint_id": "fsc_001",
         "depth_plane": "midground",
         "gesture_action": "none",
         "gesture_target_label": "",
         "label": "red circular mark in mirror reflection",
         "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": [
       "P03",
       "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": 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": "L04B04",
      "reference_usage": "exact_background",
      "owned_objects": [
       "bathroom door",
       "chair",
       "dining table",
       "kitchenette",
       "mirror",
       "photo",
       "shower fixture",
       "sink",
       "toilet"
      ],
      "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": "apartment_cold_daylight",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior spaces of the apartment are bathed in a cold, blue-gray daylight wash. The lighting lacks warm domestic tones, creating a stark, chilly, and sterile atmosphere across the different rooms. This unnatural daytime illumination suppresses any cozy feeling, making the rooms look slightly staged and unsettling.",
        "applies_to_shots": [
         6,
         15,
         20
        ],
        "element_scope": "full",
        "source_facts": [
         "Thin daylight is cooled into blue-gray shadow (Shot 6)",
         "Washed blue bathroom light (Shot 15)",
         "A cold daylight wash turns jaundiced (Shot 20)"
        ],
        "visual_inferences": [
         "The entire apartment shares a consistent cold, unwelcoming blue-gray tint regardless of the specific room.",
         "The lighting unifies the separate spaces to build a cohesive sense of isolation."
        ],
        "creative_decisions": [
         "Applying a unified cold, blue-tinted lighting palette across all interior shots to emphasize psychological horror and visual continuity."
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 12,
        "shot_index": 15,
        "ref_usage": "",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "background",
        "id": "L04B04",
        "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"
      }
     }
    }
   }
  },
  "S18_Shot20": {
   "scene_index": 18,
   "shot_index": 20,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B04"
   ],
   "scene_heading": "S#18. 안방 안 / D",
   "description": "식탁 위에 놓인 사진 속, 살점이 뭉개진 채 기괴하게 흘러내린 (변형된 민숙)의 모습 클로즈업.",
   "characters": [
    "민숙"
   ],
   "staging": {
    "camera_direction": "At tabletop height beside the dining table, the push-in finishes at an extreme close angle on the framed photograph, stripping away nearly all surrounding table context. The mother’s photographed face, now perceived as 민숙 (변형된), occupies the central close field in a grotesque melted distortion, while the photo frame edge remains barely visible to prove this horror is trapped inside the image surface.",
    "character_angles": [
     {
      "angle": "facing_camera",
      "body_pose": "frozen photo smile",
      "character": "민숙 (변형된)",
      "gaze_direction_kind": "camera",
      "gaze_target_id": null,
      "subject_state": "dead"
     }
    ],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "foreground",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "distorted mother’s face inside framed photograph",
       "screen_zone": "middle_center",
       "target_id": "C12",
       "target_kind": "character"
      }
     ],
     "reason": "primary_subject_isolation"
    },
    "framing_scale": "insert",
    "key_bg_elements": [
     {
      "camera_use": "primary hallucinated image surface",
      "directionality_class": "content_surface",
      "element": "framed family photograph",
      "orientation": "the front image face is angled slightly upward to camera, showing the mother’s face grotesquely distorted within the printed photo",
      "state": "upright on table, visually corrupted by hallucination"
     },
     {
      "camera_use": "thin physical proof that this is still a household object",
      "directionality_class": "reflective_surface",
      "element": "photo frame glass",
      "orientation": "the glass reflects a dim streak of room light across the distorted face without hiding it",
      "state": "clean but unnervingly glossy"
     },
     {
      "camera_use": "minimal scale reference around the frame",
      "directionality_class": "directional_3d",
      "element": "dining table edge",
      "orientation": "only a narrow tabletop plane and edge remain at the lower frame margin",
      "state": "still, ordinary, dim"
     }
    ],
    "lighting_mood": "A cold daylight wash turns jaundiced over the photo glass, with restrained crimson-brown distortion tones pulsing against the muted domestic background.",
    "perception_mode": "hallucination",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 18,
    "shot_index": 20,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Extreme close-up insert framing at tabletop height, pushing into the photo surface with jaundiced and crimson-brown distortion tones.",
      "t2i_prompt": "Photorealistic cinematic still. A distorted mother's face inside a framed photograph occupies the middle-center foreground. The front surface of the photo is angled slightly upward to the camera. Within the printed image, the face of a Korean middle-aged woman in her early 40s with natural dark hair and soft mature features is grotesquely melted in a frozen, distorted smile, looking directly at the camera. The clean, unnervingly glossy photo glass reflects a dim streak of room light across the melted face, proving the subject is trapped inside the physical image surface. A narrow edge of the dark dining table remains visible at the lower frame margin. A cold, blue-gray daylight wash turns jaundiced over the glass, highlighting restrained crimson-brown tones against the muted background.",
      "outfit_assignments": [],
      "source_facts": [
       "S#18 action: '식탁에 놓인 엄마와 수리영의 사진을 보는데... 환하게 웃는 엄마 얼굴이 뭉개져 흘러내린다'",
       "Shot 20 description: 식탁 위에 놓인 사진 속, 살점이 뭉개진 채 기괴하게 흘러내린 (변형된 민숙)의 모습 클로즈업."
      ],
      "visual_inferences": [
       "fixed_element apartment_cold_daylight applied: A cold, blue-gray daylight wash illuminates the scene but turns jaundiced upon hitting the distorted photo glass.",
       "Due to the insert framing scale, the surrounding room is entirely stripped away, leaving only the narrow tabletop plane as spatial context."
      ],
      "creative_decisions": [
       "Render the character's face inside the photo with generic demographic descriptors rather than C##O## composite, conforming to the reproduction surface rule.",
       "Contrast the cold blue-gray ambient lighting with sickly jaundiced and crimson-brown tones localized to the hallucinated surface to visually isolate the horror."
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001"
      ],
      "reference_phrase_kinds": [
       "character",
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "bathroom door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "chair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "dining table",
        "usage_kind": "anchor",
        "source_phrase": "the dark dining table"
       },
       {
        "owned_token": "kitchenette",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "mirror",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "photo",
        "usage_kind": "redraw",
        "source_phrase": "a framed photograph"
       },
       {
        "owned_token": "shower fixture",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "sink",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "toilet",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "b4ebe4f6ece274f8",
       "owned_hash": "18d4d6edd0ef2213",
       "camera_direction_hash": "d7790a59b6e82c34",
       "owned_usage_hash": "86b2bcbf5d19233a",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "dining table",
         "violating_phrase": "the dark dining table",
         "reason": "The dining table is mentioned only as a spatial anchor at the lower frame margin, consistent with the producer's declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "photo",
         "violating_phrase": "A distorted mother's face inside a framed photograph occupies the middle-center foreground",
         "reason": "The grotesque melting of the face inside the photo frame directly fulfills the structural change required by the shot intent ('식탁 위에 놓인 사진 속 민숙(C12)의 얼굴이 살점이 뭉개진 채 기괴하게 흘러내리는 클로즈업 순간'), qualifying for the visual state change exception.",
         "verdict": "allowed_visual_state_change"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "C12"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 18,
      "shot_index": 20
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "insert",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "At tabletop height beside the dining table, the push-in finishes at an extreme close angle on the framed photograph, stripping away nearly all surrounding table context. The mother’s photographed face, now perceived as 민숙 (변형된), occupies the central close field in a grotesque melted distortion, while the photo frame edge remains barely visible to prove this horror is trapped inside the image surface.",
      "lighting_mood": "A cold daylight wash turns jaundiced over the photo glass, with restrained crimson-brown distortion tones pulsing against the muted domestic 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": "distorted mother’s face inside framed photograph",
         "screen_zone": "middle_center",
         "target_id": "C12",
         "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": [
       "C12"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C12",
        "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": [],
      "constraints": [
       "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
       "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
       "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
       "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
       "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject 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": "L04B04",
      "reference_usage": "exact_background",
      "owned_objects": [
       "bathroom door",
       "chair",
       "dining table",
       "kitchenette",
       "mirror",
       "photo",
       "shower fixture",
       "sink",
       "toilet"
      ],
      "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": "apartment_cold_daylight",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior spaces of the apartment are bathed in a cold, blue-gray daylight wash. The lighting lacks warm domestic tones, creating a stark, chilly, and sterile atmosphere across the different rooms. This unnatural daytime illumination suppresses any cozy feeling, making the rooms look slightly staged and unsettling.",
        "applies_to_shots": [
         6,
         15,
         20
        ],
        "element_scope": "full",
        "source_facts": [
         "Thin daylight is cooled into blue-gray shadow (Shot 6)",
         "Washed blue bathroom light (Shot 15)",
         "A cold daylight wash turns jaundiced (Shot 20)"
        ],
        "visual_inferences": [
         "The entire apartment shares a consistent cold, unwelcoming blue-gray tint regardless of the specific room.",
         "The lighting unifies the separate spaces to build a cohesive sense of isolation."
        ],
        "creative_decisions": [
         "Applying a unified cold, blue-tinted lighting palette across all interior shots to emphasize psychological horror and visual continuity."
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 18,
        "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": "L04B04",
        "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"
      }
     }
    }
   }
  },
  "S18_Shot6": {
   "scene_index": 18,
   "shot_index": 6,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B03"
   ],
   "scene_heading": "S#18. 안방 안 / D",
   "description": "열린 방문 너머, 핏자국 하나 없이 말끔하게 정돈된 방안 정경.",
   "characters": [],
   "staging": {
    "camera_direction": "Just outside 수리영’s room, the camera stays eye-level and static about five feet from the threshold, looking straight through the opened door into a room that appears too clean. The doorway forms a dark rectangular frame around the orderly bed, smooth floor, and untouched curtains, with no body, no stain, and no trace where memory said there should be horror.",
    "character_angles": [],
    "frame_spatial_contract": null,
    "framing_scale": "wide",
    "key_bg_elements": [
     {
      "camera_use": "primary frame-within-frame revealing the room",
      "directionality_class": "directional_3d",
      "element": "opened bedroom door",
      "orientation": "the door slab is swung aside so the camera sees through the threshold into the room",
      "state": "open, still"
     },
     {
      "camera_use": "visual proof of unnatural order",
      "directionality_class": "directional_3d",
      "element": "neatly arranged bed",
      "orientation": "the bed’s side and top plane face camera beyond the doorway",
      "state": "made, undisturbed"
     },
     {
      "camera_use": "absence marker where the earlier horror is expected",
      "directionality_class": "transparent_surface",
      "element": "bedroom window with curtains",
      "orientation": "the window is partly obscured by clean curtains, with pale daylight diffused beyond",
      "state": "closed, curtains hanging evenly"
     },
     {
      "camera_use": "negative evidence emphasized by stillness",
      "directionality_class": "non_directional",
      "element": "spotless bedroom floor",
      "orientation": "",
      "state": "clean, dry, no blood visible"
     }
    ],
    "lighting_mood": "Thin daylight is cooled into blue-gray shadow, with no warm relief except a faint domestic amber trace that makes the room’s cleanliness feel staged and wrong.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 18,
    "shot_index": 6,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Eye-level wide shot from just outside the doorway, using the dark door frame to create a stark frame-within-a-frame composition, bathed in cold blue-gray daylight.",
      "t2i_prompt": "Photorealistic cinematic still. An observer's view looking straight through an opened bedroom door, the dark threshold forming a rectangular frame in the foreground. Inside the stark and sterile room, a neatly arranged bed sits untouched under a cold blue-gray daylight wash. The spotless floor stretches smoothly toward the back, where an evenly hanging curtain partly obscures the bedroom window. The space is entirely devoid of people, bathed in a chilly shadow with only a faint domestic amber trace lingering near the door frame.",
      "outfit_assignments": [],
      "source_facts": [
       "shot description: observer at doorway, looking in",
       "opened bedroom door: open, still",
       "neatly arranged bed: made, undisturbed",
       "spotless bedroom floor: clean, dry, no blood visible"
      ],
      "visual_inferences": [
       "fixed_element apartment_cold_daylight: cold, blue-gray daylight wash, stark, chilly, sterile",
       "The dark doorway creates a frame-within-a-frame effect to emphasize the haunting emptiness of the room"
      ],
      "creative_decisions": [
       "Emphasized the undisturbed bed and spotless floor to highlight the psychological tension of missing horror",
       "Added a faint amber trace near the frame to contrast with the chilling blue-gray light inside"
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [],
      "reference_phrase_kinds": [
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "bathroom door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "bed",
        "usage_kind": "anchor",
        "source_phrase": "neatly arranged bed sits untouched"
       },
       {
        "owned_token": "bedroom door",
        "usage_kind": "anchor",
        "source_phrase": "opened bedroom door"
       },
       {
        "owned_token": "ceiling light",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "curtain",
        "usage_kind": "anchor",
        "source_phrase": "evenly hanging curtain partly obscures"
       },
       {
        "owned_token": "dining chair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "dining table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "entrance door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "floor",
        "usage_kind": "anchor",
        "source_phrase": "spotless floor stretches smoothly"
       },
       {
        "owned_token": "kitchenette",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "mirror",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "shower fixture",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "sink",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "storage cabinet",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "threshold",
        "usage_kind": "anchor",
        "source_phrase": "dark threshold forming a rectangular frame"
       },
       {
        "owned_token": "toilet",
        "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": "the bedroom window"
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "1d1250c3d90538ad",
       "owned_hash": "8dd212a47bf04e45",
       "camera_direction_hash": "f4963f4a69a70086",
       "owned_usage_hash": "2ef87b880d81db40",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "bedroom door",
         "violating_phrase": "opened bedroom door",
         "reason": "The prompt references the bedroom door to establish the perspective looking into the room, which matches the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "threshold",
         "violating_phrase": "dark threshold forming a rectangular frame",
         "reason": "The prompt uses the threshold as a foreground framing device for the composition, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "bed",
         "violating_phrase": "neatly arranged bed sits untouched",
         "reason": "The prompt describes the clean state and lighting of the existing bed, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "floor",
         "violating_phrase": "spotless floor stretches smoothly",
         "reason": "The prompt describes the texture and state of the existing floor to establish the scene's atmosphere, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "curtain",
         "violating_phrase": "evenly hanging curtain partly obscures",
         "reason": "The prompt refers to the curtain's position and state to describe the room's background, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "window",
         "violating_phrase": "the bedroom window",
         "reason": "The prompt mentions the window as a spatial reference point behind the curtain, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "L04"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 18,
      "shot_index": 6
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "wide",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "Just outside 수리영’s room, the camera stays eye-level and static about five feet from the threshold, looking straight through the opened door into a room that appears too clean. The doorway forms a dark rectangular frame around the orderly bed, smooth floor, and untouched curtains, with no body, no stain, and no trace where memory said there should be horror.",
      "lighting_mood": "Thin daylight is cooled into blue-gray shadow, with no warm relief except a faint domestic amber trace that makes the room’s cleanliness feel staged and wrong.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 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": "L04B03",
      "reference_usage": "exact_background",
      "owned_objects": [
       "bathroom door",
       "bed",
       "bedroom door",
       "ceiling light",
       "curtain",
       "dining chair",
       "dining table",
       "entrance door",
       "floor",
       "kitchenette",
       "mirror",
       "shower fixture",
       "sink",
       "storage cabinet",
       "threshold",
       "toilet",
       "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": "apartment_cold_daylight",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior spaces of the apartment are bathed in a cold, blue-gray daylight wash. The lighting lacks warm domestic tones, creating a stark, chilly, and sterile atmosphere across the different rooms. This unnatural daytime illumination suppresses any cozy feeling, making the rooms look slightly staged and unsettling.",
        "applies_to_shots": [
         6,
         15,
         20
        ],
        "element_scope": "full",
        "source_facts": [
         "Thin daylight is cooled into blue-gray shadow (Shot 6)",
         "Washed blue bathroom light (Shot 15)",
         "A cold daylight wash turns jaundiced (Shot 20)"
        ],
        "visual_inferences": [
         "The entire apartment shares a consistent cold, unwelcoming blue-gray tint regardless of the specific room.",
         "The lighting unifies the separate spaces to build a cohesive sense of isolation."
        ],
        "creative_decisions": [
         "Applying a unified cold, blue-tinted lighting palette across all interior shots to emphasize psychological horror and visual continuity."
        ],
        "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": "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"
      }
     }
    }
   }
  },
  "S25_Shot4": {
   "scene_index": 25,
   "shot_index": 4,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B01"
   ],
   "scene_heading": "S#25. 옥탑방 안 / 해질 무렵",
   "description": "붉은 원 한가운데에 피가 묻은 낡은 흑백 사진이 꽂혀 있는 클로즈업.",
   "characters": [],
   "staging": {
    "camera_direction": "Inside the bedroom at eye level, the dolly-in ends locked nearly perpendicular to the torn wall, holding a close composition where the blood-stained black-and-white photograph sits pinned at the exact center of a crimson circle. The photo and red mark take up the central mass of the frame, while the rough wall texture remains visible around them like scraped skin.",
    "character_angles": [],
    "frame_spatial_contract": null,
    "framing_scale": "close",
    "key_bg_elements": [
     {
      "camera_use": "central occult symbol and compositional target",
      "directionality_class": "content_surface",
      "element": "red circular wall mark",
      "orientation": "the painted wall face is directly visible to camera, showing a rough crimson circle surrounding the pinned photograph",
      "state": "fresh-looking, uneven, ominous"
     },
     {
      "camera_use": "primary revealed clue",
      "directionality_class": "content_surface",
      "element": "old black-and-white photograph",
      "orientation": "the front image face is visible, showing an aged rural restaurant scene partially obscured by blood stains",
      "state": "pinned to wall, creased, blood-stained"
     },
     {
      "camera_use": "macabre texture around the clue",
      "directionality_class": "non_directional",
      "element": "torn bedroom wall texture",
      "orientation": "",
      "state": "scraped, dirty, disturbed"
     }
    ],
    "lighting_mood": "Dying amber dusk from the wrecked room skims the wall while blue-gray shadows pool around the crimson circle and old blood, giving the clue a ritual weight.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 25,
    "shot_index": 4,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Close composition locked perpendicular to the wall, dying amber dusk with blue-gray shadows",
      "t2i_prompt": "Photorealistic cinematic still. A close-up composition, locked nearly perpendicular to [: a torn bedroom wall, scraped and dirty texture filling the frame edges]. At the exact center, P02, a hand-sized, creased, and blood-stained old black-and-white paper photograph, is pinned to the surface. The front face of P02 is clearly visible, depicting a weathered scene of a rural restaurant with a round roof symbol and two young girls, partially obscured by the old blood stains. Surrounding the photograph is P03, a rough, uneven, freshly painted crimson circle. The central mass of the frame is entirely dominated by P02 and P03. The wall is illuminated by a dying amber sunset light skimming the rough texture, while deep damp blue-gray shadows pool around the crimson mark and the blood stains.",
      "outfit_assignments": [],
      "source_facts": [
       "벽에 또 붉은 원이 그려져있다",
       "그 가운데 꽂혀있는 피묻은 사진 한 장!",
       "7-80년대 쯤 보이는 시골 식당과 지붕위에 둥근 원이 설치된 (마치 십자가처럼) 식당 앞에는 어린 여자애 둘(12살)이 앉아있다",
       "해질 무렵"
      ],
      "visual_inferences": [
       "fixed_element ransacked_room_sunset_lighting: dying amber dusk intersecting with blue-gray shadows",
       "The photograph is the exact center of the frame, giving a ritualistic weight to the clue",
       "P03 is freshly painted and ominous, framing P02"
      ],
      "creative_decisions": [
       "Skipped background references to focus entirely on the close framing of the macabre wall surface",
       "Emphasized the torn, scraped texture of the wall to contrast with the deep amber and blue-gray lighting"
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [],
      "reference_phrase_kinds": [
       "prop"
      ],
      "owned_object_usage": [
       {
        "owned_token": "bed",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "curtain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "photograph",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "pin",
        "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": "201dd9731136676d",
       "owned_hash": "241f896698db3b8d",
       "camera_direction_hash": "598c02c582693c8d",
       "owned_usage_hash": "68399838ac460cb5",
       "validator": "scene_detail_owned_objects.v1.close_skip",
       "violations": []
      }
     }
    ],
    "visible_entities": [
     "P03",
     "P02"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 25,
      "shot_index": 4
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "close",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "Inside the bedroom at eye level, the dolly-in ends locked nearly perpendicular to the torn wall, holding a close composition where the blood-stained black-and-white photograph sits pinned at the exact center of a crimson circle. The photo and red mark take up the central mass of the frame, while the rough wall texture remains visible around them like scraped skin.",
      "lighting_mood": "Dying amber dusk from the wrecked room skims the wall while blue-gray shadows pool around the crimson circle and old blood, giving the clue a ritual weight.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": 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": [
       "P03",
       "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": "skipped_close_framing",
      "bg_id": "L04B01",
      "reference_usage": "skipped_close_framing",
      "owned_objects": [],
      "camera_reference": null,
      "close_framing_skips_background_ref": true,
      "constraints": [
       "this shot uses close framing — the background reference is intentionally omitted at composition time",
       "describe the close subject and its immediate surroundings without relying on the absent background reference",
       "use [L##: ...] block for frame-edge surface description"
      ]
     },
     "continuity_elements_used": {
      "fixed_elements": [
       {
        "element_id": "ransacked_room_sunset_lighting",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior space is in a heavily ransacked state, with belongings and furniture violently scattered around. A sickly, dying amber sunset light illuminates parts of the room, sharply contrasting with deep, damp blue-gray shadows pooling in the unlit areas.",
        "applies_to_shots": [
         4,
         8
        ],
        "element_scope": "full",
        "source_facts": [
         "해질 무렵",
         "집안에서 뭔가를 찾기 위해 가재도구를 온통 헤집은 것으로 보인다",
         "Dying amber dusk from the wrecked room",
         "blue-gray shadows pool",
         "Sickly amber sunset leaks... against damp blue-gray interior shadows"
        ],
        "visual_inferences": [
         "The warm dusk light intersecting with cool, dark shadows heightens the chaotic and tense atmosphere of the wrecked room."
        ],
        "creative_decisions": [
         "Maintain a consistent amber and blue-gray color palette across the interior shots to visually anchor the time of day and the psychological weight of the scene."
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 18,
        "shot_index": 15,
        "ref_usage": "",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "prop",
        "id": "P02",
        "policy": "required"
       }
      ],
      "forbidden_refs": [
       {
        "kind": "background",
        "reason": "close framing skips chain_bg reference"
       }
      ],
      "readiness_policy": "block_if_missing",
      "constraints": [
       "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
       "if a required character_outlook ref is missing, scene image generation must block before the image stage"
      ]
     },
     "render_contracts": [
      {
       "contract_id": "rc_001",
       "scope": {
        "scene_index": 25,
        "shot_indices": [
         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": 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"
      }
     }
    }
   }
  },
  "S25_Shot8": {
   "scene_index": 25,
   "shot_index": 8,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B02"
   ],
   "scene_heading": "S#25. 옥탑방 안 / 해질 무렵",
   "description": "수리영이 한 손에 구겨진 사진을 꽉 쥔 채 백팩을 메고 현관 밖으로 한 발을 내디딘 찰나의 뒷모습.",
   "characters": [
    "수리영"
   ],
   "staging": {
    "camera_direction": "From inside the rooftop room behind 수리영, slightly below eye level and several feet back, the tracking shot widens just enough to include the open front-door threshold as she steps out. Her back and backpack sit in the middle of frame, one foot crossing into the exterior light, while the crumpled photograph remains readable as a tight fist-level detail near her right side.",
    "character_angles": [
     {
      "angle": "back_to_camera",
      "body_pose": "stepping across threshold",
      "character": "수리영",
      "gaze_direction_kind": "off_screen",
      "gaze_target_id": null,
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "midground",
       "gesture_action": "moves_toward",
       "gesture_target_label": "open front door",
       "label": "수리영",
       "screen_zone": "middle_center",
       "target_id": "C01",
       "target_kind": "character"
      },
      {
       "depth_plane": "background",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "open front door threshold",
       "screen_zone": "upper_center",
       "target_id": "",
       "target_kind": "background"
      }
     ],
     "reason": "movement_direction"
    },
    "framing_scale": "wide",
    "key_bg_elements": [
     {
      "camera_use": "destination frame and exit boundary",
      "directionality_class": "directional_3d",
      "element": "open front door",
      "orientation": "the inside face of the open door and its threshold angle toward the camera as 수리영 exits",
      "state": "open, letting in dim exterior dusk"
     },
     {
      "camera_use": "evidence of intrusion in the room she leaves behind",
      "directionality_class": "non_directional",
      "element": "scattered household debris",
      "orientation": "",
      "state": "ransacked, strewn across the floor"
     },
     {
      "camera_use": "broken domestic geometry in the side background",
      "directionality_class": "directional_3d",
      "element": "overturned dining chairs",
      "orientation": "chair legs jut sideways at uneven angles across the room",
      "state": "knocked over"
     },
     {
      "camera_use": "damp air source and unsettling escape route implication",
      "directionality_class": "transparent_surface",
      "element": "open living-room window",
      "orientation": "the camera sees the dark opening and wet exterior air beyond the window frame",
      "state": "open, dirty, cold"
     }
    ],
    "lighting_mood": "Sickly amber sunset leaks from the doorway against damp blue-gray interior shadows, leaving the ransacked room textured and bruised behind her.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 25,
    "shot_index": 8,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "wide tracking shot from behind, slightly below eye level, sickly amber sunset leaking into blue-gray interior shadows",
      "t2i_prompt": "Photorealistic cinematic still. C01O02 in a waterproof windbreaker, a young Korean woman in her early 20s, stands with her back to the camera in the middle-center midground, moving toward the open front door threshold in the upper-center background. Captured from inside the dark room slightly below eye level, the wide frame encompasses her figure and the interior space behind her. She wears P04 on her back, her right hand gripped tightly around P02, the small, crumpled paper photograph held near her waist. One foot crosses over the threshold onto the floor beyond, her gaze directed off-screen into the damp outside air. Sickly amber sunset light leaks through the open door, outlining her rim-lit shoulders and preserving her body volume, while deep, damp blue-gray shadows pool behind her. The surrounding floor is scattered with violently strewn household items, anchoring the heavily ransacked state of the room against the warm exterior dusk.",
      "outfit_assignments": [
       {
        "character_id": "C01",
        "outlook_id": "O02"
       }
      ],
      "source_facts": [
       "마치 이끌리듯 백팩(P04)을 메고 밖으로 나간다. 사진(P02)을 손에 꼭 쥔 채.",
       "수리영: back_to_camera, stepping across threshold, gaze=off_screen"
      ],
      "visual_inferences": [
       "fixed_element ransacked_room_sunset_lighting: heavily ransacked state, amber sunset light intersecting with deep damp blue-gray shadows.",
       "Body volume preserved with rim light from the exterior dusk, emphasizing her departure from the dark room."
      ],
      "creative_decisions": [
       "Used a wide frame from slightly below eye level to encompass both the character's exit and the chaotic state of the room left behind.",
       "Contrasted the warm amber exterior light at the threshold with the cool blue-gray shadows inside to heighten tension."
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001",
       "fsc_002"
      ],
      "reference_phrase_kinds": [
       "character",
       "background",
       "prop"
      ],
      "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": "counter",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "curtain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "anchor",
        "source_phrase": "open front door threshold"
       },
       {
        "owned_token": "floor",
        "usage_kind": "anchor",
        "source_phrase": "onto the floor beyond"
       },
       {
        "owned_token": "footprint",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "household item",
        "usage_kind": "anchor",
        "source_phrase": "strewn household items"
       },
       {
        "owned_token": "sink",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stand",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stovetop",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "threshold",
        "usage_kind": "anchor",
        "source_phrase": "open front door threshold"
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "d28b86a5b5360689",
       "owned_hash": "c1406029db8eda6f",
       "camera_direction_hash": "f1d39fa7a40ccbb3",
       "owned_usage_hash": "9706e0c6604ef100",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "door",
         "violating_phrase": "open front door threshold",
         "reason": "The door is used as a spatial and lighting anchor to guide the character's movement and light entry, which matches the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "threshold",
         "violating_phrase": "open front door threshold",
         "reason": "The threshold is referenced purely as a physical landmark for the character to cross, serving as a compositional anchor.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "floor",
         "violating_phrase": "onto the floor beyond",
         "reason": "The floor is mentioned as a surface to define the spatial boundary and hold scattered items, serving as an anchor.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "household item",
         "violating_phrase": "strewn household items",
         "reason": "The household items are referenced to establish and anchor the pre-existing state of the ransacked room, rather than directing a new generation.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "C01",
     "P02",
     "P04",
     "L04"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 25,
      "shot_index": 8
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "wide",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "From inside the rooftop room behind 수리영, slightly below eye level and several feet back, the tracking shot widens just enough to include the open front-door threshold as she steps out. Her back and backpack sit in the middle of frame, one foot crossing into the exterior light, while the crumpled photograph remains readable as a tight fist-level detail near her right side.",
      "lighting_mood": "Sickly amber sunset leaks from the doorway against damp blue-gray interior shadows, leaving the ransacked room textured and bruised 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": "movement_direction",
       "constraints": [
        {
         "constraint_id": "fsc_001",
         "depth_plane": "background",
         "gesture_action": "none",
         "gesture_target_label": "",
         "label": "open front door threshold",
         "screen_zone": "upper_center",
         "target_id": "",
         "target_kind": "background"
        },
        {
         "constraint_id": "fsc_002",
         "depth_plane": "midground",
         "gesture_action": "moves_toward",
         "gesture_target_label": "open front 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",
       "P02",
       "P04",
       "L04"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C01",
        "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": "L04B02",
      "reference_usage": "exact_background",
      "owned_objects": [
       "TV",
       "bed",
       "chair",
       "counter",
       "curtain",
       "door",
       "floor",
       "footprint",
       "household item",
       "sink",
       "stand",
       "stovetop",
       "table",
       "threshold",
       "window"
      ],
      "camera_reference": null,
      "close_framing_skips_background_ref": false,
      "constraints": [
       "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
       "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
      ]
     },
     "continuity_elements_used": {
      "fixed_elements": [
       {
        "element_id": "ransacked_room_sunset_lighting",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The interior space is in a heavily ransacked state, with belongings and furniture violently scattered around. A sickly, dying amber sunset light illuminates parts of the room, sharply contrasting with deep, damp blue-gray shadows pooling in the unlit areas.",
        "applies_to_shots": [
         4,
         8
        ],
        "element_scope": "full",
        "source_facts": [
         "해질 무렵",
         "집안에서 뭔가를 찾기 위해 가재도구를 온통 헤집은 것으로 보인다",
         "Dying amber dusk from the wrecked room",
         "blue-gray shadows pool",
         "Sickly amber sunset leaks... against damp blue-gray interior shadows"
        ],
        "visual_inferences": [
         "The warm dusk light intersecting with cool, dark shadows heightens the chaotic and tense atmosphere of the wrecked room."
        ],
        "creative_decisions": [
         "Maintain a consistent amber and blue-gray color palette across the interior shots to visually anchor the time of day and the psychological weight of the scene."
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 14,
        "shot_index": 8,
        "ref_usage": "",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "character_outlook",
        "id": "C01O02",
        "policy": "required"
       },
       {
        "kind": "background",
        "id": "L04B02",
        "policy": "required"
       },
       {
        "kind": "prop",
        "id": "P02",
        "policy": "required"
       },
       {
        "kind": "prop",
        "id": "P04",
        "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": [
         8
        ],
        "duration": "single_shot"
       },
       "targets": [
        {
         "entity_id": "P02",
         "role": "visual_target"
        }
       ],
       "requirements": [
        {
         "dimension": "visual_identity",
         "operation": "preserve",
         "strength": "required",
         "reference_policy": "use_entity_reference"
        }
       ]
      },
      {
       "contract_id": "rc_002",
       "scope": {
        "scene_index": 25,
        "shot_indices": [
         8
        ],
        "duration": "single_shot"
       },
       "targets": [
        {
         "entity_id": "P04",
         "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"
      }
     }
    }
   }
  },
  "S27_Shot1": {
   "scene_index": 27,
   "shot_index": 1,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B02"
   ],
   "scene_heading": "S#27. 옥탑방 안 / 해질 무렵",
   "description": "난장판이 된 옥탑방 거실, 혜수가 핸드폰을 귀에 댄 채 심각한 표정으로 굳어 있는 상체.",
   "characters": [
    "혜수"
   ],
   "staging": {
    "camera_direction": "Inside the rooftop living room at chest height, the camera continues the flow’s slow dolly-in from about 2.5 meters, tightening to a medium upper-body frame of 혜수 with the phone pressed to her ear. She sits slightly right of center amid overturned, damp-looking clutter, angled three-quarters as if her attention has just pulled toward 김형사 off-frame rather than toward us.",
    "character_angles": [
     {
      "angle": "three_quarter_right",
      "body_pose": "phone pressed to ear",
      "character": "혜수",
      "gaze_direction_kind": "looks_at_character",
      "gaze_target_id": "C05",
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": null,
    "framing_scale": "medium",
    "key_bg_elements": [
     {
      "camera_use": "visible disorder around 혜수, keeping the room’s violated condition readable behind her",
      "directionality_class": "non_directional",
      "element": "scattered rooftop-room clutter",
      "orientation": "",
      "state": "messy, overturned, neglected"
     },
     {
      "camera_use": "background source of cold draft and later sound, held out of focus behind the anxiety",
      "directionality_class": "directional_3d",
      "element": "entrance door",
      "orientation": "its inner face angles slightly away from camera, showing the rattling edge and frame gap",
      "state": "not fully secure, wind-shaken"
     },
     {
      "camera_use": "thin translucent layer over the small room window, adding a damp dusk haze",
      "directionality_class": "transparent_surface",
      "element": "grimy window glass",
      "orientation": "dirty glass catches the gray exterior light while showing only a blurred rooftop beyond",
      "state": "streaked, dim"
     }
    ],
    "lighting_mood": "Cold blue dusk leaks through dirty glass while weak amber practical light stains the room’s mess, making 혜수’s frozen concern feel sickly and trapped.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 27,
    "shot_index": 1,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Chest-height medium upper-body frame, cool blue dusk contrasting with weak amber practical lights",
      "t2i_prompt": "Photorealistic cinematic still. A medium upper-body frame from chest height captures C02O03 in a dark jacket, a Korean middle-aged woman, mid-40s face, mature facial features, dark natural hair. She sits slightly right of center at a three-quarter angle from the right, her hand gripping the modern handheld smartphone P01 pressed to her ear. Her eyes are fixed on an off-screen figure with a frozen, serious expression. Behind her, the dim space features scattered overturned household items, a rattling entrance door, and a grimy window. Cold blue dusk leaks through the dirty window glass, while weak amber practical light stains the clutter.",
      "outfit_assignments": [
       {
        "character_id": "C02",
        "outlook_id": "O03"
       }
      ],
      "source_facts": [
       "S#27 action: '수리영의 녹음메시지를 확인하는 혜수'",
       "shot description: Hyesu sitting slightly right of center, angled three-quarters, phone pressed to ear, attention pulled toward Kim Detective off-frame",
       "background: messy rooftop room, wind-shaken entrance door, grimy window glass"
      ],
      "visual_inferences": [
       "chest-height camera angle naturally excludes the floor and lower body to focus on the upper body and face",
       "cold blue dusk lighting mixed with amber practical lights emphasizing the isolated and neglected atmosphere"
      ],
      "creative_decisions": [
       "medium upper-body frame to highlight Hyesu's frozen reaction while keeping the scattered clutter visible in the background",
       "color contrast between the cold exterior blue light and the sickly warm interior light to heighten tension"
      ],
      "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": "counter",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "curtain",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "anchor",
        "source_phrase": "a rattling entrance door"
       },
       {
        "owned_token": "floor",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "footprint",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "household item",
        "usage_kind": "anchor",
        "source_phrase": "scattered overturned household items"
       },
       {
        "owned_token": "sink",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stand",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stovetop",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "threshold",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "anchor",
        "source_phrase": "a grimy window"
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "629ec9ad8bf80e6c",
       "owned_hash": "c1406029db8eda6f",
       "camera_direction_hash": "1dee48f14b2ca72d",
       "owned_usage_hash": "0f19eb9b688d0aee",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "door",
         "violating_phrase": "a rattling entrance door",
         "reason": "The prompt mentions the entrance door as a background element with a dynamic state to establish atmosphere, which aligns with the producer's declaration as a spatial anchor.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "household item",
         "violating_phrase": "scattered overturned household items",
         "reason": "The prompt refers to these items to describe the background clutter and state of the room, functioning as an environmental anchor in line with the producer's declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "window",
         "violating_phrase": "a grimy window",
         "reason": "The window is mentioned to describe the glass and the cold light filtering through it, which serves as a lighting and spatial anchor without requesting a redraw.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "C02",
     "P01",
     "L04"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 27,
      "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 rooftop living room at chest height, the camera continues the flow’s slow dolly-in from about 2.5 meters, tightening to a medium upper-body frame of 혜수 with the phone pressed to her ear. She sits slightly right of center amid overturned, damp-looking clutter, angled three-quarters as if her attention has just pulled toward 김형사 off-frame rather than toward us.",
      "lighting_mood": "Cold blue dusk leaks through dirty glass while weak amber practical light stains the room’s mess, making 혜수’s frozen concern feel sickly and trapped.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 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",
       "P01",
       "L04"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C02",
        "outlook_id": "O03"
       }
      ],
      "must_use_composite_character_ids": true,
      "common_noun_required_when": [
       "a reproduced face inside any declared reproduction surface",
       "unregistered extra"
      ],
      "id_use_required_when": [
       "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
      ],
      "demographic_fallback_required": true,
      "face_identifiability_rule": {
       "use_entity_id_when": [
        "face identifiable: front, profile, three-quarter, or eyes closed",
        "OTS framing with any visible face"
       ],
       "common_noun_required_when": [
        "back to camera with no visible face",
        "silhouette or blurred outline only",
        "OTS with only back of head/shoulder, face entirely hidden"
       ],
       "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
       "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
      },
      "reproduction_surface_rule": {
       "applies": false,
       "id_use": "forbidden — generic descriptor with demographic only",
       "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
      },
      "demographic_descriptor_policy": {
       "required_on_first_appearance": true,
       "applies_to_id_forms": [
        "C##",
        "C##O##"
       ],
       "token_count_range": [
        1,
        2
       ],
       "components": {
        "ethnicity": [
         "Asian",
         "East Asian",
         "South Asian",
         "Southeast Asian",
         "Black",
         "Middle Eastern",
         "Hispanic",
         "Latina",
         "Latino",
         "Caucasian"
        ],
        "gender": [
         "man",
         "woman",
         "figure"
        ],
        "age_band": [
         "in his/her 20s",
         "in his/her 30s",
         "in his/her 40s",
         "young",
         "middle-aged",
         "elderly"
        ],
        "role_hint_from_outfit": [
         "in worker uniform",
         "in fisher workwear",
         "in detective coat",
         "in business suit"
        ]
       },
       "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
       "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
       "source_priority": [
        "visual_world_rules.region",
        "visual_world_rules.era",
        "shot context outfit hint"
       ],
       "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
       "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
      },
      "subject_reference_policy": [],
      "constraints": [
       "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
       "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
       "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
       "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
       "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
      ]
     },
     "background_binding": {
      "mode": "background_ref_attached",
      "bg_id": "L04B02",
      "reference_usage": "exact_background",
      "owned_objects": [
       "TV",
       "bed",
       "chair",
       "counter",
       "curtain",
       "door",
       "floor",
       "footprint",
       "household item",
       "sink",
       "stand",
       "stovetop",
       "table",
       "threshold",
       "window"
      ],
      "camera_reference": null,
      "close_framing_skips_background_ref": false,
      "constraints": [
       "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
       "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
      ]
     },
     "continuity_elements_used": {
      "fixed_elements": [],
      "previous_shot_refs": [
       {
        "scene_index": 18,
        "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": "C02O03",
        "policy": "required"
       },
       {
        "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"
      }
     }
    }
   }
  },
  "S4_Shot1": {
   "scene_index": 4,
   "shot_index": 1,
   "loc_ids": [
    "L03"
   ],
   "is_indoor": false,
   "bg_ids": [
    "L03B02"
   ],
   "scene_heading": "S#4. 옥탑방 / D",
   "description": "인천 변두리의 낡고 오래된 빌라 옥탑방 외부 전경이 한눈에 내려다보이는 부감 구도.",
   "characters": [],
   "staging": {
    "camera_direction": "An omniscient overhead camera holds from about forty-five meters above the old villa, centered on the rooftop room while still keeping the surrounding neighborhood readable. The rooftop structure sits in the middle of the frame like a small exposed shrine, boxed in by worn roofs, narrow alleys, and faded concrete blocks.",
    "character_angles": [],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "midground",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "old rooftop room",
       "screen_zone": "middle_center",
       "target_id": "",
       "target_kind": "background"
      }
     ],
     "reason": "required_background_position"
    },
    "framing_scale": "wide",
    "key_bg_elements": [
     {
      "camera_use": "The rooftop room is the central visual anchor and destination of the aerial reveal.",
      "directionality_class": "directional_3d",
      "element": "old rooftop room exterior",
      "orientation": "its roof and front wall are visible from above, with the doorway side angled slightly toward camera",
      "state": "aged, patched, weather-stained"
     },
     {
      "camera_use": "Surrounding villa roofs create a cramped grid that isolates the rooftop room.",
      "directionality_class": "directional_3d",
      "element": "neighboring old villa rooftops",
      "orientation": "flat roof planes face upward toward the overhead camera",
      "state": "worn, cluttered, pale gray"
     },
     {
      "camera_use": "A thin haze softens the outskirts and carries the news voice’s unease into the space.",
      "directionality_class": "non_directional",
      "element": "damp urban haze",
      "orientation": "",
      "state": "thin, bluish, stagnant"
     }
    ],
    "lighting_mood": "Daylight is overcast and desaturated, with blue-gray concrete shadows and faint sickly amber window stains breaking the neighborhood’s cold isolation.",
    "perception_mode": "direct",
    "perspective": "omniscient",
    "pov_character": "",
    "scene_index": 4,
    "shot_index": 1,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "omniscient overhead wide shot, desaturated daylight, blue-gray shadows",
      "t2i_prompt": "Photorealistic cinematic still. An old rooftop room sits in the middle-center midground, viewed from an omniscient overhead camera high above. The dilapidated building is centered in the wide frame, boxed in by a cramped grid of neighboring pale gray rooftops and narrow alleys. Daylight is overcast and desaturated, casting blue-gray concrete shadows across the worn roof tile and faded parapet. An aged water tank, a rusted antenna, and sagging cable lines dot the flat surface next to the stairwell. A thin, bluish damp urban haze softens the outskirts, while faint sickly amber stains on the window break the neighborhood's cold isolation.",
      "outfit_assignments": [],
      "source_facts": [
       "S#4 action: 인천 변두리 부감, 오래된 빌라 옥탑방 전경.",
       "shot description: omniscient overhead camera from above the old villa, centered on the rooftop room",
       "lighting mood: overcast, desaturated, blue-gray concrete shadows, sickly amber window stains"
      ],
      "visual_inferences": [
       "No characters are physically visible in the frame as the script only contains voiceover.",
       "The surrounding rooftops create a cramped grid that isolates the central rooftop room."
      ],
      "creative_decisions": [
       "Applied a wide framing scale to emphasize the physical isolation of the structure.",
       "Replaced the exact measurement 'forty-five meters' with 'high above' to comply with T2I negative constraints on physical dimensions.",
       "Added a thin, bluish damp urban haze to carry the uneasy tone of the voiceover into the visual atmosphere."
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [
       "fsc_001"
      ],
      "reference_phrase_kinds": [
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "AC",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "antenna",
        "usage_kind": "anchor",
        "source_phrase": "a rusted antenna"
       },
       {
        "owned_token": "building",
        "usage_kind": "anchor",
        "source_phrase": "The dilapidated building is centered in the wide frame"
       },
       {
        "owned_token": "cable",
        "usage_kind": "anchor",
        "source_phrase": "sagging cable lines"
       },
       {
        "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": "and faded parapet"
       },
       {
        "owned_token": "pipe",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "railing",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "roof tile",
        "usage_kind": "anchor",
        "source_phrase": "across the worn roof tile"
       },
       {
        "owned_token": "rooftop room",
        "usage_kind": "anchor",
        "source_phrase": "An old rooftop room sits in the middle-center midground"
       },
       {
        "owned_token": "stairwell",
        "usage_kind": "anchor",
        "source_phrase": "next to the stairwell"
       },
       {
        "owned_token": "utility pole",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "water tank",
        "usage_kind": "anchor",
        "source_phrase": "An aged water tank"
       },
       {
        "owned_token": "window",
        "usage_kind": "anchor",
        "source_phrase": "faint sickly amber stains on the window"
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "5f7757405cab1051",
       "owned_hash": "80045b064c2c2deb",
       "camera_direction_hash": "4939d14dcf649340",
       "owned_usage_hash": "a94fe0e969115c58",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "rooftop room",
         "violating_phrase": "An old rooftop room sits in the middle-center midground",
         "reason": "The prompt establishes the spatial positioning of the pre-existing rooftop room within the frame, which acts as a layout anchor, matching the producer's declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "building",
         "violating_phrase": "The dilapidated building is centered in the wide frame",
         "reason": "The prompt references the building's placement and condition to guide framing and composition, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "roof tile",
         "violating_phrase": "across the worn roof tile",
         "reason": "The prompt describes daylight casting concrete shadows across the pre-existing roof tiles, acting as a lighting anchor, matching the producer's declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "parapet",
         "violating_phrase": "and faded parapet",
         "reason": "The prompt describes shadows casting across the parapet to establish atmosphere and lighting, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "water tank",
         "violating_phrase": "An aged water tank",
         "reason": "The prompt mentions the water tank's position and aged state to anchor the scene's composition without requesting a redraw, matching the producer's declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "antenna",
         "violating_phrase": "a rusted antenna",
         "reason": "The prompt references the rusted antenna to ground the atmospheric and stylistic details of the rooftop, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "cable",
         "violating_phrase": "sagging cable lines",
         "reason": "The prompt describes the state of the existing cables as sagging to fit the dilapidated atmosphere, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "stairwell",
         "violating_phrase": "next to the stairwell",
         "reason": "The prompt uses the stairwell as a spatial anchor to describe where other objects are located, matching the producer's declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "window",
         "violating_phrase": "faint sickly amber stains on the window",
         "reason": "The prompt describes lighting and atmospheric stains on the pre-existing window without ordering a redraw, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "L03"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 4,
      "shot_index": 1
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "wide",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "An omniscient overhead camera holds from about forty-five meters above the old villa, centered on the rooftop room while still keeping the surrounding neighborhood readable. The rooftop structure sits in the middle of the frame like a small exposed shrine, boxed in by worn roofs, narrow alleys, and faded concrete blocks.",
      "lighting_mood": "Daylight is overcast and desaturated, with blue-gray concrete shadows and faint sickly amber window stains breaking the neighborhood’s cold isolation.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 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": "old rooftop room",
         "screen_zone": "middle_center",
         "target_id": "",
         "target_kind": "background"
        }
       ]
      },
      "constraints": [
       "one prompt captures one still moment",
       "do not combine full-body framing and body-part close-up in one frame",
       "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
       "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
       "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
      ]
     },
     "id_policy": {
      "allowed_base_entity_ids": [
       "L03"
      ],
      "allowed_outlook_pairs": [],
      "must_use_composite_character_ids": true,
      "common_noun_required_when": [
       "a reproduced face inside any declared reproduction surface",
       "unregistered extra"
      ],
      "id_use_required_when": [
       "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
      ],
      "demographic_fallback_required": true,
      "face_identifiability_rule": {
       "use_entity_id_when": [
        "face identifiable: front, profile, three-quarter, or eyes closed",
        "OTS framing with any visible face"
       ],
       "common_noun_required_when": [
        "back to camera with no visible face",
        "silhouette or blurred outline only",
        "OTS with only back of head/shoulder, face entirely hidden"
       ],
       "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
       "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
      },
      "reproduction_surface_rule": {
       "applies": false,
       "id_use": "forbidden — generic descriptor with demographic only",
       "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
      },
      "demographic_descriptor_policy": {
       "required_on_first_appearance": true,
       "applies_to_id_forms": [
        "C##",
        "C##O##"
       ],
       "token_count_range": [
        1,
        2
       ],
       "components": {
        "ethnicity": [
         "Asian",
         "East Asian",
         "South Asian",
         "Southeast Asian",
         "Black",
         "Middle Eastern",
         "Hispanic",
         "Latina",
         "Latino",
         "Caucasian"
        ],
        "gender": [
         "man",
         "woman",
         "figure"
        ],
        "age_band": [
         "in his/her 20s",
         "in his/her 30s",
         "in his/her 40s",
         "young",
         "middle-aged",
         "elderly"
        ],
        "role_hint_from_outfit": [
         "in worker uniform",
         "in fisher workwear",
         "in detective coat",
         "in business suit"
        ]
       },
       "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
       "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
       "source_priority": [
        "visual_world_rules.region",
        "visual_world_rules.era",
        "shot context outfit hint"
       ],
       "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
       "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
      },
      "subject_reference_policy": [],
      "constraints": [
       "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
       "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
       "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
       "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
       "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
      ]
     },
     "background_binding": {
      "mode": "background_ref_attached",
      "bg_id": "L03B02",
      "reference_usage": "exact_background",
      "owned_objects": [
       "AC",
       "antenna",
       "building",
       "cable",
       "door",
       "laundry line",
       "parapet",
       "pipe",
       "railing",
       "roof tile",
       "rooftop room",
       "stairwell",
       "utility pole",
       "water tank",
       "window"
      ],
      "camera_reference": null,
      "close_framing_skips_background_ref": false,
      "constraints": [
       "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
       "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
      ]
     },
     "continuity_elements_used": {
      "fixed_elements": [],
      "previous_shot_refs": [],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "background",
        "id": "L03B02",
        "policy": "required"
       }
      ],
      "forbidden_refs": [],
      "readiness_policy": "block_if_missing",
      "constraints": [
       "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
       "if a required character_outlook ref is missing, scene image generation must block before the image stage"
      ]
     },
     "render_contracts": [],
     "_card_metadata": {
      "lift_status": {
       "rule_a_lifted": true,
       "rule_c_lifted": true,
       "rule_e_lifted": false,
       "rule_h_lifted": true,
       "id_policy_composite_lifted": true,
       "id_policy_close_framing_face_lifted": true,
       "id_policy_reproduction_surface_lifted": true,
       "continuity_cross_shot_id_substitution_lifted": true,
       "continuity_ref_usage_constraints_lifted": true,
       "continuity_view_consistency_lifted": true,
       "continuity_constraints_extended": true,
       "spatial_camera_frame_lifted": true,
       "spatial_fg_bg_shared_anchor_lifted": true,
       "spatial_primary_framing_lifted": true,
       "spatial_constraints_extended": true
      },
      "rule_source": {
       "camera_rule": "A",
       "owned_rule": "C",
       "close_skip_rule": "E",
       "demographic_rule": "H",
       "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
       "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
       "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
       "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
       "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
       "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
       "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
       "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
       "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
      }
     }
    }
   }
  },
  "S5_Shot10": {
   "scene_index": 5,
   "shot_index": 10,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B05"
   ],
   "scene_heading": "S#5. 옥탑방 안 / 실내",
   "description": "수리영이 민숙의 어깨에 코를 묻고 멈춘 찰나의 측면.",
   "characters": [
    "수리영",
    "민숙"
   ],
   "staging": {
    "camera_direction": "The camera follows the flow into the narrow entrance area and holds side-on at shoulder height, about one meter away, lens parallel to the wall to compress mother and daughter together. The tighter profile frame favors the contact point: Suriyeong’s face and nose press into Minsuk’s shoulder at center-left, while Minsuk’s softened profile and apron edge sit center-right.",
    "character_angles": [
     {
      "angle": "profile_right",
      "body_pose": "nose buried in shoulder",
      "character": "수리영",
      "gaze_direction_kind": "closed_eyes",
      "gaze_target_id": null,
      "subject_state": "alive"
     },
     {
      "angle": "profile_left",
      "body_pose": "shoulder softened, smiling",
      "character": "민숙",
      "gaze_direction_kind": "looks_at_character",
      "gaze_target_id": "C01",
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": null,
    "framing_scale": "close",
    "key_bg_elements": [
     {
      "camera_use": "The narrow wall flattens the space and makes their closeness feel private and fragile.",
      "directionality_class": "non_directional",
      "element": "entrance wall",
      "orientation": "",
      "state": "worn, slightly yellowed, close to camera plane"
     },
     {
      "camera_use": "The shoe area at the bottom edge hints at Suriyeong leaving soon without pulling focus from the embrace.",
      "directionality_class": "directional_3d",
      "element": "entryway shoe area",
      "orientation": "shoe tops and low threshold edge face the camera from below the profiles",
      "state": "cluttered, dim"
     },
     {
      "camera_use": "The door seam creates a vertical boundary beside them, suggesting a moment just before departure.",
      "directionality_class": "directional_3d",
      "element": "front door seam",
      "orientation": "the flat door face is seen in side compression, seam running vertically near the right edge",
      "state": "closed, dull, scuffed"
     }
    ],
    "lighting_mood": "Soft domestic amber from the room mixes with cool daylight spill near the entrance, giving the affectionate pause a muted warmth under thriller-gray shadows.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 5,
    "shot_index": 10,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "side-on shoulder height, tight profile close-up with mixed domestic amber and cool daylight spill",
      "t2i_prompt": "Photorealistic cinematic still. A tight profile close-up held side-on at shoulder height, focusing on the intimate contact point between the two figures. C01O01 in casual indoor clothes, an East Asian young woman in right profile, eyes closed, rests her sharply focused face and nose firmly against the shoulder of the other figure at the center-left. C04O05 in a household apron over a casual long-sleeved shirt, an East Asian middle-aged woman in left profile, occupies the center-right, her partially visible profile softly focused, smiling with her eyes fixed on C01O01. The figures are compressed together against [: a narrow entryway wall, worn and slightly yellowed, with a dull, scuffed front door seam running vertically near the right frame edge, and the tops of shoes faintly visible in the dim lower edge]. Soft domestic amber ambient light mixes with cool daylight spill, casting a muted warmth beneath thriller-gray shadows.",
      "outfit_assignments": [
       {
        "character_id": "C01",
        "outlook_id": "O01"
       },
       {
        "character_id": "C04",
        "outlook_id": "O05"
       }
      ],
      "source_facts": [
       "Suriyeong (21-year-old) and Minsuk (40-year-old mother) together at the entryway.",
       "Suriyeong smelling her mother's scent.",
       "Minsuk smiling affectionately.",
       "Suriyeong wearing light casual clothes.",
       "Minsuk wearing an apron."
      ],
      "visual_inferences": [
       "fixed_element minsuk_domestic_attire: Minsuk wears a household apron over a casual long-sleeved indoor shirt.",
       "fixed_element apartment_entrance_area: The narrow entryway is bordered by simple worn walls.",
       "Suriyeong pressing her nose into Minsuk's shoulder visualizes the action of smelling her scent.",
       "The tight framing captures the shoe tops at the bottom edge, emphasizing their presence at the front door before departure."
      ],
      "creative_decisions": [
       "Close profile framing compresses the two characters against the worn wall to highlight their affectionate, fragile bond.",
       "Suriyeong is rendered sharp while Minsuk's profile is softly focused to maintain the single-subject close-up rule without losing the interaction.",
       "Thriller-gray shadows are mixed with warm amber to preserve the overarching occult thriller tone despite the warm mother-daughter interaction."
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [],
      "reference_phrase_kinds": [
       "character"
      ],
      "owned_object_usage": [
       {
        "owned_token": "TV",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "chair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "counter",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "herb",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "pot",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "sink",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stand",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stovetop",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "6d29ff11f1b36f13",
       "owned_hash": "bb65faf813543203",
       "camera_direction_hash": "e424f05faa471271",
       "owned_usage_hash": "72229ced9a40c4cc",
       "validator": "scene_detail_owned_objects.v1.close_skip",
       "violations": []
      }
     }
    ],
    "visible_entities": [
     "C04",
     "C01"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 5,
      "shot_index": 10
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "close",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "The camera follows the flow into the narrow entrance area and holds side-on at shoulder height, about one meter away, lens parallel to the wall to compress mother and daughter together. The tighter profile frame favors the contact point: Suriyeong’s face and nose press into Minsuk’s shoulder at center-left, while Minsuk’s softened profile and apron edge sit center-right.",
      "lighting_mood": "Soft domestic amber from the room mixes with cool daylight spill near the entrance, giving the affectionate pause a muted warmth under thriller-gray shadows.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": null,
      "constraints": [
       "one prompt captures one still moment",
       "do not combine full-body framing and body-part close-up in one frame",
       "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
       "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
       "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
      ]
     },
     "id_policy": {
      "allowed_base_entity_ids": [
       "C04",
       "C01"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C04",
        "outlook_id": "O05"
       },
       {
        "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": "L04B05",
      "reference_usage": "skipped_close_framing",
      "owned_objects": [],
      "camera_reference": null,
      "close_framing_skips_background_ref": true,
      "constraints": [
       "this shot uses close framing — the background reference is intentionally omitted at composition time",
       "describe the close subject and its immediate surroundings without relying on the absent background reference",
       "use [L##: ...] block for frame-edge surface description"
      ]
     },
     "continuity_elements_used": {
      "fixed_elements": [
       {
        "element_id": "minsuk_domestic_attire",
        "element_type": "character_state",
        "character_name": "Minsuk",
        "description": "A 40-year-old Korean woman wearing a household apron over a casual long-sleeved indoor shirt. Her general physical appearance, hairstyle, and domestic clothing remain consistent.",
        "applies_to_shots": [
         3,
         10
        ],
        "element_scope": "full",
        "source_facts": [
         "Minsuk (40-year-old mother)",
         "Shoulders locked in her apron (Shot 3)",
         "Apron edge sits center-right (Shot 10)",
         "Sleeve edge visible (Shot 12 context)"
        ],
        "visual_inferences": [
         "She wears practical, casual domestic clothes underneath the apron",
         "A typical and unpretentious hairstyle suited for doing household chores"
        ],
        "creative_decisions": [
         "Muted and neutral colors for her attire to blend with the slightly damp and anxious tone of the small apartment"
        ],
        "confidence": "high"
       },
       {
        "element_id": "apartment_entrance_area",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The narrow entryway inside a small rooftop apartment, bordered by simple walls. The space is dimly illuminated by a mixture of soft warm interior ambient light and cool daylight spilling from the outside.",
        "applies_to_shots": [
         10,
         12
        ],
        "element_scope": "full",
        "source_facts": [
         "Narrow entrance area",
         "Wall to compress mother and daughter together",
         "Soft domestic amber mixes with cool daylight spill",
         "Entryway behind"
        ],
        "visual_inferences": [
         "Plain walls with slight wear, typical of older and cramped rooftop housing"
        ],
        "creative_decisions": [
         "Maintaining a muted warmth combined with thriller-gray shadows to emphasize the domestic yet slightly uneasy atmosphere"
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 5,
        "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": "C04O05",
        "policy": "required"
       },
       {
        "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"
      }
     }
    }
   }
  },
  "S5_Shot12": {
   "scene_index": 5,
   "shot_index": 12,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B05"
   ],
   "scene_heading": "S#5. 옥탑방 안 / 실내",
   "description": "민숙의 손목 안쪽에 새겨진 작은 원 모양의 표식 클로즈업.",
   "characters": [
    "민숙"
   ],
   "staging": {
    "camera_direction": "The camera completes the flow’s downward push from Suriyeong’s side of the entrance to a very close waist-height insert, about twenty centimeters from Minsuk’s inner wrist. The wrist cuts diagonally across the center of frame, the small circular mark isolated in sharp focus while skin, sleeve edge, and the entryway behind fall into creamy blur.",
    "character_angles": [
     {
      "angle": "looking_away",
      "body_pose": "wrist angled outward",
      "character": "민숙",
      "gaze_direction_kind": "off_screen",
      "gaze_target_id": null,
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": {
     "constraints": [
      {
       "depth_plane": "foreground",
       "gesture_action": "none",
       "gesture_target_label": "",
       "label": "Minsuk inner wrist mark",
       "screen_zone": "middle_center",
       "target_id": "C04",
       "target_kind": "character"
      }
     ],
     "reason": "primary_subject_isolation"
    },
    "framing_scale": "insert",
    "key_bg_elements": [
     {
      "camera_use": "The marked skin surface is the focal plane and occult reveal.",
      "directionality_class": "content_surface",
      "element": "inner wrist with circular mark",
      "orientation": "the inner wrist surface faces the camera, showing a small dark circular mark clearly against the skin",
      "state": "exposed, sharply focused, mark unusually distinct"
     },
     {
      "camera_use": "The sleeve cuff frames the wrist without becoming the subject.",
      "directionality_class": "directional_3d",
      "element": "apron or sleeve edge",
      "orientation": "fabric edge runs along the wrist from camera-left, seen as a soft side fold",
      "state": "soft, worn, out of focus"
     },
     {
      "camera_use": "The entrance background becomes an indistinct shadow field so the symbol carries the tension.",
      "directionality_class": "non_directional",
      "element": "blurred entryway background",
      "orientation": "",
      "state": "dim, warm-gray, unfocused"
     }
    ],
    "lighting_mood": "A small amber domestic highlight grazes the skin while the surrounding frame sinks into blue-gray softness, making the circular mark feel quietly ritualistic.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 5,
    "shot_index": 12,
    "subject_reference_policy": [
     {
      "policy": "base_id_required",
      "policy_type": "identity_reference",
      "reason": "The shot isolates Minsuk’s wrist and occult mark rather than her full appearance; a base identity reference is enough and outlook-specific facial guidance would not align with the frame.",
      "subject_id": "C04"
     }
    ]
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "Waist-height insert framing, sharp macro focus on the skin, amber highlight against blue-gray background blur",
      "t2i_prompt": "Photorealistic cinematic still. C04 in a soft home apron, a Korean middle-aged woman, presents her inner wrist in the middle-center foreground, displaying the small P03 circular mark. Captured from a close waist-height angle, the arm cuts diagonally across the frame, with her head and lower body implied beyond the edges. The P03 mark on the exposed skin is isolated in sharp focus, facing the camera. A soft, out-of-focus fabric sleeve fold runs along the wrist from the left side. A small amber domestic highlight grazes the skin surface against the creamy, dim blue-gray blur of the narrow entryway walls.",
      "outfit_assignments": [
       {
        "character_id": "C04",
        "outlook_id": "O05"
       }
      ],
      "source_facts": [
       "Shot description: very close waist-height insert of Minsuk's inner wrist showing the circular mark.",
       "Background: The narrow entryway inside a small rooftop apartment.",
       "Lighting: A small amber domestic highlight grazes the skin while the surrounding frame sinks into blue-gray softness."
      ],
      "visual_inferences": [
       "fixed_element body_full_pose: arm cutting diagonally across the frame with head and torso out of view.",
       "Shallow depth of field applied to maintain sharp focus on the mark while blurring the entryway and sleeve."
      ],
      "creative_decisions": [
       "Placed the inner wrist exactly in the middle-center foreground to satisfy the spatial contract.",
       "Emphasized the color contrast between the warm amber skin highlight and the cool blue-gray background shadows for the occult thriller tone."
      ],
      "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": "counter",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "herb",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "pot",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "sink",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stand",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stovetop",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "absent",
        "source_phrase": ""
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "90103eba58dc1db1",
       "owned_hash": "bb65faf813543203",
       "camera_direction_hash": "6a85135e6cffc50e",
       "owned_usage_hash": "72229ced9a40c4cc",
       "validator": "scene_detail_owned_objects.v1",
       "violations": []
      }
     }
    ],
    "visible_entities": [
     "C04",
     "P03"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 5,
      "shot_index": 12
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "insert",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "The camera completes the flow’s downward push from Suriyeong’s side of the entrance to a very close waist-height insert, about twenty centimeters from Minsuk’s inner wrist. The wrist cuts diagonally across the center of frame, the small circular mark isolated in sharp focus while skin, sleeve edge, and the entryway behind fall into creamy blur.",
      "lighting_mood": "A small amber domestic highlight grazes the skin while the surrounding frame sinks into blue-gray softness, making the circular mark feel quietly ritualistic.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 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 inner 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",
       "P03"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C04",
        "outlook_id": "O05"
       }
      ],
      "must_use_composite_character_ids": true,
      "common_noun_required_when": [
       "a reproduced face inside any declared reproduction surface",
       "unregistered extra"
      ],
      "id_use_required_when": [
       "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
      ],
      "demographic_fallback_required": true,
      "face_identifiability_rule": {
       "use_entity_id_when": [
        "face identifiable: front, profile, three-quarter, or eyes closed",
        "OTS framing with any visible face"
       ],
       "common_noun_required_when": [
        "back to camera with no visible face",
        "silhouette or blurred outline only",
        "OTS with only back of head/shoulder, face entirely hidden"
       ],
       "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
       "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
      },
      "reproduction_surface_rule": {
       "applies": true,
       "id_use": "forbidden — generic descriptor with demographic only",
       "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
      },
      "demographic_descriptor_policy": {
       "required_on_first_appearance": true,
       "applies_to_id_forms": [
        "C##",
        "C##O##"
       ],
       "token_count_range": [
        1,
        2
       ],
       "components": {
        "ethnicity": [
         "Asian",
         "East Asian",
         "South Asian",
         "Southeast Asian",
         "Black",
         "Middle Eastern",
         "Hispanic",
         "Latina",
         "Latino",
         "Caucasian"
        ],
        "gender": [
         "man",
         "woman",
         "figure"
        ],
        "age_band": [
         "in his/her 20s",
         "in his/her 30s",
         "in his/her 40s",
         "young",
         "middle-aged",
         "elderly"
        ],
        "role_hint_from_outfit": [
         "in worker uniform",
         "in fisher workwear",
         "in detective coat",
         "in business suit"
        ]
       },
       "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
       "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
       "source_priority": [
        "visual_world_rules.region",
        "visual_world_rules.era",
        "shot context outfit hint"
       ],
       "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
       "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
      },
      "subject_reference_policy": [
       {
        "subject_id": "C04",
        "policy_type": "identity_reference",
        "policy": "base_id_required",
        "reason": "The shot isolates Minsuk’s wrist and occult mark rather than her full appearance; a base identity reference is enough and outlook-specific facial guidance would not align with the frame."
       }
      ],
      "constraints": [
       "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
       "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
       "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
       "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
       "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject 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": "L04B05",
      "reference_usage": "exact_background",
      "owned_objects": [
       "TV",
       "chair",
       "counter",
       "door",
       "herb",
       "pot",
       "sink",
       "stand",
       "stovetop",
       "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": "apartment_entrance_area",
        "element_type": "environment_state",
        "character_name": "",
        "description": "The narrow entryway inside a small rooftop apartment, bordered by simple walls. The space is dimly illuminated by a mixture of soft warm interior ambient light and cool daylight spilling from the outside.",
        "applies_to_shots": [
         10,
         12
        ],
        "element_scope": "full",
        "source_facts": [
         "Narrow entrance area",
         "Wall to compress mother and daughter together",
         "Soft domestic amber mixes with cool daylight spill",
         "Entryway behind"
        ],
        "visual_inferences": [
         "Plain walls with slight wear, typical of older and cramped rooftop housing"
        ],
        "creative_decisions": [
         "Maintaining a muted warmth combined with thriller-gray shadows to emphasize the domestic yet slightly uneasy atmosphere"
        ],
        "confidence": "high"
       }
      ],
      "previous_shot_refs": [
       {
        "scene_index": 5,
        "shot_index": 3,
        "ref_usage": "",
        "kind": "location"
       }
      ],
      "forward_zoom_targets": [],
      "cross_shot_id_substitution_rule": {
       "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
       "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
       "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
       "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
       "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
       "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
      },
      "ref_usage_constraints": {
       "zoom_in_detail": {
        "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
        "forbidden_additions": [
         "new persons not in the prior shot",
         "new props not in the prior shot",
         "new background elements not in the prior shot",
         "new poses, gestures, or expressions not in the prior shot",
         "different moments of action"
        ],
        "required_phrasings": [
         "describe only the focused sub-region in concrete terms",
         "explicitly state the same environment (lighting, background) is preserved",
         "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
        ],
        "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
        "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
       },
       "exact_background": {
        "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
        "permitted_additions": [
         "new persons, poses, expressions, actions for this shot's moment",
         "different camera angle within the same room"
        ],
        "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
        "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
        "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
       },
       "atmosphere_reference": {
        "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
        "forbidden_imports": [
         "furniture layout from the prior shot",
         "wall positions from the prior shot",
         "specific architectural features from the prior shot"
        ],
        "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
        "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
       }
      },
      "view_consistency": {
       "framing_scope_options": [
        "third_person",
        "close_up"
       ],
       "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
       "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
       "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
       "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
       "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
       "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
       "mixing_forbidden": true,
       "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
      },
      "constraints": [
       "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
       "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
       "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
       "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
       "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
       "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
       "props held by characters face one direction only — toward camera OR toward character, never both"
      ]
     },
     "asset_requirements": {
      "required_refs": [
       {
        "kind": "character",
        "id": "C04",
        "policy": "required"
       },
       {
        "kind": "background",
        "id": "L04B05",
        "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"
      }
     }
    }
   }
  },
  "S5_Shot3": {
   "scene_index": 5,
   "shot_index": 3,
   "loc_ids": [
    "L04"
   ],
   "is_indoor": true,
   "bg_ids": [
    "L04B05"
   ],
   "scene_heading": "S#5. 옥탑방 안 / 실내",
   "description": "앞치마를 두른 민숙이 어두운 표정으로 거실 TV 화면을 응시하며 굳어 있는 상체.",
   "characters": [
    "민숙"
   ],
   "staging": {
    "camera_direction": "The observer camera settles at the end of its lateral track from near the sink and small window, chest height and about two and a half meters from Minsuk, looking across the counter line toward the living room TV. Minsuk is held in an upper-body frame at the right-middle of the image, shoulders locked in her apron as the kitchen foreground remains softly present and the TV glow pulls her stare off-frame.",
    "character_angles": [
     {
      "angle": "three_quarter_left",
      "body_pose": "frozen by TV",
      "character": "민숙",
      "gaze_direction_kind": "off_screen",
      "gaze_target_id": null,
      "subject_state": "alive"
     }
    ],
    "frame_spatial_contract": null,
    "framing_scale": "medium",
    "key_bg_elements": [
     {
      "camera_use": "The TV is the off-frame source of her fixed attention and casts a cold news glow across the room.",
      "directionality_class": "content_surface",
      "element": "living room TV screen",
      "orientation": "the screen face is angled away from the camera, showing only a sliver of moving blue news light rather than readable content",
      "state": "on, low volume, flickering"
     },
     {
      "camera_use": "The sink and herbs sit in the near foreground, domestic routine interrupted by dread.",
      "directionality_class": "directional_3d",
      "element": "sink with unfinished medicinal herbs",
      "orientation": "the basin rim and faucet side face the camera across the counter",
      "state": "water running, herbs wet and half-washed"
     },
     {
      "camera_use": "Steam from the pot veils the compact room and gives the practical light a sick texture.",
      "directionality_class": "non_directional",
      "element": "boiling pot steam",
      "orientation": "",
      "state": "rising, thin, wavering"
     },
     {
      "camera_use": "The small window gives a narrow daylight slit that contrasts with the TV’s colder glow.",
      "directionality_class": "transparent_surface",
      "element": "small living-room window",
      "orientation": "slightly dirty glass admits pale daylight; only a blurred exterior brightness is visible through it",
      "state": "closed, dusty"
     }
    ],
    "lighting_mood": "Cold TV blue fights a weak amber kitchen practical and pale window light, turning the cramped home into a damp, anxious interior.",
    "perception_mode": "direct",
    "perspective": "observer",
    "pov_character": "",
    "scene_index": 5,
    "shot_index": 3,
    "subject_reference_policy": []
   },
   "detail": {
    "t2i_variations": [
     {
      "variant_label": "var_1",
      "camera_effect": "chest-height observer camera, lateral track end, medium framing",
      "t2i_prompt": "Photorealistic cinematic still. An observer camera at chest height looks across the counter, framing the upper body of C04O05 in the right-middle of the image. C04O05 in a household apron, a Korean middle-aged woman, stands at three-quarter angle from the left, her shoulders locked and tense. Her eyes are fixed on an off-screen source to the left, her face frozen with a dark expression. In the softly blurred foreground, a sink with half-washed herbs is visible. Thin steam wavers from a boiling pot on the stovetop. A cold blue glow from the off-frame TV washes across her profile, fighting against pale daylight from the small window and a weak amber kitchen light, casting a damp, anxious mood.",
      "outfit_assignments": [
       {
        "character_id": "C04",
        "outlook_id": "O05"
       }
      ],
      "source_facts": [
       "Shot description: observer at chest height, two and a half meters from Minsuk, looking across the counter",
       "Minsuk (C04) with dark expression, frozen by TV",
       "Sink with unfinished medicinal herbs",
       "Boiling pot with thin, wavering steam",
       "Cold TV blue fights a weak amber kitchen practical and pale window light"
      ],
      "visual_inferences": [
       "fixed_element minsuk_domestic_attire: She wears a household apron over casual indoor clothes",
       "Minsuk stands at a three-quarter angle from the left, upper body in frame",
       "TV is located off-frame to the left, casting blue light onto her profile"
      ],
      "creative_decisions": [
       "Medium frame keeps Minsuk on the right to emphasize her intense off-screen gaze",
       "Softly blurred foreground sink and herbs maintain depth without distracting from her tense posture",
       "Color temperature clash (cold blue vs amber/pale daylight) enhances the cramped, anxious atmosphere"
      ],
      "confidence": "high",
      "applied_frame_spatial_constraint_ids": [],
      "reference_phrase_kinds": [
       "character",
       "background"
      ],
      "owned_object_usage": [
       {
        "owned_token": "TV",
        "usage_kind": "anchor",
        "source_phrase": "the off-frame TV"
       },
       {
        "owned_token": "chair",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "counter",
        "usage_kind": "anchor",
        "source_phrase": "across the counter"
       },
       {
        "owned_token": "door",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "herb",
        "usage_kind": "anchor",
        "source_phrase": "half-washed herbs"
       },
       {
        "owned_token": "pot",
        "usage_kind": "anchor",
        "source_phrase": "a boiling pot"
       },
       {
        "owned_token": "sink",
        "usage_kind": "anchor",
        "source_phrase": "a sink with half-washed herbs"
       },
       {
        "owned_token": "stand",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "stovetop",
        "usage_kind": "anchor",
        "source_phrase": "on the stovetop"
       },
       {
        "owned_token": "table",
        "usage_kind": "absent",
        "source_phrase": ""
       },
       {
        "owned_token": "window",
        "usage_kind": "anchor",
        "source_phrase": "the small window"
       }
      ],
      "owned_validation": {
       "schema_version": 2,
       "t2i_prompt_hash": "52f28b95ae3e06a2",
       "owned_hash": "bb65faf813543203",
       "camera_direction_hash": "6705a2b6c3c520f9",
       "owned_usage_hash": "61d5ba1ebfa5a705",
       "validator": "scene_detail_owned_objects.v1",
       "violations": [
        {
         "owned_object": "counter",
         "violating_phrase": "across the counter",
         "reason": "The counter is used as a spatial reference for the camera's perspective, which matches the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "sink",
         "violating_phrase": "a sink with half-washed herbs",
         "reason": "The sink is mentioned as a blurred foreground element to establish composition, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "herb",
         "violating_phrase": "half-washed herbs",
         "reason": "The herbs are referenced inside the sink as a details-enhancing state, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "pot",
         "violating_phrase": "a boiling pot",
         "reason": "The pot on the stove is described to establish the environment's mood without drawing a new asset, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "stovetop",
         "violating_phrase": "on the stovetop",
         "reason": "The stovetop is used as a spatial anchor for the pot, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "TV",
         "violating_phrase": "the off-frame TV",
         "reason": "The TV is explicitly placed off-frame and used only as a lighting source, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        },
        {
         "owned_object": "window",
         "violating_phrase": "the small window",
         "reason": "The window is mentioned as a source of daylight to guide the scene's lighting, matching the producer's anchor declaration.",
         "verdict": "anchor_reference"
        }
       ]
      }
     }
    ],
    "visible_entities": [
     "C04"
    ],
    "render_prompt_card": {
     "schema_version": 1,
     "shot_key": {
      "scene_index": 5,
      "shot_index": 3
     },
     "render_strategy": {
      "mode": "direct",
      "primary_subject": "",
      "framing_scale": "medium",
      "moment_lock": "single still moment from the selected shot only",
      "camera_direction": "The observer camera settles at the end of its lateral track from near the sink and small window, chest height and about two and a half meters from Minsuk, looking across the counter line toward the living room TV. Minsuk is held in an upper-body frame at the right-middle of the image, shoulders locked in her apron as the kitchen foreground remains softly present and the TV glow pulls her stare off-frame.",
      "lighting_mood": "Cold TV blue fights a weak amber kitchen practical and pale window light, turning the cramped home into a damp, anxious interior.",
      "perception_mode": "direct",
      "spatial_consistency": {
       "camera_frame_rule": {
        "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
        "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
        "core_principles": [
         "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
         "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
         "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
         "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
        ],
        "forbidden_combinations": [
         "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
         "overhead high angle + feet visible at the lower frame edge with floor visible below them",
         "hip-height side camera + full silhouette including head and feet visible in same frame",
         "low angle looking up + ceiling and floor both fully visible in same frame"
        ],
        "recommended_phrasings": [
         "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
         "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
         "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
         "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
        ],
        "self_check_steps": [
         "identify the camera position phrasing (height + angle)",
         "list elements described inside the frame (foreground prop, body parts, background surfaces)",
         "verify each element's vertical/depth placement is geometrically consistent with that camera position",
         "if mismatch found, adjust frame-edge description to match camera position"
        ],
        "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
       },
       "fg_bg_shared_anchor_rule": {
        "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
        "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
        "forbidden_phrasings": [
         "fg/bg separation without naming the shared surface/space",
         "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
         "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
        ],
        "recommended_keywords": [
         "shared bench / shared table / shared surface",
         "the same X they both occupy (X = bench, sofa, table, doorway, room)",
         "across the X from each other",
         "<prop> crosses the air between them (interaction prop visually links the two)",
         "the <surface> sharing a single line of sight from the camera"
        ],
        "self_check_steps": [
         "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
         "is one foreground and the other background-separated?",
         "is the shared surface/space anchor explicitly named?",
         "if not, add one of the recommended keywords"
        ],
        "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
       },
       "primary_framing_rule": {
        "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
        "close_framing_rules": {
         "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
         "other_entities_appearance_options": [
          "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
          "soft background — out-of-focus silhouette via shallow depth of field",
          "absent — not rendered at all even if listed in visible_entities"
         ],
         "forbidden_combinations": [
          "same character's full body and body-part close-up in the same frame (view mixing)",
          "two characters both rendered as sharp close-up faces in the same frame"
         ],
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "wide_medium_rules": {
         "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
         "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
         "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
         "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
        },
        "self_check_steps": [
         "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
         "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
         "verify same character's full body + body-part close-up are not combined",
         "if close: verify two faces are not both rendered sharp"
        ],
        "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
       },
       "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
      },
      "frame_spatial_contract": null,
      "constraints": [
       "one prompt captures one still moment",
       "do not combine full-body framing and body-part close-up in one frame",
       "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
       "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
       "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
      ]
     },
     "id_policy": {
      "allowed_base_entity_ids": [
       "C04"
      ],
      "allowed_outlook_pairs": [
       {
        "character_id": "C04",
        "outlook_id": "O05"
       }
      ],
      "must_use_composite_character_ids": true,
      "common_noun_required_when": [
       "a reproduced face inside any declared reproduction surface",
       "unregistered extra"
      ],
      "id_use_required_when": [
       "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
      ],
      "demographic_fallback_required": true,
      "face_identifiability_rule": {
       "use_entity_id_when": [
        "face identifiable: front, profile, three-quarter, or eyes closed",
        "OTS framing with any visible face"
       ],
       "common_noun_required_when": [
        "back to camera with no visible face",
        "silhouette or blurred outline only",
        "OTS with only back of head/shoulder, face entirely hidden"
       ],
       "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
       "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
      },
      "reproduction_surface_rule": {
       "applies": 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": "L04B05",
      "reference_usage": "exact_background",
      "owned_objects": [
       "TV",
       "chair",
       "counter",
       "door",
       "herb",
       "pot",
       "sink",
       "stand",
       "stovetop",
       "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": "minsuk_domestic_attire",
        "element_type": "character_state",
        "character_name": "Minsuk",
        "description": "A 40-year-old Korean woman wearing a household apron over a casual long-sleeved indoor shirt. Her general physical appearance, hairstyle, and domestic clothing remain consistent.",
        "applies_to_shots": [
         3,
         10
        ],
        "element_scope": "full",
        "source_facts": [
         "Minsuk (40-year-old mother)",
         "Shoulders locked in her apron (Shot 3)",
         "Apron edge sits center-right (Shot 10)",
         "Sleeve edge visible (Shot 12 context)"
        ],
        "visual_inferences": [
         "She wears practical, casual domestic clothes underneath the apron",
         "A typical and unpretentious hairstyle suited for doing household chores"
        ],
        "creative_decisions": [
         "Muted and neutral colors for her attire to blend with the slightly damp and anxious tone of the small apartment"
        ],
        "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": "C04O05",
        "policy": "required"
       },
       {
        "kind": "background",
        "id": "L04B05",
        "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"
      }
     }
    }
   }
  }
 },
 "fp_by_loc": {
  "L03": [
   {
    "fp_id": "fp_l03_rooftop_entry_main",
    "png_path": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/episodes/0d30302a-51c8-4ac9-98e2-6cd9180512bf/images/floor_plan/fp_l03_rooftop_entry_main.png"
   }
  ],
  "L04": [
   {
    "fp_id": "fp_l04_rooftop_room_main",
    "png_path": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/episodes/0d30302a-51c8-4ac9-98e2-6cd9180512bf/images/floor_plan/fp_l04_rooftop_room_main.png"
   }
  ],
  "L10": [
   {
    "fp_id": "fp_l10_cement_stairs",
    "png_path": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/episodes/0d30302a-51c8-4ac9-98e2-6cd9180512bf/images/floor_plan/fp_l10_cement_stairs.png"
   },
   {
    "fp_id": "fp_l10_exterior_alley",
    "png_path": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/episodes/0d30302a-51c8-4ac9-98e2-6cd9180512bf/images/floor_plan/fp_l10_exterior_alley.png"
   }
  ]
 },
 "characters_in_shots": [
  "민숙",
  "수리영",
  "혜수"
 ],
 "passports": {
  "C07": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/images/0d30302a-51c8-4ac9-98e2-6cd9180512bf/reference/aece06f7-37b2-4804-883c-2703a8fd9e87.png",
  "C13": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/images/0d30302a-51c8-4ac9-98e2-6cd9180512bf/reference/39164d5f-c980-461f-8c11-cec836c8697e.png",
  "C03": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/images/0d30302a-51c8-4ac9-98e2-6cd9180512bf/reference/aab7b600-a99a-4029-9936-3f21bedf64a3.png",
  "C04": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/images/0d30302a-51c8-4ac9-98e2-6cd9180512bf/reference/d6b8ea09-1c0a-453c-93fa-be38348df5a6.png",
  "C02": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/images/0d30302a-51c8-4ac9-98e2-6cd9180512bf/reference/78811b6c-4b5f-4358-aa50-cff9ffa84508.png",
  "C01": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/images/0d30302a-51c8-4ac9-98e2-6cd9180512bf/reference/0b01920a-4b59-4e19-ba35-e6e033cbd6b4.png",
  "C06": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/images/0d30302a-51c8-4ac9-98e2-6cd9180512bf/reference/ff6d01af-d829-4e15-b89c-b5af9bbcbc2c.png",
  "C12": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/images/0d30302a-51c8-4ac9-98e2-6cd9180512bf/reference/bb9a0fcb-0226-4468-a6d1-5cb581467b7a.png"
 },
 "character_name_to_sid": {
  "김형사": "C05",
  "한국인 남자": "C07",
  "민숙": "C04",
  "민숙 (어린 십대 소녀)": "C13",
  "검은 고양이": "C11",
  "인우": "C03",
  "민숙 (변형된)": "C12",
  "남자": "C06",
  "혜수": "C02",
  "로트와일러": "C10",
  "남자 직원": "C08",
  "수리영": "C01",
  "여자": "C09"
 },
 "baseline_aerial": "/Users/manta/Documents/Projects/TheRoad-I1/projects/b0ad5c18-5140-4022-a2b0-805de0e5a385/episodes/0d30302a-51c8-4ac9-98e2-6cd9180512bf/images/background_chain/aerial_bg_rooftop_unit.png"
}