{
  "type": "object",
  "properties": {
    "scene_index": {"type": "integer"},
    "heading": {"type": "string"},
    "beat_title": {"type": "string", "description": "이 씬의 핵심을 한마디로"},
    "representative_moment": {"type": "string", "description": "스틸 이미지로 만들 대표 순간 (한 문장). 인물은 short_id(C01 등)로 참조."},
    "t2i_variations": {
      "type": "array",
      "description": "서로 다른 구성의 T2I 프롬프트들",
      "items": {
        "type": "object",
        "properties": {
          "variant_label": {"type": "string", "description": "var_1, var_2 등"},
          "camera_effect": {"type": "string", "description": "카메라 구도 + 색감 (필수, 시나리오 derivation; closed-list 강제 X)"},
          "t2i_prompt": {"type": "string", "description": "T2I 프롬프트. 인물+아웃룩은 복합 ID(C01O02)를 사용 — 합성 단계가 'the character from Image N'으로 자동 치환. 신체 부위 클로즈업, reproduction surface (한 면 콘텐츠 표면 또는 반사 표면 안 인물 — system prompt 가 명시) 등 예외 구도에서는 보통명사로 대체. 소품은 P01, 배경은 [L01: 설명] 형태. (정책 상세는 system prompt 참조)"},
          "outfit_assignments": {
            "type": "array",
            "description": "이 variation에서 각 인물이 입는 아웃룩. 인물별 1개씩. DB/UI 동기화용 — t2i_prompt의 복합 ID와 동일한 정보를 명시.",
            "items": {
              "type": "object",
              "properties": {
                "character_id": {"type": "string", "description": "인물 ID (C01 등)"},
                "outlook_id": {"type": "string", "description": "아웃룩 ID (O01 등)"}
              },
              "required": ["character_id", "outlook_id"],
              "additionalProperties": false
            }
          },
          "source_facts": {
            "type": "array",
            "items": {"type": "string"},
            "description": "scene_text 원문 + shot_extract description 만 (text-grounded). fixed_element 는 visual_inferences 에. 빈 배열이면 confidence=low 필수."
          },
          "visual_inferences": {
            "type": "array",
            "items": {"type": "string"},
            "description": "fixed_element 인용 + LLM 자체 추론. fixed_element 도 이미 canonized LLM 출력이라 source 가 아님."
          },
          "creative_decisions": {
            "type": "array",
            "items": {"type": "string"},
            "description": "camera_effect / framing 선택 등 작가적 결정."
          },
          "confidence": {
            "type": "string",
            "enum": ["high", "medium", "low"],
            "description": "LLM 출력은 high/medium/low 만 — 절대 'legacy' 금지."
          },
          "applied_frame_spatial_constraint_ids": {
            "type": "array",
            "items": {"type": "string"},
            "description": "Echo of render_strategy.frame_spatial_contract.constraints[].constraint_id (fsc_NNN). Empty array when contract is null. MUST equal injected id set for every variation when contract is present."
          },
          "reference_phrase_kinds": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": ["character", "background", "prop"]
            },
            "uniqueItems": true,
            "description": "Reference-kind sidecar for this variation's t2i_prompt. Empty array when the prompt body contains no reference-image attribution phrase. Producer SOT for Area #5 phantom guard — validator compares this set against attached_meta kinds. No closed phrase enumeration; structured declaration only."
          },
          "owned_object_usage": {
            "type": "array",
            "description": "이 variation 의 t2i_prompt 가 chain_bg owned 환경 객체 (objects_owned_by_background) 중 실제로 참조한 것만 per-token declare. redraw/anchor 한 owned 객체만 emit — absent 는 후처리 code 가 자동 완성하므로 declare 불필요. 전체 owned_list 1:1 echo 의무 아님. owned block 부재 시 빈 배열. owned_token 은 입력 목록 그대로 (목록 밖 token·중복 declare 금지). C2 owned_object_usage echo SOT — judge 는 본 echo 를 t2i_prompt 와 cross-check 만 한다.",
            "items": {
              "type": "object",
              "properties": {
                "owned_token": {"type": "string", "minLength": 1, "description": "owned_list 의 English canonical common noun (그대로)."},
                "usage_kind": {"type": "string", "enum": ["redraw", "anchor", "absent"], "description": "redraw = owned 객체를 새로 생성/추가/변형하라고 지시 / anchor = owned 객체를 reference·공간·형용사로만 언급 / absent = t2i_prompt 에 등장하지 않음."},
                "source_phrase": {"type": "string", "description": "t2i_prompt 안 해당 owned 가 등장한 phrase 발췌. usage_kind 가 absent 일 때만 빈 문자열 허용."}
              },
              "required": ["owned_token", "usage_kind", "source_phrase"],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "variant_label", "camera_effect", "t2i_prompt", "outfit_assignments",
          "source_facts", "visual_inferences", "creative_decisions", "confidence",
          "applied_frame_spatial_constraint_ids", "reference_phrase_kinds",
          "owned_object_usage"
        ],
        "additionalProperties": false
      }
    },
    "scene_type": {
      "type": "string",
      "enum": ["normal", "montage", "flashback", "dream", "voiceover", "transition"],
      "description": "씬의 유형"
    },
    "dependent_scene_index": {
      "type": "integer",
      "description": "앞쪽 시각 연관 씬. -1 if none"
    },
    "dependency_reason": {"type": "string"}
  },
  "required": [
    "scene_index", "heading", "beat_title", "representative_moment",
    "t2i_variations", "scene_type",
    "dependent_scene_index", "dependency_reason"
  ],
  "additionalProperties": false
}
