{
  "status": "completed",
  "completed_count": 6,
  "applicable_count": 6,
  "failed_count": 0,
  "schema_version": 13,
  "config_hash": "8a27f5e9ed3b6cac",
  "data": {
    "scenes": [
      {
        "scene_index": 1,
        "heading": "#1. 정비소 안 – 저녁",
        "beat_title": "응급 상황을 알리는 연희",
        "representative_moment": "가쁜 숨을 내쉬며 정비소 안으로 뛰어 들어온 연희의 상체",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At chest height just inside one side of the doorway, the tracking move settles into a fixed oblique three-quarter view of 연희, whose upper body occupies roughly two-thirds of the frame.",
            "t2i_prompt": "Photorealistic cinematic still. Seen from chest height just inside one side of the open door, C02O02 in a wet yellow raincoat, an Asian woman in her 20s with neat black hair, stands halted just past the entrance. Her upper body occupies roughly two-thirds of the frame at three-quarter angle from the right. Her mouth is open, shoulders heaving, eyes fixed off-screen on a figure deeper inside. The edge of the open door forms a narrow side frame around her, its interior edge facing the camera, leading out to the dark evening and contrasting the indoor lighting with the nighttime exterior. [L01: The narrow repair shop is illuminated by a single overhead fluorescent light creating a subdued atmosphere, featuring an old upturned bicycle frame at an oblique angle, alongside a grease-stained workbench with an open toolbox on top, all receding diagonally into the dim space.]",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "scene_text: '연희(20대), 노란 우비를 입고 손전등을 든 채로 문을 밀고 들어선다. 숨이 가쁘고 어깨가 젖어 있다.'",
              "shot description: '정비소 안으로 들어와 입을 벌린 채 가쁜 숨을 내쉬는 고정된 자세로 서 있는 연희의 상체'"
            ],
            "visual_inferences": [
              "fixed_element workshop_lighting_and_doorway: single overhead fluorescent light, subdued atmosphere, contrasting nighttime exterior"
            ],
            "creative_decisions": [
              "camera position from chest height just inside the door to frame her upper body at a three-quarter angle",
              "using the open door as a narrow side frame to emphasize her position at the threshold",
              "arranging the workbench and bicycle diagonally to create depth behind the character"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bicycle",
                "usage_kind": "anchor",
                "source_phrase": "old upturned bicycle frame"
              },
              {
                "owned_token": "bicycle repair stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "edge of the open door"
              },
              {
                "owned_token": "fluorescent light",
                "usage_kind": "anchor",
                "source_phrase": "single overhead fluorescent light"
              },
              {
                "owned_token": "toolbox",
                "usage_kind": "anchor",
                "source_phrase": "open toolbox"
              },
              {
                "owned_token": "workbench",
                "usage_kind": "anchor",
                "source_phrase": "grease-stained workbench"
              },
              {
                "owned_token": "wrench",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d7880812a68cc34b",
              "owned_hash": "80d92c473b29a1ca",
              "camera_direction_hash": "77dd0ac40cb4d280",
              "owned_usage_hash": "dd75e1a957c79840",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "open door, its interior edge facing the camera",
                  "reason": "The prompt references the door purely as a spatial framing anchor for the character without ordering a redraw, matching the producer anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fluorescent light",
                  "violating_phrase": "single overhead fluorescent light",
                  "reason": "The prompt mentions the fluorescent light to describe existing ambient illumination in the space, matching the producer anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bicycle",
                  "violating_phrase": "old upturned bicycle frame",
                  "reason": "The prompt mentions the bicycle frame as a background environmental anchor without instructing a redraw, matching the producer anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "workbench",
                  "violating_phrase": "grease-stained workbench",
                  "reason": "The prompt references the existing workbench as part of the receding workshop background, matching the producer anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "toolbox",
                  "violating_phrase": "open toolbox on top",
                  "reason": "The prompt references the toolbox resting on the workbench as background environmental detail, matching the producer anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No dependent scene specified",
        "_shot_index": 3,
        "visible_entities": [
          "C02",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height just inside one side of the doorway, the tracking move settles into a fixed oblique three-quarter view of 연희, whose upper body occupies roughly two-thirds of the frame. She has halted just past the entrance with her mouth open and shoulders heaving, her attention fixed on 민수 deeper inside while the doorway edge and workshop recede behind her.",
            "lighting_mood": "A single overhead fluorescent light provides restrained illumination, with evening darkness held beyond the open doorway.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "not_applicable": true,
                "not_applicable_reason": "이 샷의 visible_entities 에 인물이 1명이라 두 인물 사이의 공유 anchor 규칙은 성립하지 않는다",
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "not_applicable": true,
                  "not_applicable_reason": "framing_scale=medium — close 규칙은 이 샷에 해당하지 않는다"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "framing_scale binds entity rendering — close = primary subject 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",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L01B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bicycle",
              "bicycle repair stand",
              "door",
              "fluorescent light",
              "toolbox",
              "workbench",
              "wrench"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "workshop_lighting_and_doorway",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The narrow repair shop is illuminated by a single overhead fluorescent light that creates a subdued atmosphere. An open doorway leads out to the dark evening, contrasting the indoor lighting with the nighttime exterior.",
                "element_scope": "full",
                "applies_to_shots": [
                  3,
                  4
                ],
                "source_facts": [
                  "좁은 정비소. 형광등 하나가 천장에 매달려 있다.",
                  "A single overhead fluorescent light provides restrained illumination",
                  "evening darkness held beyond the open doorway",
                  "The same overhead fluorescent illumination"
                ],
                "visual_inferences": [
                  "The overhead light casts a focused glow in the center of the workspace, leaving the edges of the room slightly softer and darker."
                ],
                "creative_decisions": [
                  "Use the open doorway and the contrast of evening darkness outside to establish a consistent spatial relationship for both characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O02",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L01B01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "4bbd8a530023124e"
      },
      {
        "scene_index": 1,
        "heading": "#1. 정비소 안 – 저녁",
        "beat_title": "응급 상황 인지",
        "representative_moment": "민수가 자전거 체인에 손을 얹은 채 고개를 들어 문 쪽을 바라보고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight three-quarter close view, shallow depth of field, subdued contrast",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a dark navy worker uniform, an Asian man in his 40s, occupies the middle-center foreground, seen in a tight three-quarter close view from the left. His head is raised, eyes fixed on an off-screen character at the doorway. One oil-marked working hand rests on the inverted old bicycle chain spanning the lower frame edge, anchoring the composition. The figure is lit by a single overhead fluorescent light that keeps his face plainly visible. Behind him, the subdued workshop environment and the open doorway leading to the dark evening dissolve into a soft, out-of-focus blur along his eyeline, providing spatial depth without sharp background details.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "민수가 손을 멈추고 고개를 든다.",
              "자전거 체인을 손보는 중이다. 손끝에 기름이 묻어 있다.",
              "Shot 4 description: 자전거 체인에 손을 올린 채 문 쪽을 향해 고개를 든 민수의 얼굴"
            ],
            "visual_inferences": [
              "fixed_element workshop_lighting_and_doorway: single overhead fluorescent light, subdued atmosphere, open doorway to dark evening.",
              "Shallow depth of field isolates the subject's expression from the background workshop.",
              "The tight three-quarter angle captures his immediate reaction to the off-screen news."
            ],
            "creative_decisions": [
              "Placed the oil-marked hand and bicycle chain at the lower edge to establish the interrupted action within the close frame.",
              "Used the out-of-focus open doorway in the background to indicate the target of his gaze without cluttering the tight composition."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle repair stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fluorescent light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "toolbox",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "workbench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wrench",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b0ca84f8d72c4e89",
              "owned_hash": "80d92c473b29a1ca",
              "camera_direction_hash": "f76aa6583ad76456",
              "owned_usage_hash": "72745f5865e8a42c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The diagonal push from 연희's side ends slightly below 민수's face in a tight three-quarter close view, retaining his chain-resting hand at the lower edge as a scale and action reference. 민수 remains bent over the bicycle but lifts his head toward 연희 at the doorway; the doorway stays soft in the background along his eyeline, ready for the ensuing tilt down his arm.",
            "lighting_mood": "The same overhead fluorescent illumination keeps 민수's face and oil-marked working hand plainly visible against the subdued workshop.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "not_applicable": true,
                "not_applicable_reason": "이 샷의 visible_entities 에 인물이 1명이라 두 인물 사이의 공유 anchor 규칙은 성립하지 않는다",
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "not_applicable": true,
                  "not_applicable_reason": "framing_scale=close — wide/medium 규칙은 이 샷에 해당하지 않는다"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "target_kind": "character",
                  "target_id": "C01",
                  "label": "민수",
                  "screen_zone": "middle_center",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": ""
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L01B01",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "workshop_lighting_and_doorway",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The narrow repair shop is illuminated by a single overhead fluorescent light that creates a subdued atmosphere. An open doorway leads out to the dark evening, contrasting the indoor lighting with the nighttime exterior.",
                "element_scope": "full",
                "applies_to_shots": [
                  3,
                  4
                ],
                "source_facts": [
                  "좁은 정비소. 형광등 하나가 천장에 매달려 있다.",
                  "A single overhead fluorescent light provides restrained illumination",
                  "evening darkness held beyond the open doorway",
                  "The same overhead fluorescent illumination"
                ],
                "visual_inferences": [
                  "The overhead light casts a focused glow in the center of the workspace, leaving the edges of the room slightly softer and darker."
                ],
                "creative_decisions": [
                  "Use the open doorway and the contrast of evening darkness outside to establish a consistent spatial relationship for both characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "c5f45648be438e51"
      },
      {
        "scene_index": 2,
        "heading": "#2. 갈래길 – 저녁",
        "beat_title": "노인의 의식 확인",
        "representative_moment": "연희의 손전등에서 뻗어 나온 불빛이 쓰러진 노인(C03)의 감은 두 눈을 밝힌다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close observer perspective from just above the ground, high-contrast spotlight effect highlighting the subject's closed eyes",
            "t2i_prompt": "Photorealistic cinematic still. C03O03 in a gray coat, an elderly Asian man in his 70s, is lying motionless on his side on the ground in the lower-center foreground. Captured from just above the ground in a close frame, his face is shown in right profile, completely unconscious with his eyes closed. At the upper-left edge of the frame, a young Asian woman in a yellow raincoat is partially visible at a three-quarter left angle, leaning in with her arm extended. Her eyes are fixed on C03O03 as her hand grips a small flashlight pointed diagonally down at his face. The flashlight creates a concentrated circular highlight directly on C03O03's closed eyes, leaving the rest of his features in soft shadow. The immediate outdoor paved ground around his head is visibly wet and dark, reflecting subdued, elongated streaks of light from an unseen streetlamp.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "노인(70대)이 회색 외투 차림으로 눈을 감은 채 옆으로 누워 있다.",
              "연희가 손전등을 켜서 노인의 얼굴 쪽을 조심스럽게 비춘다.",
              "젖은 바닥에 불빛이 길게 번져 있다.",
              "shot description: A close view of the side-lying subject’s face, especially the two closed eyes illuminated by the flashlight"
            ],
            "visual_inferences": [
              "fixed_element old_man_lying_state: lying motionless on his side, unconscious, posture limp",
              "fixed_element wet_pavement_environment: outdoor paved ground is visibly wet and dark, reflecting scattered lights",
              "close framing restricts the standing woman to partial visibility at the upper frame edge"
            ],
            "creative_decisions": [
              "Positioned the woman at the upper-left boundary to maintain the close frame focus tightly on the old man's face",
              "Emphasized the stark contrast between the bright circular beam on the eyelids and the dim, wet asphalt to amplify the tension"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "94dda8f53f3c5318",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "0149b5cac00da5bd",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No prior visual dependency explicitly modeled via previous_shot_refs for this frame.",
        "_shot_index": 4,
        "visible_entities": [
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "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 just above the ground on the side opposite 연희, the dolly-in ends diagonally across the 노인's face as the circular flashlight beam reaches his closed eyes. His face occupies the lower center while 연희 leans in at the upper opposite edge, her extended hand and small flashlight remaining visible without obscuring her careful gaze toward him.",
            "lighting_mood": "The flashlight creates a concentrated circular highlight on the 노인's closed eyes while the flickering streetlight remains subdued across the wet ground.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "not_applicable": true,
                "not_applicable_reason": "이 샷의 visible_entities 에 인물이 1명이라 두 인물 사이의 공유 anchor 규칙은 성립하지 않는다",
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "not_applicable": true,
                  "not_applicable_reason": "framing_scale=close — wide/medium 규칙은 이 샷에 해당하지 않는다"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "target_kind": "character",
                  "target_id": "C03",
                  "label": "노인",
                  "screen_zone": "lower_center",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": ""
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "old_man_lying_state",
                "element_type": "character_state",
                "character_name": "Old man",
                "description": "An elderly Korean man in his 70s is lying motionless on his side on the ground. He is wearing a gray coat. His eyes are completely closed, indicating an unconscious state.",
                "element_scope": "full",
                "applies_to_shots": [
                  4,
                  6
                ],
                "source_facts": [
                  "노인(70대)이 회색 외투 차림으로 눈을 감은 채 옆으로 누워 있다.",
                  "lying on one side, gaze=closed_eyes, state=unconscious"
                ],
                "visual_inferences": [
                  "His body posture is completely relaxed and limp due to being unconscious."
                ],
                "creative_decisions": [
                  "The gray coat is slightly damp from being in contact with the wet pavement, adding weight to his helpless appearance."
                ],
                "confidence": "high"
              },
              {
                "element_id": "wet_pavement_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor paved ground is visibly wet and dark. The moisture on the surface creates distinct, elongated reflections from a subdued, flickering streetlight and the bright spill of a nearby flashlight.",
                "element_scope": "full",
                "applies_to_shots": [
                  4,
                  6
                ],
                "source_facts": [
                  "젖은 바닥에 불빛이 길게 번져 있다.",
                  "flickering streetlight remains subdued across the wet ground.",
                  "wet-ground setting",
                  "intermittent streetlight illumination and restrained flashlight spill"
                ],
                "visual_inferences": [
                  "The ground is an uneven asphalt surface typical of a neighborhood intersection, causing the light reflections to break and warp slightly."
                ],
                "creative_decisions": [
                  "High contrast is maintained between the dark, shadowy pavement and the sharp, glaring highlights of the flashlight and streetlight reflections to emphasize the dramatic tone."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "8f327b7d68c2bcf2"
      },
      {
        "scene_index": 2,
        "heading": "#2. 갈래길 – 저녁",
        "beat_title": "민수가 쓰러진 노인의 어깨를 흔들며 의식을 확인하는 순간",
        "representative_moment": "C01O01 kneels and firmly shakes the shoulders of the unconscious C03O03 on the wet pavement.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Ground-level lateral close framing emphasizing physical tension and wet reflections",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a dark navy worker uniform, an Asian middle-aged man, positioned in the middle-right foreground, reaches for the shoulders of C03O03 in a gray coat, an Asian elderly man, lying motionless in the middle-left foreground. A ground-level lateral camera keeps both figures on the same oblique plane. C03O03 is completely relaxed on one side in left profile at the left edge, eyes completely closed, indicating an unconscious state. C01O01 is kneeling at three-quarter angle from the right, lowered face near the upper-right edge, eyes fixed on C03O03. The close framing isolates C01O01's two gripping hands centered over the gray coat shoulders. He transfers visible force through forearms tensed forward into a decisive shake, pressing into the damp fabric. The [: visibly wet and dark outdoor paved ground] bounds the lower frame, its surface moisture creating distinct, elongated reflections from an intermittent streetlight and a restrained flashlight spill.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "민수가 노인 옆에 무릎을 꿇고 어깨를 가만히 흔들어 본다.",
              "노인(70대)이 회색 외투 차림으로 눈을 감은 채 옆으로 누워 있다.",
              "젖은 바닥에 불빛이 길게 번져 있다.",
              "flickering streetlight remains subdued across the wet ground."
            ],
            "visual_inferences": [
              "fixed_element old_man_lying_state: His body posture is completely relaxed and limp due to being unconscious.",
              "fixed_element wet_pavement_environment: The ground is an uneven asphalt surface causing the light reflections to break and warp slightly.",
              "Minsu's tensed forearms and gripping hands convey physical tension transferred to the old man's shoulders."
            ],
            "creative_decisions": [
              "Ground-level lateral angle keeps both figures on the same oblique plane to emphasize their physical interaction.",
              "Close framing strictly focuses on the hands and shoulders to highlight the compression and force of the shake while retaining edge visibility of faces."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "9a82e731e1be3c78",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "db04b9226d833375",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 2,
        "dependency_reason": "Shot 4에서 설정된 젖은 바닥 환경과 노인이 누워있는 자세(fixed_elements)의 연속성 유지",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The ground-level lateral track nearly settles beside the 노인's upper body, with 민수's two gripping hands centered over the coat shoulders and his lowered face retained near the upper-right edge. The 노인's closed profile remains at the left edge as 민수 kneels and transfers visible force through tensed forearms into the careful shake, keeping both men on the same oblique plane.",
            "lighting_mood": "Intermittent streetlight illumination and restrained flashlight spill reveal the pressure in 민수's hands against the wet-ground setting.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "wide_medium_rules": {
                  "not_applicable": true,
                  "not_applicable_reason": "framing_scale=close — wide/medium 규칙은 이 샷에 해당하지 않는다"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "target_kind": "character",
                  "target_id": "C01",
                  "label": "민수",
                  "screen_zone": "middle_right",
                  "depth_plane": "foreground",
                  "gesture_action": "reaches_for",
                  "gesture_target_label": "노인의 양어깨"
                },
                {
                  "constraint_id": "fsc_002",
                  "target_kind": "character",
                  "target_id": "C03",
                  "label": "노인",
                  "screen_zone": "middle_left",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": ""
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "old_man_lying_state",
                "element_type": "character_state",
                "character_name": "Old man",
                "description": "An elderly Korean man in his 70s is lying motionless on his side on the ground. He is wearing a gray coat. His eyes are completely closed, indicating an unconscious state.",
                "element_scope": "full",
                "applies_to_shots": [
                  4,
                  6
                ],
                "source_facts": [
                  "노인(70대)이 회색 외투 차림으로 눈을 감은 채 옆으로 누워 있다.",
                  "lying on one side, gaze=closed_eyes, state=unconscious"
                ],
                "visual_inferences": [
                  "His body posture is completely relaxed and limp due to being unconscious."
                ],
                "creative_decisions": [
                  "The gray coat is slightly damp from being in contact with the wet pavement, adding weight to his helpless appearance."
                ],
                "confidence": "high"
              },
              {
                "element_id": "wet_pavement_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor paved ground is visibly wet and dark. The moisture on the surface creates distinct, elongated reflections from a subdued, flickering streetlight and the bright spill of a nearby flashlight.",
                "element_scope": "full",
                "applies_to_shots": [
                  4,
                  6
                ],
                "source_facts": [
                  "젖은 바닥에 불빛이 길게 번져 있다.",
                  "flickering streetlight remains subdued across the wet ground.",
                  "wet-ground setting",
                  "intermittent streetlight illumination and restrained flashlight spill"
                ],
                "visual_inferences": [
                  "The ground is an uneven asphalt surface typical of a neighborhood intersection, causing the light reflections to break and warp slightly."
                ],
                "creative_decisions": [
                  "High contrast is maintained between the dark, shadowy pavement and the sharp, glaring highlights of the flashlight and streetlight reflections to emphasize the dramatic tone."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 2,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "4b6d1fa07daeda7e"
      },
      {
        "scene_index": 3,
        "heading": "정비소 안 – 밤",
        "beat_title": "노인을 살피는 민수",
        "representative_moment": "담요를 덮고 누운 노인 곁에 민수가 쪼그려 앉아 그의 얼굴을 살핀다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "crouching-height medium framing with cool overhead fluorescent illumination",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a dark navy work uniform, an Asian man in his 40s with short black hair, squats in the middle-right foreground, looking toward the face of C03O03, an Asian man in his 70s in a gray coat showing natural facial wrinkles and short gray hair, who lies unconscious in the middle-left midground. Seen from crouching height, C01O01 appears in left profile, his folded figure positioned on the shared cleared workshop floor area. C03O03 is viewed at a three-quarter angle from the right, his eyes closed, slack and limp beneath a heavy blanket. The blanket defines his resting shape against the ground plane. Behind them, the shifted workbench sits obliquely at the edge of the opened space. The overhead fluorescent light casts a cold and restrained illumination across the utilitarian workshop interior, holding the scene in a quiet nighttime tension.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S3 action: 형광등 불빛 아래 노인이 담요를 덮고 눈을 감은 채 누워 있다. 민수가 노인 곁에 쪼그려 앉아 있다.",
              "shot description: 담요 덮은 노인 곁에 쪼그려 앉아 노인의 얼굴을 향해 시선을 둔 민수의 측면"
            ],
            "visual_inferences": [
              "fixed_element: repair_shop_environment illuminated by overhead fluorescent lighting",
              "low camera height (crouching) anchors both characters onto the shared floor plane"
            ],
            "creative_decisions": [
              "medium framing clearly shows the spatial tension between the squatted figure and the resting figure",
              "cool fluorescent lighting contrasting with the nighttime mood to build quiet tension"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bicycle repair stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blanket",
                "usage_kind": "redraw",
                "source_phrase": "beneath a heavy blanket. The blanket defines his resting shape"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fluorescent light",
                "usage_kind": "anchor",
                "source_phrase": "overhead fluorescent light casts a cold and restrained illumination"
              },
              {
                "owned_token": "workbench",
                "usage_kind": "anchor",
                "source_phrase": "shifted workbench sits obliquely at the edge"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8d5700344127dcaa",
              "owned_hash": "348b6229c25e17d0",
              "camera_direction_hash": "5fe04d7e4ce8ae0a",
              "owned_usage_hash": "6451ac7ac185c657",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "blanket",
                  "violating_phrase": "beneath a heavy blanket. The blanket defines his resting shape",
                  "reason": "t2i_prompt depicts the blanket draped over the resting character, which is structurally required by shot_intent ('담요를 덮고 누운 노인'), satisfying narrow exception (1).",
                  "verdict": "allowed_visual_state_change"
                },
                {
                  "owned_object": "fluorescent light",
                  "violating_phrase": "overhead fluorescent light casts a cold and restrained illumination",
                  "reason": "t2i_prompt mentions the light source as an environmental lighting anchor without generating a new fixture, matching the producer anchor echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "workbench",
                  "violating_phrase": "shifted workbench sits obliquely at the edge",
                  "reason": "t2i_prompt references the workbench purely as a spatial background anchor, matching the producer anchor echo.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "exact_background continuity from previous shots inside the repair shop to maintain consistent utilitarian environment and lighting",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "C03",
          "P05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 3,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At crouching height beside 민수, the inward move settles slightly off his profile axis, placing his folded figure in the near right half and the 노인's blanket-framed face beyond him at left. 민수 remains squatted close to the floor with his head lowered toward the 노인, whose face is retained as the clear endpoint of his silent, unwavering gaze.",
            "lighting_mood": "The overhead fluorescent light gives the cleared workshop area restrained illumination and holds the scene in a quiet nighttime tension.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "not_applicable": true,
                  "not_applicable_reason": "framing_scale=medium — close 규칙은 이 샷에 해당하지 않는다"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "target_kind": "character",
                  "target_id": "C01",
                  "label": "민수",
                  "screen_zone": "middle_right",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "노인의 얼굴"
                },
                {
                  "constraint_id": "fsc_002",
                  "target_kind": "character",
                  "target_id": "C03",
                  "label": "노인",
                  "screen_zone": "middle_left",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": ""
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject 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",
              "P05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L01B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bicycle repair stand",
              "blanket",
              "door",
              "fluorescent light",
              "workbench"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "repair_shop_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the auto repair shop is illuminated by overhead fluorescent lighting, casting a cold and restrained light across the space. The area serves as a utilitarian workshop, maintaining a consistent quiet nighttime tension as the artificial interior light contrasts with the dark surroundings.",
                "element_scope": "full",
                "applies_to_shots": [
                  2,
                  3
                ],
                "source_facts": [
                  "정비소 안 – 밤",
                  "형광등 불빛 아래",
                  "The overhead fluorescent light gives the cleared workshop area restrained illumination (Shot 2)",
                  "Fluorescent interior light falls off toward the dark nighttime alley (Shot 3)"
                ],
                "visual_inferences": [
                  "The light casts a stark, slightly harsh glow typical of fluorescent tubes in a garage setting.",
                  "The background feels utilitarian and sparse, focusing attention on the characters' immediate actions."
                ],
                "creative_decisions": [
                  "Emphasize the stark boundary between the illuminated interior and the dark night outside to build a tense, waiting atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L01B02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "5eb3c58a6b3811eb"
      },
      {
        "scene_index": 3,
        "heading": "#3. 정비소 안 – 밤",
        "beat_title": "초조하게 구급차를 기다리며 밖을 살피던 상태 → 구급차가 곧 온다는 말에 수긍하며 차분함을 유지하는 상태",
        "representative_moment": "정비소 문가에 서서 손전등을 쥔 채 바깥 어두운 골목을 향해 목을 빼고 있는 연희의 뒷모습",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Seen from just behind and to one side at shoulder height, cool fluorescent light contrasting with dark night.",
            "t2i_prompt": "Photorealistic cinematic still. C02O02, 연희, an East Asian woman in her 20s in a yellow raincoat, stands in the middle-center midground with her back to the camera, the side of her jaw visible, looking toward the 바깥 골목 in the upper-center background. Seen from just behind and to one side at shoulder height, her figure is visible from the waist up. The open door frames the dark alley ahead. She grips the P03 handheld flashlight with her thumb near its switch, pointing the lens outward. Her neck is craned through the threshold, shoulders pitched forward as her eyes fix off-screen onto the empty destination. The interior of the auto repair shop is illuminated by an overhead fluorescent light, casting a cold and restrained glow across the utilitarian workshop. The artificial interior light falls off sharply, creating a stark contrast with the dark nighttime surroundings.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "정비소 안 – 밤",
              "형광등 불빛 아래",
              "연희는 문가에 서서 손전등을 껐다 켰다 하며 골목 쪽을 내다본다.",
              "Shot description: 정비소 문가에 서서 손전등을 쥔 채 바깥 어두운 골목을 향해 목을 빼고 있는 연희의 뒷모습",
              "Shot 3 lighting: Fluorescent interior light falls off toward the dark nighttime alley"
            ],
            "visual_inferences": [
              "fixed_element repair_shop_environment: The interior of the auto repair shop is illuminated by overhead fluorescent lighting, casting a cold and restrained light across the space.",
              "The light casts a stark, slightly harsh glow typical of fluorescent tubes in a garage setting.",
              "연희's craned neck and pitched shoulders indicate tense, focused searching."
            ],
            "creative_decisions": [
              "Framed from just behind her at shoulder height to emphasize her outward vigil against the darkness.",
              "Cool fluorescent interior light is sharply contrasted with the deep black of the outside alley to build a waiting tension."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bicycle repair stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blanket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "The open door frames the dark alley ahead"
              },
              {
                "owned_token": "fluorescent light",
                "usage_kind": "anchor",
                "source_phrase": "illuminated by an overhead fluorescent light"
              },
              {
                "owned_token": "workbench",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6552affe5e795b14",
              "owned_hash": "348b6229c25e17d0",
              "camera_direction_hash": "347d7325820d5de6",
              "owned_usage_hash": "a3a8407657b49161",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "The open door frames the dark alley ahead",
                  "reason": "The door is mentioned purely as a framing element and spatial anchor for the composition, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fluorescent light",
                  "violating_phrase": "illuminated by an overhead fluorescent light",
                  "reason": "The fluorescent light is referenced as an existing environmental light source describing scene illumination rather than being newly generated, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "앞쪽 연관 Shot — 연속성 유지",
        "_shot_index": 3,
        "visible_entities": [
          "C02",
          "P03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 3,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Just behind and to one side of 연희 at shoulder height, the camera holds her back in the middle ground while the open doorway frames the dark alley ahead. She grips the flashlight with her thumb near its switch and cranes her neck through the threshold, shoulders pitched forward as her attention searches the alley rather than the room behind her.",
            "lighting_mood": "Fluorescent interior light falls off toward the dark nighttime alley, with the handheld flashlight intermittently changing the immediate illumination as 연희 toggles it.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "not_applicable": true,
                "not_applicable_reason": "이 샷의 visible_entities 에 인물이 1명이라 두 인물 사이의 공유 anchor 규칙은 성립하지 않는다",
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "close_framing_rules": {
                  "not_applicable": true,
                  "not_applicable_reason": "framing_scale=medium — close 규칙은 이 샷에 해당하지 않는다"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer from camera_direction)",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "target_kind": "background",
                  "target_id": "",
                  "label": "바깥 골목",
                  "screen_zone": "upper_center",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": ""
                },
                {
                  "constraint_id": "fsc_002",
                  "target_kind": "character",
                  "target_id": "C02",
                  "label": "연희",
                  "screen_zone": "middle_center",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "바깥 골목"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "P03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L01B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bicycle repair stand",
              "blanket",
              "door",
              "fluorescent light",
              "workbench"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "repair_shop_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the auto repair shop is illuminated by overhead fluorescent lighting, casting a cold and restrained light across the space. The area serves as a utilitarian workshop, maintaining a consistent quiet nighttime tension as the artificial interior light contrasts with the dark surroundings.",
                "element_scope": "full",
                "applies_to_shots": [
                  2,
                  3
                ],
                "source_facts": [
                  "정비소 안 – 밤",
                  "형광등 불빛 아래",
                  "The overhead fluorescent light gives the cleared workshop area restrained illumination (Shot 2)",
                  "Fluorescent interior light falls off toward the dark nighttime alley (Shot 3)"
                ],
                "visual_inferences": [
                  "The light casts a stark, slightly harsh glow typical of fluorescent tubes in a garage setting.",
                  "The background feels utilitarian and sparse, focusing attention on the characters' immediate actions."
                ],
                "creative_decisions": [
                  "Emphasize the stark boundary between the illuminated interior and the dark night outside to build a tense, waiting atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O02",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L01B02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "f559a945151fa298"
      }
    ],
    "consumed_bg_catalog_hash": "cfd0f1b6eec2b18b",
    "consumed_shot_binding_hash": "58d700f8d8c02245"
  },
  "step_id": "scene_detail",
  "run_id": "900c3aa7-cdc6-43b5-9ea7-0ab9949c3912",
  "resolved_model": "gemini-pro",
  "updated_at": "2026-08-28T18:39:28.741873+00:00",
  "project_config_snapshot": {}
}