{
  "status": "completed",
  "completed_count": 57,
  "applicable_count": 57,
  "failed_count": 0,
  "schema_version": 8,
  "config_hash": "f12296572b3e973d",
  "data": {
    "scenes": [
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "정체불명의 습격자에게 덮쳐지기 직전의 공포",
        "representative_moment": "C06이 극한의 공포에 질려 위를 올려다보는 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A tight low angle observer view through wet foliage, shallow depth of field, dim blue-green dusk light with red-brown accents.",
            "t2i_prompt": "Photorealistic cinematic still. A tight low angle observer view, head-and-shoulder composition of C06O11 in a torn bloody hiking jacket, a young Asian man with dark eyes. He is positioned at three-quarter angle from the left, jaw lifted upward, eyes fixed upward in terror. Focus on his muddy cheek and wide, trembling lower eyelid. Wet rain-damp foliage brushes the left and right foreground edges of the frame. Dim blue-green dusk light from above washes his skin with humid low contrast, faint red-brown tones reflecting on his jawline. A fog-softened darkening tree canopy dissolves into shallow depth-of-field in the upper background.",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "Scene heading states: 숲속 / 해 질 무렵 (Forest / Dusk)",
              "Shot description specifies a terrified expression of a man (T.S).",
              "Shot 2 DP instructions require a low angle through-object frame, focusing on his muddy cheek and trembling eyelid as he looks upward in terror."
            ],
            "visual_inferences": [
              "fixed_element dusk_forest_environment (wet leaves, dim blue-green dusk light, and mud) is applied to the frame edges and subject's skin to maintain continuity without a background reference.",
              "The subject's shoulder and upper chest remain visible to prevent floating head artifacts in close framing."
            ],
            "creative_decisions": [
              "Used a head-and-shoulder composition to anchor the face realistically within the frame.",
              "Placed wet foliage at the left and right foreground edges to create a claustrophobic through-object observer perspective.",
              "Applied humid blue-green ambient fill with faint red-brown reflections on the skin to match the dark occult thriller tone and blood presence."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "ab0b235498e0a5cf",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "1d13fa52042f2e56",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "C06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A tighter-than-stage CU low angle through-object frame holds less than a foot from the 20대 한국인 남자’s face, crouched just under his chin as wet leaves cut across the left and right edges. The man’s face occupies the center-left 70% of frame, his muddy cheek and trembling lower eyelid sharp while the foliage and dusk canopy above dissolve into shallow DOF; this is an observer view, not his POV, watching him look upward in terror.",
            "lighting_mood": "Dim blue-green dusk light seeps through the canopy, with humid low contrast and faint red-brown blood tones warming the man’s skin.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C06"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusk_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, humid forest setting at dusk. The ground and immediate surroundings are covered in damp, crushed leaves, torn grass, and patches of dark mud. The ambient lighting is dim and filtered, casting deep blue-green and damp green-brown tones across the vegetation.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "source_facts": [
                  "Scene heading states: 숲속 / 해 질 무렵 (Forest / Dusk)",
                  "Shot 2 mentions wet leaves, foliage, dusk canopy, and dim blue-green dusk light.",
                  "Shot 4 mentions torn grass, mud, crushed leaves, and damp green-brown forest tones."
                ],
                "visual_inferences": [
                  "The ground remains consistently muddy and disturbed from the chase and the ensuing physical struggle."
                ],
                "creative_decisions": [
                  "Emphasized the damp, blue-green and muddy brown color palette to visually unify the background across different camera framing distances."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C06O11",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "77c410345b7119ea"
      },
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "정체불명의 습격",
        "representative_moment": "검은 인영(C10)이 진흙탕 바닥에 쓰러진 남자(C06)를 위에서 강하게 짓누르며 덮치는 찰나.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Ground-level handheld frame with low frontal observer angle, dim blue-green and damp green-brown dusk lighting",
            "t2i_prompt": "Photorealistic cinematic still. A ground-level handheld frame from the frontal axis, landing close to the fallen body. C10O14 in a dark ragged cloak, a humanoid figure, with back to camera, in a forceful mid-lunge down, head angled toward C06O11. C10O14 appears as a backlit mass exerting force, body volume preserved against the dim ambient fill, face fully obscured with no visible facial features, the cloak trailing upward in the direction opposite to the downward motion. C10O14 is pinning down C06O11 from above. C06O11 in a bloody hiking jacket, a young Asian man, facing the camera, pinned on his back in the lower frame, eyes looking up. He is the constrained figure receiving the heavy impact. Both figures occupy the same damp muddy forest ground, with C10O14's dark mass in the center foreground partially blocking C06O11's shoulders and chest beneath. The surrounding earth is covered in damp crushed leaves, torn grass, and patches of dark mud churned up by the struggle. A mud-smeared lost shoe lies abandoned near the frame edge, toe angled away from the camera and heel turned toward the impact area. Lit by dying dusk filtered through leaves, the ambient light casts deep blue-green and damp green-brown tones across the dense vegetation. Focus on the forceful impact point where the dark silhouette presses into the fallen man against the muddy earth.",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O11"
              },
              {
                "character_id": "C10",
                "outlook_id": "O14"
              }
            ],
            "source_facts": [
              "S#1 action: '어디선가 쏜살같이 달려온 검은 인영이 남자를 덮친다.'",
              "Shot 4 description: 검은 인영이 남자의 상체를 바닥으로 강하게 짓누르며 덮치는 찰나의 정면 구도.",
              "DP instructions: C10 back to camera lunging down, C06 facing camera pinned on back with eyes up."
            ],
            "visual_inferences": [
              "fixed_element dusk_forest_environment: deep blue-green and damp green-brown tones, wet leaves, mud applied to the impact surface.",
              "Mid-action freeze applied to C10's lunge, with the cloak trailing upward opposite to the motion.",
              "Physical conflict role asymmetry: C10 acts as the figure exerting force, C06 as the constrained figure receiving the impact."
            ],
            "creative_decisions": [
              "Used a shared spatial anchor ('the same damp muddy forest ground') to solidly link the fg/bg separated figures.",
              "Positioned the lost shoe near the edge with specific toe/heel orientation to anchor the foreground scale and hint at the struggle.",
              "Applied the entity-aware silhouette policy for C10 (face fully obscured with no visible features) while preserving body volume."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "e00c8796a55e2774",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "09cbdb5ddc8f21e8",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "exact_background continuity: same forest environment as S#1 Shot 2, preserving the muddy ground and dusk lighting.",
        "_shot_index": 4,
        "visible_entities": [
          "C06",
          "C10",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A ground-level MWS eye-level-to-the-fallen-body handheld frame lands on the frontal axis about three feet from the 20대 한국인 남자’s upper body at the exact impact. The 검은 인영 crashes into the center foreground, its dark mass partially blocking the man beneath; the man’s shoulders and face are pinned in the lower half while torn grass, mud, and crushed leaves shake around the frame.",
            "lighting_mood": "The handheld impact is lit by dying dusk filtered through leaves, with the silhouette nearly black against damp green-brown forest tones.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C06",
              "C10",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O11"
              },
              {
                "character_id": "C10",
                "outlook_id": "O14"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusk_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, humid forest setting at dusk. The ground and immediate surroundings are covered in damp, crushed leaves, torn grass, and patches of dark mud. The ambient lighting is dim and filtered, casting deep blue-green and damp green-brown tones across the vegetation.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "source_facts": [
                  "Scene heading states: 숲속 / 해 질 무렵 (Forest / Dusk)",
                  "Shot 2 mentions wet leaves, foliage, dusk canopy, and dim blue-green dusk light.",
                  "Shot 4 mentions torn grass, mud, crushed leaves, and damp green-brown forest tones."
                ],
                "visual_inferences": [
                  "The ground remains consistently muddy and disturbed from the chase and the ensuing physical struggle."
                ],
                "creative_decisions": [
                  "Emphasized the damp, blue-green and muddy brown color palette to visually unify the background across different camera framing distances."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 2,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C06O11",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C10O14",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "0a533ce80c7d1e6b"
      },
      {
        "scene_index": 2,
        "heading": "S#2. 도시 뒷골목 / N",
        "beat_title": "붉은 눈의 습격",
        "representative_moment": "어두운 골목 전봇대 앞, 붉은 눈을 번뜩이며 여자의 목을 무는 C06의 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level framing just over the shoulder, shallow depth of field, high contrast red and amber lighting",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level frame positioned just over the woman's shoulder. Tight framing on his face, upper body in frame. C06O12, a Korean man in his 20s in a black hoodie, at three-quarter angle from the right, acts as the figure exerting force, his teeth pressed firmly into the exposed neck of the constrained figure at the lower right. His glowing red eyes are fixed on the void, with sickly red light pooling on his cheek and mouth. C07O13, a Korean woman in her 20s in an ivory silk blouse, with back to camera, her neck exposed limp and eyes closed. Her shoulder and hair form a blurred foreground wedge on the left. The two figures share the cramped space against the immediate surroundings. [: The dark vertical backing of a weathered, damp utility pole directly behind the bodies, its cylindrical side catching a thin rim of backlight. The reflecting surface of the wet alley pavement at the bottom edge shows broken amber streetlight and a faint red glint.] Humid, claustrophobic atmosphere with deep black shadows swallowing the frame boundaries.",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O12"
              },
              {
                "character_id": "C07",
                "outlook_id": "O13"
              }
            ],
            "source_facts": [
              "S#2 action: 남자의 붉은 눈동자, 목의 살점을 뜯는 이빨… 푹 힘없이 쓰러지는 여자",
              "Shot description: eye-level CU isolating the man's glowing red eyes and teeth pressed into the neck",
              "The woman's shoulder and hair form a blurred foreground wedge on the left",
              "Background details: weathered damp utility pole and wet alley pavement reflecting amber and red light"
            ],
            "visual_inferences": [
              "The woman's eyes are closed and her neck is limp, reflecting her collapsing state",
              "Red glow from the man's eyes naturally pools on his cheek and mouth",
              "The utility pole serves as an immediate spatial anchor directly behind the bodies"
            ],
            "creative_decisions": [
              "Used tight framing with the woman's shoulder as a blurred foreground element to enhance claustrophobic tension",
              "Emphasized the asymmetric power dynamic ('figure exerting force' vs 'constrained figure') via positioning",
              "Utilized [L02: ...] block to construct frame-edge surfaces without relying on forbidden background references"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "4288bbd33785d882",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "25467122504194fc",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 2,
        "visible_entities": [
          "C06",
          "C07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An eye-level CU OTS-like frame sits just off the 20대 한국인 여자’s shoulder line, isolating the 20대 한국인 남자’s glowing red eyes, cheek, mouth, and the exposed side of her neck. The man’s face fills the upper center, his teeth pressed into the neck at lower right, while the woman’s shoulder and hair form a blurred foreground wedge on the left; the camera is almost motionless at the peak of the approach.",
            "lighting_mood": "Sodium streetlight and sickly red eye-glow create a humid, claustrophobic palette with black shadows swallowing the alley edges.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C06",
              "C07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O12"
              },
              {
                "character_id": "C07",
                "outlook_id": "O13"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C06O12",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C07O13",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "77f0b3deb1bd1cde"
      },
      {
        "scene_index": 3,
        "heading": "S#3. 현장 / D",
        "beat_title": "비상령 속 수사 개시",
        "representative_moment": "폴리스 라인이 쳐진 숲속에서 흰색 덮개로 덮인 시신을 둘러싼 한국인 경찰들의 정지 화면.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "static eye-level wide composition, muted news-feed gray-green, low contrast overcast daylight with subtle digital compression artifacts",
            "t2i_prompt": "Photorealistic cinematic still. An eye-level wide composition held at a distance. P09, a taut rain-damp police line tape, runs horizontally across the lower foreground acting as a sharp visual barrier, the printed warning side facing the camera. Beyond it, P10, a white body cover stained with moisture, lies center frame forming a low mound on the damp, leaf-covered forest ground of L01. Arranged around the shared space of the covered body are investigators in a frozen tableau. C02O05 in a charcoal grey suit jacket, a Korean woman in her early 40s with black hair and dark eyes, stands at a three-quarter angle from the left, bending over a clipboard with her eyes fixed on the covered body. Beside her, an Asian male investigator in his 30s wearing a dark windbreaker crouches in right profile near the tarp, his eyes also fixed on the covered body. Overcast daylight is flattened into a muted news-feed gray-green, the humid haze and low contrast making the white cover feel unnaturally stark. Subtle digital compression artifacts give the texture of a broadcast feed. Focus on the stark white body cover anchoring the center.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "S#3 action: '씬1, 2 현장을 감식하는 경찰, 폴리스 라인을 치고 시신을 수거한다. 형사무리 속에 사건을 지휘하는 혜수의 모습이 보인다.'",
              "shot description: 폴리스 라인이 쳐진 숲속에서 흰색 덮개로 덮인 시신을 둘러싼 한국인 경찰들의 정지 화면"
            ],
            "visual_inferences": [
              "C02O05 bending over clipboard, observing the body cover",
              "unregistered male investigator crouching near tarp",
              "damp leaf-covered forest ground"
            ],
            "creative_decisions": [
              "applied subtle digital compression artifacts to convey 'through_device' broadcast without drawing explicit UI borders",
              "placed police tape as a horizontal lower-foreground boundary to anchor depth",
              "used muted gray-green palette to carry atmosphere_reference tone"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "932938ca51ee67c0",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "b49efe6cdb275c94",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "연속된 사건 현장의 유사한 분위기 및 조명 톤 참조 (atmosphere_reference)",
        "_shot_index": 1,
        "visible_entities": [
          "C02",
          "P09",
          "P10",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 3,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static EWS eye-level through-device news-camera composition holds about 15 meters outside the police line, using the tape as a sharp foreground boundary across the lower third. Beyond it, the covered body lies center frame on the forest floor while 혜수 and 김형사 are small figures among investigators, arranged in a frozen broadcast-like tableau with no reporter visible.",
            "lighting_mood": "Overcast daylight is flattened into a muted news-feed gray-green, with humid haze and low contrast making the white cover feel unnaturally stark.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "P09",
              "P10",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 4,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "2ebc8f97f510d9b5"
      },
      {
        "scene_index": 4,
        "heading": "S#4. 옥탑방 / D",
        "beat_title": "수사 난항으로 인해 지역 주민들 사이에 소문이 돌며 불안감이 동네 전체로 확산된 상태",
        "representative_moment": "인천 변두리의 낡은 빌라 옥탑방과 주변 전경이 내려다보이는 부감 쇼트.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A high angle bird's eye establishing shot, wide aerial framing matching the layout reference, muted coastal haze color palette",
            "t2i_prompt": "Photorealistic cinematic still. A high angle bird's eye establishing shot looking down from a map-like aerial perspective over the coastal outskirts. Focus on the weathered old rooftop room from the reference, positioned slightly right of center. The wide aerial framing looks down upon the site, capturing the rooftop deck, the rooftop unit, and the stair bulkhead from the reference below. The surrounding alley, the parking strip, and the neighboring roofs from the reference form staggered blocks of aged low-rise villas. Clear daylight is tempered into a muted coastal haze, casting pale blues and concrete grays across the quiet, empty urban expanse devoid of any people.",
            "outfit_assignments": [],
            "source_facts": [
              "S#4. 옥탑방 / D",
              "인천 변두리 부감, 오래된 빌라 옥탑방 전경.",
              "S4_Shot1은 인물 없는 장소 제시 컷으로 사용한다."
            ],
            "visual_inferences": [
              "high angle bird's eye establishing shot holding before any descent",
              "weathered old rooftop room slightly right of center among low-rise villas",
              "camera position above the site facing down to include rooftop deck, rooftop unit, and surrounding alleys"
            ],
            "creative_decisions": [
              "muted coastal haze with pale blues and concrete grays to reflect the unease and quiet tension of the neighborhood",
              "explicit anchoring of 'from the reference' for owned objects to ensure the background is perfectly aligned without generating new duplicate structures"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "9c1502fc3d483cf5",
              "owned_hash": "72d8385eab7418f1",
              "camera_direction_hash": "a107c71c016f43e0",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "alley",
                  "violating_phrase": "the surrounding alley",
                  "reason": "The prompt mentions alley as part of the surrounding environment without any explicit redraw verb or addition/creation intent.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "parking strip",
                  "violating_phrase": "the parking strip",
                  "reason": "The prompt references the parking strip as an existing background element in the aerial scene, not as something to create or modify.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "neighboring roof",
                  "violating_phrase": "the neighboring roofs from the reference",
                  "reason": "The roofs are explicitly tied to the reference, so this is an anchor reference rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rooftop deck",
                  "violating_phrase": "the rooftop deck",
                  "reason": "The rooftop deck is merely described as part of the viewed scene, with no explicit instruction to add or alter it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rooftop unit",
                  "violating_phrase": "the rooftop unit",
                  "reason": "The rooftop unit is mentioned as an existing visible object, not targeted by a redraw verb.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "stair bulkhead",
                  "violating_phrase": "the stair bulkhead from the reference below",
                  "reason": "The reference wording anchors this stair bulkhead to the existing background rather than directing a new draw or modification.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "L03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 4,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A high angle EWS bird's eye establishing shot looks down from roughly 90 meters at a 45-degree slant over the Incheon outskirts, holding before any descent begins. The old rooftop room sits slightly right of center among low-rise villas and narrow lanes, occupying only a small portion of the frame so the surrounding neighborhood and clear sky establish scale and unease.",
            "lighting_mood": "Clear daylight is tempered into a muted coastal haze, bright but not cheerful, with pale blues and concrete grays dominating.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L03"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L03B05",
            "reference_usage": "exact_background",
            "owned_objects": [
              "AC condenser",
              "alley",
              "antenna",
              "building",
              "circle mark",
              "door",
              "drain",
              "entrance canopy",
              "laundry line",
              "neighboring roof",
              "parapet",
              "parking strip",
              "pipe",
              "rooftop deck",
              "rooftop unit",
              "satellite dish",
              "stair bulkhead",
              "water tank",
              "window"
            ],
            "camera_reference": {
              "camera_position": "above the site centered over number 2 (rooftop deck), facing down to include number 1 (old villa footprint), number 3 (rooftop unit), and surrounding numbers 14, 15, and 16",
              "camera_height": "high aerial overview, map-like reference height",
              "lens_hint": "wide aerial framing, equivalent 28mm",
              "framing_notes": "Use as a layout reference for a day aerial view; keep the rooftop unit and stair bulkhead readable while showing the surrounding alley, parking strip, and neighboring roofs."
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L03B05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "1794552f83451123"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "황급히 TV를 끄는 민숙",
        "representative_moment": "딸이 나오자 깜짝 놀라며 TV를 끄려 리모컨을 쥔 손을 뻗는 민숙(C03)의 상반신.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "MCU head-and-shoulder composition at eye level, cold TV flicker contrasting with muted daylight",
            "t2i_prompt": "Photorealistic cinematic still. MCU head-and-shoulder composition at eye level. C03O06 in casual domestic clothes and a kitchen apron, an East Asian woman in her 40s with a middle-aged face, black hair, and dark eyes, at three-quarter angle from the right, occupies the center-right of the frame. Her outstretched hand gripping a remote control sits in the lower-left foreground at natural scale, a distinct small circular reddish mark permanently present on the wrist skin. Sharp focus on the figure, her dark eyes snapping toward the off-camera doorway with a startled expression. Cold blue TV flicker from the lower left reflects on her cheek and shoulder, contrasting with thin humid daylight. [L04: soft out-of-focus frame-edge surroundings showing a dim kitchenette counter, a pale window filtering hazy light, and steam rising from a simmering pot].",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O06"
              }
            ],
            "source_facts": [
              "S#5 action: '앞치마를 두른 채 TV 뉴스를 뚫어지게 바라보는 민숙... 수리영이 방문을 열고... 나오자 후다닥 TV를 끄는 민숙.'",
              "Shot description: 'From the television side of the room, an MCU eye-level through-object push-in resolves into a hold, looking past 민숙’s outstretched remote hand in the near foreground toward her startled face.'"
            ],
            "visual_inferences": [
              "fixed_element minsuk_attire_and_mark: casual domestic clothes with a kitchen apron, a distinct, small, circular reddish mark is permanently present on her wrist skin",
              "Minsuk's posture shifts defensively, holding the remote forward to shut off the news before her daughter fully sees the screen."
            ],
            "creative_decisions": [
              "Placed the hand with the remote in the lower-left foreground to create depth against the center-right positioned body.",
              "Used cold blue light spilling onto her cheek to represent the off-camera television, contrasting with the soft hazy daylight in the background."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "c613ec7ecb729912",
              "owned_hash": "336090adaa16cf9a",
              "camera_direction_hash": "0eecdac105ac324f",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "C03",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the television side of the room, an MCU eye-level through-object push-in resolves into a hold, looking past 민숙’s outstretched remote hand in the near foreground toward her startled face. The remote and fingers sit in the lower-left foreground at natural scale, while 민숙 occupies the center-right with the kitchenette soft behind her, her eyes snapping toward 수리영’s doorway rather than the lens.",
            "lighting_mood": "Thin daylight from the small window mixes with cold TV flicker, keeping the rooftop room muted and humid with a faint domestic warmth under the alarm.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C03",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "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",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "minsuk_attire_and_mark",
                "element_type": "character_state",
                "character_name": "Minsuk",
                "description": "A 40-year-old East Asian woman wearing casual domestic clothes with a kitchen apron tied around her body. A distinct, small, circular reddish mark is permanently present on her wrist skin.",
                "applies_to_shots": [
                  3,
                  7
                ],
                "source_facts": [
                  "Scene text action: '앞치마를 두른 채' (wearing an apron)",
                  "Scene text action: '민숙 손목에 보이는 작은 원(이하 표식)' (small circular mark on Minsuk's wrist)",
                  "Shot 3: MCU push-in framing of Minsuk",
                  "Shot 7: CU profile framing showing Minsuk's upper body in the shallow plane"
                ],
                "visual_inferences": [
                  "The apron and casual clothes are consistently worn from the living room area to the entryway.",
                  "The circular mark on the wrist is an inherent, unmoving physical trait that belongs to her overall character model."
                ],
                "creative_decisions": [
                  "Merged the persistent attire and physical mark into a single 'full/upper body' character state for Shots 3 and 7.",
                  "Excluded Shot 9 from fixed elements because it is a solitary extreme close-up, adhering to the rule to prevent conflicting zoom descriptions."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C03O06",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "89652ce46253a878"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "딸의 다가감과 익숙한 손목의 표식",
        "representative_moment": "외출하려던 수리영이 눈을 감고 민숙의 앞치마 자락을 쥐며 기대고, 민숙이 부드럽게 미소 지으며 그녀를 바라본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "slightly high angle close framing at shoulder height, warm gray-beige tones",
            "t2i_prompt": "Photorealistic cinematic still. A slightly high angle frame at shoulder height. C01O02 in a beige hoodie, an East Asian young woman, occupies the left-center in left profile with eyes closed, her neck and shoulders fully visible. She leans affectionately into the side of C03O06. C03O06 in a kitchen apron over grey homewear, an East Asian middle-aged woman, stands just beyond her in the same shallow plane at a three-quarter angle from the left, a soft smile paused on her face, eyes fixed on C01O02. C01O02's hand clutches the softly wrinkled apron fabric near the lower center. Just beside the grip, C03O06's wrist extends into the frame, showing a grey homewear sleeve cuff and a distinct, small, circular reddish mark on the skin. They share the tight space anchored by [: a closed, scuffed entry door sitting behind them at a slight angle, with the top of a crowded shoe rack partially visible at the lower frame edge]. Soft room light and faint daylight flatten the space into warm gray-beige tones, casting tender, soft shadows on the fabric.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O06"
              }
            ],
            "source_facts": [
              "Scene text action: 수리영이 엄마의 냄새를 맡으며 다가간다.",
              "Scene text action: 수리영이 민숙 손목에 보이는 작은 원 표식을 본다.",
              "Shot 7 description: CU profile framing showing Sooyoung leaning into Minsuk's side, closed-eyed, hand clutching clothing."
            ],
            "visual_inferences": [
              "fixed_element minsuk_attire_and_mark: A distinct, small, circular reddish mark is permanently present on her wrist skin.",
              "The wrist area with the mark and the grey homewear sleeve cuff is positioned near the clutched fabric to ensure it is visible in the lower frame, setting up the forward zoom target.",
              "Sooyoung is wearing a beige hoodie (O02) as a casual, light outfit for going out to her part-time job."
            ],
            "creative_decisions": [
              "Composed using a tight high-angle frame at shoulder height to focus on the intimate physical connection without violating the body-part focus rule, ensuring both upper bodies remain visible.",
              "Described the immediate frame-edge surfaces ([L04: entry door and shoe rack]) rather than the full room background, aligning precisely with the skipped_close_framing policy.",
              "Used warm gray-beige tones to blend the tender maternal gesture with the underlying dim, humid domestic atmosphere."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "3d22b410db521ab5",
              "owned_hash": "336090adaa16cf9a",
              "camera_direction_hash": "ad505378fee2f4bf",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "previous_shot_refs specifies S5_Shot3 for exact_background, though the background reference is intentionally omitted at composition time due to close framing, keeping consistency localized to the immediate shared frame edges.",
        "_shot_index": 7,
        "visible_entities": [
          "C01",
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the narrow entry, a slightly high angle CU profile frame holds at shoulder height about 0.8 meters from 수리영 as she leans into 민숙’s side. 수리영’s closed-eyed side profile fills the left-center, her hand clutching 민숙’s clothing near the lower center, while 민숙 remains just beyond her in the same shallow plane, softened but present.",
            "lighting_mood": "Soft room light and faint daylight flatten into warm gray-beige tones, making the intimate gesture feel tender but still shadowed by the earlier news anxiety.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "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",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "minsuk_attire_and_mark",
                "element_type": "character_state",
                "character_name": "Minsuk",
                "description": "A 40-year-old East Asian woman wearing casual domestic clothes with a kitchen apron tied around her body. A distinct, small, circular reddish mark is permanently present on her wrist skin.",
                "applies_to_shots": [
                  3,
                  7
                ],
                "source_facts": [
                  "Scene text action: '앞치마를 두른 채' (wearing an apron)",
                  "Scene text action: '민숙 손목에 보이는 작은 원(이하 표식)' (small circular mark on Minsuk's wrist)",
                  "Shot 3: MCU push-in framing of Minsuk",
                  "Shot 7: CU profile framing showing Minsuk's upper body in the shallow plane"
                ],
                "visual_inferences": [
                  "The apron and casual clothes are consistently worn from the living room area to the entryway.",
                  "The circular mark on the wrist is an inherent, unmoving physical trait that belongs to her overall character model."
                ],
                "creative_decisions": [
                  "Merged the persistent attire and physical mark into a single 'full/upper body' character state for Shots 3 and 7.",
                  "Excluded Shot 9 from fixed elements because it is a solitary extreme close-up, adhering to the rule to prevent conflicting zoom descriptions."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 3,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [
              {
                "scene_index": 5,
                "shot_index": 9,
                "description": "민숙의 손목에 있는 또렷한 둥근 표식 클로즈업.",
                "keep_elements": [
                  {
                    "label": "softly wrinkled apron fabric",
                    "kind": "static_prop"
                  },
                  {
                    "label": "grey homewear sleeve cuff",
                    "kind": "static_prop"
                  }
                ]
              }
            ],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O06",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "f2f8c886ec386a8d"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "유난히 또렷한 표식 인지",
        "representative_moment": "수리영의 시점에서 민숙의 손목에 선명하게 드러난 P08 붉은 원형 표식을 극도로 가까이서 포착한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "subjective POV ECU Dutch angle macro, soft indirect daylight with ominous red-brown undertone",
            "t2i_prompt": "Photorealistic cinematic still. A subjective POV ECU Dutch angle macro. Focus on the same figure's wrist, an East Asian woman in her 40s wearing a wrinkled grey home-wear sleeve. The wrist cuts diagonally across the middle third of the frame, the outer side facing the lens. P08, a distinct and unusually clear dark circular mark, is sharply focused on the slightly damp skin texture. The same soft indirect daylight reflects on the skin and sleeve, carrying a faint ominous red-brown undertone pooling on P08. The wall and fabric blur into an abstract muted beige-gray background behind the wrist. Both faces are entirely excluded from the frame.",
            "outfit_assignments": [],
            "source_facts": [
              "S5 action: '힐끗, 민숙 손목에 보이는 작은 원(이하 표식)을 본다. 오늘따라 유난히 또렷해 보이지만...'",
              "shot description: A subjective POV ECU Dutch angle macro from 수리영’s glance sits less than 20 centimeters from 민숙’s wrist, the lens nearly parallel to the skin surface."
            ],
            "visual_inferences": [
              "fixed_element zoom_in_detail: focusing strictly on the wrist, faces omitted",
              "grey home-wear sleeve visible at the edge of the wrist",
              "damp skin texture from kitchen work earlier in the scene"
            ],
            "creative_decisions": [
              "applied body_part_focus_rule: replaced character ID with a common noun and demographic descriptor for the wrist ECU to prevent floating face artifacts",
              "utilized abstract blurred colors for the background to respect skipped_close_framing without referencing the room",
              "used 'the same figure's wrist' and 'the same soft indirect daylight' to maintain continuity without violating close framing constraints"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "a111e7180261b833",
              "owned_hash": "336090adaa16cf9a",
              "camera_direction_hash": "df94279b5c816c7b",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "S5 Shot 7과 동일 시공간 내에서 손목의 특정 부위로 깊게 들어가는 zoom_in_detail 연속성 적용",
        "_shot_index": 9,
        "visible_entities": [
          "C03",
          "P08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A subjective POV ECU Dutch angle macro from 수리영’s glance sits less than 20 centimeters from 민숙’s wrist, the lens nearly parallel to the skin surface. Both faces are excluded; the wrist cuts diagonally across the middle third, and the clear circular mark is held sharp while the entry wall and fabric blur into abstract muted color behind it.",
            "lighting_mood": "The macro is lit by soft indirect daylight with a faint ominous red-brown undertone in the mark, turning a domestic detail into an occult warning.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C03",
              "P08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "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",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 7,
                "ref_usage": "zoom_in_detail",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "cdfead61c0013671"
      },
      {
        "scene_index": 6,
        "heading": "S#6. 해안가 도로 / D",
        "beat_title": "바닷바람을 맞는 수리영",
        "representative_moment": "이어폰을 낀 채 눈을 감고 미소 지으며 자전거로 도로를 달리는 C01의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A front-right tracking close-up at eye level, soft bright coastal daylight with a humid pastel palette",
            "t2i_prompt": "Photorealistic cinematic still. Tight framing on the face of C01O02 in a beige hoodie, an early 20s Korean woman with black hair, captured from eye-level in a front-right tracking shot moving backward. She is shown at a three-quarter angle from the right with eyes closed, enjoying the wind. Her relaxed face occupies the center-right of the frame. Earphone wires run downward along her neck. A sliver of her shoulder and a curved bicycle handlebar enter the lower frame edge to preserve the mid-pedal forward motion. The immediate frame-edge background behind her is a soft, motion-blurred hazy coastal horizon. Bright coastal daylight wraps her features in a humid pastel palette, casting warm skin tones against the pale blue ambient sea light.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#6 action: '수리영 자전거를 타고 해안가 도로를 달린다. 이어폰을 끼고 바다냄새를 실컷 마신다. 밝고 활기차 보인다.'",
              "shot description: '눈을 감고 바닷바람을 맞는 수리영의 미소 띤 얼굴 클로즈업.'"
            ],
            "visual_inferences": [
              "mid-pedal motion captured by motion-blurred background and handlebar in the lower frame",
              "earphone wires visible along the neck to match the text description"
            ],
            "creative_decisions": [
              "tight front-right tracking close-up to focus on her expression while preserving the sensation of speed",
              "humid pastel palette with pale blue ambient sea light to enhance the bright and refreshing mood"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "7e84adf4953485e8",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9ccd15073d6e3bb2",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 6,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A front-right tracking CU eye-level shot moves backward at bicycle speed, holding 수리영’s face close while the coast streaks softly behind her. Her closed eyes and relaxed smile occupy the center-right 70% of frame, with a sliver of handlebar and shoulder movement at the lower edge to preserve the sensation of motion.",
            "lighting_mood": "Bright coastal daylight is softened into a humid pastel palette, with pale blue sea light and warm skin tones giving her a brief sense of freedom.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "f61d5418f68dc299"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "사납게 짖는 로트와일러",
        "representative_moment": "철창 안에서 이빨을 드러낸 채 앞발을 들고 사납게 카메라를 노려보는 로트와일러(C08).",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Handheld medium shot, low angle near the floor, cold fluorescent coastal-gray lighting.",
            "t2i_prompt": "Photorealistic cinematic still. Deviating from the background reference's eye-level framing to a handheld low angle just above the wet concrete floor. Looking outward through the thick, vertical metal cage bars of an animal enclosure from the reference. The damp_kennel_bars cut the foreground into hard vertical strips. C08O00, a large dog showing the variant features carried from stable_traits — short dark brown coat, broad head, strong jaw, and dark eyes — facing the camera. The dog stands with raised paws hooked on the scratched metal bars at mid-frame, its bared teeth sitting just above center, eyes fixed on the camera. Focus on the dog's bared teeth and raised paws gripping the metal. The structure is set in a damp, humid room illuminated by cold fluorescent lighting, creating pale reflections on the wet metallic and stained concrete surfaces. Beyond the animal, the dim practical-lit kennel aisle recedes backward, maintaining the grim coastal-gray cast and the existing background environment.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O00"
              }
            ],
            "source_facts": [
              "S#7 action: '사납게 짖으며 날뛰는 로트와일러'",
              "camera_direction: 'From inside the kennel, a handheld MS low angle through-object frame... looking outward through thick cage bars'",
              "character pose: 'facing_camera, paws hooked on bars, eyes→camera'"
            ],
            "visual_inferences": [
              "fixed_element damp_kennel_bars: Thick, vertical metal cage bars creating pale reflections on the wet metallic and concrete surfaces",
              "low angle placement near the floor emphasizes the dog's threatening posture and bared teeth"
            ],
            "creative_decisions": [
              "Explicitly stating deviation from the reference's eye-level framing to a low angle to accommodate scale differences",
              "Focusing on the bared teeth and gripping paws to convey the intense threat geometry as specified in the DP notes",
              "Applying cold fluorescent light and pale reflections to evoke the grim coastal-gray shelter atmosphere"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "e44a3810c8cd2d2f",
              "owned_hash": "456d19eb30dd6a5c",
              "camera_direction_hash": "3c07a1918b3a748c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "cage",
                  "violating_phrase": "cage bars",
                  "reason": "The prompt mentions the cage as part of the existing background structure and describes framing through it, not creating or adding a new cage.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "kennel",
                  "violating_phrase": "kennel aisle",
                  "reason": "The kennel is referenced as an existing environment element in the background, with no explicit instruction to redraw or add it.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From inside the kennel, a handheld MS low angle through-object frame sits about 40 centimeters above the floor and one meter from 로트와일러, looking outward through thick cage bars. The bars cut the foreground into hard vertical strips while the dog’s raised paws grip the metal at mid-frame and its bared teeth sit just above center, confronting the lens directly.",
            "lighting_mood": "Cold fluorescent light mixes with damp concrete reflections, giving the shelter a grim coastal-gray cast while the dog’s mouth reads as a dark, violent accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L06B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "bathtub",
              "cabinet",
              "cage",
              "cart",
              "counter",
              "crate",
              "door",
              "dryer",
              "exam table",
              "floor drain",
              "grooming table",
              "hamper",
              "hose sprayer",
              "kennel",
              "light fixture",
              "partition",
              "rack",
              "refrigerator",
              "shelving",
              "sink",
              "trolley",
              "ventilation unit",
              "window"
            ],
            "camera_reference": {
              "camera_position": "near number 6 (main interior door) on the south side, facing diagonally north toward number 8 (west dog kennel bank), number 9 (east dog kennel bank), and number 17 (grooming table), with number 20 (bathing tub) visible deeper to the northeast",
              "camera_height": "eye-level standing ~1.6m",
              "lens_hint": "28mm wide angle",
              "framing_notes": "Include the busy kennel aisle and at least one wet-care activity zone; keep number 12 and number 13 readable in the mid-background for vaccination prep context."
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": "damp_kennel_bars",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Thick, vertical metal cage bars of an animal enclosure. The structure is set in a damp, humid room illuminated by cold fluorescent lighting, creating pale reflections on the wet metallic and concrete surfaces.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "source_facts": [
                  "Shot 1 camera: 'thick cage bars', 'hard vertical strips'",
                  "Shot 1 lighting: 'Cold fluorescent light mixes with damp concrete reflections'",
                  "Shot 5 camera: 'blurred kennel bars remain as damp vertical streaks behind her'",
                  "Shot 5 lighting: 'muted by humidity', 'dim practical spill'"
                ],
                "visual_inferences": [
                  "The metal cages are uniform throughout the holding area, consistently reflecting the bleak, humid lighting of the shelter room."
                ],
                "creative_decisions": [
                  "Using the damp, vertical metal bars as a recurring environmental motif to ground the location's gritty, institutional, and enclosed atmosphere across different camera angles."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L06B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "c769645ed67efdcd"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "연락이 닿지 않는 민숙",
        "representative_moment": "휴대폰을 내려다보는 수리영(C01)의 굳은 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close-up, eye-level shallow depth of field, cool humid daylight with pale green-blue underlight.",
            "t2i_prompt": "Photorealistic cinematic still. Head-and-shoulder composition of C01O02 in a beige hoodie, an Asian woman in her 20s, at three-quarter angle from the right, occupying the center-right of the frame. Her neck is bent over, eyes looking down toward a phone held just below the lower frame edge. Focus on her hardened expression. A pale green-blue glow from the unseen screen washes upward across her chin and jawline, contrasting with the cool, humid ambient light. [: shallow depth of field, blurred thick vertical metal cage bars of an animal enclosure forming damp vertical streaks immediately behind her against a dim fluorescent spill].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#7 action: 늦을 거 같다. 민숙에게 연락을 취해보지만, 받지 않는다.",
              "Shot 5 description: 휴대폰 액정을 바라보는 수리영의 굳은 얼굴 클로즈업.",
              "DP instructions: phone held just below frame casting light up under her chin, face occupying the upper two-thirds."
            ],
            "visual_inferences": [
              "fixed_element damp_kennel_bars: Thick, vertical metal cage bars of an animal enclosure.",
              "The cage bars appear as blurred vertical streaks behind her due to the close framing and shallow DOF.",
              "Cool kennel daylight mixes with the pale green-blue glow of the smartphone screen."
            ],
            "creative_decisions": [
              "Utilized a tight head-and-shoulder framing to emphasize her tension and isolation, omitting the background reference as per skipped_close_framing mode.",
              "Replaced the specific L06 background ID with an L00 frame-edge block to construct the immediate blurred surroundings of the damp kennel bars.",
              "Used upward washing light (underlight) rather than carving effects to adhere to lighting physics rules without dividing the facial structure."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "0f6282169123ae24",
              "owned_hash": "456d19eb30dd6a5c",
              "camera_direction_hash": "dde9c0538a830e86",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 7,
        "dependency_reason": "같은 씬 Shot 1의 보호실 철창 환경(damp kennel bars) 연속성 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the kennel aisle flow, the camera settles into a CU, eye-level shallow-DOF push-in about 50–60 cm from 수리영, with her face occupying the upper two-thirds and the phone held just below frame casting light up under her chin. This is neutral observer vision, not her phone POV; the frame compresses her lowered gaze and hardened mouth while blurred kennel bars remain as damp vertical streaks behind her.",
            "lighting_mood": "Cool kennel daylight is muted by humidity, with the phone’s pale green-blue glow carving her tense features against dim practical spill.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L06B01",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "damp_kennel_bars",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Thick, vertical metal cage bars of an animal enclosure. The structure is set in a damp, humid room illuminated by cold fluorescent lighting, creating pale reflections on the wet metallic and concrete surfaces.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "source_facts": [
                  "Shot 1 camera: 'thick cage bars', 'hard vertical strips'",
                  "Shot 1 lighting: 'Cold fluorescent light mixes with damp concrete reflections'",
                  "Shot 5 camera: 'blurred kennel bars remain as damp vertical streaks behind her'",
                  "Shot 5 lighting: 'muted by humidity', 'dim practical spill'"
                ],
                "visual_inferences": [
                  "The metal cages are uniform throughout the holding area, consistently reflecting the bleak, humid lighting of the shelter room."
                ],
                "creative_decisions": [
                  "Using the damp, vertical metal bars as a recurring environmental motif to ground the location's gritty, institutional, and enclosed atmosphere across different camera angles."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 7,
                "shot_index": 1,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "82b782e34fe35093"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "밀려드는 업무 속 강아지 목욕",
        "representative_moment": "수리영(C01)이 씻기던 강아지 등에 비누 거품 묻은 손을 얹은 채 허리를 숙여 집중하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium close-up with a slight high angle, shallow depth of field through rising steam, subdued coastal blues",
            "t2i_prompt": "Photorealistic cinematic still. Medium close-up with a slight high angle from an observer beside the wash table. C01O02 in a beige hoodie, a Korean female in her early 20s with dark hair and dark eyes, is captured at three-quarter angle from the left, leaning over the wash table, her eyes fixed on the dog below, upper body and shoulders in frame. Her hand, coated in white soap foam, rests gently on the wet, soapy back of a dog occupying the lower foreground. The scratched, slick rim of the stainless wash table cuts across the lower frame edge beneath them. [: A fogged, water-spotted translucent plastic splash guard forms the immediate background, blurring grooming tools and a gray wall beyond, while a water-streaked wall-mounted soap dispenser sits behind her shoulder.] Flat fluorescent wash-room light is softened by rising steam and humidity, casting dull steel reflections and creating a muted, humid coastal palette with subdued coastal blues. Shallow depth of field isolates the figure from the blurred background.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#7 action: '달려가 털깍고, 연고 바르고, 목욕시키고'",
              "shot description: 수리영 leaning over wash table, soapy hand on the dog's wet back"
            ],
            "visual_inferences": [
              "the dog's body is partially visible in the lower foreground, acting as a focal anchor",
              "working environment features practical grooming details like a splash guard and soap dispenser",
              "wet surfaces and rising steam enhance the humid, busy atmosphere"
            ],
            "creative_decisions": [
              "high angle framing to naturally capture her leaning posture and the dog below her",
              "shallow depth of field to keep the focus intimate and workmanlike while softening the background",
              "replaced requested background ID with L01 to frame the immediate surroundings without relying on L06"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "81f5e25d10cbe575",
              "owned_hash": "456d19eb30dd6a5c",
              "camera_direction_hash": "4a0fe92d51de4890",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 7,
        "dependency_reason": "atmosphere_reference: S7_Shot1의 전반적인 유기견 보호원 톤과 색감(subdued coastal blues, fluorescent wash-room light)을 유지",
        "_shot_index": 7,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Beside the wash table, the tracking flow becomes a MCU with a slight high angle, cropped to 수리영’s upper body while her soapy hand and the dog’s wet back sit in the lower foreground. The camera stays chest-height and about one meter away, using shallow DOF through rising steam so her careful motion feels intimate but still workmanlike.",
            "lighting_mood": "Flat fluorescent wash-room light is softened by steam and humidity, with dull steel reflections and subdued coastal blues.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L06B01",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 7,
                "shot_index": 1,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "5dc276478a1b8fdc"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "엇갈린 동선에 당황하는 수리영",
        "representative_moment": "빈 박스를 든 여직원 어깨 너머로, 엄마가 일찍 떠났다는 사실을 듣고 눈이 동그랗게 커진 수리영(C01)의 혼란스러운 얼굴.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level over-the-shoulder MCU, greenish fluorescent mixed with damp dusk neon",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level over-the-shoulder composition. C01O02 in a beige hoodie, a Korean woman in her early 20s with a youthful face, black hair, and dark eyes, stands in the center-left at three-quarter angle from the right, weight on her back foot, tight framing on her face and upper chest, eyes fixed on the woman across from her. A Korean woman in her 40s in a worker vest occupies the right foreground with her back to the camera, head angled toward C01O02, an empty cardboard box tucked to her ribs cutting into the right foreground at chest height. The two figures stand across the empty cardboard box from each other. [: compressed mart shelving running diagonally behind C01O02 with product faces turned toward the aisle, fluorescent ceiling fixtures receding above, a smudged glass entrance showing blurred dusk neon and street movement beyond]. Greenish fluorescent mart light mixes with a continuous lighting condition of early evening dusk and colorful damp neon spilling from the wet street into the entrance, casting a moody, slightly muted glow that reflects on C01O02's face and mutes skin tones, adding unease. Focus on C01O02's widened, confused expression.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Shot 2 description: 빈 박스를 든 40대 한국인 여직원 앞에 서서 눈을 동그랗게 뜬 수리영의 표정.",
              "DP framing: near-static MCU, eye-level OTS from the 40대 한국인 여직원’s box-side shoulder toward 수리영’s widened eyes."
            ],
            "visual_inferences": [
              "fixed_element damp_dusk_neon_lighting: continuous lighting condition of early evening dusk mixed with colorful neon reflecting off damp surfaces.",
              "The cardboard box acts as a shared spatial anchor between the foreground OTS element and the primary subject."
            ],
            "creative_decisions": [
              "Utilized [L00: ...] block to define the frame-edge surfaces (shelving, ceiling fixtures, and glass entrance) directly, maintaining the required close framing constraint without referencing an external room.",
              "Kept the upper chest of C01O02 visible to prevent the head from appearing disconnected in the MCU composition."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "9af4079b106bc685",
              "owned_hash": "7c29ab00671f32cf",
              "camera_direction_hash": "b06a4d780e6784e6",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 2,
        "dependency_reason": "수리영의 감정선이 외부에서 내부로 진입하며 발견한 상실감에 이어지며, 씬 2와 5에서 구축된 습기 찬 저녁 네온 조명(damp_dusk_neon_lighting)이 일관되게 작용함.",
        "_shot_index": 2,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the mart front aisle, the dolly-in settles into a near-static MCU, eye-level OTS from the 40대 한국인 여직원’s box-side shoulder toward 수리영’s widened eyes. 수리영 holds the center-left of frame while the empty cardboard box cuts into the right foreground at chest height, keeping the employee’s answer physically between them.",
            "lighting_mood": "Greenish fluorescent mart light mixes with damp dusk neon leaking through the entrance, muting skin tones and adding unease.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L08B01",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "damp_dusk_neon_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A continuous lighting condition of early evening dusk mixed with colorful neon lights. The neon light reflects off damp surfaces, casting a moody, slightly muted glow that visually bridges the interior entrance and the exterior street environment.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "source_facts": [
                  "Shot 2 lighting: 'mixes with damp dusk neon leaking through the entrance'",
                  "Shot 5 lighting: 'Dusk has fallen into blue-gray street darkness, punctured by damp neon'"
                ],
                "visual_inferences": [
                  "The ambient damp neon lighting spills from the wet street into the mart's entrance, maintaining consistent environmental color tones on the character's face across both locations."
                ],
                "creative_decisions": [
                  "Using wet surface reflections and neon color spills to visually connect the interior and exterior shots, maintaining a consistent somber and uneasy mood."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "1eff32da3900b9c4"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "엇갈린 약속과 수리영의 결정",
        "representative_moment": "마트 밖으로 나온 수리영(C01)이 굳은 표정으로 자전거 핸들을 꽉 쥐고 집으로 향할 결심을 하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "MCU, low angle at handlebar height, blue-gray dusk with ominous damp neon red reflections",
            "t2i_prompt": "Photorealistic cinematic still. MCU, low observer at handlebar height. A curved wet bicycle handlebar crosses the lower third of the frame horizontally, with the upper bicycle frame structure faintly visible below it. C01O02 in a beige hoodie, a Korean woman in her early 20s with a young face, black hair, and dark eyes, is positioned at a three-quarter angle from the left. Her clenched hands tightly grip the brake levers angled toward the camera in the foreground. Above her hands, her hardened face is fully visible, her dark eyes looking distant into the passing street blur. Dusk blue-gray street darkness dominates the atmosphere, punctured by damp neon lighting. A faint ominous red ambient spill washes the side of her face and pools on the wet hoodie fabric. At the lower edge, the rain-slick pavement reflects red and green signage in broken streaks beneath the bicycle. Immediately behind her, the dark negative space of closed mart glass doors reveals dim interior shelves through smears of moisture. Above and behind her, the illuminated front face of a neon-glowing mart sign points toward the camera, its lettering softened by a light drizzle. Focus on the wet foreground bicycle handlebar and her tense posture.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#8 action: 수리영 마트 밖을 나오면서 연락을 취해보지만 받지않는다. 일단 집으로-",
              "Shot 5 lighting: 'Dusk has fallen into blue-gray street darkness, punctured by damp neon'",
              "Shot description: MCU, low angle at handlebar height, bicycle handlebar as a through-object foreground line."
            ],
            "visual_inferences": [
              "fixed_element: damp_dusk_neon_lighting bridges the exterior and interior with neon reflections on her face",
              "The bicycle's front structure is slightly visible to ground the handlebar in reality, preventing a floating prop",
              "Her stopped posture contrasts with the passing street blur, emphasizing her internal decision"
            ],
            "creative_decisions": [
              "Positioning the handlebar strongly in the lower third to create a physical barrier and anchor her tense grip",
              "Using the closed dark glass doors behind her as negative space to make her silhouette and expression pop",
              "Reflecting the ominous red neon exclusively on the wet pavement and the side of her face to heighten the thriller mood"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "0f8822fecb0fe09b",
              "owned_hash": "82729a7331412f24",
              "camera_direction_hash": "3852248132c20b7d",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "atmosphere_reference: S8_Shot2 의 damp dusk neon lighting 분위기를 그대로 차용하여 마트 내외부 조명 일관성 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Outside the mart after dusk, the frame drops into a MCU, low angle at handlebar height, using the bicycle handlebar as a through-object foreground line across the lower third. 수리영’s clenched hands sit sharp in the lower center while her hardened face remains visible above them, slightly compressed against wet neon reflections and passing street blur.",
            "lighting_mood": "Dusk has fallen into blue-gray street darkness, punctured by damp neon and a faint ominous red spill on the wet pavement.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L08B02",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "damp_dusk_neon_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A continuous lighting condition of early evening dusk mixed with colorful neon lights. The neon light reflects off damp surfaces, casting a moody, slightly muted glow that visually bridges the interior entrance and the exterior street environment.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "source_facts": [
                  "Shot 2 lighting: 'mixes with damp dusk neon leaking through the entrance'",
                  "Shot 5 lighting: 'Dusk has fallen into blue-gray street darkness, punctured by damp neon'"
                ],
                "visual_inferences": [
                  "The ambient damp neon lighting spills from the wet street into the mart's entrance, maintaining consistent environmental color tones on the character's face across both locations."
                ],
                "creative_decisions": [
                  "Using wet surface reflections and neon color spills to visually connect the interior and exterior shots, maintaining a consistent somber and uneasy mood."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 2,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "a12ce821dece4b74"
      },
      {
        "scene_index": 9,
        "heading": "S#9. 해안가 / N",
        "beat_title": "불안한 귀가",
        "representative_moment": "어둠이 깔린 해안도로에서 입술을 꽉 깨문 채 자전거 페달을 힘껏 내리밟으며 달리는 수리영(C01).",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Parallel tracking medium shot from the left, slight high angle from waist height, unsteady lateral motion blur, cold coastal night tones.",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the tense forward momentum. C01O02 in a beige hoodie, a young Korean woman in her early 20s with black hair and dark eyes, in left profile, seated on the saddle of a bicycle. She is frozen in mid-pedal, her left foot driving the rain-specked pedal downward, her mouth clenched, eyes fixed on the distance. Her black hair and the hoodie drawstrings flutter backward in the direction opposite to motion. The bicycle's frame, crank, and front wheel fill the lower frame, the left side of the crank facing the camera. Captured from a tracking parallel position on the left with a slight high angle near waist height, her torso and lower body occupy the frame. Cold coastal night tones flatten the scene, with dim sodium streetlight glints and faint red ambient light pooling on the wet metal bicycle frame. Behind her, the dark coastal road streaks laterally in unsteady motion blur, the foggy sea edge barely visible in the dark background. A distant, rain-dulled roadside warning sign slips past, its red reflective face turned obliquely toward the camera.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "해안도로를 자전거를 타고 바삐 집으로 달려가는 수리영",
              "어둠이 깔린 해안도로에서 입술을 꽉 깨문 채, 한쪽 발로 자전거 페달을 힘껏 내리밟는 mid-pedal 순간"
            ],
            "visual_inferences": [
              "자전거 진행 방향 반대편으로 머리카락과 옷깃이 날림 (mid-action freeze 보존)",
              "젖은 금속 자전거 프레임 표면에 맺히는 가로등과 경고판의 반사광",
              "배경의 lateral motion blur를 통한 다급한 속도감 표현"
            ],
            "creative_decisions": [
              "수리영의 긴장된 표정과 페달을 밟는 발을 동시에 잡기 위해 약간 높은 waist-height 앵글 설정",
              "차가운 해안가 밤 색조 속에 희미한 붉은색 경고판을 배치하여 불길한 분위기 암시"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "ead2d9648af9912f",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "c63788b3db5875d9",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 6,
        "dependency_reason": "continuity card에 S6_Shot2의 exact_background가 지정되어 있으나, background_binding mode가 not_applicable이며 해안도로 공간(L05) 묘사가 요구되므로 reference 없이 공간을 직접 묘사함.",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 9,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Parallel to the bicycle on its left side, the camera tracks in a MWS with a slight high angle from waist height, widened enough to catch 수리영’s clenched mouth near the upper left and her foot driving the pedal down in the lower right. The road streaks laterally behind her in an unsteady tracking profile, preserving the flow’s speed while making one mid-pedal strike feel like a held breath.",
            "lighting_mood": "Cold coastal night tones flatten the road, with sodium streetlight glints and faint red roadside reflections flashing across wet metal.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 6,
                "shot_index": 2,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "fe938d8083df156e"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "옥탑방으로 접근하는 낯선 그림자",
        "representative_moment": "낯선 남자의 긴 그림자가 옥탑방 철문 현관 앞 바닥으로 길게 드리워진 모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "ankle-height low angle medium wide shot, blue-gray coastal dampness with weak practical light",
            "t2i_prompt": "Photorealistic cinematic still. Deviating from the reference's eye-level framing to an ankle-height low angle, a medium wide shot focuses on the damp, gritty concrete of the rooftop deck from the reference. An elongated human shadow stretches from off-frame across the blue-gray floor, forming a dominant diagonal shape that leads the eye to the threshold of the iron door from the reference. The intruder's physical body remains entirely outside the frame. A creased advertising flyer is wedged edge-first into the door's narrow crack, its printed face partly visible with blurred ad graphics showing. The water tank and clothesline posts from the reference stand in the dim background. A weak rooftop practical light casts the deep black shadow, highlighting rust-red stains near the threshold.",
            "outfit_assignments": [],
            "source_facts": [
              "S#10 action: '남자의 긴 그림자. (얼굴은 보이지 않는다) 신발은 옥탑방 철문 현관 앞에 멈춰 선다.'",
              "shot description: 철문 현관 앞 바닥에 길게 드리워진 낯선 남자의 그림자."
            ],
            "visual_inferences": [
              "intruder's body and shoes remain out of frame to maximize the ominous presence of the shadow",
              "damp concrete floor reflecting the weak practical light"
            ],
            "creative_decisions": [
              "explicit framing deviation from eye-level to ankle-height low angle to emphasize the stretched shadow on the ground plane",
              "rust-red stains near the door threshold to add an occult thriller undertone"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "5768882af4c2eaeb",
              "owned_hash": "434f35347ebb15a4",
              "camera_direction_hash": "cb4ceaa85a4e9753",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "rooftop deck",
                  "violating_phrase": "the damp, gritty concrete of the rooftop deck from the reference",
                  "reason": "The owned object is mentioned with an explicit reference anchor, not as a newly created or modified object.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "the threshold of the iron door from the reference",
                  "reason": "The owned object appears in a reference-anchored phrase rather than as the direct object of a redraw verb.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "shadow",
                  "violating_phrase": "An elongated human shadow stretches from off-frame",
                  "reason": "The shadow is described as an existing framing element and not explicitly created or added.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "water tank",
                  "violating_phrase": "The water tank and clothesline posts from the reference",
                  "reason": "The owned object is explicitly tied to the reference, which makes this an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "clothesline",
                  "violating_phrase": "clothesline posts from the reference",
                  "reason": "The mention is reference-anchored and does not explicitly instruct creation or modification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "post",
                  "violating_phrase": "clothesline posts from the reference",
                  "reason": "The posts are referenced as existing background elements from the reference, not newly drawn objects.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "atmosphere_reference from prior rooftop exterior for consistent lighting and mood",
        "_shot_index": 3,
        "visible_entities": [
          "L03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "On the rooftop floor directly before the iron door, the camera holds a MWS, low angle at ankle height, tracking to a near-stop as the 낯선 남자’s elongated shadow stretches from off-frame across the concrete. His body and face remain outside the image; the shadow forms the dominant diagonal shape leading the eye to the threshold and the narrow door crack.",
            "lighting_mood": "A weak rooftop practical throws a long black shadow across blue-gray concrete, with rust-red stains near the threshold adding occult unease.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L03"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L03B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "clothesline",
              "door",
              "drainage grate",
              "light fixture",
              "parapet",
              "platform",
              "post",
              "rooftop deck",
              "shadow",
              "stairwell headhouse",
              "utility pipe",
              "water tank"
            ],
            "camera_reference": {
              "camera_position": "near number 2 (iron door), facing diagonally across number 1 (rooftop deck) toward number 5 (water tank) and number 6 (clothesline posts)",
              "camera_height": "eye-level standing ~1.6m",
              "lens_hint": "35mm wide angle",
              "framing_notes": "include number 2 prominently as the intrusion point, keep number 5 and number 6 readable in the background, and place number 9 along the floor path for the long intruder silhouette trace"
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": [],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "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"
            }
          }
        },
        "render_prompt_card_hash": "5661f472017a4318"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "어둠 속의 습격과 절규",
        "representative_moment": "C03가 보이지 않는 힘에 어깨를 제압당한 채 공포에 질려 입을 크게 벌리고 비명을 지른다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "ECU head-and-shoulder composition, subtly Dutch angle, eye-level handheld, sickly amber and cool blue lighting",
            "t2i_prompt": "Photorealistic cinematic still. ECU head-and-shoulder composition, subtly Dutch angle, eye-level handheld observer POV. C03O06 in a grey homewear and apron, an East Asian woman in her 40s, at three-quarter angle from the left, the figure receiving the force, body angled backward in a sudden recoil, an unseen grip holding her shoulder out of alignment. Her mouth is wide open in a scream, strained cheek muscles visible, eyes fixed on the void. Focus on her panicked expression, her shoulder visible at the edge of the frame. Dim practical amber light falling on one side of her face fights cool blue window spill on the opposite cheek, giving the skin tones a sickly cast. [: heavily blurred dark edge of a scuffed doorframe behind her head, soft amber glow from a weak lamp, dirty yellowed wallpaper out of focus, and a night-black window glass catching a warped smear of amber lamp light and a vague moving darkness at the edge]",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O06"
              }
            ],
            "source_facts": [
              "S#10 action: '창문에 비친 그림자. 민숙을 덮쳐 어깨를 물어뜯는 듯한 모습 ‘아악-’'",
              "shot description: Inside the room, the camera snaps into an ECU, eye-level handheld close observation less than half a meter from 민숙’s face, tightening until her open mouth and strained cheek muscles occupy most of the frame."
            ],
            "visual_inferences": [
              "fixed_element body_pose: recoiling from an unseen force, shoulder held out of alignment",
              "Dutch angle and handheld observer POV emphasize the instability and sudden panic of the attack",
              "Skipped close framing intentionally blurs the background to isolate the subject's terror, using frame-edge elements for depth"
            ],
            "creative_decisions": [
              "Used 'head-and-shoulder composition' with 'shoulder visible at the edge' to fulfill the ECU requirement without triggering a floating severed-head artifact.",
              "Described the unseen attacker as a physical force ('an unseen grip holding her shoulder out of alignment') to convey violent role asymmetry without adding a second ID.",
              "Applied practical amber and cool blue spill on the skin surfaces rather than cutting through, maintaining physical integrity while achieving the sickly tone."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "fb5c5ee06a408774",
              "owned_hash": "434f35347ebb15a4",
              "camera_direction_hash": "80edeb07725f8caa",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 10,
        "dependency_reason": "S10_Shot3의 어둡고 축축한 옥탑방 분위기(atmosphere_reference)를 공유하여 연속된 긴장감을 유지",
        "_shot_index": 8,
        "visible_entities": [
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the room, the camera snaps into an ECU, eye-level handheld close observation less than half a meter from 민숙’s face, tightening until her open mouth and strained cheek muscles occupy most of the frame. The angle is subtly Dutch, with the unseen grip jerking her shoulder out of alignment while the background collapses into smeared darkness.",
            "lighting_mood": "Dim practical amber fights cold blue window spill, while the handheld Dutch instability makes the skin tones sickly and panicked.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L03B04",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 10,
                "shot_index": 3,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C03O06",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "314f99e8031e1b55"
      },
      {
        "scene_index": 11,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "집 안에서 엄마를 부르며 찾아다님 → 자신의 방에서 처참하게 물어뜯긴 채 죽어있는 엄마의 시신을 발견함",
        "representative_moment": "A thick pool of blood and smeared footprints on the dark wooden floor, receding toward a distant blurred curtain.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up, Dutch angle, very low floor-level perspective, cool blue-gray tone with striking saturated red contrast.",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up from a very low floor-level perspective, tilted in a Dutch angle. Focus on a thick, wet pool of deep red blood occupying the lower center of the frame. The saturated, glossy liquid is heavily spread across dark wooden floorboards. Smeared, uneven bloody footprints form a wet trail receding away from the camera along the long board seams deeper into the space. [L04: oppressive interior edge submerged in humid, cool blue-gray shadows, with a weak, muted off-camera spill barely illuminating the dark wood]. A blurred, mundane fabric window curtain hangs vertically in the distant background, its bottom edge touching the floor, serving as a soft, shadowy framing device. The scene is dominated by a grim atmosphere where the unnaturally saturated crimson sharply breaks the dim blue-gray tone of the room.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene text: '바닥에 흥건한 혈흔. 피묻은 발자국은 커튼으로 이어져 있다.'",
              "Shot 11 camera: 'The pooled red blood occupies the lower center and stains the eye path deeper into the room'",
              "Shot 11 lighting: 'Weak TV spill and a dim room lamp leave the floor in humid gray shadow'"
            ],
            "visual_inferences": [
              "fixed_element pooled_blood_on_floor: The blood is fresh enough to appear wet and highly saturated, starkly contrasting with the wooden floor.",
              "fixed_element dim_blue_gray_lighting: The ambient light is extremely low, relying on a single weak artificial light source that casts cool, unsettling shadows.",
              "fixed_element hanging_window_curtain: The curtain is likely made of a heavy, neutral-colored fabric that absorbs the dim room light."
            ],
            "creative_decisions": [
              "Using an extreme close-up with a Dutch angle to amplify the disorientation and horror of the bloody discovery.",
              "Contrasting the highly saturated, glossy red of the blood against the muted, cool blue-gray shadows of the wooden floor to make the stain feel overwhelmingly visceral."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "73978a04a38bceec",
              "owned_hash": "930b9286d35f0313",
              "camera_direction_hash": "caceee152e91bc8a",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "atmosphere_reference",
        "_shot_index": 11,
        "visible_entities": [
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside 수리영’s bedroom, the floor-tracking flow nearly stops in a CU, Dutch angle, with the lens only about 20 cm above the ground near the doorway. The pooled red blood occupies the lower center and stains the eye path deeper into the room, while floorboards and a blurred curtain line remain visible as scale references so the stain feels real rather than abstract.",
            "lighting_mood": "Weak TV spill and a dim room lamp leave the floor in humid gray shadow, broken by the unnaturally saturated red of the blood.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L04"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "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",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dim_blue_gray_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior space is submerged in oppressive, humid shadows characterized by a strong cool, blue-gray tone. A weak, muted spill of light from an off-camera source barely illuminates the space, maintaining a grim, dark, and gloomy atmosphere.",
                "applies_to_shots": [
                  11,
                  14,
                  20
                ],
                "source_facts": [
                  "Shot 11 lighting: 'dim room lamp leave the floor in humid gray shadow'",
                  "Shot 14 lighting: 'Muted lamp spill... carve silhouette into a gray-blue silhouette'",
                  "Shot 20 lighting: 'The room stays dim and blue-gray'"
                ],
                "visual_inferences": [
                  "The ambient light is extremely low, relying on a single weak artificial light source that casts cool, unsettling shadows."
                ],
                "creative_decisions": [
                  "Unifying the visual tone across wide and close-up shots by locking in the specific cool blue-gray color grading to enhance the horror atmosphere."
                ],
                "confidence": "high"
              },
              {
                "element_id": "pooled_blood_on_floor",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A thick, wet pool of deep red blood is heavily spread across the dark wooden floorboards. The saturated red liquid creates a striking, gruesome contrast against the muted, shadowy textures of the room's floor.",
                "applies_to_shots": [
                  11,
                  14
                ],
                "source_facts": [
                  "Scene text: '바닥에 흥건한 혈흔.'",
                  "Shot 11 action: '방바닥에 흥건하게 고인 붉은 핏자국'",
                  "Shot 11 camera: 'The pooled red blood occupies the lower center'",
                  "Shot 14 lighting: 'sick red stains pulling the eye downward'"
                ],
                "visual_inferences": [
                  "The blood is fresh enough to appear wet and highly saturated, starkly contrasting with the wooden floor."
                ],
                "creative_decisions": [
                  "Using the blood pool as a persistent environmental anchor between the close-up floor tracking and the wide reveal of the body."
                ],
                "confidence": "high"
              },
              {
                "element_id": "hanging_window_curtain",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A long, mundane fabric window curtain hangs vertically, its bottom edge touching the wooden floorboards. It is partially pulled aside, serving as a soft, shadowy framing device at the edge of the visual field.",
                "applies_to_shots": [
                  11,
                  14
                ],
                "source_facts": [
                  "Scene text: '피묻은 발자국은 커튼으로 이어져 있다. 호흡을 가다듬고 커튼을 젖히자...'",
                  "Shot 11 camera: 'blurred curtain line remain visible as scale references'",
                  "Shot 14 camera: 'behind the pulled-aside fabric. The curtain edge frames the left foreground'"
                ],
                "visual_inferences": [
                  "The curtain is likely made of a heavy, neutral-colored fabric that absorbs the dim room light."
                ],
                "creative_decisions": [
                  "Maintaining the curtain as a constant foreground or background element to emphasize the cramped, hidden nature of the space."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 9,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "d791fbece6aa221b"
      },
      {
        "scene_index": 11,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "엄마의 참혹한 죽음 발견",
        "representative_moment": "커튼 뒤에 앉은 채 죽어있는 C03의 축 늘어진 전신.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium-wide low angle, cool blue-gray tones with muted lamp spill",
            "t2i_prompt": "Photorealistic cinematic still. A low angle view from about one meter high. The pulled-aside fabric of the hanging window curtain from the reference frames the left foreground like a soft, shadowy veil. Behind the curtain, C03O06 in gray homewear and an apron, a Korean woman in her early 40s with black hair, sits slumped heavily on the wooden floorboards from the reference. She is positioned center-right, looking away with dead eyes, her head dropped forward and limbs loose. One hand rests low near the floor, loosely holding a crumpled old photograph. Below her, a thick, wet pool of deep red blood spreads across the dark floor. The dim shadow of the bed base from the reference occupies the right edge. The oppressive space is submerged in humid shadows with a strong cool, blue-gray tone, while a weak, muted lamp spill shapes her form into a silhouette against the cold darkness.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O06"
              }
            ],
            "source_facts": [
              "Shot 14 description: 커튼 뒤에 앉은 채로 고개를 푹 수그린 민숙의 축 늘어진 전신.",
              "Shot 14 lighting: 'Muted lamp spill and cold window darkness carve 민숙 into a gray-blue silhouette with sick red stains'",
              "Shot 11 action: '방바닥에 흥건하게 고인 붉은 핏자국'"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: slumped seated behind curtain, head dropped, limbs heavy",
              "fixed_element pooled_blood_on_floor: wet, saturated red blood contrasting the dark floor",
              "fixed_element hanging_window_curtain: pulled aside framing the left foreground",
              "forward_zoom_targets positioned visibly: crumpled old photograph held in the dropped hand near the floor, bed base shadow on the right"
            ],
            "creative_decisions": [
              "Low angle (~1m) to emphasize the weight of the slumped body and place the blood pool and photograph securely in the lower frame.",
              "Using the reference curtain as a left foreground framing device to heighten the claustrophobic reveal while preserving exact background constraints."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "1e030cf34313f67f",
              "owned_hash": "930b9286d35f0313",
              "camera_direction_hash": "ed2ca7ae2d27e9bc",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "curtain",
                  "violating_phrase": "the hanging window curtain from the reference",
                  "reason": "The curtain is mentioned with an explicit reference cue and as a framing element, not as a newly created object.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "the wooden floorboards from the reference",
                  "reason": "The floor is referenced as an existing background element from the reference, without any redraw directive.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "photo",
                  "violating_phrase": "a crumpled old photograph",
                  "reason": "The photo is only described as a held prop, with no explicit instruction to create or add a new photo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bed",
                  "violating_phrase": "The dim shadow of the bed base from the reference",
                  "reason": "The bed is mentioned as an existing referenced background element, not as something to redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "Shot 11 (previous shot) exact_background binding, sharing the same room environment, blood pool, and pulled-aside curtain.",
        "_shot_index": 14,
        "visible_entities": [
          "C03",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "shot_index": 14
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Near the window curtain, the completed tilt resolves into a WS, low angle from about one meter high, held just far enough back for 민숙’s entire slumped body to read behind the pulled-aside fabric. The curtain edge frames the left foreground like a torn veil, while 민숙 sits center-right with her head dropped and limbs heavy, the room’s cramped depth pressing in around her.",
            "lighting_mood": "Muted lamp spill and cold window darkness carve 민숙 into a gray-blue silhouette with sick red stains pulling the eye downward.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C03",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L04B06",
            "reference_usage": "exact_background",
            "owned_objects": [
              "backpack",
              "bed",
              "bloodstain",
              "curtain",
              "doll",
              "door",
              "floor",
              "photo",
              "wall",
              "wardrobe",
              "window"
            ],
            "camera_reference": {
              "camera_position": "just inside number 20 (main bedroom door), facing toward number 23 (curtain partition), number 24 (concealed body position), number 25 (blood stain symbol), and number 26 (red circular tattoo clue)",
              "camera_height": "eye-level standing ~1.55m",
              "lens_hint": "35mm wide angle",
              "framing_notes": "Keep the curtain as the main blocker; show the floor clue positions without exposing graphic detail."
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": "dim_blue_gray_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior space is submerged in oppressive, humid shadows characterized by a strong cool, blue-gray tone. A weak, muted spill of light from an off-camera source barely illuminates the space, maintaining a grim, dark, and gloomy atmosphere.",
                "applies_to_shots": [
                  11,
                  14,
                  20
                ],
                "source_facts": [
                  "Shot 11 lighting: 'dim room lamp leave the floor in humid gray shadow'",
                  "Shot 14 lighting: 'Muted lamp spill... carve silhouette into a gray-blue silhouette'",
                  "Shot 20 lighting: 'The room stays dim and blue-gray'"
                ],
                "visual_inferences": [
                  "The ambient light is extremely low, relying on a single weak artificial light source that casts cool, unsettling shadows."
                ],
                "creative_decisions": [
                  "Unifying the visual tone across wide and close-up shots by locking in the specific cool blue-gray color grading to enhance the horror atmosphere."
                ],
                "confidence": "high"
              },
              {
                "element_id": "pooled_blood_on_floor",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A thick, wet pool of deep red blood is heavily spread across the dark wooden floorboards. The saturated red liquid creates a striking, gruesome contrast against the muted, shadowy textures of the room's floor.",
                "applies_to_shots": [
                  11,
                  14
                ],
                "source_facts": [
                  "Scene text: '바닥에 흥건한 혈흔.'",
                  "Shot 11 action: '방바닥에 흥건하게 고인 붉은 핏자국'",
                  "Shot 11 camera: 'The pooled red blood occupies the lower center'",
                  "Shot 14 lighting: 'sick red stains pulling the eye downward'"
                ],
                "visual_inferences": [
                  "The blood is fresh enough to appear wet and highly saturated, starkly contrasting with the wooden floor."
                ],
                "creative_decisions": [
                  "Using the blood pool as a persistent environmental anchor between the close-up floor tracking and the wide reveal of the body."
                ],
                "confidence": "high"
              },
              {
                "element_id": "hanging_window_curtain",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A long, mundane fabric window curtain hangs vertically, its bottom edge touching the wooden floorboards. It is partially pulled aside, serving as a soft, shadowy framing device at the edge of the visual field.",
                "applies_to_shots": [
                  11,
                  14
                ],
                "source_facts": [
                  "Scene text: '피묻은 발자국은 커튼으로 이어져 있다. 호흡을 가다듬고 커튼을 젖히자...'",
                  "Shot 11 camera: 'blurred curtain line remain visible as scale references'",
                  "Shot 14 camera: 'behind the pulled-aside fabric. The curtain edge frames the left foreground'"
                ],
                "visual_inferences": [
                  "The curtain is likely made of a heavy, neutral-colored fabric that absorbs the dim room light."
                ],
                "creative_decisions": [
                  "Maintaining the curtain as a constant foreground or background element to emphasize the cramped, hidden nature of the space."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "shot_index": 11,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [
              {
                "scene_index": 11,
                "shot_index": 20,
                "description": "민숙의 손목에 있는 둥근 표식이 붉은색을 띤 클로즈업.",
                "keep_elements": [
                  {
                    "label": "crumpled old photograph",
                    "kind": "static_prop"
                  },
                  {
                    "label": "blood-spotted floor below",
                    "kind": "environment"
                  },
                  {
                    "label": "dim bed base shadow",
                    "kind": "environment"
                  }
                ]
              }
            ],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L04B06",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "be47f31a0ec5811c"
      },
      {
        "scene_index": 11,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "붉게 변하는 표식",
        "representative_moment": "Focus on the reddening circular mark on the limp wrist.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up, overhead bird's eye angle at hand level, shallow rack focus, dim cool blue-gray lighting",
            "t2i_prompt": "Photorealistic cinematic still. Overhead bird's eye angle at hand level. Focus on the pale wrist and limp fingers of a Korean woman in her early 40s wearing a grey home-wear sleeve, the arm crossing the lower third of the frame. Dead center on the wrist, the P08 circular mark glows with a wet red emphasis, the marked skin surface facing upward toward the overhead camera. At frame left, a crumpled photograph rests on the surface, its creased printed face partly turned toward the camera, image content obscured by folds and blood smears, softened by shallow depth of field. [: The hand-level floor surface directly below is covered in sticky dark red smears, a dim bed base casting a shadow nearby]. The same space is submerged in oppressive, humid shadows characterized by a strong cool blue-gray tone from a weak muted spill, contrasting with the occult red detail on the skin.",
            "outfit_assignments": [],
            "source_facts": [
              "S11 action: '엄마 손목에 있던 문신이 붉은색으로 변한다'",
              "Shot 20 description: 'Beside 민숙 on the bedroom floor, the camera completes the evidence-detail push into an ECU, overhead / bird's eye angle at hand level... shallow rack focus from crumpled photograph past her limp fingers to the circular wrist mark.'"
            ],
            "visual_inferences": [
              "fixed_element dim_blue_gray_lighting: 'The interior space is submerged in oppressive, humid shadows characterized by a strong cool, blue-gray tone. A weak, muted spill of light...'",
              "Id policy body_part_focus_rule applied: Replaced C03O06 with a common noun and demographic descriptor ('Korean woman in her early 40s') to prevent body separation artifacts in an extreme close-up."
            ],
            "creative_decisions": [
              "Used shallow depth of field to isolate the reddening P08 mark and the limp hand from the crumpled photo, emphasizing the focal point.",
              "Framed using an overhead angle strictly targeting the immediate hand-level surface [L01] to comply with skipped_close_framing background constraints."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "ae619593c589ab94",
              "owned_hash": "930b9286d35f0313",
              "camera_direction_hash": "954f06c972415b82",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "zoom_in_detail from Shot 14, preserving the same dim blue-gray lighting and immediate floor space",
        "_shot_index": 20,
        "visible_entities": [
          "C03",
          "P08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "shot_index": 20
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Beside 민숙 on the bedroom floor, the camera completes the evidence-detail push into an ECU, overhead / bird's eye angle at hand level, with a shallow rack focus from the crumpled photograph past her limp fingers to the circular wrist mark. The reddening mark sits dead center, her hand crossing the lower third and the photo kept partially visible at frame left so the supernatural change stays tied to physical evidence.",
            "lighting_mood": "The room stays dim and blue-gray, but the wrist symbol emits a subtle wet red emphasis that feels occult without breaking gritty realism.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C03",
              "P08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "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",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dim_blue_gray_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior space is submerged in oppressive, humid shadows characterized by a strong cool, blue-gray tone. A weak, muted spill of light from an off-camera source barely illuminates the space, maintaining a grim, dark, and gloomy atmosphere.",
                "applies_to_shots": [
                  11,
                  14,
                  20
                ],
                "source_facts": [
                  "Shot 11 lighting: 'dim room lamp leave the floor in humid gray shadow'",
                  "Shot 14 lighting: 'Muted lamp spill... carve silhouette into a gray-blue silhouette'",
                  "Shot 20 lighting: 'The room stays dim and blue-gray'"
                ],
                "visual_inferences": [
                  "The ambient light is extremely low, relying on a single weak artificial light source that casts cool, unsettling shadows."
                ],
                "creative_decisions": [
                  "Unifying the visual tone across wide and close-up shots by locking in the specific cool blue-gray color grading to enhance the horror atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "shot_index": 14,
                "ref_usage": "zoom_in_detail",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "eef27edaf99cf221"
      },
      {
        "scene_index": 12,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "수리영의 절망적인 보고",
        "representative_moment": "계단 아래에서 오열하며 시선을 위로 향한 C01의 얼굴을 비추는 클로즈업 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing from a slightly low angle with shallow depth of field, muted coastal night light and a faint red emergency siren bokeh.",
            "t2i_prompt": "Photorealistic cinematic still. Head-and-shoulder composition from a slightly low angle, shallow depth of field. C01O02 in a beige hoodie, East Asian early 20s woman, occupying the center-left of the frame at three-quarter angle from the right. Her chin is lifting slowly, tear-wet face turned upward, eyes fixed on an off-camera figure above. Muted coastal night light with fog-softened contrast washes her shoulder, while a faint, pulsing red emergency siren flicker reflects softly on her wet cheek. [L04B07: Out-of-focus damp concrete stair railing extending diagonally upward into the dark, with a distant red-blue siren pulse compressed in the bokeh behind her.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#13 action: '비명을 지르며 옥탑방을 빠져나오는 수리영, 허겁지겁 계단을 내려간다. 동시에 사이렌이 울리고~'",
              "Shot 4 description: A tight CU, slightly low angle... as she lifts her tear-wet face toward off-camera 혜수."
            ],
            "visual_inferences": [
              "fixed_element: Faint, pulsing red emergency siren lights casting subtle red accents and reflections across the space",
              "Camera angle is positioned to look slightly upward at her face to emphasize her vulnerable emotional state"
            ],
            "creative_decisions": [
              "Used a head-and-shoulder composition to fulfill the close framing constraint without filling the entire frame with her face",
              "Applied shallow depth of field to isolate C01 against the wet, blurred background stair railing, emphasizing the emergency red flicker on her cheek"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "835b3a4c2c896279",
              "owned_hash": "13f8b28591f9882d",
              "camera_direction_hash": "f28cfac769a6e57c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "Shot 4 imports the muted, uneasy coastal night atmosphere from S11_Shot14 as an atmosphere_reference.",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "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": "A tight CU, slightly low angle, from the foot of the rooftop stairs, holding just below 수리영’s eyeline as she lifts her tear-wet face toward off-camera 혜수. The framing uses shallow DOF: 수리영 occupies the center-left 70% of frame, with the damp stair rail and a faint red siren smear compressed behind her; 혜수 is kept fully off-frame and exists only through 수리영’s upward gaze.",
            "lighting_mood": "Muted coastal night light with fog-softened contrast, a cold practical spill from the rooftop room, and a faint red emergency flicker catching her tears.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "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",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "emergency_siren_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Faint, pulsing red emergency siren lights from outside, casting subtle red accents and reflections across the space to create an uneasy and tense atmosphere.",
                "applies_to_shots": [
                  4,
                  13
                ],
                "source_facts": [
                  "S#13 action: '동시에 사이렌이 울리고'",
                  "Shot 4 lighting: 'a faint red emergency flicker catching her tears'",
                  "Shot 13 lighting: 'with the red accents now reduced to a barely perceptible unease'"
                ],
                "visual_inferences": [
                  "The pulsing red light from the arrived police car reaches both the exterior stairs and the interior living area."
                ],
                "creative_decisions": [
                  "Maintained the red siren light as a subtle, unifying atmospheric element across the active shots to emphasize the lingering tension of the crime scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "shot_index": 14,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "da7896f82d4e56fb"
      },
      {
        "scene_index": 12,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "사라진 흔적과 지나치게 깨끗한 방",
        "representative_moment": "시신과 핏자국이 감쪽같이 사라진 채, 백팩과 인형만 남아있는 서늘하고 깨끗한 옥탑방 내부.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A static eye-level medium framing from just outside the doorway, cool dawn ambient light mixed with dim practicals",
            "t2i_prompt": "Photorealistic cinematic still. A static eye-level medium framing from just outside the doorway, looking into the unnervingly clean bedroom. Focus on the completely empty, dry floor from the reference in the lower center, devoid of any marks. A cold, grayish-blue ambient dawn light seeps into the interior, mixing with dim practical lighting to render the space in a sterile, cool, and humid tone. Mid-right, the neatly made mattress from the reference sits undisturbed. In the lower-left, P04, the backpack from the reference, rests on the floor with its front pocket angled toward the camera and straps collapsed. Nearby, the doll from the reference lies motionless, angled slightly upward. In the background, the curtain from the reference hangs closed across the window from the reference, letting pale dawn-gray exterior brightness leak through, emphasizing the complete absence of any human presence.",
            "outfit_assignments": [],
            "source_facts": [
              "S#14 옥탑방 안: 지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고, 침대 위에 붉은 표식은 물론 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
              "수리영 방안에 놓여진 백팩, 인형. 약간씩 위치가 달라진."
            ],
            "visual_inferences": [
              "fixed_element cool_interior_ambient_light: A cold, grayish-blue ambient dawn light seeping into the interior of the house, rendering the surrounding walls and empty space in a sterile, cool tone.",
              "The complete absence of the body and blood makes the clean room feel unnerving and sterile."
            ],
            "creative_decisions": [
              "Anchored all owned objects (floor, mattress, backpack, doll, curtain, window) explicitly 'from the reference' to satisfy the exact_background binding constraint.",
              "Described the floor as 'completely empty, dry' and 'devoid of any marks' instead of mentioning blood directly to prevent the model from generating accidental blood stains."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "b9a302b946b21f77",
              "owned_hash": "13f8b28591f9882d",
              "camera_direction_hash": "a647b1f4086409a6",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "just outside the doorway",
                  "reason": "The doorway is mentioned only as a spatial framing reference for the camera position, not as an instruction to create or modify a door.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "the completely empty, dry floor from the reference",
                  "reason": "The floor is explicitly referenced as already existing 'from the reference,' which anchors it rather than asking for a redraw.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "mattress",
                  "violating_phrase": "the neatly made mattress from the reference",
                  "reason": "The mattress is described with a reference anchor and a state adjective, not with a redraw verb.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "backpack",
                  "violating_phrase": "the backpack from the reference",
                  "reason": "The backpack is explicitly tied to the reference and only positioned in the scene, so this is an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "doll",
                  "violating_phrase": "the doll from the reference",
                  "reason": "The doll is explicitly referenced as an existing object and merely described in place, not newly created or altered.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curtain",
                  "violating_phrase": "the curtain from the reference hangs closed",
                  "reason": "The curtain is an existing reference object with a hanging state description, which anchors it rather than redrawing it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "the window from the reference",
                  "reason": "The window is explicitly marked as coming from the reference and is only used as a spatial/lighting anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "previous_shot_refs(exact_background): S12_Shot4의 옥탑방 배경 및 가구 배치를 동일하게 유지",
        "_shot_index": 8,
        "visible_entities": [
          "P04",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static WS at eye-level from just outside 수리영’s bedroom doorway, looking across the spotless bed and floor area like a held evidentiary frame. The bed sits mid-right, the backpack rests low-left, and the doll is slightly separated near the lower center, leaving an unnerving empty zone where blood and the body should have been.",
            "lighting_mood": "Dim interior practical light mixes with bluish coastal dawn seepage, making the clean room feel unnaturally sterile and humid.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P04",
              "L04"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L04B07",
            "reference_usage": "exact_background",
            "owned_objects": [
              "backpack",
              "baseboard",
              "curtain",
              "doll",
              "door",
              "floor",
              "light fixture",
              "mattress",
              "photo",
              "wall mark",
              "wardrobe",
              "window"
            ],
            "camera_reference": {
              "camera_position": "near number 20 (main bedroom door), facing toward number 21 (low bed), number 27 (backpack), number 28 (doll), and number 23 (curtain partition)",
              "camera_height": "eye-level standing ~1.55m",
              "lens_hint": "35mm wide angle",
              "framing_notes": "Use the same bedroom geography as the prior night scene, but emphasize the now-clean floor and shifted personal items."
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": "cool_interior_ambient_light",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A cold, grayish-blue ambient dawn light seeping into the interior of the house, rendering the surrounding walls and empty space in a sterile, cool tone.",
                "applies_to_shots": [
                  8,
                  13
                ],
                "source_facts": [
                  "Shot 8 lighting: 'bluish coastal dawn seepage, making the clean room feel unnaturally sterile'",
                  "Shot 13 lighting: 'the surrounding room stays cool and gray'"
                ],
                "visual_inferences": [
                  "The early dawn light from the coastal area uniformly affects the interior color palette of the rooftop house, contrasting with localized practical lights."
                ],
                "creative_decisions": [
                  "Using a cool, sterile color temperature for the background interior to highlight the unnatural emptiness where the body used to be."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 4,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L04B07",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "06151d635290c967"
      },
      {
        "scene_index": 12,
        "heading": "S#13. 옥탑방 외곽 / N & S#14. 옥탑방 안 / N",
        "beat_title": "위로와 보호",
        "representative_moment": "혜수가 수리영의 어깨를 양손으로 감싸 쥐며 부드러운 눈빛으로 바라보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "An MCU at eye-level, frontal and gently pushing in, with an intimate OTS-like foreground connection.",
            "t2i_prompt": "Photorealistic cinematic still. An MCU at eye-level. C02O04 in a detective coat, a Korean woman in her 40s with black hair, facing the camera, occupying the central upper half. C02O04's hands gently grip both shoulders of C01O02. In the lower foreground, C01O02 in a beige hoodie, a Korean woman in her 20s, with back to camera, shoulders held tense, eyes fixed on C02O04, anchoring the bottom third in an OTS-like composition. C02O04's eyes are fixed on C01O02 with a reassuring gaze. Soft practical light warms C02O04's face, while a cold grayish-blue ambient dawn light reflects on the frame-edge surfaces. A faint, pulsing red emergency glow falls softly on C02O04's coat. [: A softly blurred open doorway angled slightly away behind C02O04's shoulder, the near edge of a clean table running horizontally along the lower background, and a misted window showing a dull gray exterior glow], maintaining a sterile, cool tone.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "S#13 action: '(수리영 어깨를 어루만지며) 영아.'",
              "Shot 13 description: '수리영의 어깨를 양손으로 감싸 쥔 채 부드러운 눈빛으로 바라보는 혜수의 정면 구도.'",
              "Shot 13 lighting: 'with the red accents now reduced to a barely perceptible unease'"
            ],
            "visual_inferences": [
              "fixed_element emergency_siren_lighting: Faint, pulsing red emergency lights cast subtle red accents across the space.",
              "fixed_element cool_interior_ambient_light: A cold, grayish-blue ambient dawn light seeps into the interior, creating a sterile tone."
            ],
            "creative_decisions": [
              "Adopted an OTS-like MCU to focus on the emotional connection and physical reassurance between the two characters.",
              "Skipped the main background reference due to close framing, composing only immediate frame-edge elements like the open doorway, table edge, and misted window.",
              "Applied soft practical light on C02's face to gently contrast with the cold, sterile dawn light washing the background."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "3981805d57ed98b6",
              "owned_hash": "13f8b28591f9882d",
              "camera_direction_hash": "3921866889853abc",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "Maintains continuity with the exact background and lighting elements established in the prior shots of the rooftop house.",
        "_shot_index": 13,
        "visible_entities": [
          "C01",
          "C02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 13
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An MCU at eye-level, frontal and gently pushing in, positioned in the living area near the bedroom side so 혜수 is centered squarely while 수리영’s shoulders anchor the lower foreground. The composition uses an intimate OTS-like foreground connection: 혜수’s hands grip both of 수리영’s shoulders near the bottom third, and 혜수’s face occupies the central upper half with the softened room receding behind her.",
            "lighting_mood": "Soft practical light warms 혜수’s face while the surrounding room stays cool and gray, with the red accents now reduced to a barely perceptible unease.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "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",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "emergency_siren_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Faint, pulsing red emergency siren lights from outside, casting subtle red accents and reflections across the space to create an uneasy and tense atmosphere.",
                "applies_to_shots": [
                  4,
                  13
                ],
                "source_facts": [
                  "S#13 action: '동시에 사이렌이 울리고'",
                  "Shot 4 lighting: 'a faint red emergency flicker catching her tears'",
                  "Shot 13 lighting: 'with the red accents now reduced to a barely perceptible unease'"
                ],
                "visual_inferences": [
                  "The pulsing red light from the arrived police car reaches both the exterior stairs and the interior living area."
                ],
                "creative_decisions": [
                  "Maintained the red siren light as a subtle, unifying atmospheric element across the active shots to emphasize the lingering tension of the crime scene."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cool_interior_ambient_light",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A cold, grayish-blue ambient dawn light seeping into the interior of the house, rendering the surrounding walls and empty space in a sterile, cool tone.",
                "applies_to_shots": [
                  8,
                  13
                ],
                "source_facts": [
                  "Shot 8 lighting: 'bluish coastal dawn seepage, making the clean room feel unnaturally sterile'",
                  "Shot 13 lighting: 'the surrounding room stays cool and gray'"
                ],
                "visual_inferences": [
                  "The early dawn light from the coastal area uniformly affects the interior color palette of the rooftop house, contrasting with localized practical lights."
                ],
                "creative_decisions": [
                  "Using a cool, sterile color temperature for the background interior to highlight the unnatural emptiness where the body used to be."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 8,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "9a35c639852c52c1"
      },
      {
        "scene_index": 13,
        "heading": "S#15. 해안가. 버스정류장 부근 / N",
        "beat_title": "자신의 착각이라 합리화하며 급히 집으로 달려가기로 결심함",
        "representative_moment": "벤치에서 몸을 반쯤 일으킨 채 입술을 굳게 다문 수리영(C01)의 결연한 표정.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight MCU from a slightly low angle, cold blue-gray coastal night palette with weak fluorescent practical lighting, shallow depth of field on the expression.",
            "t2i_prompt": "Photorealistic cinematic still. A tight MCU from a slightly low angle, shallow focus on the resolute expression. C01O02 in a beige hooded sweatshirt, a Korean early 20s woman with black hair, caught half-risen from the seat at three-quarter angle from the left, torso leaning forward occupying the center-right, eyes fixed on the distant darkness. [: A rain-damp bench occupies the lower frame edge, its wet front edge facing the camera. Close behind her, a condensation-streaked glass panel and a damp dimly lit timetable board with its printed schedule turned obliquely toward the camera, falling into soft out-of-focus negative space.] Cold blue-gray night ambient wraps the figure, a weak fluorescent practical light washing her face, and moisture glinting on the lower-frame bench.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#15 action: '수리영... (훅 일어나며) 집에 가봐야 겠어.'",
              "Shot 3 description: 벤치에서 몸을 반쯤 일으킨 채 입술을 굳게 다문 수리영의 결연한 표정.",
              "DP directive: A tight MCU, slightly low angle, from within arm’s length of the bus-stop bench as 수리영 is caught half-risen."
            ],
            "visual_inferences": [
              "fixed_element damp_coastal_bus_stop: A dark, damp coastal roadside at night, weak cold fluorescent glow.",
              "The bench edge cuts the lower frame to anchor the half-risen posture geometrically to the slightly low camera angle."
            ],
            "creative_decisions": [
              "Applying close framing to omit the broader scene, focusing entirely on C01's immediate surroundings (wet glass, damp timetable board) to highlight her psychological shift.",
              "Using shallow focus on the expression and blurring the background to isolate the character's tension."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "00ef5ce89f2976a3",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "ea4b5928fb6c1906",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A tight MCU, slightly low angle, from within arm’s length of the bus-stop bench as 수리영 is caught half-risen, her firm lips and resolved eyes tightened in shallow focus. The bench cuts across the lower frame, her torso leans forward center-right, and the dark sea road falls into blurred negative space behind her.",
            "lighting_mood": "Cold blue-gray coastal night wraps the shelter, with a weak fluorescent practical flattening her face and moisture glinting on the bench.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "damp_coastal_bus_stop",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, damp coastal roadside at night, featuring a bus stop shelter that casts a weak, cold fluorescent glow. The paved ground is wet, reflecting the faint artificial light, while the surrounding background is swallowed by deep, blue-black coastal darkness.",
                "applies_to_shots": [
                  3,
                  4,
                  5
                ],
                "source_facts": [
                  "Shot 3: 'weak fluorescent practical flattening her face and moisture glinting on the bench'",
                  "Shot 4: 'wet road', 'roadside sodium spill', 'darkness ahead'",
                  "Shot 5: 'Weak shelter light', 'damp blue-black roadside'"
                ],
                "visual_inferences": [
                  "The asphalt remains uniformly wet across the scene, creating a consistent cold reflection of the nearby artificial lights."
                ],
                "creative_decisions": [
                  "Emphasizing a cold blue-gray color palette for the night environment to amplify the sense of isolation and uncertainty."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "38da50a348595721"
      },
      {
        "scene_index": 13,
        "heading": "S#15. 해안가. 버스정류장 부근 / N",
        "beat_title": "혼란 속 귀가 결심과 질주",
        "representative_moment": "수리영(C01)이 혼란스러운 표정으로 버스정류장을 뒤로 한 채 어둠 속으로 다급하게 달려가는 역동적인 뒷모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A kinetic MWS, low angle tracking behind at waist height, cold and humid coastal night palette",
            "t2i_prompt": "Photorealistic cinematic still. A kinetic medium shot, low angle tracking behind the subject at waist height. C01O02 in a beige hoodie, Korean early 20s female, seen from a back-left angle with her left profile edge slightly visible, mid-stride running away on the damp coastal roadside. Her figure occupies the right third of the frame, lower legs and the wet road occupying the lower frame, one foot just lifted off the pavement, her hoodie collar and dark hair flowing backward in the direction opposite to her forward motion, eyes fixed on the distant darkness. Focus on her dynamic mid-stride posture against the slick ground. On the left edge behind her, the dark night environment features an empty bus stop shelter casting a weak, cold fluorescent glow onto the wet asphalt. The lighting palette is cold and humid, with a thin roadside sodium spill washing her moving silhouette, while deep, blue-black coastal darkness swallows the space ahead.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#15 action: '수리영, 응. 나 갈게 (달려간다)'",
              "shot description: 수리영 running away from the bus stop into the dark, mid-stride from behind, coat fluttering back."
            ],
            "visual_inferences": [
              "fixed_element damp_coastal_bus_stop: wet asphalt reflecting weak cold fluorescent glow from the shelter.",
              "mid-stride posture frozen to preserve motion direction (collar and hair flowing backward opposite to motion)."
            ],
            "creative_decisions": [
              "Low angle tracking at waist height to emphasize the kinetic energy of her departure, placing the wet road prominently in the lower frame.",
              "Cold and humid color palette with thin sodium spill washing her figure to heighten the sense of isolation and the ominous darkness ahead."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "191f4885a90207cf",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "b538df2e22f299df",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 13,
        "dependency_reason": "exact_background: 같은 버스정류장 배경 안에서 수리영이 달려나가는 새로운 순간을 묘사 (이전 샷의 공간적 일관성 유지)",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "L09"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A kinetic MWS, low angle, tracking behind and slightly to the side of 수리영 at waist-to-shoulder height as she runs away from the bus stop. Her back-left side occupies the right third, one foot just lifted from the wet road and her collar flaring backward, while the bus stop shrinks behind her on the left edge.",
            "lighting_mood": "The palette stays cold and humid, with thin roadside sodium spill skimming her moving silhouette and the darkness ahead swallowing detail.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L09"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "damp_coastal_bus_stop",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, damp coastal roadside at night, featuring a bus stop shelter that casts a weak, cold fluorescent glow. The paved ground is wet, reflecting the faint artificial light, while the surrounding background is swallowed by deep, blue-black coastal darkness.",
                "applies_to_shots": [
                  3,
                  4,
                  5
                ],
                "source_facts": [
                  "Shot 3: 'weak fluorescent practical flattening her face and moisture glinting on the bench'",
                  "Shot 4: 'wet road', 'roadside sodium spill', 'darkness ahead'",
                  "Shot 5: 'Weak shelter light', 'damp blue-black roadside'"
                ],
                "visual_inferences": [
                  "The asphalt remains uniformly wet across the scene, creating a consistent cold reflection of the nearby artificial lights."
                ],
                "creative_decisions": [
                  "Emphasizing a cold blue-gray color palette for the night environment to amplify the sense of isolation and uncertainty."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 13,
                "shot_index": 3,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "7d553398a64df43b"
      },
      {
        "scene_index": 13,
        "heading": "해안가. 버스정류장 부근 / N",
        "beat_title": "소리치는 혜수와 멀어지는 수리영",
        "representative_moment": "혜수가 멀어지는 수리영을 향해 손을 입가에 대고 소리친다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium shot from an observer's perspective, cool blue-gray nighttime color palette with high contrast between the weak fluorescent shelter light and deep coastal darkness.",
            "t2i_prompt": "Photorealistic cinematic still. A medium shot at eye-level from an observer POV near the edge of the bus stop area. C02O04 in an investigator jacket, a middle-aged Korean woman with black hair and dark eyes, stands at three-quarter angle from the right, occupying the left-center frame from the waist up. Her hand is cupped to her mouth as she calls out, her eyes fixed on the receding figure. In the right half of the frame, separated across the same damp asphalt road, a young Korean woman is seen receding into the dark negative space, captured in mid-stride running away, her coat trailing opposite to her motion. A weak, cold fluorescent glow from the bus stop shelter behind the foreground woman falls on the wet paved ground and C02O04's jacket, leaving the surrounding background swallowed by deep, ominous blue-black coastal darkness. Focus on the tense distance between the calling woman and the distant runner along the shared wet road.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "S#15 action: '혜수 (등 뒤에 대고 소리친다)', '수리영 (달려간다)'",
              "Shot 5: 'Weak shelter light', 'damp blue-black roadside'"
            ],
            "visual_inferences": [
              "fixed_element: The paved ground is wet, reflecting the faint artificial light",
              "The wet asphalt road acts as a shared spatial anchor connecting the foreground caller and the background runner",
              "Suriyoung is captured mid-stride to freeze her running motion"
            ],
            "creative_decisions": [
              "Keeping the right half of the frame as dark negative space to emphasize Suriyoung disappearing into the coastal darkness",
              "Observer POV positioned slightly behind and to the side of Hyesu to frame both figures in a single cohesive shot without view switching"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d5c7711d484ca066",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "6cdff6c1b1efa72e",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 13,
        "dependency_reason": "exact_background: 이전 샷의 정류장 환경(비에 젖은 아스팔트, 푸르고 어두운 해안가 도로, 약한 형광등 조명)을 동일하게 유지하며 새로운 동작의 순간을 포착",
        "_shot_index": 5,
        "visible_entities": [
          "C02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static MS at eye-level near the edge of the bus stop area, looking back across the roadside toward 혜수 as she calls after 수리영. 혜수 fills the left-center upper body area with one hand cupped to her mouth, while the right half of the frame is held open as dark negative space where 수리영 recedes as a small distant figure.",
            "lighting_mood": "Weak shelter light isolates 혜수 against a damp blue-black roadside, with the background darkness left ominously unfilled.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "damp_coastal_bus_stop",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, damp coastal roadside at night, featuring a bus stop shelter that casts a weak, cold fluorescent glow. The paved ground is wet, reflecting the faint artificial light, while the surrounding background is swallowed by deep, blue-black coastal darkness.",
                "applies_to_shots": [
                  3,
                  4,
                  5
                ],
                "source_facts": [
                  "Shot 3: 'weak fluorescent practical flattening her face and moisture glinting on the bench'",
                  "Shot 4: 'wet road', 'roadside sodium spill', 'darkness ahead'",
                  "Shot 5: 'Weak shelter light', 'damp blue-black roadside'"
                ],
                "visual_inferences": [
                  "The asphalt remains uniformly wet across the scene, creating a consistent cold reflection of the nearby artificial lights."
                ],
                "creative_decisions": [
                  "Emphasizing a cold blue-gray color palette for the night environment to amplify the sense of isolation and uncertainty."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 13,
                "shot_index": 4,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "4ced9b2e1e8d7c92"
      },
      {
        "scene_index": 14,
        "heading": "S#16. 경찰서 사무실 / N",
        "beat_title": "위치추적 요구",
        "representative_moment": "C02가 당직 근무 중인 C04의 얼굴 앞으로 P01 스마트폰 액정을 불쑥 들이미는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Side-composed MCU at chest height, over-the-shoulder framing, flat greenish fluorescent lighting broken by a cold phone glow",
            "t2i_prompt": "Photorealistic cinematic still. A side-composed MCU at chest height. C02O04 in an investigator jacket, an Asian woman in her early 40s, occupies the left third as a partial shoulder and arm slice in over-the-shoulder framing, her side profile visible with dark eyes fixed on the seated man. Her arm is extended forward, holding P01 smartphone suspended in the foreground just below his face. The P01 smartphone's lit screen face is angled toward the seated man and partly toward the camera, showing a saved contact number layout. C04O08 in an investigator jacket, an Asian man in his 30s with short black hair, is seated mid-right in left profile, leaning back in his chair with his dark eyes fixed on the phone. They share the space over [L10: a messy duty desk surface with scattered night-shift papers running between the camera and the seated man, and a blurred paper-covered office notice board visible behind him]. Illuminated by flat, sickly greenish fluorescent overhead lights casting damp shadows on the background, broken by the cold glow of the phone screen washing the side of the seated man's face, establishing an exhausted night-shift tension. Focus on the tense space between the glowing phone and the seated man.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O04"
              },
              {
                "character_id": "C04",
                "outlook_id": "O08"
              }
            ],
            "source_facts": [
              "Scene text: '사무실 안에는 김형사 혼자 당직 근무 중이다.'",
              "Scene text: '(핸드폰에 저장된 민숙번호 보여주며) 이 번호 위치 좀 따봐.'",
              "Shot 3 description: '김형사의 얼굴 앞으로 휴대폰 액정을 불쑥 내민 혜수의 측면 구도.'"
            ],
            "visual_inferences": [
              "fixed_element night_shift_office_environment: Flat greenish fluorescent office light broken by cold phone glow, damp, exhausted night-shift tension.",
              "Hyesu is framed as a foreground partial slice (OTS) to emphasize her invasion of Kim's workspace without shifting focus away from the phone and Kim's reaction."
            ],
            "creative_decisions": [
              "Applied skipped_close_framing policy: explicitly described the frame-edge environment (messy duty desk and blurred notice board) using the [L10: ...] block to fulfill forward_zoom_targets continuity without referencing the background PNG.",
              "Positioned the desk between the camera and the seated figure to act as the shared spatial anchor for fg/bg separation.",
              "Lighting is restricted to surface interaction: the phone screen glow washes the side of Kim's face instead of slicing or cutting."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "ac1877ef21be324c",
              "owned_hash": "f747b52ba12b45e1",
              "camera_direction_hash": "558b44ea92fb4eb2",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 3,
        "visible_entities": [
          "C02",
          "C04",
          "P01",
          "L10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A side-composed MCU at chest height, dollying in from the duty desk side across 혜수’s shoulder as her arm thrusts a phone into 김형사’s personal space. The phone screen cuts into the foreground just below 김형사’s face without overwhelming the frame, while 김형사 sits mid-right in profile and 혜수’s tense shoulder and extended arm occupy the left third.",
            "lighting_mood": "Flat greenish fluorescent office light is broken by the cold phone glow, giving the confrontation a damp, exhausted night-shift tension.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "C04",
              "P01",
              "L10"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O04"
              },
              {
                "character_id": "C04",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L10B02",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "night_shift_office_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of an institutional office at night, illuminated by flat, sickly greenish fluorescent overhead lights. The harsh lighting casts cool, damp shadows across the room, establishing an exhausted and tense atmosphere. A faint, cold glow from a mobile device slightly pierces the ambient greenish light, while the background features muted, indistinct office furniture and duty desks.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "source_facts": [
                  "Scene text: '경찰서 사무실 / N'",
                  "Shot 3 description: 'Flat greenish fluorescent office light is broken by the cold phone glow, giving the confrontation a damp, exhausted night-shift tension'",
                  "Shot 5 description: 'Sickly fluorescent light and the faint phone glow'"
                ],
                "visual_inferences": [
                  "Standard institutional office setting with overhead panel lights",
                  "The overall color palette is dominated by cold green and bluish tones due to the fluorescent fixtures"
                ],
                "creative_decisions": [
                  "Using the greenish tint to visually reinforce the fatigue and anxiety of the late-night shift",
                  "Keeping the background details relatively generic and muted to keep the focus on the foreground subjects"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [
              {
                "scene_index": 14,
                "shot_index": 5,
                "description": "휴대폰을 꽉 쥔 채 허공을 노려보는 혜수의 불안한 표정.",
                "keep_elements": [
                  {
                    "label": "messy duty desk surface with scattered night-shift papers",
                    "kind": "environment"
                  },
                  {
                    "label": "paper-covered office notice board behind the desk",
                    "kind": "environment"
                  }
                ]
              }
            ],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O04",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O08",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "54723a1791cb1ca4"
      },
      {
        "scene_index": 14,
        "heading": "경찰서 사무실 / N",
        "beat_title": "불길한 예감",
        "representative_moment": "C02가 휴대폰을 꽉 쥔 채 불안한 표정으로 허공을 노려본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A CU at eye-level with tight framing, sickly fluorescent lighting and cold green tones",
            "t2i_prompt": "Photorealistic cinematic still. A CU at eye-level, tight framing on her face, upper body in frame. The same figure, C02O04 in a dark investigator jacket, a Korean woman in her early 40s with black hair and dark eyes, stands at three-quarter angle from the left. Her eyes are fixed past the camera into the void with an expression of deep anxiety. Near the lower frame edge, she is tightly gripping P01, a smartphone. The phone's screen is angled downward and only partly visible to the camera, its faint cold glow leaking between her fingers and reflecting softly on her lower cheek. Sickly greenish fluorescent light washes over her features from above, casting cool, damp shadows that pool around her eyes. [: A muted, out-of-focus institutional blur behind her, preserving the same room's overall dim lighting].",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "Scene text: '이상해, 예감이 안 좋아.'",
              "Shot 5 description: '휴대폰을 꽉 쥔 채 허공을 노려보는 혜수의 불안한 표정.'"
            ],
            "visual_inferences": [
              "fixed_element night_shift_office_environment: cool green and bluish tones due to fluorescent fixtures",
              "The background is rendered as an out-of-focus blur to adhere to close framing constraints while maintaining the prior shot's lighting"
            ],
            "creative_decisions": [
              "Tight framing on the face with neck and shoulders visible ensures the head remains anchored to the body",
              "The phone's cold glow reflects on her lower cheek to provide localized lighting without breaking the physical continuity of the face"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "9654c6d1011e5626",
              "owned_hash": "f747b52ba12b45e1",
              "camera_direction_hash": "0ed96a841501adc9",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "zoom_in_detail reference from S14_Shot3 for lighting and character continuity",
        "_shot_index": 5,
        "visible_entities": [
          "C02",
          "P01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A CU at eye-level, pushing in to about two feet from 혜수’s face as she freezes with anxiety, staring past the camera into empty office space rather than at anyone. Her face sits slightly left of center, the clenched phone remains visible near the lower frame edge, and the duty room behind her falls soft into muted institutional blur.",
            "lighting_mood": "Sickly fluorescent light and the faint phone glow carve worry into her face, with cool shadows and no warm relief.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "P01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L10B02",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "night_shift_office_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of an institutional office at night, illuminated by flat, sickly greenish fluorescent overhead lights. The harsh lighting casts cool, damp shadows across the room, establishing an exhausted and tense atmosphere. A faint, cold glow from a mobile device slightly pierces the ambient greenish light, while the background features muted, indistinct office furniture and duty desks.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "source_facts": [
                  "Scene text: '경찰서 사무실 / N'",
                  "Shot 3 description: 'Flat greenish fluorescent office light is broken by the cold phone glow, giving the confrontation a damp, exhausted night-shift tension'",
                  "Shot 5 description: 'Sickly fluorescent light and the faint phone glow'"
                ],
                "visual_inferences": [
                  "Standard institutional office setting with overhead panel lights",
                  "The overall color palette is dominated by cold green and bluish tones due to the fluorescent fixtures"
                ],
                "creative_decisions": [
                  "Using the greenish tint to visually reinforce the fatigue and anxiety of the late-night shift",
                  "Keeping the background details relatively generic and muted to keep the focus on the foreground subjects"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 3,
                "ref_usage": "zoom_in_detail",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "d2920836d7e779d5"
      },
      {
        "scene_index": 15,
        "heading": "S#17. 옥탑방 / 동틀무렵",
        "beat_title": "고요한 새벽, 불 켜진 옥탑방",
        "representative_moment": "어스름한 새벽빛 아래 불이 켜진 옥탑방 창문이 보이는 텅 빈 마당 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme wide shot, low angle at waist height, pre-dawn blue haze with lonely warm yellow practical light",
            "t2i_prompt": "Photorealistic cinematic still. [L03: Low angle at waist height from the far edge of the yard, facing diagonally upward. The empty, damp dawn-gray courtyard ground from the reference occupies the lower frame as negative space. In the upper third, the lit rooftop window from the reference glows sharply with a lonely yellow practical light through closed, slightly fogged glass. Along the right side, the rain-darkened exterior stairs and the wet courtyard wall from the reference angle upward toward the glowing room. Pre-dawn blue haze and humid fog mute the overall environment, creating a quiet, ominous isolation.]",
            "outfit_assignments": [],
            "source_facts": [
              "S#17. 옥탑방 / 동틀무렵",
              "shot description: 어스름한 새벽빛 아래 불이 켜진 옥탑방 창문이 보이는 텅 빈 마당 전경."
            ],
            "visual_inferences": [
              "Wet surfaces in the courtyard reflect the dim ambient blue light",
              "Fog softens the edges of the light emanating from the window"
            ],
            "creative_decisions": [
              "Extreme wide shot at waist height to emphasize the damp negative space in the foreground",
              "Strong color contrast between the cold blue fog and the warm yellow practical light from the window"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "892603546a913787",
              "owned_hash": "9788465baca39ead",
              "camera_direction_hash": "659983f6edbfa365",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "courtyard",
                  "violating_phrase": "The empty, damp dawn-gray courtyard ground from the reference",
                  "reason": "The courtyard is referenced as existing background from the reference, not explicitly created or modified.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "the lit rooftop window from the reference",
                  "reason": "The window is explicitly described as being from the reference, which anchors it to the existing background rather than redrawing it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "stair",
                  "violating_phrase": "the rain-darkened exterior stairs",
                  "reason": "The stairs are only described as an existing environmental element with an adjective, not as newly created or inserted.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "the wet courtyard wall from the reference",
                  "reason": "The wall is explicitly anchored to the reference background, so this is a reference mention rather than a redraw request.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "exact_background: same courtyard and rooftop exterior from a prior shot, maintaining spatial continuity for the background elements.",
        "_shot_index": 1,
        "visible_entities": [
          "L03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 15,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An EWS, low angle, held static from the far edge of the empty courtyard at waist height, facing the rooftop room across the yard. The courtyard occupies most of the lower frame as damp negative space, while the lit rooftop window sits small but sharp in the upper third, glowing before any cat is revealed.",
            "lighting_mood": "Pre-dawn blue haze mutes the courtyard while the rooftop window burns with a lonely yellow practical glow, edged by humid fog.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L03"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L03B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cat",
              "courtyard",
              "drain",
              "gate",
              "landing",
              "light fixture",
              "railing",
              "roof",
              "stair",
              "utility pipe",
              "wall",
              "window"
            ],
            "camera_reference": {
              "camera_position": "near number 4 (south entrance gate), inside number 1 (courtyard yard), facing diagonally upward/north toward number 5 (lit rooftop window), with number 2 (exterior stair run and base landing) along the right side and number 7 (black cat on wall) crossing the wall line",
              "camera_height": "eye-level standing ~1.6m",
              "lens_hint": "35mm wide angle",
              "framing_notes": "Emphasize the empty dawn courtyard mood by keeping the yard open in the foreground; include the stair base, the rooftop window, and the cat on the wall as the key readable anchors."
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": [],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L03B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "375fbfc0ce2db525"
      },
      {
        "scene_index": 16,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "번쩍 뜬 눈, 안도와 불안의 교차",
        "representative_moment": "번쩍 뜬 눈으로 천장을 응시하는 C01의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up (ECU), slight low angle from bed level, static intimate camera, cold dim grayish dawn lighting",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in a beige hoodie, an East Asian woman in her early 20s, propped against a creased, slept-on pillow at a three-quarter angle from the right. The camera focuses sharply on her awakened, startled eyes fixed upward toward the blank ceiling. A head-and-shoulder composition, with her neck and upper chest visible in the lower frame to anchor the shot. Cold, dim grayish dawn ambient light washes over her face and the pillow, establishing a gloomy, low-contrast atmosphere. A sliver of the pale bedroom ceiling and a dimly glowing curtained window are visible at the frame edges. The intimate, slight low-angle shot captures her breath-held stillness.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Shot 2: 번쩍 뜬 눈으로 텅 빈 방 천장을 향해 시선을 고정한 수리영의 얼굴 클로즈업.",
              "Shot 2 lighting: Cold dawn seepage and faint room shadow"
            ],
            "visual_inferences": [
              "fixed_element dim_dawn_lighting: cold, dim, and muted grayish daylight characteristic of early dawn, casting faint shadows.",
              "The immediate surroundings (pillow edge, pale ceiling, dimly glowing window) naturally frame her face without needing to render the entire room layout, fitting the close framing constraint."
            ],
            "creative_decisions": [
              "Described a 'head-and-shoulder composition' with neck and upper chest visible to explicitly prevent the T2I model from generating a disembodied face floating in the frame.",
              "Used 'The camera focuses sharply on' to satisfy the DP's focus requirement while avoiding the strict 'focus on / close on' trigger phrasing that would forbid the use of the C01O02 ID.",
              "Completely excluded the L04 background tag per the removal request, relying only on direct frame-edge surface descriptions (pillow, ceiling sliver, curtain edge)."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "3b820bfd65882728",
              "owned_hash": "6b550e5aab414324",
              "camera_direction_hash": "94de47cb1f3dd327",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "previous_shot_refs lists Scene 12 (S12_Shot8) for exact_background, maintaining consistent environmental tone even though this specific ECU frame omits the broader background.",
        "_shot_index": 2,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An ECU, slight low angle, from bed level beside 수리영’s face, aimed upward enough to catch her fixed gaze toward the blank ceiling. Only her awakened eyes, brow, and upper face dominate the frame, with the pillow edge and a sliver of dim ceiling giving scale; the camera is static, intimate, and breath-held.",
            "lighting_mood": "Cold dawn seepage and faint room shadow leave her eyes glossy and startled, with no hallucination yet—only oppressive stillness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L04B09",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dim_dawn_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The indoor environment is bathed in a cold, dim, and muted grayish daylight characteristic of early dawn. Soft, cool-toned ambient light seeps into the spaces, casting faint shadows and establishing a consistently gloomy, low-contrast atmosphere across different rooms.",
                "applies_to_shots": [
                  2,
                  10,
                  14
                ],
                "source_facts": [
                  "Shot 2 lighting: 'Cold dawn seepage and faint room shadow'",
                  "Shot 10 lighting: 'cool humid daylight'",
                  "Shot 14 lighting: 'Muted gray daylight'"
                ],
                "visual_inferences": [
                  "The entire house shares the same overcast, early morning natural light coming from outside.",
                  "The lack of strong direct sunlight unifies the physically disconnected rooms (bedroom, bathroom, dining area) under one cohesive tone."
                ],
                "creative_decisions": [
                  "Applying a consistent cool-blue and grayish color grade to the environmental lighting to heighten the protagonist's psychological dread and the eerie occult undertones."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 8,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "e535d09b027e9bda"
      },
      {
        "scene_index": 16,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "거울에 비친 환각의 붉은 원",
        "representative_moment": "수리영의 주관적 시점으로 욕실 거울에 비친 타일 위에 선명한 붉은 원(P08)이 나타난 정지 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Static CU, eye-level reflection shot against the mirror plane, focus on the red circle",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the vividly saturated P08, an unnaturally crisp red painted circle, reflected on the flat, wet-looking pale grid of [L04: humid bathroom tile surface viewed in the mirror reflection]. From tight against the bathroom mirror plane, the eye-level reflection flattens the tiled wall directly opposite into a near-graphic grid, centering the fresh-looking red mark slightly above the middle third. Dim practical light mixes with cold, dim, and muted grayish daylight characteristic of early dawn, making the ominous red accent of P08 feel aggressively vivid against the fog-softened tile whites.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 10 description: 거울 표면에 반사된, 욕실 타일 위에 붉은 도료로 그려진 선명한 원의 정지 화면.",
              "Camera direction: From tight against the bathroom mirror plane, the camera holds a static CU, eye-level reflection shot; the reflected bathroom tiles flatten into a near-graphic grid, with the vivid red painted circle centered slightly above the middle third. This is 수리영’s subjective hallucinated perception, but she is excluded from frame.",
              "Lighting mood: Dim bathroom practical light mixes with cool humid daylight, making the red circle feel aggressively vivid against fog-softened tile whites."
            ],
            "visual_inferences": [
              "fixed_element dim_dawn_lighting: The indoor environment is bathed in a cold, dim, and muted grayish daylight characteristic of early dawn.",
              "The mirror reflects the tiled wall directly opposite it, making the tile grid appear completely flat and unnatural in the close-framed shot."
            ],
            "creative_decisions": [
              "Framed entirely as an eye-level reflection shot tight against the mirror, excluding any characters to emphasize the subjective hallucination.",
              "Used the [L04: ...] block to describe only the frame-edge surface of the wet tiles reflected in the mirror, complying with skipped close framing rules.",
              "Contrasted the highly saturated red of P08 with the pale, fog-softened tiles under cool grayish daylight to enhance the eerie, occult thriller tone."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "cc307ab2f081739b",
              "owned_hash": "cdfa7376ed4f4a07",
              "camera_direction_hash": "1c02a1e42137e393",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "동일한 옥탑방 환경의 새벽녘 차갑고 우울한 분위기 조명(atmosphere_reference) 공유",
        "_shot_index": 10,
        "visible_entities": [
          "P08",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From tight against the bathroom mirror plane, the camera holds a static CU, eye-level reflection shot; the reflected bathroom tiles flatten into a near-graphic grid, with the vivid red painted circle centered slightly above the middle third. This is 수리영’s subjective hallucinated perception, but she is excluded from frame, leaving only the mirror-surface image and the impossible mark.",
            "lighting_mood": "Dim bathroom practical light mixes with cool humid daylight, making the red circle feel aggressively vivid against fog-softened tile whites.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P08",
              "L04"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L04B10",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dim_dawn_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The indoor environment is bathed in a cold, dim, and muted grayish daylight characteristic of early dawn. Soft, cool-toned ambient light seeps into the spaces, casting faint shadows and establishing a consistently gloomy, low-contrast atmosphere across different rooms.",
                "applies_to_shots": [
                  2,
                  10,
                  14
                ],
                "source_facts": [
                  "Shot 2 lighting: 'Cold dawn seepage and faint room shadow'",
                  "Shot 10 lighting: 'cool humid daylight'",
                  "Shot 14 lighting: 'Muted gray daylight'"
                ],
                "visual_inferences": [
                  "The entire house shares the same overcast, early morning natural light coming from outside.",
                  "The lack of strong direct sunlight unifies the physically disconnected rooms (bedroom, bathroom, dining area) under one cohesive tone."
                ],
                "creative_decisions": [
                  "Applying a consistent cool-blue and grayish color grade to the environmental lighting to heighten the protagonist's psychological dread and the eerie occult undertones."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 8,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "cebb401104df2bf3"
      },
      {
        "scene_index": 16,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "환각에 의한 극심한 공포와 혼란",
        "representative_moment": "식탁 위에 놓인 사진(P03) 속 중년 여자의 웃는 얼굴이 기괴하게 일그러져 흘러내리는 환각의 정지 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing with a slight Dutch angle at table height, cold gray dawn ambient light with a sickly warm practical reflection",
            "t2i_prompt": "Photorealistic cinematic still. Close framing at dining-table height with a slight Dutch angle, focused entirely on P03, a worn framed family photograph standing upright. The picture surface of P03 displays a portrait of an Asian middle-aged woman, facing the camera with her eyes fixed directly forward, her neck and shoulders visible inside the picture. Her smiling face is grotesquely warped, the printed ink appearing to melt downward in a sickening hallucination. The physical frame edges of P03 and [L04B10: a narrow sliver of the dark wood dining tabletop] anchor the bottom of the shot. A half-full water glass with condensation droplets sits in the blurred foreground. The immediate environment is bathed in a cold, dim, muted grayish dawn ambient light, while the dull, fingerprinted glass over P03 catches a faint streak of weak warm practical lighting across the melting portrait, heightening the eerie occult tension.",
            "outfit_assignments": [],
            "source_facts": [
              "S#18 action: '식탁에 놓인 엄마와 수리영의 사진을 보는데... 환하게 웃는 엄마 얼굴이 뭉개져 흘러내린다'",
              "shot description: The front photo face is visible to camera, showing the 중년 여자’s smiling portrait warped into a grotesque shape.",
              "shot description: water glass half-full, wet with droplets."
            ],
            "visual_inferences": [
              "fixed_element dim_dawn_lighting: cold, dim, muted grayish daylight casting faint shadows.",
              "The photograph's glass catches a faint practical light reflection, contrasting with the cold dawn seepage.",
              "The water glass is kept blurred in the foreground to maintain depth without distracting from the distorted photo."
            ],
            "creative_decisions": [
              "Applied a slight Dutch angle to emphasize the psychological dread and subjective panic of the POV character.",
              "Included the physical frame edges and a sliver of the tabletop to keep the hallucinated distortion grounded in a realistic physical space."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "f1f52f9828c4b9eb",
              "owned_hash": "cdfa7376ed4f4a07",
              "camera_direction_hash": "bbd88148db5584f1",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "Shot 8 provides the exact background atmosphere and lighting reference for the dining room, ensuring the table surface matches the established space.",
        "_shot_index": 14,
        "visible_entities": [
          "P03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "shot_index": 14
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At dining-table height, the completed dolly-in locks into a CU, slight Dutch angle on the framed photograph surface; the mother’s smiling face sits in the center third, grotesquely warped as if the ink is melting downward. The frame edges and a sliver of tabletop remain visible to keep it physically grounded, while the distortion is perceived through 수리영’s hallucination.",
            "lighting_mood": "Muted gray daylight and weak warm practicals leave the table dim, with the photo’s warped face carrying the shot’s sickly occult emphasis.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P03"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L04B10",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dim_dawn_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The indoor environment is bathed in a cold, dim, and muted grayish daylight characteristic of early dawn. Soft, cool-toned ambient light seeps into the spaces, casting faint shadows and establishing a consistently gloomy, low-contrast atmosphere across different rooms.",
                "applies_to_shots": [
                  2,
                  10,
                  14
                ],
                "source_facts": [
                  "Shot 2 lighting: 'Cold dawn seepage and faint room shadow'",
                  "Shot 10 lighting: 'cool humid daylight'",
                  "Shot 14 lighting: 'Muted gray daylight'"
                ],
                "visual_inferences": [
                  "The entire house shares the same overcast, early morning natural light coming from outside.",
                  "The lack of strong direct sunlight unifies the physically disconnected rooms (bedroom, bathroom, dining area) under one cohesive tone."
                ],
                "creative_decisions": [
                  "Applying a consistent cool-blue and grayish color grade to the environmental lighting to heighten the protagonist's psychological dread and the eerie occult undertones."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 8,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "prop",
                "id": "P03",
                "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": 16,
                "shot_indices": [
                  14
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P03",
                  "role": "visual_target"
                }
              ],
              "requirements": [
                {
                  "dimension": "visual_identity",
                  "operation": "preserve",
                  "strength": "required",
                  "reference_policy": "use_entity_reference"
                }
              ]
            }
          ],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "c36c13c331382f82"
      },
      {
        "scene_index": 17,
        "heading": "S#19. 마트 / D",
        "beat_title": "단서 확인을 앞둔 멈춤",
        "representative_moment": "안개가 낀 이른 아침, 수리영(C01)이 마트 입구에서 자전거 핸들을 잡고 선 채로 매장을 바라보고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level establishing perspective with cold, fog-muted dawn lighting and soft fluorescent spill",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level framing from an observer's perspective, capturing the subject's full body in the center foreground. C01O02 in a beige hoodie, a Korean woman in her 20s with black hair and dark eyes, stands at a three-quarter angle from the left, gripping the damp handlebar of the parked bicycle from the reference. The handlebar is angled slightly toward the camera, with its front brake cable visible against her coat, and the bicycle frame and front wheel visible below her waist. Her eyes are fixed on the closed glass doors from the reference in the background. The quiet storefront from the reference sits symmetrically behind her in the frame. The scene is bathed in cold, fog-muted dawn light, creating a dim, cool-toned daylight with a layer of thin, humid pale gray morning fog softening the edges. Weak fluorescent spill from inside the mart washes across the damp sidewalk from the reference and reflects faintly on her shoulders. The rain-slick street lane from the reference reflects the doors and bicycle tires in broken, dim patches. Focus on C01O02 anchoring the scene in the quiet misty morning.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "scene heading text: 이른 아침",
              "Shot 1 description: 수리영 gripping bicycle handlebar, full body, eyes fixed on mart entrance.",
              "DP constraint: The handlebar is angled slightly toward camera, its front brake cable visible against 수리영’s coat."
            ],
            "visual_inferences": [
              "fixed_element cold_dawn_lighting_state: dim, cool-toned daylight with a visible layer of faint morning fog",
              "owned_objects constraint: linking bicycle, storefront, doors, sidewalk, and street lane directly to the reference"
            ],
            "creative_decisions": [
              "Positioning the character in the center foreground to anchor the eye-level framing, ensuring the bicycle body is visible below her waist",
              "Using pale gray fog and weak fluorescent reflections to emphasize the chilly, humid coastal atmosphere of the early morning"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "c2556e3d18815a8f",
              "owned_hash": "32ecec4c97c04d6d",
              "camera_direction_hash": "3de681063f8513d2",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bicycle",
                  "violating_phrase": "the parked bicycle from the reference",
                  "reason": "The bicycle is mentioned with an explicit reference anchor, which indicates an existing object rather than a newly drawn one.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "the closed glass doors from the reference",
                  "reason": "The doors are referenced as already present in the reference/background, not explicitly created or added.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "storefront",
                  "violating_phrase": "The quiet storefront from the reference",
                  "reason": "The storefront is tied to the reference/background and described as an existing scene element.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sidewalk",
                  "violating_phrase": "the damp sidewalk from the reference",
                  "reason": "The sidewalk is explicitly anchored to the reference, so it is not a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "street lane",
                  "violating_phrase": "The rain-slick street lane from the reference",
                  "reason": "The street lane is described as part of the referenced background, which indicates anchoring rather than redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "Relies on fixed_element environmental state rather than a specific prior scene's action",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "L07"
        ],
        "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": "Outside the mart entrance, the camera holds a WS, eye-level establishing frame about 18 feet from the glass doors before the dolly-in begins; 수리영’s full body and bicycle occupy the center foreground, with the handlebar readable across her waist line. The quiet storefront sits symmetrically behind her through faint morning fog, emphasizing the pause before she enters.",
            "lighting_mood": "Cool fog-muted dawn light dominates, with weak fluorescent spill from inside the mart and no comforting warmth.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L07B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "awning",
              "bicycle",
              "bicycle rack",
              "bollard",
              "curb",
              "door",
              "entrance mat",
              "sidewalk",
              "storefront",
              "street lane",
              "window"
            ],
            "camera_reference": {
              "camera_position": "near number 9 (parked bicycle) beside number 8 (bicycle rack), facing diagonally toward number 4 (glass double doors) with number 5 and number 6 (front windows) across the facade",
              "camera_height": "eye-level standing ~1.6m",
              "lens_hint": "35mm wide angle",
              "framing_notes": "include the bicycle arrival area in the foreground and the closed mart entrance beyond it"
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": "cold_dawn_lighting_state",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A specific lighting state of the outdoor environment, featuring cold, fog-muted dawn light. The scene is bathed in dim, cool-toned daylight with a visible layer of faint morning fog that softens edges and mutes surrounding colors, creating a chilly and quiet atmosphere.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "source_facts": [
                  "scene heading text: 이른 아침 (early morning)",
                  "Shot 1 lighting: Cool fog-muted dawn light dominates",
                  "Shot 5 lighting: Cold dawn light"
                ],
                "visual_inferences": [
                  "The light casts a bluish-gray tint over the exterior, lacking any warm sunlight."
                ],
                "creative_decisions": [
                  "Unifying the color grading and atmospheric fog texture to ensure the early morning mood remains consistent across wide and tight shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L07B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "ca6ce1f48e0975a1"
      },
      {
        "scene_index": 17,
        "heading": "S#19. 마트 / D",
        "beat_title": "CCTV 화면을 통한 확인 결심",
        "representative_moment": "수리영이 마트 외부 CCTV 렌즈를 정면으로 노려보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "surveillance-style high angle, tight CU with washed-out contrast and dim cool-toned daylight",
            "t2i_prompt": "Photorealistic cinematic still. Head-and-shoulder composition from a high angle surveillance perspective, the camera focuses on the tense expression of a young Korean woman in her early 20s in a beige hoodie, with black hair. She is facing the camera, chin lifted tense, dark eyes fixed directly on the lens. The scene is bathed in cold, fog-muted dawn light with dim, cool-toned daylight that mutes surrounding colors. Washed-out contrast flattens her features, while a faint red indicator glow washes her cheek. [: A blurred dark edge of the device housing is visible at the top corner, the edge of a damp pale concrete wall appears behind her shoulder, and the rain-slick pavement below faintly reflects pale light beneath her chin.]",
            "outfit_assignments": [],
            "source_facts": [
              "S#19 scene heading: 이른 아침 (early morning), 마트 밖",
              "S#19 action: CCTV 위치를 확인하다",
              "shot description: 수리영 lifts her chin directly toward the lens, looking into the CCTV"
            ],
            "visual_inferences": [
              "fixed_element cold_dawn_lighting_state: dim, cool-toned daylight with faint morning fog",
              "through_device perception mode implies a high-angle frontal view with surveillance characteristics",
              "the red indicator glow emphasizes the active recording state of the CCTV"
            ],
            "creative_decisions": [
              "Used head-and-shoulder composition to satisfy close framing without creating a disembodied face",
              "Applied washed-out contrast and flat lighting to simulate a raw security camera feed"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "b9bb9366e9f753fa",
              "owned_hash": "9c311eb384197b50",
              "camera_direction_hash": "da6841d00ebbd309",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 17,
        "dependency_reason": "previous_shot_refs (atmosphere_reference) from S17_Shot1 for cold dawn lighting tone",
        "_shot_index": 5,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 17,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Mounted high beside the exterior CCTV axis, the camera holds a tight CU, high angle, surveillance-style frontal frame as 수리영 lifts her chin directly toward the lens. Her face occupies most of the center, while the wall and CCTV hardware are reduced to thin blurred edges, making the confrontation feel like she is staring into recorded evidence itself.",
            "lighting_mood": "Cold dawn light and washed-out CCTV-like contrast flatten her features, with a faint red indicator glow near the camera side adding menace.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L07B02",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cold_dawn_lighting_state",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A specific lighting state of the outdoor environment, featuring cold, fog-muted dawn light. The scene is bathed in dim, cool-toned daylight with a visible layer of faint morning fog that softens edges and mutes surrounding colors, creating a chilly and quiet atmosphere.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "source_facts": [
                  "scene heading text: 이른 아침 (early morning)",
                  "Shot 1 lighting: Cool fog-muted dawn light dominates",
                  "Shot 5 lighting: Cold dawn light"
                ],
                "visual_inferences": [
                  "The light casts a bluish-gray tint over the exterior, lacking any warm sunlight."
                ],
                "creative_decisions": [
                  "Unifying the color grading and atmospheric fog texture to ensure the early morning mood remains consistent across wide and tight shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 17,
                "shot_index": 1,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "a4a4589b5b34fc20"
      },
      {
        "scene_index": 18,
        "heading": "S#20. 마트 총무과 / 실내",
        "beat_title": "식별 불가능한 CCTV 영상에 초조해하는 수리영",
        "representative_moment": "혜수의 어깨 너머로 초조하게 모니터를 향해 목을 뺀 C01의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level over-the-shoulder close framing, dim blue-gray illumination",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level over-the-shoulder close framing. On the left, an East Asian woman in her 30s with back to camera forms a soft dark foreground silhouette, leaning toward the monitor, her shoulder occupying the lower left edge. On the center-right, sharing the space behind the desk, C01O02 in a beige hoodie, East Asian young woman in her early 20s, at three-quarter angle from the right, neck craned forward past the foreground shoulder, eyes fixed on the off-frame CCTV monitor, her face occupying the center-right with her upper body in frame. The off-frame monitor, facing away from the camera at a slight angle, casts a faint, underexposed blue-gray glow that washes over C01O02's face, making her eyes appear tense and wet. At the bottom edge, a desk cluttered with cables and paperwork runs diagonally. [: dark and muted out-of-focus background surface, catching the cool monitor spill]. Shallow depth of field focusing on C01O02, softly blurring the foreground shoulder.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Scene text: CCTV footage is being replayed in the supermarket administrative office/security room.",
              "Shot 2 staging: eyes are fixed toward the CCTV monitor, with blue-gray monitor light present.",
              "Shot 2 lighting: 'Blue-gray monitor light cuts across humid, stale office darkness.'"
            ],
            "visual_inferences": [
              "fixed_element cold_cctv_monitor_office_lighting: Blue-gray monitor light serves as the primary illumination on the subject's face.",
              "fixed_element desk_cctv_monitor_dark_playback: The desk is placed in the lower frame with cables and paperwork.",
              "The unregistered extra (혜수) is described as an East Asian woman in her 30s with her back to the camera to provide the OTS foreground silhouette."
            ],
            "creative_decisions": [
              "Used 'washes over' instead of 'cuts across' for lighting to avoid physical severing artifacts in T2I generation.",
              "Applied shallow depth of field focusing on C01O02 to emphasize her tension while keeping the foreground shoulder softly blurred.",
              "Omitted background reference L11 due to skipped_close_framing policy, describing only the immediate out-of-focus frame-edge surface."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d057821fa6e88e61",
              "owned_hash": "93ac7ff8cd40c3b5",
              "camera_direction_hash": "8f130c24a43289f4",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency on prior scenes mentioned.",
        "_shot_index": 2,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Just behind and slightly beside 혜수, the camera tracks into an OTS CU, eye-level frame; 혜수’s shoulder becomes a soft dark foreground edge on the left while 수리영’s anxious face fills the center-right. 수리영 leans past 혜수 toward the unseen monitor, her neck stretched forward and eyes fixed off-frame.",
            "lighting_mood": "Blue-gray monitor light cuts across humid, stale office darkness, leaving 혜수 as a soft silhouette and 수리영’s eyes tense and wet.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L11B02",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "applies_to_shots": [
                  2,
                  4
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Keep the blue-gray CCTV monitor glow as the dominant visual continuity cue across both selected shots.",
                  "Maintain a cold investigative atmosphere in the office rather than introducing warm ambient light."
                ],
                "description": "The supermarket administrative security office remains dim, with cold blue-gray light from a CCTV monitor washing across the people near the desk. Any overhead fluorescent light stays dull and dirty, mixing weakly with the monitor spill and leaving the room in muted, cool shadows.",
                "element_id": "cold_cctv_monitor_office_lighting",
                "element_type": "environment_state",
                "source_facts": [
                  "Scene text: CCTV footage is being replayed in the supermarket administrative office/security room.",
                  "Shot 2 lighting: 'Blue-gray monitor light cuts across humid, stale office darkness.'",
                  "Shot 4 lighting: 'Dirty fluorescent overheads mix with blue monitor spill.'"
                ],
                "visual_inferences": [
                  "The same cold monitor spill is treated as a continuous lighting condition across the selected shots.",
                  "The office darkness is kept consistent even when the camera angle changes."
                ]
              },
              {
                "applies_to_shots": [
                  2,
                  4
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Use the CCTV monitor as the central fixed prop motivating eyelines and blue light, even when it is partly off-frame.",
                  "Keep the dark surveillance segment visually unresolved so the scene’s investigative tension remains consistent."
                ],
                "description": "A CCTV monitor at the desk is replaying surveillance footage in which one crucial section appears abnormally dark and difficult to identify. The screen faces the people gathered around the desk and acts as the source of the cold blue-gray glow in the room.",
                "element_id": "desk_cctv_monitor_dark_playback",
                "element_type": "persistent_prop",
                "source_facts": [
                  "Scene text: the security staff and others are reviewing CCTV footage.",
                  "Scene text: '그 부분만 유독 어두워 식별이 불가능하다' — that portion is unusually dark and impossible to identify.",
                  "Shot 2 staging: eyes are fixed toward the CCTV monitor, with blue-gray monitor light present.",
                  "Shot 4 lighting: blue monitor spill is present during the exchange."
                ],
                "visual_inferences": [
                  "The CCTV monitor is placed on or immediately beside the desk in front of the characters.",
                  "The dark section remains on the same playback source across both shots."
                ]
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "a985107b56b9e75a"
      },
      {
        "scene_index": 18,
        "heading": "S#20. 마트 총무과 / 실내",
        "beat_title": "CCTV 원본 확보 시도",
        "representative_moment": "혜수가 책상에 턱을 괸 채 보안직원을 응시하며 전체 CCTV 복사를 요청한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Slight low angle composition, chest height, emphasizing C02's investigative focus against cold blue monitor light",
            "t2i_prompt": "Photorealistic cinematic still. A slight low angle observer positioned below shoulder height, the desk's front edge cutting across the lower frame. C02O05 in a charcoal gray suit jacket, a Korean middle-aged woman with black hair and dark eyes, occupies the left-center frame in right profile. Her upper body is visible, chin resting on her hand braced against the shared security desk. Across the shared desk, an Asian man in worker uniform leans forward in left profile, occupying the right midground as a soft out-of-focus presence. C02O05's eyes are fixed on the man, and his eyes are fixed on C02O05. Between them on the desk, a CCTV monitor's front screen is angled partly away from the camera, showing a dark, muddy video section. Cold blue-gray monitor light reflects on C02O05's jawline and collar, mixing with weak yellow ambient falling from above. Focus on C02O05's cold, investigating expression in the blue spill. [L11: soft out-of-focus paper-covered notice board directly behind the man in the cramped, cool shadowed environment].",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "Scene text: 혜수 asks to copy the entire CCTV footage.",
              "Shot 4 description: 혜수 occupies the left-center with her hand braced under her chin, while 보안직원 remains in the right midground as her eyeline target."
            ],
            "visual_inferences": [
              "fixed_element desk_cctv_monitor_dark_playback placed as a physical divider and light source on the shared desk.",
              "fixed_element cold_cctv_monitor_office_lighting applied as blue-gray reflections on the subject's skin and clothing.",
              "Unregistered security staff rendered as an Asian man in worker uniform, softened in the background to comply with close framing primary subject rules."
            ],
            "creative_decisions": [
              "Used a slight low angle from chest height to give C02 an authoritative, grounded presence in the frame.",
              "Contrasted the cold blue monitor spill with dull yellow overhead light to emphasize the gritty, investigative tone."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "4c202ee402c6dd18",
              "owned_hash": "93ac7ff8cd40c3b5",
              "camera_direction_hash": "252dad1f347820eb",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 18,
        "dependency_reason": "S18 Shot 2's exact_background continuity, though close framing intentionally omits distant room layout to focus on the immediate frame-edge surfaces.",
        "_shot_index": 4,
        "visible_entities": [
          "C02",
          "L11"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The lateral move settles beside the desk into a steady MCU, slight low angle across 혜수 toward 보안직원’s side profile. 혜수 occupies the left-center with her hand braced under her chin, while 보안직원 remains in the right midground as her eyeline target, keeping the investigative pressure on their exchange.",
            "lighting_mood": "Dirty fluorescent overheads mix with blue monitor spill, giving 혜수’s focused profile a cold investigative hardness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "L11"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L11B02",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "applies_to_shots": [
                  2,
                  4
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Keep the blue-gray CCTV monitor glow as the dominant visual continuity cue across both selected shots.",
                  "Maintain a cold investigative atmosphere in the office rather than introducing warm ambient light."
                ],
                "description": "The supermarket administrative security office remains dim, with cold blue-gray light from a CCTV monitor washing across the people near the desk. Any overhead fluorescent light stays dull and dirty, mixing weakly with the monitor spill and leaving the room in muted, cool shadows.",
                "element_id": "cold_cctv_monitor_office_lighting",
                "element_type": "environment_state",
                "source_facts": [
                  "Scene text: CCTV footage is being replayed in the supermarket administrative office/security room.",
                  "Shot 2 lighting: 'Blue-gray monitor light cuts across humid, stale office darkness.'",
                  "Shot 4 lighting: 'Dirty fluorescent overheads mix with blue monitor spill.'"
                ],
                "visual_inferences": [
                  "The same cold monitor spill is treated as a continuous lighting condition across the selected shots.",
                  "The office darkness is kept consistent even when the camera angle changes."
                ]
              },
              {
                "applies_to_shots": [
                  2,
                  4
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Use the CCTV monitor as the central fixed prop motivating eyelines and blue light, even when it is partly off-frame.",
                  "Keep the dark surveillance segment visually unresolved so the scene’s investigative tension remains consistent."
                ],
                "description": "A CCTV monitor at the desk is replaying surveillance footage in which one crucial section appears abnormally dark and difficult to identify. The screen faces the people gathered around the desk and acts as the source of the cold blue-gray glow in the room.",
                "element_id": "desk_cctv_monitor_dark_playback",
                "element_type": "persistent_prop",
                "source_facts": [
                  "Scene text: the security staff and others are reviewing CCTV footage.",
                  "Scene text: '그 부분만 유독 어두워 식별이 불가능하다' — that portion is unusually dark and impossible to identify.",
                  "Shot 2 staging: eyes are fixed toward the CCTV monitor, with blue-gray monitor light present.",
                  "Shot 4 lighting: blue monitor spill is present during the exchange."
                ],
                "visual_inferences": [
                  "The CCTV monitor is placed on or immediately beside the desk in front of the characters.",
                  "The dark section remains on the same playback source across both shots."
                ]
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 18,
                "shot_index": 2,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "c531dd50989df988"
      },
      {
        "scene_index": 19,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "Horrifying Discovery",
        "representative_moment": "C01 hunches over the desk, paralyzed by the shocking crime scene photographs.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close head-and-shoulder framing, low angle from the desk corner, shallow depth of field with cold fluorescent lighting.",
            "t2i_prompt": "Photorealistic cinematic still. Close head-and-shoulder composition, low angle from the desk front edge with shallow depth of field. Focus on the wide, dilated dark eyes of the character. C01O02 in a beige hoodie, an early 20s Korean woman, at three-quarter angle from the left, hunched close over the tabletop, her neck and shoulders anchored in the upper frame, eyes fixed down on the evidence. A scratched gray laminate desk surface cuts across the lower foreground, blurred at the very edge. Resting directly on the desk beneath her, glossy crime scene photographs are chaotically scattered and overlapping, their front faces lying upward revealing dark red-brown torn flesh details under partial focus. Dull silver paperclips sit beside the photos. The space is illuminated by harsh, cold fluorescent overheads and a cool blue-white monitor spill falling across her pale face, contrasting with the somber, heavy shadows cast over the lower desk. [L10B01: A worn gray office partition receding in the soft background, behind the oblique glowing surface of an unreadable computer screen.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "scene text: '혜수 책상위에는 살인사건 확대 사진들이 어지럽게 널려있다. 목, 어깨, 얼굴등 살점이 떨어져'",
              "Shot 4: 'her gaze drops toward the evidence below'"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: hunched close over the tabletop at three-quarter angle from the left",
              "fixed_element cold_fluorescent_lighting: pale skin contrasting with heavy desk shadows",
              "fixed_element scattered_evidence_photos: resting directly on the scratched gray laminate desk surface in the lower frame alongside dull silver paperclips"
            ],
            "creative_decisions": [
              "Using a shallow depth of field to blur the foreground desk edge and background partition, isolating her shocked expression and the disturbing photos",
              "Positioning the camera at a low angle from the desk to emphasize her claustrophobic feeling as she leans over the gruesome evidence"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "74b24a2faf5ec183",
              "owned_hash": "704a968fbe0b5a95",
              "camera_direction_hash": "ac2555c3f6e685a3",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "Shares the exact background room with scene 14 shot 5, adapted into a soft out-of-focus background for close framing.",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "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 front corner of 혜수’s desk, the camera pushes into a CU, low angle with shallow DOF; the blurred desk edge cuts across the lower foreground while 수리영’s dilated eyes dominate the upper center. She is hunched close over the tabletop, frozen between recognition and panic as her gaze drops toward the evidence below.",
            "lighting_mood": "Harsh police-station fluorescents are softened by humid air and monitor spill, draining her face pale while the desk shadows feel heavy.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "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",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "scattered_evidence_photos",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "Several glossy crime scene photographs are chaotically scattered and overlapping on the surface of a standard office desk. The visible images display gruesome, torn flesh details with dark red-brown tones, contrasting sharply with the mundane desk surface.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "scene text: '혜수 책상위에는 살인사건 확대 사진들이 어지럽게 널려있다. 목, 어깨, 얼굴등 살점이 떨어져'",
                  "Shot 4: 'her gaze drops toward the evidence below'",
                  "Shot 5: 'The images overlap chaotically across the desk, with torn neck and shoulder details isolated in the center'"
                ],
                "visual_inferences": [
                  "The photographs are directly resting on the desk under the character's immediate view, acting as a horrifying focal point among otherwise normal office items."
                ],
                "creative_decisions": [
                  "Highlighting the red-brown wound details within the photos to create a sickening, warm accent against the cold desk environment."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_fluorescent_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The police station environment is illuminated by harsh, cold overhead fluorescent lights. This lighting casts a sterile, bluish-white glare across flat surfaces like the desk and glossy photos, while deepening the somber, heavy shadows in the background.",
                "applies_to_shots": [
                  4,
                  5,
                  7
                ],
                "source_facts": [
                  "Shot 4: 'Harsh police-station fluorescents are softened by humid air and monitor spill'",
                  "Shot 5: 'Cold fluorescent light makes the glossy photo surfaces glare in patches'",
                  "Shot 7: 'cutting through the police-office gloom'"
                ],
                "visual_inferences": [
                  "The overall ambient light in the room is distinctly cool-toned and uninviting, typical of institutional spaces at night or in tense situations."
                ],
                "creative_decisions": [
                  "Using the contrast between the cold, harsh overhead glares and the deep background gloom to amplify the psychological tension of the discovery."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 5,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [
              {
                "scene_index": 19,
                "shot_index": 5,
                "description": "책상에 어지럽게 널린, 목과 어깨의 살점이 뜯긴 끔찍한 시신이 찍힌 살인사건 현장 사진들 클로즈업.",
                "keep_elements": [
                  {
                    "label": "scratched gray laminate desk surface",
                    "kind": "environment"
                  },
                  {
                    "label": "glossy crime scene photographs scattered on the desk",
                    "kind": "static_prop"
                  },
                  {
                    "label": "dull silver paperclips beside the photos",
                    "kind": "static_prop"
                  }
                ]
              }
            ],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "e888642b2bcc4bbd"
      },
      {
        "scene_index": 19,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "살인사건 사진과의 조우",
        "representative_moment": "책상 위에 어지럽게 널려있는, 목과 어깨의 살점이 뜯긴 끔찍한 살인사건 현장 사진들(P07).",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Steep high angle close-up, tabletop POV insert with sterile fluorescent glare",
            "t2i_prompt": "Photorealistic cinematic still. Focus on P07, several glossy crime scene photographs chaotically scattered and overlapping. Viewed from a steep high angle point-of-view tabletop insert, cropping out all human presence. The glossy front faces of P07 are turned upward to the camera, displaying forensic images of a gruesome torn neck and shoulder with dark red-brown flesh details. Thin official case-number labels with unreadable print are attached to the slightly curled borders of the photos. A cluster of loose, dull silver paperclips rests beside the edges. [: scratched gray laminate desk surface visible underneath, filling the frame edges]. Harsh, cold overhead fluorescent lighting casts a sterile bluish-white glare in patches across the glossy photo surfaces, highlighting the nauseating, warm red-brown tones of the wound details against the cold environment.",
            "outfit_assignments": [],
            "source_facts": [
              "scene text: '혜수 책상위에는 살인사건 확대 사진들이 어지럽게 널려있다. 목, 어깨, 얼굴등 살점이 떨어져'",
              "Shot 5: 'The images overlap chaotically across the desk, with torn neck and shoulder details isolated in the center'"
            ],
            "visual_inferences": [
              "fixed_element scattered_evidence_photos: glossy photos directly resting on the desk under immediate view",
              "fixed_element cold_fluorescent_lighting: sterile bluish-white glare across flat surfaces",
              "paperclip cluster provides a mundane office context for the terrifying evidence"
            ],
            "creative_decisions": [
              "Steep high angle POV explicitly crops out the observer to maximize the claustrophobic and shocking impact of the forensic details",
              "Using the cold fluorescent glare to create harsh specular highlights on the glossy paper, contrasting intensely with the warm, dark red-brown wounds"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "83dbebb27db3616f",
              "owned_hash": "704a968fbe0b5a95",
              "camera_direction_hash": "839082b79a8927af",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 19,
        "dependency_reason": "zoom_in_detail from S19_Shot4, requiring the same lighting and specific desk surface environment while zooming into the exact tabletop details.",
        "_shot_index": 5,
        "visible_entities": [
          "P07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Following 수리영’s gaze, the camera holds a steep high angle CU, point-of-view tabletop insert over the scattered murder-scene photographs. The images overlap chaotically across the desk, with torn neck and shoulder details isolated in the center while all human presence is cropped out.",
            "lighting_mood": "Cold fluorescent light makes the glossy photo surfaces glare in patches, turning the red-brown wound details into the only warm, nauseating accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P07"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "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",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "scattered_evidence_photos",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "Several glossy crime scene photographs are chaotically scattered and overlapping on the surface of a standard office desk. The visible images display gruesome, torn flesh details with dark red-brown tones, contrasting sharply with the mundane desk surface.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "scene text: '혜수 책상위에는 살인사건 확대 사진들이 어지럽게 널려있다. 목, 어깨, 얼굴등 살점이 떨어져'",
                  "Shot 4: 'her gaze drops toward the evidence below'",
                  "Shot 5: 'The images overlap chaotically across the desk, with torn neck and shoulder details isolated in the center'"
                ],
                "visual_inferences": [
                  "The photographs are directly resting on the desk under the character's immediate view, acting as a horrifying focal point among otherwise normal office items."
                ],
                "creative_decisions": [
                  "Highlighting the red-brown wound details within the photos to create a sickening, warm accent against the cold desk environment."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_fluorescent_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The police station environment is illuminated by harsh, cold overhead fluorescent lights. This lighting casts a sterile, bluish-white glare across flat surfaces like the desk and glossy photos, while deepening the somber, heavy shadows in the background.",
                "applies_to_shots": [
                  4,
                  5,
                  7
                ],
                "source_facts": [
                  "Shot 4: 'Harsh police-station fluorescents are softened by humid air and monitor spill'",
                  "Shot 5: 'Cold fluorescent light makes the glossy photo surfaces glare in patches'",
                  "Shot 7: 'cutting through the police-office gloom'"
                ],
                "visual_inferences": [
                  "The overall ambient light in the room is distinctly cool-toned and uninviting, typical of institutional spaces at night or in tense situations."
                ],
                "creative_decisions": [
                  "Using the contrast between the cold, harsh overhead glares and the deep background gloom to amplify the psychological tension of the discovery."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 19,
                "shot_index": 4,
                "ref_usage": "zoom_in_detail",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "81170ff2ae20d56d"
      },
      {
        "scene_index": 19,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "Discovering the GPS coordinates",
        "representative_moment": "Extreme close-up of the monitor screen displaying the mother's last traced sea location with a red pin and coordinates.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up screen insert, eye-level, cold blue-white monitor light",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up of a computer monitor display, the lens positioned nearly parallel to the screen. Focus on a crisp, bright red map pin and glowing white English coordinate numbers on the display. The screen shows a dark sea map interface; the red pin sits near the upper-left third, standing out like a warning flare. The coordinate text sits sharply in the lower-right third. The monitor emits a dominant cold blue-white light. Harsh, sterile bluish-white fluorescent glare from overhead catches the faint upper bezel, while a thin, out-of-focus edge of a keyboard and dark desk surface rests along the bottom margin of the frame.",
            "outfit_assignments": [],
            "source_facts": [
              "S#21 action: '해상 지도위에 좌표. 37.484400 N / 126. 072486 E'",
              "Shot description: 'cutting through the police-office gloom'"
            ],
            "visual_inferences": [
              "fixed_element cold_fluorescent_lighting: harsh, cold overhead fluorescent lights cast a sterile bluish-white glare",
              "Keyboard and desk edge are blurred at the bottom to physically anchor the monitor in the real space"
            ],
            "creative_decisions": [
              "ECU framing with the lens nearly parallel to the monitor to emphasize the crucial GPS data",
              "The red pin is offset to the upper-left third and text to the lower-right third for compositional balance"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "5c5d77f9c982f473",
              "owned_hash": "704a968fbe0b5a95",
              "camera_direction_hash": "add66a580ceccd5e",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "atmosphere_reference: maintaining the cold, somber police station lighting mood established in scene 14",
        "_shot_index": 7,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Beside the monitor, the camera completes the move into an ECU, eye-level screen insert with the lens nearly parallel to the display; the red pin sits near the upper-left third and the English coordinate numbers sit sharply in the lower-right third. The bezel nearly disappears, but a thin edge of keyboard blur and desk clutter remain at the margins to keep the screen physically anchored.",
            "lighting_mood": "The monitor’s cold blue-white light becomes the dominant source, with the red pin cutting through the police-office gloom like a warning flare.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "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",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cold_fluorescent_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The police station environment is illuminated by harsh, cold overhead fluorescent lights. This lighting casts a sterile, bluish-white glare across flat surfaces like the desk and glossy photos, while deepening the somber, heavy shadows in the background.",
                "applies_to_shots": [
                  4,
                  5,
                  7
                ],
                "source_facts": [
                  "Shot 4: 'Harsh police-station fluorescents are softened by humid air and monitor spill'",
                  "Shot 5: 'Cold fluorescent light makes the glossy photo surfaces glare in patches'",
                  "Shot 7: 'cutting through the police-office gloom'"
                ],
                "visual_inferences": [
                  "The overall ambient light in the room is distinctly cool-toned and uninviting, typical of institutional spaces at night or in tense situations."
                ],
                "creative_decisions": [
                  "Using the contrast between the cold, harsh overhead glares and the deep background gloom to amplify the psychological tension of the discovery."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 5,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "6a5a47ff4f2e980e"
      },
      {
        "scene_index": 20,
        "heading": "S#22. 경찰서 밖 / D",
        "beat_title": "자전거를 타고 다급히 출발하는 수리영",
        "representative_moment": "C01이 주차된 자전거 안장에서 엉덩이를 뗀 채 한쪽 페달에 체중을 싣고 거리를 향해 다급하게 내달리기 시작하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low angle tracking shot from a 3/4 side position, deviating from the eye-level background reference, overcast coastal daylight with slick reflections.",
            "t2i_prompt": "Photorealistic cinematic still. Tracking parallel from a low three-quarter side position about two meters away, deviating from the reference's eye-level framing to a low angle looking up at the figure. C01O02 in a beige hoodie, an East Asian woman in her early 20s with a young face, black hair, and dark eyes, in left profile. She is captured in mid-action, pushing off from the parking spot, her hips lifted off the saddle of the bicycle from the reference. Her weight is driven down on one pedal, one knee bent in the down stroke, leaning forward with eyes fixed on a distant point. The hem of her hoodie flows back slightly in the direction opposite to motion. She grips the handlebar of the bicycle from the reference, the bicycle frame and front wheel turned slightly toward the direction of travel, prominently visible below her. Focus on the urgent physical force of C01O02 driving down on the pedal. The station building facade from the reference behind her recedes obliquely as she accelerates. The wet pavement from the reference occupies the lower frame, reflecting the bicycle wheels and her legs in broken streaks beneath the moving frame. The chipped curb from the reference runs diagonally from the lower foreground. Overcast coastal daylight stays muted and humid, with slick ground reflections and a faint red brake reflector from the reference adding the only sharp color accent.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#22 action: '주차된 자전거를 타고 이내 달리는 수리영'",
              "Shot description: 자전거 안장에서 엉덩이를 뗀 채 한쪽 페달에 체중을 실은 수리영의 역동적인 전신 구도"
            ],
            "visual_inferences": [
              "mid-action freeze with weight driving down on the pedal and hoodie flowing backward to indicate motion",
              "low angle tracking shot emphasizing the physical urgency of her departure",
              "wet pavement reflecting the motion streaks of the bicycle"
            ],
            "creative_decisions": [
              "explicitly anchoring the bicycle, pavement, building, and curb to the background reference to avoid phantom props",
              "stating the deviation from the reference's eye-level camera to a low angle to account for compositor scale differences",
              "muted overcast lighting with a faint red reflector accent to maintain the grounded coastal tone without dramatic color shifts"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "6b2d8d43de5e5e25",
              "owned_hash": "8ce1510a9509e291",
              "camera_direction_hash": "691f00811483660b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bicycle",
                  "violating_phrase": "the bicycle from the reference",
                  "reason": "The phrase references an existing bicycle from the reference and does not instruct creating, adding, or altering a bicycle.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "station building",
                  "violating_phrase": "The station building facade from the reference",
                  "reason": "The phrase explicitly anchors the station building facade to the reference rather than requesting a new build or modification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curb",
                  "violating_phrase": "The chipped curb from the reference",
                  "reason": "The curb is mentioned as an existing reference element with descriptive detail only, not as a redraw target.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 20,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Tracking parallel from a low three-quarter side position about two meters away, the camera frames a WS, low angle of 수리영’s full body and bicycle as she pushes off from the parking spot. Her hips lift off the saddle, one foot drives down on the pedal, and the whole bike angles forward across the wet police-station exterior, giving the departure urgent physical force.",
            "lighting_mood": "Overcast coastal daylight stays muted and humid, with slick ground reflections and a faint red brake reflector adding the only sharp color accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L12"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L12B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV pole",
              "barrier gate",
              "bicycle",
              "bicycle rack",
              "curb",
              "door",
              "parking lot",
              "parking space",
              "patrol car",
              "planter",
              "road",
              "sidewalk",
              "signboard",
              "station building",
              "window"
            ],
            "camera_reference": {
              "camera_position": "near number 5 (main entrance door), facing diagonally across number 1 (parking lot) toward number 12 (bicycle departure route) and number 7 (driveway exit)",
              "camera_height": "eye-level standing ~1.6m",
              "lens_hint": "35mm wide angle",
              "framing_notes": "include number 11 (bicycle) and number 12 (departure route) prominently, with number 2 (station building frontage) behind and number 4 (public road) visible beyond the exit"
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L12B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "f14c5dce26e9b3d0"
      },
      {
        "scene_index": 21,
        "heading": "S#23. 어느 PC방 / 실내",
        "beat_title": "화면 속 좌표를 응시하는 수리영",
        "representative_moment": "어두운 PC방 모니터의 푸른 불빛 아래 굳은 표정으로 화면을 응시하는 C01.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level head-and-shoulder close framing, cold blue practical monitor lighting, soft background depth.",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level head-and-shoulder composition. C01O02 in a beige hoodie, an East Asian woman in her early 20s with black hair and dark eyes, facing the camera, hunched forward at the unseen workstation. Her eyes are fixed on the offscreen monitor. Cold blue monitor light washes across her face and the front of her hoodie, with muted coastal humidity in the dim shadows and almost no warm fill. Focus on her tense expression illuminated by the blue glow. [: edges of dark computer booth partitions facing the camera in staggered rows, forming a soft, out-of-focus tunnel-like recession in the murky background]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#23 action: '모니터 화면에 앉아있는 수리영, 좌표를 찍고 위치를 확인하고'",
              "Shot description: observer at eye-level, looking directly at her stiff face lit by the blue monitor light."
            ],
            "visual_inferences": [
              "She is hunched slightly forward to emphasize deep concentration on the monitor.",
              "The monitor is positioned off-screen directly in front of her, casting a strong blue directional light on her face."
            ],
            "creative_decisions": [
              "Used a head-and-shoulder composition to ensure her face is prominent without violating the forbidden 'face filling the entire frame' rule.",
              "Described the lighting as washing across her face to avoid physically slicing or cutting the body parts with light.",
              "Utilized [L01: ...] block to define the immediate frame-edge surroundings of staggered booth partitions, satisfying the skipped_close_framing policy without referencing background images."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "e45d03eb2f8f78db",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "b6cb85ef99f8d1f1",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 1,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static close-up (CU) at eye-level holds a symmetrical frontal monitor-axis view from just beyond the implied screen line, with 수리영 centered and the dark PC café receding into soft rows behind her. The framing is direct observer vision, not a device POV; her face occupies about 70% of the frame while the monitor itself stays offscreen, suggested only by the blue light flattening her features.",
            "lighting_mood": "Cold blue monitor light is the dominant practical source, with muted coastal humidity in the shadows and almost no warm fill.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "e73260821f51f4f1"
      },
      {
        "scene_index": 22,
        "heading": "S#24. 해안가 / 소나기",
        "beat_title": "폭풍우 치는 해안",
        "representative_moment": "먹구름 낀 어두운 해안가 하늘 위로 거대한 번개 줄기가 내리치는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme wide establishing shot, high upward-tilted angle, slate-blue and charcoal palette overexposed by lightning",
            "t2i_prompt": "Photorealistic cinematic still. Extreme wide establishing shot from a very high coastal position with an upward-tilted angle, focusing on a massive lightning bolt flashing white across the upper center of the frame. Thick, rain-loaded storm clouds dominate the ominous sky. A dark, wet shoreline sits as a thin, near-silhouetted strip along the lower frame edge, compressing the space between sky and sea. Heavy diagonal rain streaks cut through the dense, fog-softened atmosphere. The stormy environment is heavily saturated in cold slate-blue and charcoal tones, briefly overexposed by the harsh illumination of the lightning flash. No human figures are visible.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene text: '천둥 번개와 함께 잔뜩 낀 먹구름이 세찬 비를 뿌린다'",
              "Shot 1: 'A near-frozen extreme wide / establishing shot (EWS) from a very high coastal position uses a high, upward-tilted angle across the storm ceiling'",
              "Shot 1: 'holding the massive lightning bolt in the upper center while the black shoreline sits as a thin lower strip'",
              "Shot 1: 'rain streaks cutting diagonally through the foreground but no human figure visible'"
            ],
            "visual_inferences": [
              "fixed_element stormy_coastal_weather: A severe storm environment characterized by heavy diagonal rain streaks cutting through the dark atmosphere",
              "fixed_element stormy_coastal_weather: cold slate-blue, charcoal, and muted storm-gray tones",
              "Static observer frame compressing sky and sea into one continuous atmospheric block"
            ],
            "creative_decisions": [
              "Upward-tilted camera angle emphasizes the massive scale and power of the storm clouds relative to the very thin grounding line of the shore",
              "Adopted a highly cohesive cold gray and slate-blue color palette to carry over the mood from the previous atmosphere reference shot",
              "Utilized the lightning flash as the primary light source to create harsh, brief overexposure against the dark clouds"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "fec209ec64bc98b8",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "230013d2afee4183",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 9,
        "dependency_reason": "atmosphere_reference for the moody, cold, stormy slate-blue palette",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 22,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A near-frozen extreme wide / establishing shot (EWS) from a very high coastal position uses a high, upward-tilted angle across the storm ceiling, holding the massive lightning bolt in the upper center while the black shoreline sits as a thin lower strip. The static observer frame compresses sky and sea into one ominous plane, with rain streaks cutting diagonally through the foreground but no human figure visible.",
            "lighting_mood": "The palette is slate-blue and charcoal, briefly overexposed by the lightning flash before falling back into fog-softened darkness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "stormy_coastal_weather",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A severe storm environment characterized by heavy diagonal rain streaks cutting through the dark atmosphere. The sky and surroundings are dominated by cold slate-blue, charcoal, and muted storm-gray tones, periodically illuminated by bright, harsh lightning flashes from thick, dark storm clouds.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "source_facts": [
                  "Scene text: '천둥 번개와 함께 잔뜩 낀 먹구름이 세찬 비를 뿌린다'",
                  "Shot 1: 'rain streaks cutting diagonally', 'slate-blue and charcoal, briefly overexposed by the lightning flash'",
                  "Shot 4: 'Storm-muted gray light', 'faint distant lightning flicker'"
                ],
                "visual_inferences": [
                  "The intensity of the rain and the gloomy, oppressive darkness remain constant regardless of whether the camera is far away or up close."
                ],
                "creative_decisions": [
                  "Using a highly cohesive cold gray and slate-blue color palette to visually link the extreme wide landscape with the intimate close-up."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 9,
                "shot_index": 1,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [],
            "readiness_policy": "not_applicable",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "f620272cd356a515"
      },
      {
        "scene_index": 22,
        "heading": "S#24. 해안가 / 소나기",
        "beat_title": "폭우 속 절박한 질주",
        "representative_moment": "비바람이 몰아치는 빗속, 절박하게 자전거 페달을 밟는 C01의 핏발 선 옆얼굴.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tracking extreme close-up (ECU) in profile, shallow DOF, storm-muted gray light with cold highlights.",
            "t2i_prompt": "Photorealistic cinematic still. C01O03 in a dark navy windbreaker, a Korean woman in her early 20s with a young face, black wet hair trailing back horizontally in the direction opposite to motion, and dark eyes fixed on the distance. She is positioned in left profile, occupying the right half of the frame, with her neck and upper shoulder clearly visible. The lens isolates her expression, prioritizing her bloodshot eye and fresh raindrops clinging to her cheek. She leans forward into the motion. Storm-muted cold gray ambient light washes across her wet skin, punctuated by a faint distant lightning flicker reflecting on her wet shoulder. Heavy diagonal rain streaks pass near the lens. The edge of a wet bicycle handlebar is visible in the lower foreground, aligned forward. [: shallow depth of field rendering the wet coastal road as a horizontal motion blur of slate-blue and charcoal storm tones behind her].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "Scene text: '천둥 번개와 함께 잔뜩 낀 먹구름이 세찬 비를 뿌린다. 자전거를 타고 빗속을 달리는 수리영.'",
              "Shot description: observer beside her, raindrops clinging to cheek, bloodshot eye staring ahead, side profile"
            ],
            "visual_inferences": [
              "fixed_element stormy_coastal_weather: heavy diagonal rain streaks, slate-blue and charcoal tones, lightning flashes",
              "Motion freeze: wet hair trailing back horizontally opposite to the movement direction, forward leaning pose",
              "Bicycle prop presence: edge of handlebar visible in lower frame to anchor the riding posture"
            ],
            "creative_decisions": [
              "Positioned neck and shoulder in frame to explicitly avoid the forbidden 'floating head/face filling the entire frame' artifact while maintaining tight visual weight on the eye",
              "L02 used for the immediate background to comply with the skipped_close_framing rule without referencing the forbidden exact background",
              "Storm light described as washing across the skin to prevent the T2I model from physically bisecting or cutting the facial features with lighting terms"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "b26b301368ad692a",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d4e793989a73fafe",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 9,
        "dependency_reason": "해안도로 배경의 비오는 분위기와 환경 연장 및 조명톤 연속성 유지",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 22,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A tracking extreme close-up (ECU) at eye-level runs shoulder-height beside 수리영, less than a meter from her rain-slick side profile, using profile framing and shallow DOF. Her bloodshot eye and one suspended raindrop sit in the right half of the frame, while the blurred wet road and bicycle motion smear horizontally behind her.",
            "lighting_mood": "Storm-muted gray light wraps her face with cold highlights on rain, punctuated by faint distant lightning flicker.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "stormy_coastal_weather",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A severe storm environment characterized by heavy diagonal rain streaks cutting through the dark atmosphere. The sky and surroundings are dominated by cold slate-blue, charcoal, and muted storm-gray tones, periodically illuminated by bright, harsh lightning flashes from thick, dark storm clouds.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "source_facts": [
                  "Scene text: '천둥 번개와 함께 잔뜩 낀 먹구름이 세찬 비를 뿌린다'",
                  "Shot 1: 'rain streaks cutting diagonally', 'slate-blue and charcoal, briefly overexposed by the lightning flash'",
                  "Shot 4: 'Storm-muted gray light', 'faint distant lightning flicker'"
                ],
                "visual_inferences": [
                  "The intensity of the rain and the gloomy, oppressive darkness remain constant regardless of whether the camera is far away or up close."
                ],
                "creative_decisions": [
                  "Using a highly cohesive cold gray and slate-blue color palette to visually link the extreme wide landscape with the intimate close-up."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 9,
                "shot_index": 1,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "5aad6337200f08bf"
      },
      {
        "scene_index": 23,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "난장판이 된 집안과 낯선 발자국 발견",
        "representative_moment": "비에 젖은 거실 바닥에 찍힌 진흙 묻은 낯선 발자국 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "very low ground-level framing, high-angle-to-surface perspective, cool silver-gray dusk lighting with deep blue-black shadows, shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. Positioned very low, barely above the ground, focus on a trail of muddy unfamiliar footprints tracked across the wet floor. The footprints occupy the central band of the frame, showing smeared shoe shapes and dark muddy edges. Thin rainwater puddles reflect a weak, cool silver-gray evening light filtering in from off-frame, while deep blue-black shadows dominate the unlit space. [L04: rain-wet floor stretching backward into a gloomy void, overturned dining chair legs and an open window softly blurred in the far background, an unlit doorway forming a dark rectangle in the distance].",
            "outfit_assignments": [],
            "source_facts": [
              "S#25 action: '누군가 다녀간 흔적으로 보이는 발자국들. ... 거실에 난 창은 열려있고, 식탁 의자들을 쓰러져있다.'",
              "shot description: 비에 젖은 옥탑방 거실 바닥에 어지럽게 찍힌 진흙 묻은 낯선 발자국 클로즈업."
            ],
            "visual_inferences": [
              "fixed_element dusk_apartment_interior_lighting: dark, low-key dusk lighting, deep blue-black shadows, silver-gray wet floor.",
              "fixed_element shadowed_entrance_doorway: unlit rectangular void in the background.",
              "overturned chairs and open window blurred in the background to indicate the ransacked state without pulling focus from the footprints."
            ],
            "creative_decisions": [
              "Placing the camera barely above the ground to emphasize the intrusion and wet textures of the muddy tracks.",
              "Using a shallow depth of field to keep the footprints sharp while blurring the distant doorway and toppled furniture, isolating the primary trace evidence."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "680331f0fe3f31f6",
              "owned_hash": "4d307ad28636e606",
              "camera_direction_hash": "472430d9774ba92a",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "exact_background: 씬 11에서 확립된 옥탑방의 구조와 창문, 현관문 위치를 동일한 비율로 공유하되, 바닥의 빗물과 발자국 등 현재의 상태를 덮어씀 (단, close framing에 따라 배경 요소는 soft focus로 부분 노출됨)",
        "_shot_index": 1,
        "visible_entities": [
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 23,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A very low close-up (CU) at a high-angle-to-surface perspective rides only about 15 cm above the wet living-room floor, lens nearly parallel as it dollies into muddy unfamiliar footprints. The muddy tracks occupy the central band of the frame, with the entrance side blurred behind and the disturbed room hinted by toppled shapes in the far background.",
            "lighting_mood": "Fading dusk leaks through the open window, turning the wet floor silver-gray while the room stays underlit and sickly humid.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L04"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L04B03",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusk_apartment_interior_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the apartment is enveloped in dark, low-key dusk lighting. Deep blue-black shadows dominate the unlit space, while a weak, cool silver-gray evening light softly filters in from the outside, creating a gloomy, humid, and unsettling atmosphere across the rooms.",
                "applies_to_shots": [
                  1,
                  6,
                  11
                ],
                "source_facts": [
                  "Shot 1: Fading dusk leaks through the open window, turning the wet floor silver-gray while the room stays underlit.",
                  "Shot 6: Low dusk light mixes with a faint warm interior practical, gray-green shadows.",
                  "Shot 11: doorway falls into blue-black interior shadow while the exterior dusk gives her face a weak gray rim."
                ],
                "visual_inferences": [
                  "The lack of strong indoor lighting ensures the entire apartment interior consistently reads as an eerie, shadowed void heavily influenced by the cool dusk light from outside."
                ],
                "creative_decisions": [
                  "Unifying the color palette across different sections of the apartment with a blue-gray dusk tint and heavy black shadows to heighten the psychological tension and sense of abandonment."
                ],
                "confidence": "high"
              },
              {
                "element_id": "shadowed_entrance_doorway",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The main entrance doorway of the apartment stands as a stark, unlit architectural feature. The frame of the open door reveals a deep, heavily shadowed rectangular void, completely lacking any welcoming interior light.",
                "applies_to_shots": [
                  1,
                  11
                ],
                "source_facts": [
                  "Shot 1: the entrance side blurred behind.",
                  "Shot 11: faces back into the dark doorway... doorway remains a shadowed rectangle behind her."
                ],
                "visual_inferences": [
                  "Since the apartment is unlit, the entrance area receives no practical illumination, rendering it as a dark silhouette or a black rectangle in the background."
                ],
                "creative_decisions": [
                  "Using the unlit, shadowy doorway as a consistent framing device to emphasize the emptiness and unsettling nature of the ransacked apartment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "shot_index": 11,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "e6d9b5303ec17684"
      },
      {
        "scene_index": 23,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "붉은 원 안의 피 묻은 사진",
        "representative_moment": "붉은 원 정중앙에 날카로운 핀으로 꽂혀 있는 피 묻은 낡은 사진 P02의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height eye-level close-up (CU) with shallow depth of field, cool silver-gray dusk lighting mixed with a faint warm practical.",
            "t2i_prompt": "Photorealistic cinematic still. Chest-height eye-level close-up with shallow depth of field. Focus on P02, an old, yellowed, and wrinkled photograph pinned to [L04: a damp-stained bedroom wall]. P02 occupies the central frame, firmly anchored by a sharp metal pin piercing its top center, with a slight blood mark on the pin head. The front image side of P02 faces the camera, displaying a faded rural restaurant and two young East Asian girls sitting in front, marred by dark blood smears across the cracked paper texture. Surrounding the photograph is P08, a rough, ominous red circular mark painted directly on the wall surface. A weak, cool silver-gray evening dusk light washes across the wall, mixing with a faint warm interior practical glow. Deep blue-black and gray-green shadows pool across the frame edge, making the red paint of P08 appear unnaturally saturated against the gloomy ambient fill.",
            "outfit_assignments": [],
            "source_facts": [
              "S#25: 벽에 또 붉은 원이 그려져있다. 그 가운데 꽂혀있는 피묻은 사진 한 장!",
              "Shot 6 description: A close-up of the old blood-stained photograph pinned to the center of the red circle.",
              "DP instruction: old blood-stained photograph, front image side faces the camera, showing a faded rural restaurant, two young girls, and dark blood smears."
            ],
            "visual_inferences": [
              "fixed_element dusk_apartment_interior_lighting: The interior of the apartment is enveloped in dark, low-key dusk lighting. Deep blue-black shadows and cool silver-gray evening light.",
              "Reproduction surface rule: The two young girls in the photograph are described using common nouns and demographic descriptors instead of C## IDs."
            ],
            "creative_decisions": [
              "Shallow depth of field keeps P02 sharply in focus while softly blurring the edges of the red circle and the wall texture.",
              "Chest-height eye-level composition maintains spatial consistency with the wall."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "c21a7a89554719d3",
              "owned_hash": "db5e9f1b6e8d2520",
              "camera_direction_hash": "a180b9b46640bcbf",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "exact_background continuity (from scene 11 shot 14), preserving the established environment lighting while keeping the focus entirely on the tight frame of the wall surface.",
        "_shot_index": 6,
        "visible_entities": [
          "P02",
          "P08",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 23,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A slow dolly-in close-up (CU) at chest-height eye-level pushes toward the bedroom wall, using shallow DOF so the pin point, blood flecks, and cracked paper texture become the sharp central focus. The old photograph stays within the middle 35–40% of the frame, surrounded by the red circle on the wall like an occult target rather than letting the prop unrealistically overtake the whole image.",
            "lighting_mood": "Low dusk light mixes with a faint warm interior practical, making the red circle feel unnaturally saturated against otherwise gray-green shadows.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P02",
              "P08",
              "L04"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L04B02",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusk_apartment_interior_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the apartment is enveloped in dark, low-key dusk lighting. Deep blue-black shadows dominate the unlit space, while a weak, cool silver-gray evening light softly filters in from the outside, creating a gloomy, humid, and unsettling atmosphere across the rooms.",
                "applies_to_shots": [
                  1,
                  6,
                  11
                ],
                "source_facts": [
                  "Shot 1: Fading dusk leaks through the open window, turning the wet floor silver-gray while the room stays underlit.",
                  "Shot 6: Low dusk light mixes with a faint warm interior practical, gray-green shadows.",
                  "Shot 11: doorway falls into blue-black interior shadow while the exterior dusk gives her face a weak gray rim."
                ],
                "visual_inferences": [
                  "The lack of strong indoor lighting ensures the entire apartment interior consistently reads as an eerie, shadowed void heavily influenced by the cool dusk light from outside."
                ],
                "creative_decisions": [
                  "Unifying the color palette across different sections of the apartment with a blue-gray dusk tint and heavy black shadows to heighten the psychological tension and sense of abandonment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "shot_index": 14,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "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": 23,
                "shot_indices": [
                  6
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P02",
                  "role": "visual_target"
                }
              ],
              "requirements": [
                {
                  "dimension": "visual_identity",
                  "operation": "preserve",
                  "strength": "required",
                  "reference_policy": "use_entity_reference"
                }
              ]
            }
          ],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "1d6914ba7664381c"
      },
      {
        "scene_index": 23,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "혼미한 상태로 방을 떠나는 수리영",
        "representative_moment": "백팩을 메고 피 묻은 사진을 쥔 채, 어두운 옥탑방 현관을 나서는 수리영(C01)의 몽롱한 찰나.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium shot from outside looking in, slight low angle, weak dusk rim light against blue-black interior shadow",
            "t2i_prompt": "Photorealistic cinematic still. Medium shot at a slight low angle from just outside the entrance, deviating from the reference's standing eye-level perspective to look slightly up. The front face of the doorframe from the reference surrounds the background. C01O03 in a dark navy windbreaker, a Korean woman in her early 20s with black hair and dark eyes, caught mid-stride exiting the room at a three-quarter angle from the left, one foot suspended midair. Her upper body and the rear side of the worn backpack (P04) draped over her shoulder occupy the center-left frame, with the suspended foot hovering near the lower frame edge. An old, creased, blood-stained photograph is clutched close at her chest level, the image side partly turned toward her chest with only a stained edge facing the camera. Her eyes are fixed on the void in a vacant trance. Focus on her empty expression against the dark background. The doorway from the reference remains a heavily shadowed rectangular void behind her, entirely enveloped in deep blue-black interior shadow. Fading exterior dusk light provides a weak, cool silver-gray rim on her face and the damp windbreaker against the dim, humid rooftop air.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S#25: 연속해서 벌어지는 기이한 상황에 정신이 혼미한 엉망이 된 잡 안을 한번 획 둘러보는 수리영, 마치 이끌리듯 백팩을 메고 밖으로 나간다. 사진을 손에 꼭 쥔 채.",
              "Shot 11 description: 백팩을 멘 채 어두워진 옥탑방 현관문 밖으로 걸어 나가는 도중, 한쪽 발이 공중에 떠 있는 찰나의 자세로 멈춘 수리영의 몽롱한 표정."
            ],
            "visual_inferences": [
              "fixed_element dusk_apartment_interior_lighting: blue-black interior shadow dominating the unlit space, cool silver-gray evening light filtering in",
              "fixed_element shadowed_entrance_doorway: shadowed rectangular void completely lacking interior light",
              "low camera angle places her upper body and backpack in the upper-center frame and her suspended foot at the lower edge"
            ],
            "creative_decisions": [
              "Slight low angle medium shot explicitly marked as deviating from the reference framing to emphasize her trance-like emergence from the dark void",
              "Cool dusk rim light softly outlining her face to separate her silhouette from the heavy interior blackness"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "a201f226f7313fc8",
              "owned_hash": "4d307ad28636e606",
              "camera_direction_hash": "90d2421ae6e9807f",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "The front face of the doorframe from the reference",
                  "reason": "This mentions the existing doorframe as a reference anchor and does not instruct creating, adding, or modifying a door.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "previous_shot_refs [atmosphere_reference] S12_Shot8: shares the dim, humid twilight mood without importing background layouts",
        "_shot_index": 11,
        "visible_entities": [
          "C01",
          "P04",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 23,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From just outside the rooftop-room entrance, a retreating medium shot (MS) at a slight low angle faces back into the dark doorway as 수리영 steps out with one foot suspended midair. The observer frame holds her in the center-left, her old photograph clutched close at chest level, while the doorway remains a shadowed rectangle behind her rather than competing for attention.",
            "lighting_mood": "The doorway falls into blue-black interior shadow while the exterior dusk gives her face a weak gray rim, emphasizing her vacant trance.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P04",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L04B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "chair",
              "coffee table",
              "cooktop",
              "counter",
              "curtain",
              "dining table",
              "door",
              "footprint",
              "hallway",
              "herb pot",
              "kitchenette",
              "living room",
              "refrigerator",
              "shoe cabinet",
              "sink",
              "smartphone",
              "sofa",
              "washing machine",
              "window"
            ],
            "camera_reference": {
              "camera_position": "near number 8 (front door), facing through number 3 (living area) toward number 19 (openable living sliding window), number 40 (muddy footprint trail), and number 41 (fallen chair pair)",
              "camera_height": "eye-level standing ~1.6m",
              "lens_hint": "28mm wide angle",
              "framing_notes": "Show the ransacked path from the entrance through the room to the window."
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": "dusk_apartment_interior_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the apartment is enveloped in dark, low-key dusk lighting. Deep blue-black shadows dominate the unlit space, while a weak, cool silver-gray evening light softly filters in from the outside, creating a gloomy, humid, and unsettling atmosphere across the rooms.",
                "applies_to_shots": [
                  1,
                  6,
                  11
                ],
                "source_facts": [
                  "Shot 1: Fading dusk leaks through the open window, turning the wet floor silver-gray while the room stays underlit.",
                  "Shot 6: Low dusk light mixes with a faint warm interior practical, gray-green shadows.",
                  "Shot 11: doorway falls into blue-black interior shadow while the exterior dusk gives her face a weak gray rim."
                ],
                "visual_inferences": [
                  "The lack of strong indoor lighting ensures the entire apartment interior consistently reads as an eerie, shadowed void heavily influenced by the cool dusk light from outside."
                ],
                "creative_decisions": [
                  "Unifying the color palette across different sections of the apartment with a blue-gray dusk tint and heavy black shadows to heighten the psychological tension and sense of abandonment."
                ],
                "confidence": "high"
              },
              {
                "element_id": "shadowed_entrance_doorway",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The main entrance doorway of the apartment stands as a stark, unlit architectural feature. The frame of the open door reveals a deep, heavily shadowed rectangular void, completely lacking any welcoming interior light.",
                "applies_to_shots": [
                  1,
                  11
                ],
                "source_facts": [
                  "Shot 1: the entrance side blurred behind.",
                  "Shot 11: faces back into the dark doorway... doorway remains a shadowed rectangle behind her."
                ],
                "visual_inferences": [
                  "Since the apartment is unlit, the entrance area receives no practical illumination, rendering it as a dark silhouette or a black rectangle in the background."
                ],
                "creative_decisions": [
                  "Using the unlit, shadowy doorway as a consistent framing device to emphasize the emptiness and unsettling nature of the ransacked apartment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 8,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O03",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L04B03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "e08383964ac7a5f4"
      },
      {
        "scene_index": 24,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "수리영은 엄마를 찾는 데만 집중하며 외부 연락을 차단한 상태에 가깝다.",
        "representative_moment": "수리영의 손에 들린, '혜수이모'라는 발신자 이름이 뜬 스마트폰 화면 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level-to-hands angle looking down, shallow depth of field, cold gray fog light broken by dim bluish smartphone glow.",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the tense, rain-damp hands of a young Korean woman in her early 20s, wearing dark navy windbreaker sleeves. Viewed from beside the subject looking down at an eye-level-to-hands angle, the hands grip P01 in the lower third of the frame. The illuminated front screen of P01 faces the camera at a slight diagonal, speckled with wet droplets and displaying the caller name '혜수이모'. A small bluish glow from the screen reflects on the damp skin. [: Dark, slick, uneven harbor rocks enveloped in dense, milky gray-blue fog] form the frame-edge background, acting as a semi-opaque veil that softy obscures distant elements into a low-contrast atmosphere. Cold gray atmospheric light mixes with the dim practical reflections from the phone. Shallow depth of field blurs the rocky ground, keeping the vibrating screen sharp.",
            "outfit_assignments": [],
            "source_facts": [
              "S#26 action: '안개가 자욱하다. 텅 빈 포구.', '진동벨이 울린다. 얼핏 보니 혜수이모다. 벌써 여러통 째 부재중 전화.'",
              "Shot 3 description: '수리영의 손에 들린, 혜수이모라는 발신자 이름이 뜬 스마트폰 화면 클로즈업.'"
            ],
            "visual_inferences": [
              "fixed_element thick_harbor_fog: A dense, pervasive fog blankets the coastal area during dusk, creating a moody gray-blue haze.",
              "The subject's hands are tense and wet, reflecting the recent rain shower ('소나기가 한차례 퍼 붓는가 싶더니').",
              "The phone screen emits a practical bluish light that catches on the wet skin."
            ],
            "creative_decisions": [
              "Apply a downward eye-level-to-hands angle to ground the shot against the harbor rocks without revealing the distant horizon.",
              "Use shallow depth of field to isolate the glowing smartphone screen and wet fingers while softening the background fog.",
              "Omit the L01 background reference entirely, directly describing the rocks and fog as frame-edge textures (L02)."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "0666219c3ab36141",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d45e101f45e98b8a",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "P01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 24,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A tight close-up (CU) from seated shoulder height beside 수리영 tilts down to her hands, using an eye-level-to-hands angle and shallow DOF to make the vibrating smartphone screen readable without letting it exceed the lower third of the frame. This is direct observer vision: her wet fingers and sleeve frame the display showing ‘혜수이모,’ while the slick rocks and foggy harbor remain soft scale references around it.",
            "lighting_mood": "Cold gray fog light is broken by the phone’s small bluish glow, with wet skin and stone catching dim practical reflections.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "thick_harbor_fog",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, pervasive fog blankets the coastal area during dusk. It creates a thick gray-blue haze that heavily obscures distant elements and softens the ambient lighting into a moody, low-contrast atmosphere.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "source_facts": [
                  "S#26 action: '안개가 자욱하다. 텅 빈 포구.'",
                  "Shot 3 description: 'foggy harbor remain soft scale references'",
                  "Shot 4 description: 'compressed wall of fog', 'Fog-diffused dusk light'"
                ],
                "visual_inferences": [
                  "The fog imparts a cold, uniform gray-blue atmospheric tint across the harbor area due to the dusk timing."
                ],
                "creative_decisions": [
                  "Use the heavy fog as a consistent backdrop to visually isolate the subjects and establish a gloomy, mysterious mood across varying framings."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "266f8540c3efcdde"
      },
      {
        "scene_index": 24,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "안개 속에서 나타난 배",
        "representative_moment": "짙은 안개를 뚫고 낡은 어선 한 척이 뱃머리를 드러내며 텅 빈 포구로 다가온다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A static eye-level medium wide shot facing a wall of fog, fog-diffused dusk light flattening contrast into gray-blue.",
            "t2i_prompt": "Photorealistic cinematic still. A static eye-level medium wide perspective at the wet, empty pier edge angled across the lower corner of the frame. Focus on the weathered bow of a small fishing boat breaking through a compressed wall of opaque gray-white fog directly toward the camera. [L14: A dense, pervasive fog blankets the coastal area during dusk, forming a thick gray-blue haze that flattens contrast and softens the ambient lighting into a moody atmosphere.] The old fishing boat occupies the middle third of the frame, its visibly weathered exterior showing chipped rust-red and red-brown paint accents standing out faintly against the gloom. The hull and front boards are slick with moisture, while the thick fog completely erases the stern, leaving the vessel pushing out of a blank void. Below the boat, dark harbor water forms gently rippling horizontal bands, the surface reflecting the broken gray fog and the dark underside of the bow in wavering fragments.",
            "outfit_assignments": [],
            "source_facts": [
              "S#26 action: '안개가 자욱하다. 텅 빈 포구.', '그때 안개를 뚫고 배 한척이 다가오는 게 보인다.'",
              "Shot 4 description: 'compressed wall of fog', 'old fishing boat emerges bow-first', 'rust-red accent cutting faintly through the gloom'"
            ],
            "visual_inferences": [
              "fixed_element thick_harbor_fog: pervasive gray-blue haze heavily obscuring distant elements and softening ambient lighting",
              "fixed_element weathered_fishing_boat: visibly weathered exterior, rust-red and red-brown paint accents, surfaces slick with moisture",
              "The dark harbor water reflects the dark underside of the bow and broken fog in wavering fragments"
            ],
            "creative_decisions": [
              "Placed the wet pier edge in the lower corner to anchor the observer's position in the foreground.",
              "Employed a muted gray-blue dusk palette with faint rust-red boat accents to isolate the primary subject against the monochromatic fog."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "4cc0ea332da5ae87",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "db7a884e0b54ae8c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 24,
        "dependency_reason": "Shot 3의 안개 낀 포구 분위기와 색감(gray-blue dusk atmospheric tone)을 그대로 유지",
        "_shot_index": 4,
        "visible_entities": [
          "L14"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 24,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static medium wide shot (MWS) with a telephoto eye-level angle waits at the pier edge, facing straight into a compressed wall of fog as the old fishing boat emerges bow-first in the center. The bow occupies the middle third of the frame, water ripples form dark horizontal bands below, and the fog erases the stern so the boat seems to push out of a blank void.",
            "lighting_mood": "Fog-diffused dusk light flattens contrast into gray-blue, with the boat’s rust-red accent cutting faintly through the gloom.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L14"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "thick_harbor_fog",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, pervasive fog blankets the coastal area during dusk. It creates a thick gray-blue haze that heavily obscures distant elements and softens the ambient lighting into a moody, low-contrast atmosphere.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "source_facts": [
                  "S#26 action: '안개가 자욱하다. 텅 빈 포구.'",
                  "Shot 3 description: 'foggy harbor remain soft scale references'",
                  "Shot 4 description: 'compressed wall of fog', 'Fog-diffused dusk light'"
                ],
                "visual_inferences": [
                  "The fog imparts a cold, uniform gray-blue atmospheric tint across the harbor area due to the dusk timing."
                ],
                "creative_decisions": [
                  "Use the heavy fog as a consistent backdrop to visually isolate the subjects and establish a gloomy, mysterious mood across varying framings."
                ],
                "confidence": "high"
              },
              {
                "element_id": "weathered_fishing_boat",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An old, small fishing boat exhibits a visibly weathered exterior with chipped rust-red and red-brown paint accents. Its hull and deck surfaces are slick with moisture, reflecting the dim ambient light.",
                "applies_to_shots": [
                  4,
                  9
                ],
                "source_facts": [
                  "Shot 4 description: 'old fishing boat emerges bow-first', 'rust-red accent cutting faintly through the gloom'",
                  "Shot 9 description: 'wet boat deck', 'dim red-brown boat paint accents adding a restrained ominous warmth'"
                ],
                "visual_inferences": [
                  "The boat looks visibly aged, and its exposed surfaces are completely wet due to the recent heavy rain shower mentioned in the scene text."
                ],
                "creative_decisions": [
                  "Highlight the muted red-brown paint to provide a subtle, consistent color contrast against the otherwise monochromatic gray-blue foggy environment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 24,
                "shot_index": 3,
                "ref_usage": "atmosphere_reference",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [],
            "readiness_policy": "not_applicable",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "c13f1deb816f427b"
      },
      {
        "scene_index": 24,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "수리영의 승선",
        "representative_moment": "수리영(C01)이 안개 낀 포구에서 배의 갑판으로 첫 발을 내딛는 역동적인 멈춤 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Handheld low-angle MCU from deck level, muted gray ambient with dim red-brown accents",
            "t2i_prompt": "Photorealistic cinematic still. A handheld low-angle medium close-up from deck level, looking back toward a dark slick quay edge. C01O03 in a dark navy windbreaker, a young Korean woman in her early 20s with black hair, at three-quarter angle from the right, frozen mid-stride during the physical transfer from shore to boat. Her shoe and shin occupy the lower center frame making contact with the surface, while her upper body leans diagonally into the frame from above, eyes looking down toward the wet deck. Focus on C01O03 suspended in this forward motion against the obscured backdrop. The frame edges are formed by [: scuffed wooden deck planks slick with moisture running away toward the quay behind her, and the inner gunwale with chipped rust-red and red-brown paint cutting along the right edge], illuminated by low gray ambient light reflecting off the wet surfaces, adding a restrained ominous warmth to the dense damp harbor fog.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S#26 action: '배로 다가가는 수리영. 배에서 내린 인우는 닷줄을 고정시키고 있다.' (수리영이 배에 오르려는 상황)",
              "Shot 9 description: observer at deck level, looking back toward the quay as 수리영’s first foot lands on the wet boat deck.",
              "C01 stable_traits: Korean, 20대 초반 여성, 젊은 얼굴, 검은 머리."
            ],
            "visual_inferences": [
              "fixed_element weathered_fishing_boat: deck surfaces are slick with moisture and feature chipped rust-red/red-brown paint.",
              "수리영's posture is suspended mid-stride with her shoe just touching the deck to emphasize the physical threshold of stepping onto the unstable boat."
            ],
            "creative_decisions": [
              "Low-angle MCU perspective physically compresses the frame to show both the landing foot in the foreground and her leaning torso extending from the upper edge.",
              "Dense fog obscures the quay behind her, completely isolating the immediate interaction between her and the rust-red boat gunwale."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "ae8a9b8e6c3fcf70",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "a0e6b7a70715f5ea",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 24,
        "dependency_reason": "Shot 4의 어선(weathered_fishing_boat) 표면 질감, 붉은색/적갈색 페인트 포인트, 젖은 갑판(exact_background)에 대한 환경 연속성 유지.",
        "_shot_index": 9,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 24,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A handheld medium close-up (MCU) at a low angle from deck level looks back toward the quay as 수리영’s first foot lands on the wet boat deck. Her shoe and shin occupy the lower center with realistic scale, while her upper body leans diagonally into the frame from above, turning the shore-to-boat transfer into a suspended action beat.",
            "lighting_mood": "Low gray ambient light reflects off the wet deck, with dim red-brown boat paint accents adding a restrained ominous warmth.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "weathered_fishing_boat",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An old, small fishing boat exhibits a visibly weathered exterior with chipped rust-red and red-brown paint accents. Its hull and deck surfaces are slick with moisture, reflecting the dim ambient light.",
                "applies_to_shots": [
                  4,
                  9
                ],
                "source_facts": [
                  "Shot 4 description: 'old fishing boat emerges bow-first', 'rust-red accent cutting faintly through the gloom'",
                  "Shot 9 description: 'wet boat deck', 'dim red-brown boat paint accents adding a restrained ominous warmth'"
                ],
                "visual_inferences": [
                  "The boat looks visibly aged, and its exposed surfaces are completely wet due to the recent heavy rain shower mentioned in the scene text."
                ],
                "creative_decisions": [
                  "Highlight the muted red-brown paint to provide a subtle, consistent color contrast against the otherwise monochromatic gray-blue foggy environment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 24,
                "shot_index": 4,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "dae4459bde845465"
      },
      {
        "scene_index": 25,
        "heading": "S#27. 옥탑방 안 / 해질 무렵",
        "beat_title": "불안한 의심의 구체화",
        "representative_moment": "혜수(C02)가 불안한 얼굴로 휴대폰(P01)을 귀에 댄 채 방 안쪽의 김형사를 바라본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A slow dolly-in eye-level composition, blue-gray dusk mixed with dim interior practical spill",
            "t2i_prompt": "Photorealistic cinematic still. Head-and-shoulder composition. C02O05 in a charcoal gray suit jacket, a Korean early 40s woman with black hair and dark eyes, positioned in the foreground at three-quarter angle from the right, eyes fixed on the figure across the shared dim room. She holds the P01 smartphone pressed to her ear; its dark screen side is angled away from the camera, only its thin edge visible. Cool blue-gray dusk light washes the side of her damp-eyed face, mixing with weak warm practical spill. Across the shared dim room from her, a Korean middle-aged man in a detective coat appears as a soft out-of-focus background figure at three-quarter angle from the left, leaning near a table. Focus on her anxious expression. [: soft out-of-focus space, faint oblique furniture edge, dim grimy window glass].",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "S#27 action: '수리영의 녹음메시지를 확인하는 혜수'",
              "shot description: '혜수의 불안한 얼굴 클로즈업. 휴대폰을 귀에 댄 채 김형사 쪽으로 시선을 돌린'"
            ],
            "visual_inferences": [
              "phone held with screen angled away so content is unreadable",
              "Korean middle-aged man in detective coat leaning near the table in the background as a soft out-of-focus presence"
            ],
            "creative_decisions": [
              "Head-and-shoulder composition to maintain upper body presence in close framing",
              "Used 'across the shared dim room' to satisfy the shared anchor rule for fg/bg separation",
              "Applied soft out-of-focus background treatment for the second figure to adhere to close framing constraints",
              "Used L02 instead of L01 for the frame-edge background surface description"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "80c2a4d34cbfc99a",
              "owned_hash": "47c60fddbcd37070",
              "camera_direction_hash": "40c254c2ecc75eb4",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "same location (옥탑방 안), background reference skipped due to close framing but spatial continuity implied",
        "_shot_index": 1,
        "visible_entities": [
          "C02",
          "P01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A slow dolly-in close-up (CU) at eye-level sits just off 혜수’s phone side, catching her face in three-quarter view as her eyes turn toward 김형사. The phone edge remains barely visible along the left foreground, while 김형사 is a soft presence deeper in the dim rooftop room, making her anxious look define the screen direction.",
            "lighting_mood": "Blue-gray dusk from the window mixes with weak interior practical spill, leaving 혜수’s face damp-eyed and anxious against a hollow, shadowed room.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "P01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L04B11",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 8,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "d83eec1ec77eca20"
      },
      {
        "scene_index": 26,
        "heading": "S#28. 바다 + 갑판 / 해질 무렵",
        "beat_title": "사진을 본 인우의 당황과 강한 부인",
        "representative_moment": "낡은 사진을 보고 당황하여 눈이 커진 C05의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight extreme close-up at eye-level, shallow depth of field with dull amber and sea-gray lighting",
            "t2i_prompt": "Photorealistic cinematic still. C05O10 in a worn waterproof jumper, an East Asian young man in his mid-20s with black hair and dark eyes, in a head-and-shoulder composition at three-quarter angle from the left, leaning forward. His widened dark eyes are fixed on a worn black-and-white photograph, his mouth tightly sealed. The creased paper edge of the old photograph with water stains and faded photographic grain dominates the left foreground; its printed face is angled toward the camera, but only its silvered emulsion edge and worn corner are visible in a soft blur. Behind his cheek, [: the background is a soft, out-of-focus rain-slick deck darkened by sea spray, enveloped in a muted gray sea-haze]. A dim amber sunset mixes with cold sea-gray fill, leaving his features wet and shadowed while the photograph edge catches a dull ghostly highlight.",
            "outfit_assignments": [
              {
                "character_id": "C05",
                "outlook_id": "O10"
              }
            ],
            "source_facts": [
              "Scene heading: 바다 + 갑판 / 해질 무렵 (Sea + deck / around sunset)",
              "Shot 6: 낡은 흑백 사진을 마주한 채 눈을 크게 뜨고 입술을 굳게 다문 인우의 당황한 얼굴 클로즈업.",
              "Beat #4 [emotion]: 인우는 사진을 보고 당황하며 모른다고 강하게 부인한다.",
              "DP notes: old black-and-white photograph edge: creased, damp, faded (near-foreground occluder and emotional trigger)"
            ],
            "visual_inferences": [
              "fixed_element sunset_marine_atmosphere: dim, humid sunset merging with cold sea-gray haze",
              "fixed_element rain_slick_deck: floor of the small boat's deck is noticeably slick with rainwater",
              "The tight framing physically compresses the emotional space around Inwoo, heightening the feeling of panic."
            ],
            "creative_decisions": [
              "Used a head-and-shoulder composition to achieve an extreme close-up feel without triggering the T2I floating-head artifact.",
              "Placed the creased photograph edge prominently in the left foreground to serve as a forward zoom target for the next shot while keeping its surface oriented toward the camera as instructed.",
              "Applied a mix of amber sunset and cool sea-gray lighting to emphasize the damp, isolated marine mood and the wetness of Inwoo's features."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "307ed4daa01718d4",
              "owned_hash": "42cfab1203ec82d1",
              "camera_direction_hash": "a2d1544025c478c0",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 6,
        "visible_entities": [
          "C05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Tight at Inwoo's face from just beside the old photograph, this extreme close-up (ECU) at eye-level compresses his widened eyes and sealed mouth into the center-right of frame while the blurred photo edge slices up the left foreground at less than one-third of the image. The camera is an observer's direct vision, holding the dolly-in pressure as if the photograph itself is crowding him, with only wet deck gloom and sunset haze behind his cheek.",
            "lighting_mood": "Dim amber sunset mixes with cold sea-gray fill, leaving Inwoo's eyes wet and shadowed while the photograph edge catches a dull, ghostly highlight.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C05",
                "outlook_id": "O10"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L15B03",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sunset_marine_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The surrounding environment is characterized by a dim, humid sunset merging with a cold sea-gray haze. Weak amber and orange-gray light softly illuminates the damp air, creating a moody and isolated marine atmosphere. The background remains enveloped in a muted grayish tone reflecting the fading light over the ocean.",
                "applies_to_shots": [
                  6,
                  8,
                  11
                ],
                "source_facts": [
                  "Scene heading: 바다 + 갑판 / 해질 무렵 (Sea + deck / around sunset)",
                  "Shot 6: Dim amber sunset mixes with cold sea-gray fill, wet deck gloom and sunset haze",
                  "Shot 8: Low, humid sunset light, shallow-focus gray",
                  "Shot 11: dim sea glow, weak orange-gray sunset backlights rain"
                ],
                "visual_inferences": [
                  "The combination of the setting sun and sea spray creates a persistently hazy, damp air quality across the entire scene."
                ],
                "creative_decisions": [
                  "Using the contrasting warm amber and cool sea-gray tones to heighten the emotional tension and sense of isolation on the small boat."
                ],
                "confidence": "high"
              },
              {
                "element_id": "rain_slick_deck",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The floor of the small boat's deck is noticeably slick with rainwater and sea spray, presenting a highly reflective, glossy surface under the faint light. The dark, weathered texture of the deck emphasizes the wet, cold, and uncomfortable conditions of the exterior environment.",
                "applies_to_shots": [
                  6,
                  11
                ],
                "source_facts": [
                  "Shot 6: wet deck gloom",
                  "Shot 11: rain-slick deck, rain on their faces"
                ],
                "visual_inferences": [
                  "The deck surface is likely made of aged, dark material that heavily reflects the ambient sunset light when coated in water."
                ],
                "creative_decisions": [
                  "Emphasizing the glossy, wet texture of the deck floor to visually anchor the characters in a harsh physical space before they move inside."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [
              {
                "scene_index": 26,
                "shot_index": 8,
                "description": "사진 모서리에 작게 적힌 '금월'이라는 글씨 클로즈업.",
                "keep_elements": [
                  {
                    "label": "worn black-and-white photograph edge",
                    "kind": "static_prop"
                  },
                  {
                    "label": "creased paper texture with water stains",
                    "kind": "static_prop"
                  },
                  {
                    "label": "faded photographic grain",
                    "kind": "static_prop"
                  },
                  {
                    "label": "muted gray sea-haze background",
                    "kind": "environment"
                  }
                ]
              }
            ],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C05O10",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "be5853c6a562b550"
      },
      {
        "scene_index": 26,
        "heading": "S#28. 바다 + 갑판 / 해질 무렵",
        "beat_title": "사진 속 단서 확인",
        "representative_moment": "An extreme close-up of the handwritten text on P02.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "An extreme close-up (ECU) macro insert holds almost parallel to the photograph surface at a slight Dutch angle.",
            "t2i_prompt": "Photorealistic cinematic still. The lower corner of the same P02 photograph occupies the central band of the frame, held almost parallel to the camera at a slight Dutch angle. The old black-and-white photograph corner is creased, water-spotted, and yellowed, the printed face visible to camera showing the tiny handwritten '금월' alongside visible paper fibers and faded photographic grain. The front white margin faces camera, stained and cracked around the writing. The same environment is preserved as low, humid sunset light skims across the paper texture, making the ink look almost red-brown. The photograph rests against the same surface at the lower frame edge, [: a wet, salt-streaked weathered deck plane], with the rest of the image falling away into shallow-focus cold sea-gray haze.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene heading: 바다 + 갑판 / 해질 무렵 (Sea + deck / around sunset)",
              "Shot 8: 사진 모서리에 작게 적힌 '금월'이라는 글씨 클로즈업"
            ],
            "visual_inferences": [
              "fixed_element sunset_marine_atmosphere: low, humid sunset light and cold sea-gray haze",
              "The photograph is resting against the deck surface as an out-of-focus background in the macro view"
            ],
            "creative_decisions": [
              "Slight Dutch angle to emphasize the disorientation or sudden realization of the clue",
              "Low, skimming light to exaggerate the paper texture and make the ink stand out as red-brown against the monochrome print"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "663e866245183cfa",
              "owned_hash": "42cfab1203ec82d1",
              "camera_direction_hash": "c8a39e3e3625535a",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 26,
        "dependency_reason": "Shot 8 is a zoom_in_detail of the photograph seen in Shot 6, maintaining the exact same lighting and marine environment.",
        "_shot_index": 8,
        "visible_entities": [
          "P02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An extreme close-up (ECU) macro insert holds almost parallel to the photograph surface at a slight Dutch angle, isolating the tiny handwritten '금월' on the lower corner while the paper fibers and salt stains remain visible. The clue-bearing corner occupies the central band of frame, with the rest of the faded image falling away into shallow-focus gray.",
            "lighting_mood": "Low, humid sunset light skims across the paper texture, making the ink look almost red-brown against the monochrome photograph.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P02"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L15B03",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sunset_marine_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The surrounding environment is characterized by a dim, humid sunset merging with a cold sea-gray haze. Weak amber and orange-gray light softly illuminates the damp air, creating a moody and isolated marine atmosphere. The background remains enveloped in a muted grayish tone reflecting the fading light over the ocean.",
                "applies_to_shots": [
                  6,
                  8,
                  11
                ],
                "source_facts": [
                  "Scene heading: 바다 + 갑판 / 해질 무렵 (Sea + deck / around sunset)",
                  "Shot 6: Dim amber sunset mixes with cold sea-gray fill, wet deck gloom and sunset haze",
                  "Shot 8: Low, humid sunset light, shallow-focus gray",
                  "Shot 11: dim sea glow, weak orange-gray sunset backlights rain"
                ],
                "visual_inferences": [
                  "The combination of the setting sun and sea spray creates a persistently hazy, damp air quality across the entire scene."
                ],
                "creative_decisions": [
                  "Using the contrasting warm amber and cool sea-gray tones to heighten the emotional tension and sense of isolation on the small boat."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 26,
                "shot_index": 6,
                "ref_usage": "zoom_in_detail",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "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": 26,
                "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"
                }
              ]
            }
          ],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "166d36534b8d704c"
      },
      {
        "scene_index": 26,
        "heading": "바다 + 갑판 / 해질 무렵",
        "beat_title": "조타실 앞에서의 제지",
        "representative_moment": "수리영(C01)이 조타실 문틀을 잡고 배를 돌리려는 인우를 몸으로 막아선다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium shot from just inside the pilothouse, framed by dark doorjambs, contrasting cool interior shadow with weak sunset backlight.",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level medium shot from just inside the wheelhouse from the reference, framed by the dark doorjambs. C01O03 in a dark navy windbreaker, Korean woman in her early 20s with black hair and dark eyes, facing the camera, occupying the center-left with one hand clamped to the doorway from the reference. She physically blocks an Asian man in his 40s at three-quarter angle from the right, his shoulder driven forward. C01O03's eyes fixed on the man, and his eyes fixed on her, sharing the narrow threshold space. Cool interior shadow covers the foreground. A weak orange-gray sunset backlights the falling rain on their faces. A faint ominous red glimmer from inside the cabin reflects on the doorframe and their shoulders. Behind them, the rain-slick deck from the reference recedes into a dim, humid sunset merging with a cold sea-gray haze. Focus on the tense physical blocking at the narrow threshold between the two figures.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "Scene heading: 바다 + 갑판 / 해질 무렵",
              "Shot 11: 조타실 문틀을 한 손으로 꽉 쥔 채 인우의 어깨를 막아선 수리영의 정면 구도.",
              "수리영: facing_camera, hand clamped doorframe, eyes→인우",
              "인우: three_quarter_right, shoulder driven forward, eyes→수리영"
            ],
            "visual_inferences": [
              "fixed_element sunset_marine_atmosphere: dim, humid sunset merging with a cold sea-gray haze.",
              "fixed_element rain_slick_deck: deck floor noticeably slick with rainwater and sea spray.",
              "In-woo is treated as an unregistered Asian man since his ID is not in allowed base entity ids."
            ],
            "creative_decisions": [
              "Using the doorway from the reference to frame the shot and act as a shared anchor space between the two characters.",
              "Contrasting cool interior shadows with a weak orange-gray backlight to emphasize tension without using temporal or action-mixing language."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "9a04e3929f8917d4",
              "owned_hash": "42cfab1203ec82d1",
              "camera_direction_hash": "96866822470c2087",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "doorway",
                  "violating_phrase": "from the reference",
                  "reason": "The prompt explicitly references the existing doorway from the reference rather than asking to create or modify it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "deck",
                  "violating_phrase": "the rain-slick deck from the reference",
                  "reason": "The deck is mentioned as part of the referenced background, with no explicit instruction to redraw it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wheelhouse",
                  "violating_phrase": "just inside the wheelhouse from the reference",
                  "reason": "The wheelhouse is used as an existing spatial anchor from the reference, not as a new object to generate.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 26,
        "dependency_reason": "exact_background ref_usage from previous shot 6 to maintain the established environment, with fixed_elements sunset_marine_atmosphere and rain_slick_deck applied.",
        "_shot_index": 11,
        "visible_entities": [
          "C01",
          "L15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From just inside the pilothouse doorway at chest height, the stopped track resolves into a medium wide shot (MWS), eye-level, framed by the dark doorjambs like a hard frontal collision. 수리영 occupies the center-left with one hand clamped to the frame, blocking 인우's shoulder on the right as the rain-slick deck and dim sea glow recede behind them.",
            "lighting_mood": "Cool interior shadow traps the foreground while a weak orange-gray sunset backlights rain on their faces, with a faint ominous red glimmer bleeding from inside the cabin.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L15B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cleat",
              "crate",
              "deck",
              "doorway",
              "fish crate",
              "gate",
              "hatch",
              "photograph",
              "railing",
              "rope",
              "utility light",
              "water",
              "wheelhouse",
              "window"
            ],
            "camera_reference": {
              "camera_position": "just aft of number 3 on the open deck, facing into the narrow wheelhouse doorway choke point between number 3 and number 2",
              "camera_height": "eye-level standing ~1.6m",
              "lens_hint": "35mm wide angle",
              "framing_notes": "emphasize the constrained doorway width and nearby railings numbers 6 and 7 for physical blocking during confrontation"
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": "sunset_marine_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The surrounding environment is characterized by a dim, humid sunset merging with a cold sea-gray haze. Weak amber and orange-gray light softly illuminates the damp air, creating a moody and isolated marine atmosphere. The background remains enveloped in a muted grayish tone reflecting the fading light over the ocean.",
                "applies_to_shots": [
                  6,
                  8,
                  11
                ],
                "source_facts": [
                  "Scene heading: 바다 + 갑판 / 해질 무렵 (Sea + deck / around sunset)",
                  "Shot 6: Dim amber sunset mixes with cold sea-gray fill, wet deck gloom and sunset haze",
                  "Shot 8: Low, humid sunset light, shallow-focus gray",
                  "Shot 11: dim sea glow, weak orange-gray sunset backlights rain"
                ],
                "visual_inferences": [
                  "The combination of the setting sun and sea spray creates a persistently hazy, damp air quality across the entire scene."
                ],
                "creative_decisions": [
                  "Using the contrasting warm amber and cool sea-gray tones to heighten the emotional tension and sense of isolation on the small boat."
                ],
                "confidence": "high"
              },
              {
                "element_id": "rain_slick_deck",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The floor of the small boat's deck is noticeably slick with rainwater and sea spray, presenting a highly reflective, glossy surface under the faint light. The dark, weathered texture of the deck emphasizes the wet, cold, and uncomfortable conditions of the exterior environment.",
                "applies_to_shots": [
                  6,
                  11
                ],
                "source_facts": [
                  "Shot 6: wet deck gloom",
                  "Shot 11: rain-slick deck, rain on their faces"
                ],
                "visual_inferences": [
                  "The deck surface is likely made of aged, dark material that heavily reflects the ambient sunset light when coated in water."
                ],
                "creative_decisions": [
                  "Emphasizing the glossy, wet texture of the deck floor to visually anchor the characters in a harsh physical space before they move inside."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 26,
                "shot_index": 6,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O03",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L15B02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "301ea5359b318aa8"
      },
      {
        "scene_index": 27,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "방향키를 막아서는 손",
        "representative_moment": "수리영이 방향키를 돌리려는 인우의 손목을 강하게 쥐며 제지한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "low angle wrist-height close-up, striking dual-tone amber and blue dusk lighting",
            "t2i_prompt": "Photorealistic cinematic still. Very close to the helm at wrist height, low angle close-up, focus on the gripping hand of an East Asian woman in her early 20s in a dark navy windbreaker forcefully holding the tense wrist of an East Asian man in his mid 20s in a worn waterproof jumper. The hands collide in the lower center of the frame, the man's wrist angled as if twisting the helm. The P17 worn, wet-smudged steering wheel cuts diagonally through the right side as a cramped mechanical obstacle, its side rim facing the camera at an oblique angle. [L16B03: A dark, slightly worn control console surface at the lower edge anchors the interaction, grazed by a muddy amber practical light that catches on the knuckles, contrasting against the cold blue-gray dusk gloom spilling through the fogged, rain-specked window pane just beyond the hands.]",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 2 description: 방향키를 돌리려는 인우의 손목을 강하게 붙잡은 수리영의 손 클로즈업.",
              "DP instruction: Very close to the helm at wrist height... hands collide in the lower center of frame... wheel rim cuts diagonally.",
              "DP instruction: muddy amber practical from the console grazes their knuckles... cold blue-gray window light."
            ],
            "visual_inferences": [
              "fixed_element wheelhouse_dusk_lighting: sickly amber practical vs cold blue-gray gloom.",
              "fixed_element dark_boat_console: dark worn horizontal surface anchoring the close-up.",
              "Due to the body_part_focus_rule, character IDs are omitted in favor of demographic descriptors (East Asian woman/man) to ensure the T2I model generates an isolated wrist/hand composition without hallucinating floating faces."
            ],
            "creative_decisions": [
              "Framed tightly to exclude the full bodies and faces, focusing purely on the physical tension at the steering wheel.",
              "Incorporated the P17 steering wheel diagonally to act as a visual and mechanical barrier, isolating the action against the L16B03 console and fogged window edge."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "e29e01e68858cbd9",
              "owned_hash": "7a1f375a15beb5d2",
              "camera_direction_hash": "d9887f5067e9415d",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "C05",
          "P17"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Very close to the helm at wrist height, this close-up (CU), low angle tightens beside the steering wheel so only 인우's tense wrist, 수리영's gripping hand, and a sliver of the control area remain visible. The dolly-in pressure makes the hands collide in the lower center of frame, while the wheel rim cuts diagonally through the right side as a cramped mechanical barrier.",
            "lighting_mood": "A muddy amber practical from the console grazes their knuckles, while cold blue-gray window light leaves the cramped cabin humid and bruised.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C05",
              "P17"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              },
              {
                "character_id": "C05",
                "outlook_id": "O10"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L16B03",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "wheelhouse_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the boat cabin is defined by a striking dual-tone lighting environment. A sickly, muddy amber practical light from the control area casts a weak, yellowish glow over the nearby surfaces and subjects. This warm artificial light contrasts sharply against the cold, damp blue-gray gloom of dusk spilling in from the windows, creating a humid and oppressive atmosphere.",
                "applies_to_shots": [
                  2,
                  5,
                  8
                ],
                "source_facts": [
                  "Shot 2: A muddy amber practical from the console... cold blue-gray window light",
                  "Shot 5: lit by a weak yellow cabin practical and cold window spill",
                  "Shot 8: Sickly cabin yellow and cold dusk blue"
                ],
                "visual_inferences": [
                  "The consistent contrast between the interior yellow practical light and the exterior blue dusk gloom is the primary environmental characteristic visually linking these disparate shots."
                ],
                "creative_decisions": [
                  "Using the stark warm/cold color contrast to unify the spatial continuity and emotional tension across the different framing scales and camera angles."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dark_boat_console",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A dark, slightly worn horizontal control console surface located near the helm inside the boat cabin. It is partially illuminated by the nearby amber practical light, providing a flat, shadowy base for interactions and objects.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "source_facts": [
                  "Shot 2: a sliver of the control area remain visible",
                  "Shot 5: The photograph lies across the dark console"
                ],
                "visual_inferences": [
                  "The 'control area' near the steering wheel in Shot 2 and the 'dark console' supporting the photograph in Shot 5 refer to the same physical structure anchoring the close-up actions."
                ],
                "creative_decisions": [
                  "Maintaining a consistent dark, worn texture for the console surface to ground the tight hand-level shots in the same spatial context."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "55e166f83012f0fe"
      },
      {
        "scene_index": 27,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "사진 속 얼굴을 지목하는 수리영",
        "representative_moment": "A close-up of a young woman's hand strongly pressing on a girl's face in the old photograph P02.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Overhead close-up, high angle, dual-tone amber and cool blue-gray lighting",
            "t2i_prompt": "Photorealistic cinematic still. Close on a young Korean woman's hand extending from a dark navy windbreaker sleeve, the index finger forcefully pressing down on the damp, creased surface of P02, an old black-and-white photograph. The printed face of one of the two young girls in the photograph is firmly pinned under the fingertip. The rectangular edge of P02 is tilted slightly across the frame, resting flat against a dark, slightly worn horizontal control console that fills the lower frame and background. An overhead high angle looking down captures this frozen evidentiary composition. A muddy amber practical light washes over the knuckles and the right side of the console, contrasting sharply with a cold blue-gray dusk gloom pooling on the left edge of P02, turning the monochrome image slightly green-gray. A dusty round gauge face peeks from the upper edge of the frame, its numbers barely visible toward the camera. Humid, hazy air softens the dark surroundings.",
            "outfit_assignments": [],
            "source_facts": [
              "S29 action: 수리영 points at one child in the photo, saying it is her mother.",
              "Shot description: Close above the old photograph at hand level, finger presses one of the two girls.",
              "Prop constraint: P02 must be identified by its ID."
            ],
            "visual_inferences": [
              "fixed_element dark_boat_console provides the flat background surface directly below the photo.",
              "fixed_element wheelhouse_dusk_lighting applies warm amber and cold blue-gray tones directly onto the hand, photo, and console surface."
            ],
            "creative_decisions": [
              "Used 'Close on' trigger to focus solely on the hand and P02, applying the body-part focus rule to omit the C##O## composite and replace it with a demographic noun.",
              "Tilted P02 slightly to create visual tension within the static high-angle frame, emphasizing the forceful press of the finger."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "2d0b876a549e3a53",
              "owned_hash": "cc274d34a2a21947",
              "camera_direction_hash": "2279388094c678ad",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 27,
        "dependency_reason": "Exact background constraint requires maintaining the established dark console surface and dusk lighting from Shot 2, while focusing closely on the hand and prop.",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "P02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Close above the old photograph at hand level, this close-up (CU), high angle holds completely still as 수리영's finger presses one of the two girls in the image near the lower-right foreground. The photograph lies across the dark console, its rectangular edge tilted slightly across the frame, while her fingertip creates the only forceful movement in an otherwise frozen evidentiary composition.",
            "lighting_mood": "The photo is lit by a weak yellow cabin practical and cold window spill, with the old monochrome image turning green-gray under the damp coastal gloom.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L16B01",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "wheelhouse_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the boat cabin is defined by a striking dual-tone lighting environment. A sickly, muddy amber practical light from the control area casts a weak, yellowish glow over the nearby surfaces and subjects. This warm artificial light contrasts sharply against the cold, damp blue-gray gloom of dusk spilling in from the windows, creating a humid and oppressive atmosphere.",
                "applies_to_shots": [
                  2,
                  5,
                  8
                ],
                "source_facts": [
                  "Shot 2: A muddy amber practical from the console... cold blue-gray window light",
                  "Shot 5: lit by a weak yellow cabin practical and cold window spill",
                  "Shot 8: Sickly cabin yellow and cold dusk blue"
                ],
                "visual_inferences": [
                  "The consistent contrast between the interior yellow practical light and the exterior blue dusk gloom is the primary environmental characteristic visually linking these disparate shots."
                ],
                "creative_decisions": [
                  "Using the stark warm/cold color contrast to unify the spatial continuity and emotional tension across the different framing scales and camera angles."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dark_boat_console",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A dark, slightly worn horizontal control console surface located near the helm inside the boat cabin. It is partially illuminated by the nearby amber practical light, providing a flat, shadowy base for interactions and objects.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "source_facts": [
                  "Shot 2: a sliver of the control area remain visible",
                  "Shot 5: The photograph lies across the dark console"
                ],
                "visual_inferences": [
                  "The 'control area' near the steering wheel in Shot 2 and the 'dark console' supporting the photograph in Shot 5 refer to the same physical structure anchoring the close-up actions."
                ],
                "creative_decisions": [
                  "Maintaining a consistent dark, worn texture for the console surface to ground the tight hand-level shots in the same spatial context."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 27,
                "shot_index": 2,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "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": 27,
                "shot_indices": [
                  5
                ],
                "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"
            }
          }
        },
        "render_prompt_card_hash": "8e04ac2fab0133a6"
      },
      {
        "scene_index": 27,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "불길한 표식의 발견",
        "representative_moment": "어두운 인우의 어깨 너머로 조타실 뒷벽을 빼곡히 채운 기괴한 붉은 원형 표식들이 선명하게 드러난다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Over-the-shoulder medium shot, eye-level observer POV, sickly amber and cold blue dusk lighting contrast",
            "t2i_prompt": "Photorealistic cinematic still. Occupying the left foreground in an over-the-shoulder medium composition, C05O10 in a worn waterproof jumper, a young Asian man, stands with back to camera, his shoulders locked rigid as a dark human-shaped barrier. Focus on the rear wall panel from the reference filling the middle distance. The wall panel is square to the camera, its dark stained surface densely covered with hand-drawn P08 red circular markings and smears. A muddy amber practical light from the ceiling casing casts a weak yellowish glow falling on his shoulder and the marked wall, contrasting sharply against the cold blue-gray dusk gloom spilling from the condensed side window glass at the frame edge. The P08 red circles stand out as the only saturated color against the humid, cramped black shadows of the wheelhouse interior.",
            "outfit_assignments": [
              {
                "character_id": "C05",
                "outlook_id": "O10"
              }
            ],
            "source_facts": [
              "S#29 action: '인우 얼굴 너머에 보이는 조타실안 수많은 원. 빙글빙글 돌고 여기에서 또다시 발견된 붉은 원!'",
              "Shot description: 인우의 등 뒤, 어두운 조타실 벽면을 빼곡하게 채운 기괴한 붉은 원형 표식들의 정지 화면."
            ],
            "visual_inferences": [
              "fixed_element wheelhouse_dusk_lighting: muddy amber practical vs cold blue-gray dusk gloom.",
              "Inwoo's back forms a dark silhouette anchoring the left foreground in the OTS reveal.",
              "P08 markings are the dominant focal point on the square-facing rear wall panel."
            ],
            "creative_decisions": [
              "Maintained C05 in deep silhouette shadow to emphasize the saturated red of P08 on the background wall.",
              "Included the condensed side window glass to reinforce the cold, humid, oppressive dusk atmosphere without breaking the cramped spatial constraint."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "5c6d54c12fd53a2d",
              "owned_hash": "cc274d34a2a21947",
              "camera_direction_hash": "72352fd2c28fe81a",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "wall panel",
                  "violating_phrase": "rear wall panel from the reference",
                  "reason": "The phrase explicitly refers to the existing wall panel from the reference, so it is an anchor rather than a request to redraw it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "side window glass at the frame edge",
                  "reason": "The window is only used as an existing framing element at the edge of the shot, not as a newly created or modified object.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 27,
        "dependency_reason": "Shot 5의 조타실 내부 배경(exact_background) 및 wheelhouse_dusk_lighting 조명 연속성 유지",
        "_shot_index": 8,
        "visible_entities": [
          "C05",
          "P08",
          "L16"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "After sliding behind 인우, the camera stops at shoulder height in a medium shot (MS), eye-level, using an over-the-shoulder reveal: his dark back anchors the left foreground while the rear wall fills the middle distance with dense red circular markings. The frame freezes into direct observer vision, keeping 인우 mostly silhouette and letting the occult pattern stare back from the dim wheelhouse wall.",
            "lighting_mood": "Sickly cabin yellow and cold dusk blue leave the room nearly black, while the red circles pulse as the only saturated color against the humid shadows.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C05",
              "P08",
              "L16"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C05",
                "outlook_id": "O10"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L16B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "GPS",
              "bench locker",
              "chair",
              "console",
              "door",
              "fuse panel",
              "helm wheel",
              "marking",
              "photo",
              "radio",
              "switch panel",
              "throttle",
              "wall panel",
              "window",
              "windshield"
            ],
            "camera_reference": {
              "camera_position": "near number 13 (storage bench) in the aft standing zone, facing diagonally toward number 11 (marked wall panel) and number 12 (old photo clue), with number 7 (helm wheel and throttle) peripheral in the foreground",
              "camera_height": "eye-level standing ~1.55m",
              "lens_hint": "35mm moderate wide angle",
              "framing_notes": "include number 11 and number 12 prominently; keep the wheelhouse visibly cramped"
            },
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'",
              "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": "wheelhouse_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the boat cabin is defined by a striking dual-tone lighting environment. A sickly, muddy amber practical light from the control area casts a weak, yellowish glow over the nearby surfaces and subjects. This warm artificial light contrasts sharply against the cold, damp blue-gray gloom of dusk spilling in from the windows, creating a humid and oppressive atmosphere.",
                "applies_to_shots": [
                  2,
                  5,
                  8
                ],
                "source_facts": [
                  "Shot 2: A muddy amber practical from the console... cold blue-gray window light",
                  "Shot 5: lit by a weak yellow cabin practical and cold window spill",
                  "Shot 8: Sickly cabin yellow and cold dusk blue"
                ],
                "visual_inferences": [
                  "The consistent contrast between the interior yellow practical light and the exterior blue dusk gloom is the primary environmental characteristic visually linking these disparate shots."
                ],
                "creative_decisions": [
                  "Using the stark warm/cold color contrast to unify the spatial continuity and emotional tension across the different framing scales and camera angles."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 27,
                "shot_index": 5,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C05O10",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L16B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "ad124a2e0d96344a"
      },
      {
        "scene_index": 28,
        "heading": "S#30. 바다 / 해질 무렵",
        "beat_title": "안개 속으로 사라지는 어선",
        "representative_moment": "안개벽 속으로 뱃머리가 반쯤 집어삼켜진 낡은 어선의 뒷모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low angle wide shot tracking behind the stern, flat gray fog crushing the last gold sunset",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the battered rear rail of the old fishing boat. Directly behind the vessel at stern height, low angle tracking along the centerline just above the wake. The dark, weathered, wet stern silhouette occupies the lower middle of the frame, with the bow disappearing halfway into the dense, motionless-looking gray fog wall. A heavy band of blank gray fog swallows the upper half of the image. In the foreground, a churned, gray-white foaming wake trails off the stern into the frame. The dark, rain-dimpled, black-green sea surface reflects a broken smear of gold sunset and the boat's stern shadow beneath the hull. The last gold of sunset is flattened by cold gray fog, turning the boat into a damp silhouette with only faint bronze highlights catching on the wake.",
            "outfit_assignments": [],
            "source_facts": [
              "S#30 action: '세상과 경계를 지우는 것 같은 짙은 안개 띠. 서서히 안개 안으로 들어가는 인우의 배.'",
              "shot description: 짙은 안개벽 속으로 뱃머리가 반쯤 집어삼켜진 낡은 어선의 뒷모습."
            ],
            "visual_inferences": [
              "low angle placement directly behind the stern tracking the wake",
              "the boat is entirely a silhouette against the fog and sunset reflection"
            ],
            "creative_decisions": [
              "arranged the foaming wake leading straight to the lower middle frame for a strong vanishing point perspective",
              "contrasted the cold gray fog dominating the upper frame with the faint bronze highlights on the lower water surface"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "34ca53dfb0b904c9",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "c26f81ddb5927bac",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "독립적인 외부 환경 묘사 샷",
        "_shot_index": 3,
        "visible_entities": [
          "L17"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 28,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Directly behind the old fishing boat at stern height, this wide shot (WS), low angle tracks along the centerline just above the wake as the stern silhouette occupies the lower middle of frame and the bow disappears halfway into the fog wall. The composition stays tight enough to read the boat's battered rear rail and cabin outline, but leaves a heavy band of blank gray fog swallowing the upper half of the image.",
            "lighting_mood": "The last gold of sunset is flattened by cold gray fog, turning the boat into a damp silhouette with only faint bronze highlights on the wake.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L17"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a common noun + demographic descriptor instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the common-noun rule applies only to a face reproduction, not to the prop entity.",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [],
            "readiness_policy": "not_applicable",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "2b597d76cc077558"
      }
    ],
    "consumed_bg_catalog_hash": "d416ac4b47723c22",
    "consumed_shot_binding_hash": "7e96fc96a43e8f42"
  },
  "step_id": "scene_detail",
  "run_id": "12957805-6913-40e7-abdc-f5322526e7ed",
  "resolved_model": "gemini-pro",
  "updated_at": "2026-05-14T02:04:59.887770+00:00",
  "project_config_snapshot": {}
}