{
  "schema_version": "2026-07-14.media-workbench-intake-plan.v2",
  "request_id": "media_req_c5d01502179c",
  "project_key": "godfortune_plan_8cae3e136639",
  "benchmark_profile": "rapid_state_comedy_2d_v1",
  "quality_profile": {
    "profile_id": "rapid_state_comedy_2d_v1",
    "revision": 5,
    "fingerprint": "d3577acdb3e721e370661f98",
    "approval_status": "research",
    "production_enabled": false,
    "snapshot": {
      "schema_version": "2026-07-14.media-workbench-quality.v1",
      "profile_id": "rapid_state_comedy_2d_v1",
      "revision": 5,
      "approval_status": "research",
      "production_enabled": false,
      "supported_content_formats": [
        "comedy_musical_short",
        "fortune_musical_short",
        "dialogue_comedy_short",
        "story_comedy_short"
      ],
      "benchmark": {
        "cuts_per_minute_min": 38.0,
        "cuts_per_minute_max": 55.0,
        "average_shot_seconds_target": 1.25,
        "maximum_shot_seconds": 1.7,
        "first_hook_max_seconds": 0.5,
        "visual_event_gap_max_seconds": 1.7
      },
      "character": {
        "style_id": "original_round_chibi_comedy_v1",
        "geometry": {
          "head_count_min": 2.0,
          "head_count_default": 2.6,
          "head_count_max": 3.0,
          "silhouette": "round_compact",
          "face_shape": "round_or_soft_square",
          "line_weight": "bold_nearly_uniform",
          "shading_steps_max": 1,
          "mobile_preview_width": 360,
          "mobile_preview_height": 640
        },
        "performance": {
          "primary_comedy_channel": "facial_expression",
          "body_motion_policy": "limited_reusable_gestures",
          "allow_extreme_squash_stretch": true,
          "extreme_identity_locks": [
            "hair_or_headwear_silhouette",
            "costume_color_blocks",
            "signature_prop",
            "face_center_and_character_read"
          ]
        },
        "state_pack": {
          "body_poses": 5,
          "facial_expressions": 12,
          "mouth_states": 6,
          "extreme_reactions": 5,
          "total": 28
        },
        "candidate_checkpoints": [
          "sd_xl_base_1.0.safetensors",
          "Illustrious-XL-v2.0.safetensors",
          "animagine-xl-4.0-opt.safetensors",
          "kohaku-xl-zeta.safetensors",
          "animagus.safetensors"
        ],
        "candidate_loras": [
          "simple-cartoon-style-sdxl.safetensors",
          "iroiro-sdxl-flat.safetensors",
          "iroiro-sdxl-boldline.safetensors",
          "Comic-SDXL.safetensors"
        ],
        "conditioning_chain": [
          "approved_master_reference",
          "ip-adapter-plus_sdxl_vit-h.safetensors",
          "openpose_or_lineart_controlnet",
          "full_state_generation",
          "registered_face_and_mouth_layers"
        ],
        "identity_gate_states": [
          "neutral_front",
          "action_three_quarter",
          "extreme_reaction"
        ],
        "prompt_template_rules": [
          "preserve immutable identity traits before scene or action terms",
          "use a round compact character between two and three heads tall with a default target of 2.6 heads",
          "keep the face large enough for eyes eyebrows and mouth to carry the comedy beat",
          "use fixed line, palette, shading, proportion, and detail vocabulary",
          "describe one full-body state with a readable silhouette",
          "reuse a small body gesture vocabulary and reserve full-body deformation for extreme punchline states",
          "exclude background content from character generation"
        ],
        "postprocess": [
          "transparent cutout cleanup",
          "palette normalization",
          "outline harmonization",
          "registered anchor alignment"
        ],
        "generation_resolution": "1024x1024_or_832x1216_then_cutout",
        "state_pack_policy": "approve_round_neutral_speaking_and_extreme_face_gate_before_generating_five_reusable_body_poses_and_expression_first_states"
      },
      "background": {
        "style_id": "original_flat_2d_stage_background_v1",
        "generation_mode": "separate_from_characters",
        "prompt_template_rules": [
          "match the approved character line and palette family without copying branded art",
          "keep mobile-readable geometry and low texture density",
          "reserve character, caption, and action safe zones",
          "generate reusable clean plates without characters or text"
        ],
        "composition_rules": [
          "foreground midground and background separation",
          "character contrast remains readable at phone size",
          "props that drive jokes receive a dedicated insert composition",
          "background continuity is locked per scene id"
        ],
        "postprocess": [
          "palette normalization",
          "texture reduction",
          "safe-zone contrast check",
          "character contact shadow during composite"
        ]
      },
      "audio": {
        "voice_selection_policy": "resolve semantic voice intent to an approved Korean voice profile and keep it fixed per character",
        "song_selection_policy": "generate or receive separate vocal and instrumental stems with beat and section timing",
        "dialogue_loudness_lufs": -18.0,
        "final_loudness_lufs": -16.0,
        "true_peak_max_dbtp": -1.0,
        "required_stems": [
          "dialogue_or_vocal",
          "bgm_or_instrumental",
          "sound_effects"
        ]
      },
      "render": {
        "width": 1080,
        "height": 1920,
        "fps": 30,
        "video_codec": "h264",
        "audio_codec": "aac",
        "sample_rate_hz": 48000,
        "compositor": "held_state_2d_compositor",
        "motion_presets": [
          "hard_cut",
          "push_in",
          "pan",
          "scale_punch",
          "shake",
          "recoil",
          "squash",
          "bounce",
          "slide",
          "prop_pop"
        ]
      },
      "quality_gate": {
        "required_checks": [
          "three_state_character_identity_review",
          "two_to_three_head_round_proportion_review",
          "facial_expression_readability_at_360x640",
          "character_silhouette_and_palette_consistency",
          "face_anchor_and_layer_registration",
          "extra_limb_and_generation_artifact_review",
          "background_style_and_safe_zone_review",
          "character_background_mobile_readability",
          "caption_safe_zone_and_change_frequency",
          "cut_cadence_and_visual_event_gap",
          "word_beat_and_lip_timing",
          "loudness_true_peak_black_frame_and_silence",
          "approved_lossless_assets_only",
          "proxy_assets_absent_from_final",
          "yaco_relative_benchmark_score",
          "final_human_review"
        ],
        "human_review_required": true,
        "minimum_approved_character_states": 3,
        "allow_automatic_upload": false
      },
      "execution": {
        "priority": "quality_first",
        "scheduling_mode": "queued_offline",
        "target_benchmark_score": 90.0,
        "max_quality_rounds": 6,
        "allow_preview_assets_in_final": false,
        "require_approved_assets_before_composite": true,
        "preserve_lossless_intermediates": true,
        "candidates": {
          "character_master_candidates": 12,
          "character_state_candidates_per_state": 4,
          "background_candidates_per_intent": 4,
          "voice_candidates_per_role": 3,
          "song_candidates": 8,
          "shot_render_candidates": 3,
          "automatic_shortlist_size": 3,
          "max_parallel_gpu_tasks": 1,
          "human_winner_required": true
        },
        "visual": {
          "strategy": "best_of_n_then_controlled_refinement",
          "required_passes": [
            "native_resolution_candidate_generation",
            "identity_and_structure_controlled_regeneration",
            "masked_face_hand_and_artifact_correction",
            "two_x_detail_upscale_and_palette_line_normalization"
          ],
          "identity_reference_required_after_master_approval": true,
          "structure_control_required": true,
          "lossless_intermediate_format": "png"
        },
        "music": {
          "full_song_engine": "ace_step_15",
          "preferred_dit_models": [
            "acestep-v15-xl-sft",
            "acestep-v15-xl-turbo"
          ],
          "required_lm_model": "acestep-5Hz-lm-4B",
          "thinking_enabled": true,
          "minimum_full_song_seconds": 10.0,
          "short_cue_strategy": "clear_vocal_guide_plus_generated_instrumental",
          "lyrics_alignment_scoring_required": true,
          "lossless_master_required": true
        },
        "stage_gates": [
          "approve_character_master_before_state_generation",
          "approve_identity_gate_states_before_full_state_pack",
          "approve_background_and_prop_assets_before_shot_render",
          "approve_voice_and_song_winners_before_audio_mix",
          "approve_all_lossless_assets_before_composite",
          "pass_ninety_point_benchmark_and_human_review_before_release"
        ]
      },
      "blockers": [
        "simple-cartoon-style-sdxl is a conditional body-style candidate, but the registered identity and extreme-expression gate still fails; a character identity layer remains required",
        "BACKTOON was rejected and plain background generation still requires approved structure guides and clean plates",
        "ACE-Step XL SFT or XL Turbo with 4B LM is not installed and the generated Korean singing quality has not passed best-of-eight review"
      ]
    }
  },
  "quality_execution": {
    "priority": "quality_first",
    "scheduling_mode": "queued_offline",
    "target_benchmark_score": 90.0,
    "max_quality_rounds": 6,
    "max_parallel_gpu_tasks": 1,
    "candidate_budget": {
      "character_masters": 96,
      "character_gate_states": 96,
      "backgrounds": 40,
      "voices": 24,
      "songs": 8
    },
    "work_groups": [
      {
        "group_id": "character_master_character_01",
        "stage": "character_master_search",
        "asset_type": "character_master",
        "asset_key": "character_01",
        "candidate_count": 12,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_01_neutral_front",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_01:neutral_front",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_01"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_01_action_three_quarter",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_01:action_three_quarter",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_01"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_01_extreme_reaction",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_01:extreme_reaction",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_01"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_master_character_02",
        "stage": "character_master_search",
        "asset_type": "character_master",
        "asset_key": "character_02",
        "candidate_count": 12,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_02_neutral_front",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_02:neutral_front",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_02"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_02_action_three_quarter",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_02:action_three_quarter",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_02"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_02_extreme_reaction",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_02:extreme_reaction",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_02"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_master_character_03",
        "stage": "character_master_search",
        "asset_type": "character_master",
        "asset_key": "character_03",
        "candidate_count": 12,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_03_neutral_front",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_03:neutral_front",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_03"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_03_action_three_quarter",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_03:action_three_quarter",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_03"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_03_extreme_reaction",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_03:extreme_reaction",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_03"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_master_character_04",
        "stage": "character_master_search",
        "asset_type": "character_master",
        "asset_key": "character_04",
        "candidate_count": 12,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_04_neutral_front",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_04:neutral_front",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_04"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_04_action_three_quarter",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_04:action_three_quarter",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_04"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_04_extreme_reaction",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_04:extreme_reaction",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_04"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_master_character_05",
        "stage": "character_master_search",
        "asset_type": "character_master",
        "asset_key": "character_05",
        "candidate_count": 12,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_05_neutral_front",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_05:neutral_front",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_05"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_05_action_three_quarter",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_05:action_three_quarter",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_05"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_05_extreme_reaction",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_05:extreme_reaction",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_05"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_master_character_06",
        "stage": "character_master_search",
        "asset_type": "character_master",
        "asset_key": "character_06",
        "candidate_count": 12,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_06_neutral_front",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_06:neutral_front",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_06"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_06_action_three_quarter",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_06:action_three_quarter",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_06"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_06_extreme_reaction",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_06:extreme_reaction",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_06"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_master_character_07",
        "stage": "character_master_search",
        "asset_type": "character_master",
        "asset_key": "character_07",
        "candidate_count": 12,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_07_neutral_front",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_07:neutral_front",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_07"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_07_action_three_quarter",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_07:action_three_quarter",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_07"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_07_extreme_reaction",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_07:extreme_reaction",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_07"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_master_character_08",
        "stage": "character_master_search",
        "asset_type": "character_master",
        "asset_key": "character_08",
        "candidate_count": 12,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_08_neutral_front",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_08:neutral_front",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_08"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_08_action_three_quarter",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_08:action_three_quarter",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_08"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "character_state_character_08_extreme_reaction",
        "stage": "character_identity_gate",
        "asset_type": "character_state",
        "asset_key": "character_08:extreme_reaction",
        "candidate_count": 4,
        "depends_on_approved_groups": [
          "character_master_character_08"
        ],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "background_background_scene_001",
        "stage": "background_search",
        "asset_type": "background",
        "asset_key": "background_scene_001",
        "semantic_intent": "주문 단말의 42번과 소연 휴대전화의 010 숫자가 맞부딪히고 입단속 하트 하나가 깨지는 즉시 이해 가능한 첫 실패. / 9:16 Korean animated musical comedy background, readable staging",
        "candidate_count": 4,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "background_background_scene_002",
        "stage": "background_search",
        "asset_type": "background",
        "asset_key": "background_scene_002",
        "semantic_intent": "갓포츈이 다섯 칸 시험표와 남은 하트 세 개를 한 화면에 펼쳐 반복 규칙과 현재 손실을 동시에 설명한다. / 9:16 Korean animated musical comedy background, readable staging",
        "candidate_count": 4,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "background_background_scene_003",
        "stage": "background_search",
        "asset_type": "background",
        "asset_key": "background_scene_003",
        "semantic_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 9:16 Korean animated musical comedy background, readable staging",
        "candidate_count": 4,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "background_background_scene_004",
        "stage": "background_search",
        "asset_type": "background",
        "asset_key": "background_scene_004",
        "semantic_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 9:16 Korean animated musical comedy background, readable staging",
        "candidate_count": 4,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "background_background_scene_005",
        "stage": "background_search",
        "asset_type": "background",
        "asset_key": "background_scene_005",
        "semantic_intent": "준호가 들어오자 카페가 결승전 무대로 바뀌고 마지막 하트가 유리 케이스에 잠긴다. / 9:16 Korean animated musical comedy background, readable staging",
        "candidate_count": 4,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "background_background_scene_006",
        "stage": "background_search",
        "asset_type": "background",
        "asset_key": "background_scene_006",
        "semantic_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 9:16 Korean animated musical comedy background, readable staging",
        "candidate_count": 4,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "background_background_scene_007",
        "stage": "background_search",
        "asset_type": "background",
        "asset_key": "background_scene_007",
        "semantic_intent": "모든 로맨틱 세트가 철수되고 준호가 신메뉴 평가표를 꺼내자 합창단이 악보를 접고 갓포츈이 시험 종료 도장을 찍는다. / 9:16 Korean animated musical comedy background, readable staging",
        "candidate_count": 4,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "background_background_scene_008",
        "stage": "background_search",
        "asset_type": "background",
        "asset_key": "background_scene_008",
        "semantic_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 9:16 Korean animated musical comedy background, readable staging",
        "candidate_count": 4,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "background_background_scene_009",
        "stage": "background_search",
        "asset_type": "background",
        "asset_key": "background_scene_009",
        "semantic_intent": "성공 직후 소연이 명확한 시간 질문에도 세 박자를 세어 학습이 과적용으로 뒤집히는 별도 인물 개그. / 9:16 Korean animated musical comedy background, readable staging",
        "candidate_count": 4,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "background_background_scene_010",
        "stage": "background_search",
        "asset_type": "background",
        "asset_key": "background_scene_010",
        "semantic_intent": "초반에 생긴 주말 대타표가 다시 화면을 가르고, 소연이 또 세려는 순간 모두가 즉시 대답하라고 막아 규칙과 결과를 동시에 회수한다. / 9:16 Korean animated musical comedy background, readable staging",
        "candidate_count": 4,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true
      },
      {
        "group_id": "voice_voice_character_01",
        "stage": "voice_casting",
        "asset_type": "voice",
        "asset_key": "voice_character_01",
        "candidate_count": 3,
        "depends_on_approved_groups": [],
        "gpu_required": false,
        "human_winner_required": true
      },
      {
        "group_id": "voice_voice_character_02",
        "stage": "voice_casting",
        "asset_type": "voice",
        "asset_key": "voice_character_02",
        "candidate_count": 3,
        "depends_on_approved_groups": [],
        "gpu_required": false,
        "human_winner_required": true
      },
      {
        "group_id": "voice_voice_character_03",
        "stage": "voice_casting",
        "asset_type": "voice",
        "asset_key": "voice_character_03",
        "candidate_count": 3,
        "depends_on_approved_groups": [],
        "gpu_required": false,
        "human_winner_required": true
      },
      {
        "group_id": "voice_voice_character_04",
        "stage": "voice_casting",
        "asset_type": "voice",
        "asset_key": "voice_character_04",
        "candidate_count": 3,
        "depends_on_approved_groups": [],
        "gpu_required": false,
        "human_winner_required": true
      },
      {
        "group_id": "voice_voice_character_05",
        "stage": "voice_casting",
        "asset_type": "voice",
        "asset_key": "voice_character_05",
        "candidate_count": 3,
        "depends_on_approved_groups": [],
        "gpu_required": false,
        "human_winner_required": true
      },
      {
        "group_id": "voice_voice_character_06",
        "stage": "voice_casting",
        "asset_type": "voice",
        "asset_key": "voice_character_06",
        "candidate_count": 3,
        "depends_on_approved_groups": [],
        "gpu_required": false,
        "human_winner_required": true
      },
      {
        "group_id": "voice_voice_character_07",
        "stage": "voice_casting",
        "asset_type": "voice",
        "asset_key": "voice_character_07",
        "candidate_count": 3,
        "depends_on_approved_groups": [],
        "gpu_required": false,
        "human_winner_required": true
      },
      {
        "group_id": "voice_voice_character_08",
        "stage": "voice_casting",
        "asset_type": "voice",
        "asset_key": "voice_character_08",
        "candidate_count": 3,
        "depends_on_approved_groups": [],
        "gpu_required": false,
        "human_winner_required": true
      },
      {
        "group_id": "song_musical_number",
        "stage": "full_song_search",
        "asset_type": "song",
        "asset_key": "musical_number",
        "candidate_count": 8,
        "depends_on_approved_groups": [],
        "gpu_required": true,
        "human_winner_required": true,
        "route": "ace_step_15"
      }
    ],
    "music_routes": {
      "full_song": "ace_step_15",
      "short_cue": "clear_vocal_guide_plus_generated_instrumental",
      "short_cue_audio_source_ids": [],
      "longest_contiguous_song_seconds": {
        "musical_number": 26.666667
      }
    },
    "promotion_rules": {
      "preview_assets_allowed": false,
      "approved_assets_required_before_composite": true,
      "human_winner_required": true,
      "lossless_intermediates_required": true
    },
    "stage_gates": [
      "approve_character_master_before_state_generation",
      "approve_identity_gate_states_before_full_state_pack",
      "approve_background_and_prop_assets_before_shot_render",
      "approve_voice_and_song_winners_before_audio_mix",
      "approve_all_lossless_assets_before_composite",
      "pass_ninety_point_benchmark_and_human_review_before_release"
    ]
  },
  "character_prompt_protocol": {
    "protocol_id": "round_chibi_character_research_v1",
    "status": "research_validated_production_blocked",
    "seed_role": "initial_noise_reproduction_key_not_character_identity_key",
    "positive_total_tags_max": 28,
    "negative_total_tags_max": 22,
    "atomic_tags_required": true,
    "quality_tags_owner": "studio_recipe",
    "lora_triggers_owner": "studio_recipe",
    "registered_props_in_base_prompt": false,
    "quality_priority": "quality_first",
    "preview_outputs_are_non_promotable": true,
    "neutral_master_candidates": 12,
    "state_candidates_per_state": 4,
    "production_passes": [
      "native_resolution_candidate_generation",
      "approved_master_reference_conditioning",
      "lineart_or_silhouette_structure_control",
      "masked_face_hand_and_artifact_correction",
      "two_x_detail_upscale",
      "palette_outline_and_anchor_normalization"
    ]
  },
  "ownership_boundary": {
    "requester": "content_identity_assets_and_publication_intent",
    "studio": "generation_recipes_composition_audio_render_and_quality_gates"
  },
  "content_format": "fortune_musical_short",
  "content": {
    "title": "쥐띠 연애운이 소연의 입을 막았다",
    "language": "ko-KR",
    "summary": "카페에서 들리는 다섯 번의 애매한 말을 연애 신호로 먼저 완성할 때마다 입단속 하트가 사라지고, 마지막 한 번을 끝까지 들어야 진짜 인연을 구별한다.",
    "target_duration_seconds": 62.0,
    "segments": [
      {
        "segment_id": "scene_001_001",
        "order": 0,
        "kind": "dialogue",
        "speaker_character_id": "character_01",
        "on_screen_character_ids": [
          "character_01",
          "character_02",
          "character_03"
        ],
        "text": "픽업 번호요.",
        "lyrics": null,
        "visual_intent": "주문 단말의 42번과 소연 휴대전화의 010 숫자가 맞부딪히고 입단속 하트 하나가 깨지는 즉시 이해 가능한 첫 실패. / 배달기사가 주문 단말의 빈 번호 칸을 소연 쪽으로 내민다.",
        "audio_source_id": "voice_character_01",
        "duration_hint_seconds": 1.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_001_002",
        "order": 1,
        "kind": "dialogue",
        "speaker_character_id": "character_02",
        "on_screen_character_ids": [
          "character_01",
          "character_02",
          "character_03"
        ],
        "text": "번호! 사랑 번호!",
        "lyrics": null,
        "visual_intent": "주문 단말의 42번과 소연 휴대전화의 010 숫자가 맞부딪히고 입단속 하트 하나가 깨지는 즉시 이해 가능한 첫 실패. / 합창단이 전화기 모양 무대에서 010 숫자 리본을 소연 입으로 밀어 넣는다.",
        "audio_source_id": "voice_character_02",
        "duration_hint_seconds": 1.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_001_003",
        "order": 2,
        "kind": "dialogue",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_01",
          "character_02",
          "character_03"
        ],
        "text": "공일공-사칠이-",
        "lyrics": null,
        "visual_intent": "주문 단말의 42번과 소연 휴대전화의 010 숫자가 맞부딪히고 입단속 하트 하나가 깨지는 즉시 이해 가능한 첫 실패. / 소연 입에서 휴대전화 숫자가 네온 자막으로 연속 튀어나온다.",
        "audio_source_id": "voice_character_03",
        "duration_hint_seconds": 1.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_001_004",
        "order": 3,
        "kind": "dialogue",
        "speaker_character_id": "character_01",
        "on_screen_character_ids": [
          "character_01",
          "character_02",
          "character_03"
        ],
        "text": "주문번호요. 42번.",
        "lyrics": null,
        "visual_intent": "주문 단말의 42번과 소연 휴대전화의 010 숫자가 맞부딪히고 입단속 하트 하나가 깨지는 즉시 이해 가능한 첫 실패. / 단말의 42가 거대해지며 010 리본을 눌러 찌그러뜨린다.",
        "audio_source_id": "voice_character_01",
        "duration_hint_seconds": 1.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_002_001",
        "order": 4,
        "kind": "dialogue",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_04",
          "character_03"
        ],
        "text": "쥐띠 연애운. 낯익은 말 다섯 번. 끊으면 하트 차감.",
        "lyrics": null,
        "visual_intent": "갓포츈이 다섯 칸 시험표와 남은 하트 세 개를 한 화면에 펼쳐 반복 규칙과 현재 손실을 동시에 설명한다. / 운세 카드에 다섯 개 시험 칸과 '끝까지 듣기' 문구가 점등된다.",
        "audio_source_id": "voice_character_04",
        "duration_hint_seconds": 2.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_002_002",
        "order": 5,
        "kind": "dialogue",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_04",
          "character_03"
        ],
        "text": "세 개 남았네. 아직 부자.",
        "lyrics": null,
        "visual_intent": "갓포츈이 다섯 칸 시험표와 남은 하트 세 개를 한 화면에 펼쳐 반복 규칙과 현재 손실을 동시에 설명한다. / 소연이 하트 세 개를 동전처럼 쌓다가 하나를 떨어뜨릴 뻔한다.",
        "audio_source_id": "voice_character_03",
        "duration_hint_seconds": 2.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_003_001",
        "order": 6,
        "kind": "dialogue",
        "speaker_character_id": "character_05",
        "on_screen_character_ids": [
          "character_05",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": "소연 씨, 주말 비어요?",
        "lyrics": null,
        "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 점장이 근무표를 등 뒤에 감춘 채 빈 주말 칸만 가리킨다.",
        "audio_source_id": "voice_character_05",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_003_002",
        "order": 7,
        "kind": "dialogue",
        "speaker_character_id": "character_02",
        "on_screen_character_ids": [
          "character_05",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": "바다! 호텔!",
        "lyrics": null,
        "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 카페 바닥이 파도처럼 갈라지고 합창단이 여행 가방을 굴려 들어온다.",
        "audio_source_id": "voice_character_02",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_003_003",
        "order": 8,
        "kind": "dialogue",
        "speaker_character_id": "character_06",
        "on_screen_character_ids": [
          "character_05",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": "체크인!",
        "lyrics": null,
        "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 선글라스를 쓴 소연 분신들이 호텔 키를 동시에 들어 올린다.",
        "audio_source_id": "voice_character_06",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_003_004",
        "order": 9,
        "kind": "dialogue",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_05",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": "오션뷰면 좋아요!",
        "lyrics": null,
        "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 현실 소연이 근무표 대신 상상 속 호텔 키를 덥석 잡는다.",
        "audio_source_id": "voice_character_03",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_003_005",
        "order": 10,
        "kind": "dialogue",
        "speaker_character_id": "character_05",
        "on_screen_character_ids": [
          "character_05",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": "해변점 마감 대타요.",
        "lyrics": null,
        "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 호텔 키가 해변점 마감 근무표로 바뀌어 소연 손에 도장을 찍는다.",
        "audio_source_id": "voice_character_05",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_003_006",
        "order": 11,
        "kind": "dialogue",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_05",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": "하트보다 주말이 먼저 사라짐.",
        "lyrics": null,
        "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 하트 하나와 달력의 토·일 칸이 함께 쓰레기통으로 떨어진다.",
        "audio_source_id": "voice_character_04",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_004_001",
        "order": 12,
        "kind": "dialogue",
        "speaker_character_id": "character_07",
        "on_screen_character_ids": [
          "character_07",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": "이 상자 좀 받아...",
        "lyrics": null,
        "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 매일 3시 명찰이 붙은 단골이 흰 케이크 상자를 두 손으로 내민다.",
        "audio_source_id": "voice_character_07",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_004_002",
        "order": 13,
        "kind": "dialogue",
        "speaker_character_id": "character_02",
        "on_screen_character_ids": [
          "character_07",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": "반지! 프러포즈!",
        "lyrics": null,
        "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 케이크 상자가 벨벳 반지 상자로 변하고 합창단이 꽃잎을 폭발시킨다.",
        "audio_source_id": "voice_character_02",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_004_003",
        "order": 14,
        "kind": "dialogue",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_07",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": "왼손 비었어요!",
        "lyrics": null,
        "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 소연이 직원 장갑을 벗어 던지고 왼손을 상자 안으로 자신 있게 넣는다.",
        "audio_source_id": "voice_character_03",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_004_004",
        "order": 15,
        "kind": "dialogue",
        "speaker_character_id": "character_07",
        "on_screen_character_ids": [
          "character_07",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": "...서 냉장고에 넣어줘요. 케이크예요.",
        "lyrics": null,
        "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 상자가 다시 케이크 상자로 돌아오고 소연 손가락에 생크림이 묻는다.",
        "audio_source_id": "voice_character_07",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_004_005",
        "order": 16,
        "kind": "dialogue",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_07",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": "손 말고 냉장고.",
        "lyrics": null,
        "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 소연이 생크림 묻은 손을 냉장고에 넣으려다 멈춘다.",
        "audio_source_id": "voice_character_03",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_004_006",
        "order": 17,
        "kind": "dialogue",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_07",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": "하트 하나 남음.",
        "lyrics": null,
        "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 갓포츈이 마지막 하트를 케이크 촛불처럼 간신히 보호한다.",
        "audio_source_id": "voice_character_04",
        "duration_hint_seconds": 1.5,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_005_001",
        "order": 18,
        "kind": "dialogue",
        "speaker_character_id": "character_08",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_04"
        ],
        "text": "소연 씨.",
        "lyrics": null,
        "visual_intent": "준호가 들어오자 카페가 결승전 무대로 바뀌고 마지막 하트가 유리 케이스에 잠긴다. / 준호가 평소 컵을 들고 카페 문에서 소연을 부른다.",
        "audio_source_id": "voice_character_08",
        "duration_hint_seconds": 1.3333333333333333,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_005_002",
        "order": 19,
        "kind": "song",
        "speaker_character_id": "character_02",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_04"
        ],
        "text": null,
        "lyrics": "본선 진출!",
        "visual_intent": "준호가 들어오자 카페가 결승전 무대로 바뀌고 마지막 하트가 유리 케이스에 잠긴다. / 합창단이 카페 천장에 결승전 현수막을 펼친다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.3333333333333333,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_005_003",
        "order": 20,
        "kind": "song",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_04"
        ],
        "text": null,
        "lyrics": "마지막 하트.",
        "visual_intent": "준호가 들어오자 카페가 결승전 무대로 바뀌고 마지막 하트가 유리 케이스에 잠긴다. / 갓포츈이 마지막 하트를 투명 유리 케이스에 넣고 열쇠를 삼킨 척한다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.3333333333333333,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_006_001",
        "order": 21,
        "kind": "song",
        "speaker_character_id": "character_08",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "오늘 끝나고 저랑...",
        "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 준호의 말줄임표가 실제 세 개의 빈 원으로 화면 중앙에 멈춘다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.375,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_006_002",
        "order": 22,
        "kind": "song",
        "speaker_character_id": "character_02",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "저녁!",
        "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 합창단이 촛불 식탁을 첫 번째 빈 원에 밀어 넣는다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.375,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_006_003",
        "order": 23,
        "kind": "song",
        "speaker_character_id": "character_02",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "영화!",
        "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 두 번째 빈 원이 영화관 스크린으로 변하며 좌석이 소연을 덮친다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.375,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_006_004",
        "order": 24,
        "kind": "song",
        "speaker_character_id": "character_06",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "상견례!",
        "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 양가 명찰을 든 소연 분신들이 세 번째 원에서 행진한다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.375,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_006_005",
        "order": 25,
        "kind": "song",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "입 닫아. 혀도 대기.",
        "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 현실 소연이 자기 입에 카페 집게를 가로로 물고 분신들을 쟁반으로 막는다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.375,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_006_006",
        "order": 26,
        "kind": "song",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "하나.",
        "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 갓포츈이 첫 손가락을 들자 촛불 식탁이 꺼진다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.375,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_006_007",
        "order": 27,
        "kind": "song",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "둘.",
        "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 두 번째 손가락과 함께 영화관 좌석이 접힌다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.375,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_006_008",
        "order": 28,
        "kind": "song",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_06",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "셋.",
        "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 세 번째 손가락에 상견례 행진이 정지하고 마지막 하트가 안정된다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.375,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_007_001",
        "order": 29,
        "kind": "song",
        "speaker_character_id": "character_08",
        "on_screen_character_ids": [
          "character_08",
          "character_03",
          "character_02",
          "character_04"
        ],
        "text": null,
        "lyrics": "...신메뉴 테스트해줄래요?",
        "visual_intent": "모든 로맨틱 세트가 철수되고 준호가 신메뉴 평가표를 꺼내자 합창단이 악보를 접고 갓포츈이 시험 종료 도장을 찍는다. / 준호가 데이트 티켓 대신 체크박스가 빽빽한 신메뉴 평가표를 편다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 2.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_007_002",
        "order": 30,
        "kind": "song",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_08",
          "character_03",
          "character_02",
          "character_04"
        ],
        "text": null,
        "lyrics": "네. 신메뉴요.",
        "visual_intent": "모든 로맨틱 세트가 철수되고 준호가 신메뉴 평가표를 꺼내자 합창단이 악보를 접고 갓포츈이 시험 종료 도장을 찍는다. / 소연이 생크림 묻은 손으로 업무용 체크 표시를 차분히 한다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 2.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_007_003",
        "order": 31,
        "kind": "song",
        "speaker_character_id": "character_02",
        "on_screen_character_ids": [
          "character_08",
          "character_03",
          "character_02",
          "character_04"
        ],
        "text": null,
        "lyrics": "아, 업무였네.",
        "visual_intent": "모든 로맨틱 세트가 철수되고 준호가 신메뉴 평가표를 꺼내자 합창단이 악보를 접고 갓포츈이 시험 종료 도장을 찍는다. / 합창단이 낮은 음으로 악보를 접고 무대 조명을 하나씩 끈다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 2.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_007_004",
        "order": 32,
        "kind": "song",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_08",
          "character_03",
          "character_02",
          "character_04"
        ],
        "text": null,
        "lyrics": "검사 종료. 하트 하나 보존.",
        "visual_intent": "모든 로맨틱 세트가 철수되고 준호가 신메뉴 평가표를 꺼내자 합창단이 악보를 접고 갓포츈이 시험 종료 도장을 찍는다. / 갓포츈이 시험표를 닫고 마지막 하트에 보존 도장을 찍는다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 2.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_008_001",
        "order": 33,
        "kind": "song",
        "speaker_character_id": "character_08",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "테스트 끝나면...",
        "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 닫힌 시험표 뒤에서 새 말줄임표 세 개가 조용히 떠오른다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_008_002",
        "order": 34,
        "kind": "song",
        "speaker_character_id": "character_02",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "또 시작해?",
        "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 퇴장하던 합창단 한 명이 고개만 무대 커튼 밖으로 다시 내민다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_008_003",
        "order": 35,
        "kind": "song",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "아직 안 끝났어.",
        "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 소연이 합창단 쪽에만 작은 정지 표지판을 들고 준호에게는 시선을 유지한다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_008_004",
        "order": 36,
        "kind": "song",
        "speaker_character_id": "character_08",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "...저녁도 같이 먹어요.",
        "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 준호가 평가표 뒤에서 두 사람 몫의 식사 쿠폰을 꺼낸다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_008_005",
        "order": 37,
        "kind": "song",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": null,
        "lyrics": "세 박자.",
        "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 갓포츈이 말없이 세 칸짜리 박자등을 초록색으로 켠다.",
        "audio_source_id": "musical_number",
        "duration_hint_seconds": 1.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_008_006",
        "order": 38,
        "kind": "dialogue",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_08",
          "character_02",
          "character_03",
          "character_04"
        ],
        "text": "네. 좋아요.",
        "lyrics": null,
        "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 세 번째 불이 켜진 뒤 소연이 대답하고 마지막 하트가 두 사람 사이로 이동한다.",
        "audio_source_id": "voice_character_03",
        "duration_hint_seconds": 1.0,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_009_001",
        "order": 39,
        "kind": "dialogue",
        "speaker_character_id": "character_08",
        "on_screen_character_ids": [
          "character_08",
          "character_03",
          "character_04"
        ],
        "text": "몇 시 좋아요?",
        "lyrics": null,
        "visual_intent": "성공 직후 소연이 명확한 시간 질문에도 세 박자를 세어 학습이 과적용으로 뒤집히는 별도 인물 개그. / 준호가 평범한 시계 화면을 보여주며 명확하게 묻는다.",
        "audio_source_id": "voice_character_08",
        "duration_hint_seconds": 0.75,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_009_002",
        "order": 40,
        "kind": "dialogue",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_08",
          "character_03",
          "character_04"
        ],
        "text": "하나, 둘, 셋.",
        "lyrics": null,
        "visual_intent": "성공 직후 소연이 명확한 시간 질문에도 세 박자를 세어 학습이 과적용으로 뒤집히는 별도 인물 개그. / 소연이 시계 대신 자기 손가락 세 개를 엄숙하게 센다.",
        "audio_source_id": "voice_character_03",
        "duration_hint_seconds": 0.75,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_009_003",
        "order": 41,
        "kind": "dialogue",
        "speaker_character_id": "character_08",
        "on_screen_character_ids": [
          "character_08",
          "character_03",
          "character_04"
        ],
        "text": "셋을 세요?",
        "lyrics": null,
        "visual_intent": "성공 직후 소연이 명확한 시간 질문에도 세 박자를 세어 학습이 과적용으로 뒤집히는 별도 인물 개그. / 준호가 시계와 소연 손가락을 번갈아 보며 한쪽 눈썹을 올린다.",
        "audio_source_id": "voice_character_08",
        "duration_hint_seconds": 0.75,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_009_004",
        "order": 42,
        "kind": "dialogue",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_08",
          "character_03",
          "character_04"
        ],
        "text": "과적용.",
        "lyrics": null,
        "visual_intent": "성공 직후 소연이 명확한 시간 질문에도 세 박자를 세어 학습이 과적용으로 뒤집히는 별도 인물 개그. / 갓포츈이 합격 도장 위에 작은 '과적용' 경고 스티커를 붙인다.",
        "audio_source_id": "voice_character_04",
        "duration_hint_seconds": 0.75,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_010_001",
        "order": 43,
        "kind": "dialogue",
        "speaker_character_id": "character_05",
        "on_screen_character_ids": [
          "character_05",
          "character_08",
          "character_03",
          "character_04"
        ],
        "text": "대타 확정!",
        "lyrics": null,
        "visual_intent": "초반에 생긴 주말 대타표가 다시 화면을 가르고, 소연이 또 세려는 순간 모두가 즉시 대답하라고 막아 규칙과 결과를 동시에 회수한다. / 점장이 해변점 근무표를 데이트 하트 한가운데에 도장처럼 찍는다.",
        "audio_source_id": "voice_character_05",
        "duration_hint_seconds": 0.75,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_010_002",
        "order": 44,
        "kind": "dialogue",
        "speaker_character_id": "character_08",
        "on_screen_character_ids": [
          "character_05",
          "character_08",
          "character_03",
          "character_04"
        ],
        "text": "평일 7시.",
        "lyrics": null,
        "visual_intent": "초반에 생긴 주말 대타표가 다시 화면을 가르고, 소연이 또 세려는 순간 모두가 즉시 대답하라고 막아 규칙과 결과를 동시에 회수한다. / 준호가 달력의 평일 칸으로 하트를 옮겨 놓는다.",
        "audio_source_id": "voice_character_08",
        "duration_hint_seconds": 0.75,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_010_003",
        "order": 45,
        "kind": "dialogue",
        "speaker_character_id": "character_03",
        "on_screen_character_ids": [
          "character_05",
          "character_08",
          "character_03",
          "character_04"
        ],
        "text": "하나...",
        "lyrics": null,
        "visual_intent": "초반에 생긴 주말 대타표가 다시 화면을 가르고, 소연이 또 세려는 순간 모두가 즉시 대답하라고 막아 규칙과 결과를 동시에 회수한다. / 소연이 다시 첫 손가락을 들자 화면 전체가 긴급 정지 색으로 바뀐다.",
        "audio_source_id": "voice_character_03",
        "duration_hint_seconds": 0.75,
        "comedy_devices": [],
        "retention_role": null
      },
      {
        "segment_id": "scene_010_004",
        "order": 46,
        "kind": "dialogue",
        "speaker_character_id": "character_04",
        "on_screen_character_ids": [
          "character_05",
          "character_08",
          "character_03",
          "character_04"
        ],
        "text": "바로 답해!",
        "lyrics": null,
        "visual_intent": "초반에 생긴 주말 대타표가 다시 화면을 가르고, 소연이 또 세려는 순간 모두가 즉시 대답하라고 막아 규칙과 결과를 동시에 회수한다. / 갓포츈과 합창단이 화면 양쪽에서 손가락을 눌러 내리고 즉답 도장을 찍는다.",
        "audio_source_id": "voice_character_04",
        "duration_hint_seconds": 0.75,
        "comedy_devices": [],
        "retention_role": null
      }
    ]
  },
  "character_identity_plans": [
    {
      "character_id": "character_01",
      "role": "first_test_trigger",
      "seed": {
        "source": "prompt",
        "reference_paths": [],
        "catalog_ref": null,
        "state_pack_manifest_path": null,
        "prompt": "무광 검정 헬멧과 청록색 배달 재킷을 입고 주문 확인 휴대전화를 든 배달기사.",
        "negative_prompt": null,
        "random_seed": null,
        "cache_scope": "project",
        "identity_cache_key": null
      },
      "identity_fingerprint": "e9d32cd9daf6853eddc13100",
      "identity_strategy": "generate_master_then_reference_conditioning",
      "random_seed_role": "reproducibility_only",
      "cache_scope": "project",
      "cache_lookup_required": true,
      "recurring": false,
      "design_rules": [
        "hair: 헬멧을 계속 착용해 머리는 보이지 않음",
        "outfit: 청록색 배달 재킷과 무광 검정 헬멧",
        "palette: matte black, teal",
        "props: 주문 확인 휴대전화",
        "머리 형태와 길이",
        "복장 종류와 주조색",
        "고유 소품의 형태와 색상",
        "장면 사이의 연령대와 얼굴 정체성"
      ],
      "state_policy": "shot_required_states_plus_reusable_cache",
      "prompt_policy": "compile_short_model_specific_atomic_tags_after_identity_resolution",
      "identity_gate": [
        "neutral_state",
        "action_state",
        "extreme_reaction_state"
      ]
    },
    {
      "character_id": "character_02",
      "role": "musical_counterforce_ensemble",
      "seed": {
        "source": "prompt",
        "reference_paths": [],
        "catalog_ref": null,
        "state_pack_manifest_path": null,
        "prompt": "금색과 산호색 무대복을 맞춰 입은 세 명의 상상 속 합창단, 같은 별 모양 브로치를 착용한 과장된 표정의 앙상블.",
        "negative_prompt": null,
        "random_seed": null,
        "cache_scope": "project",
        "identity_cache_key": null
      },
      "identity_fingerprint": "0f9b1ff0cd08c9d8edacf9ae",
      "identity_strategy": "generate_master_then_reference_conditioning",
      "random_seed_role": "reproducibility_only",
      "cache_scope": "project",
      "cache_lookup_required": true,
      "recurring": false,
      "design_rules": [
        "hair: 세 멤버의 머리 실루엣을 고정",
        "outfit: 금색·산호색 합창단 무대복",
        "palette: gold, coral, white",
        "props: 별 모양 브로치와 손 마이크",
        "머리 형태와 길이",
        "복장 종류와 주조색",
        "고유 소품의 형태와 색상",
        "장면 사이의 연령대와 얼굴 정체성"
      ],
      "state_policy": "shot_required_states_plus_reusable_cache",
      "prompt_policy": "compile_short_model_specific_atomic_tags_after_identity_resolution",
      "identity_gate": [
        "neutral_state",
        "action_state",
        "extreme_reaction_state"
      ]
    },
    {
      "character_id": "character_03",
      "role": "protagonist",
      "seed": {
        "source": "prompt",
        "reference_paths": [],
        "catalog_ref": null,
        "state_pack_manifest_path": null,
        "prompt": "20대 한국인 여성, 짙은 갈색 단발, 흰 셔츠와 민트색 카페 앞치마, 빨간 휴대전화 스트랩, 표정 변화가 크다.",
        "negative_prompt": null,
        "random_seed": null,
        "cache_scope": "project",
        "identity_cache_key": null
      },
      "identity_fingerprint": "d0a14fdeec92c4e0da07ad91",
      "identity_strategy": "generate_master_then_reference_conditioning",
      "random_seed_role": "reproducibility_only",
      "cache_scope": "project",
      "cache_lookup_required": true,
      "recurring": false,
      "design_rules": [
        "hair: 짙은 갈색 턱선 단발",
        "outfit: 흰 셔츠와 민트색 카페 앞치마",
        "palette: white, mint, red",
        "props: 빨간 휴대전화 스트랩",
        "머리 형태와 길이",
        "복장 종류와 주조색",
        "고유 소품의 형태와 색상",
        "장면 사이의 연령대와 얼굴 정체성"
      ],
      "state_policy": "shot_required_states_plus_reusable_cache",
      "prompt_policy": "compile_short_model_specific_atomic_tags_after_identity_resolution",
      "identity_gate": [
        "neutral_state",
        "action_state",
        "extreme_reaction_state"
      ]
    },
    {
      "character_id": "character_04",
      "role": "fortune_host_and_judge",
      "seed": {
        "source": "prompt",
        "reference_paths": [],
        "catalog_ref": null,
        "state_pack_manifest_path": null,
        "prompt": "젊은 한국인 소년 도사, 검은 갓과 옅은 하늘색 도포, 금색 테두리 운세 카드를 든 건조한 표정.",
        "negative_prompt": null,
        "random_seed": null,
        "cache_scope": "project",
        "identity_cache_key": null
      },
      "identity_fingerprint": "6ef44787b3e3713ace1ac385",
      "identity_strategy": "generate_master_then_reference_conditioning",
      "random_seed_role": "reproducibility_only",
      "cache_scope": "project",
      "cache_lookup_required": true,
      "recurring": false,
      "design_rules": [
        "hair: 검은 갓 아래 짧은 검은 머리",
        "outfit: 옅은 하늘색 한복 도포",
        "palette: black, pale blue, gold",
        "props: 금색 테두리 운세 카드",
        "머리 형태와 길이",
        "복장 종류와 주조색",
        "고유 소품의 형태와 색상",
        "장면 사이의 연령대와 얼굴 정체성"
      ],
      "state_policy": "shot_required_states_plus_reusable_cache",
      "prompt_policy": "compile_short_model_specific_atomic_tags_after_identity_resolution",
      "identity_gate": [
        "neutral_state",
        "action_state",
        "extreme_reaction_state"
      ]
    },
    {
      "character_id": "character_05",
      "role": "reality_counterforce",
      "seed": {
        "source": "prompt",
        "reference_paths": [],
        "catalog_ref": null,
        "state_pack_manifest_path": null,
        "prompt": "30대 한국인 카페 점장, 갈색 셔츠와 짙은 초록 앞치마, 근무표 클립보드를 든 실무적인 인상.",
        "negative_prompt": null,
        "random_seed": null,
        "cache_scope": "project",
        "identity_cache_key": null
      },
      "identity_fingerprint": "88ba18b471663ae9084388b3",
      "identity_strategy": "generate_master_then_reference_conditioning",
      "random_seed_role": "reproducibility_only",
      "cache_scope": "project",
      "cache_lookup_required": true,
      "recurring": false,
      "design_rules": [
        "hair: 단정히 묶거나 넘긴 검은 머리",
        "outfit: 갈색 셔츠와 짙은 초록 앞치마",
        "palette: brown, dark green, white",
        "props: 근무표 클립보드",
        "머리 형태와 길이",
        "복장 종류와 주조색",
        "고유 소품의 형태와 색상",
        "장면 사이의 연령대와 얼굴 정체성"
      ],
      "state_policy": "shot_required_states_plus_reusable_cache",
      "prompt_policy": "compile_short_model_specific_atomic_tags_after_identity_resolution",
      "identity_gate": [
        "neutral_state",
        "action_state",
        "extreme_reaction_state"
      ]
    },
    {
      "character_id": "character_06",
      "role": "imagined_protagonist_variants",
      "seed": {
        "source": "prompt",
        "reference_paths": [],
        "catalog_ref": null,
        "state_pack_manifest_path": null,
        "prompt": "소연와 동일한 외형과 복장을 유지하되 표정과 포즈만 서로 다른 세 명의 상상 분신.",
        "negative_prompt": null,
        "random_seed": null,
        "cache_scope": "project",
        "identity_cache_key": null
      },
      "identity_fingerprint": "1be8340764dd94e6868046fe",
      "identity_strategy": "generate_master_then_reference_conditioning",
      "random_seed_role": "reproducibility_only",
      "cache_scope": "project",
      "cache_lookup_required": true,
      "recurring": false,
      "design_rules": [
        "hair: 주인공과 동일한 머리",
        "outfit: 주인공과 동일한 카페 복장",
        "palette: white, mint, red",
        "props: 빨간 휴대전화 스트랩",
        "머리 형태와 길이",
        "복장 종류와 주조색",
        "고유 소품의 형태와 색상",
        "장면 사이의 연령대와 얼굴 정체성"
      ],
      "state_policy": "shot_required_states_plus_reusable_cache",
      "prompt_policy": "compile_short_model_specific_atomic_tags_after_identity_resolution",
      "identity_gate": [
        "neutral_state",
        "action_state",
        "extreme_reaction_state"
      ]
    },
    {
      "character_id": "character_07",
      "role": "regular_customer_third_trigger",
      "seed": {
        "source": "prompt",
        "reference_paths": [],
        "catalog_ref": null,
        "state_pack_manifest_path": null,
        "prompt": "40대 한국인 여성 카페 단골, 짧은 웨이브 머리와 자주색 재킷, 매일 3시 표식이 붙은 흰 케이크 상자를 든 친근한 인상.",
        "negative_prompt": null,
        "random_seed": null,
        "cache_scope": "project",
        "identity_cache_key": null
      },
      "identity_fingerprint": "8f802e9547ae848e1db724c0",
      "identity_strategy": "generate_master_then_reference_conditioning",
      "random_seed_role": "reproducibility_only",
      "cache_scope": "project",
      "cache_lookup_required": true,
      "recurring": false,
      "design_rules": [
        "hair: 짧은 검은색 웨이브 머리",
        "outfit: 자주색 재킷과 밝은 블라우스",
        "palette: plum, white, cream",
        "props: 매일 3시 표식이 붙은 흰 케이크 상자",
        "머리 형태와 길이",
        "복장 종류와 주조색",
        "고유 소품의 형태와 색상",
        "장면 사이의 연령대와 얼굴 정체성"
      ],
      "state_policy": "shot_required_states_plus_reusable_cache",
      "prompt_policy": "compile_short_model_specific_atomic_tags_after_identity_resolution",
      "identity_gate": [
        "neutral_state",
        "action_state",
        "extreme_reaction_state"
      ]
    },
    {
      "character_id": "character_08",
      "role": "love_interest",
      "seed": {
        "source": "prompt",
        "reference_paths": [],
        "catalog_ref": null,
        "state_pack_manifest_path": null,
        "prompt": "20대 한국인 남성 단골손님, 단정한 검은 머리, 남색 카디건과 밝은 셔츠, 무지 테이크아웃 컵을 든 차분한 인상.",
        "negative_prompt": null,
        "random_seed": null,
        "cache_scope": "project",
        "identity_cache_key": null
      },
      "identity_fingerprint": "68a5ebfd5a5f42485e6e5d50",
      "identity_strategy": "generate_master_then_reference_conditioning",
      "random_seed_role": "reproducibility_only",
      "cache_scope": "project",
      "cache_lookup_required": true,
      "recurring": false,
      "design_rules": [
        "hair: 단정한 검은 머리",
        "outfit: 남색 카디건과 밝은 셔츠",
        "palette: navy, white, neutral",
        "props: 무지 테이크아웃 컵",
        "머리 형태와 길이",
        "복장 종류와 주조색",
        "고유 소품의 형태와 색상",
        "장면 사이의 연령대와 얼굴 정체성"
      ],
      "state_policy": "shot_required_states_plus_reusable_cache",
      "prompt_policy": "compile_short_model_specific_atomic_tags_after_identity_resolution",
      "identity_gate": [
        "neutral_state",
        "action_state",
        "extreme_reaction_state"
      ]
    }
  ],
  "creative_segments": [
    {
      "segment_id": "scene_001_001",
      "order": 0,
      "kind": "dialogue",
      "speaker_character_id": "character_01",
      "on_screen_character_ids": [
        "character_01",
        "character_02",
        "character_03"
      ],
      "text": "픽업 번호요.",
      "lyrics": null,
      "visual_intent": "주문 단말의 42번과 소연 휴대전화의 010 숫자가 맞부딪히고 입단속 하트 하나가 깨지는 즉시 이해 가능한 첫 실패. / 배달기사가 주문 단말의 빈 번호 칸을 소연 쪽으로 내민다.",
      "audio_source_id": "voice_character_01",
      "duration_hint_seconds": 1.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_001_002",
      "order": 1,
      "kind": "dialogue",
      "speaker_character_id": "character_02",
      "on_screen_character_ids": [
        "character_01",
        "character_02",
        "character_03"
      ],
      "text": "번호! 사랑 번호!",
      "lyrics": null,
      "visual_intent": "주문 단말의 42번과 소연 휴대전화의 010 숫자가 맞부딪히고 입단속 하트 하나가 깨지는 즉시 이해 가능한 첫 실패. / 합창단이 전화기 모양 무대에서 010 숫자 리본을 소연 입으로 밀어 넣는다.",
      "audio_source_id": "voice_character_02",
      "duration_hint_seconds": 1.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_001_003",
      "order": 2,
      "kind": "dialogue",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_01",
        "character_02",
        "character_03"
      ],
      "text": "공일공-사칠이-",
      "lyrics": null,
      "visual_intent": "주문 단말의 42번과 소연 휴대전화의 010 숫자가 맞부딪히고 입단속 하트 하나가 깨지는 즉시 이해 가능한 첫 실패. / 소연 입에서 휴대전화 숫자가 네온 자막으로 연속 튀어나온다.",
      "audio_source_id": "voice_character_03",
      "duration_hint_seconds": 1.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_001_004",
      "order": 3,
      "kind": "dialogue",
      "speaker_character_id": "character_01",
      "on_screen_character_ids": [
        "character_01",
        "character_02",
        "character_03"
      ],
      "text": "주문번호요. 42번.",
      "lyrics": null,
      "visual_intent": "주문 단말의 42번과 소연 휴대전화의 010 숫자가 맞부딪히고 입단속 하트 하나가 깨지는 즉시 이해 가능한 첫 실패. / 단말의 42가 거대해지며 010 리본을 눌러 찌그러뜨린다.",
      "audio_source_id": "voice_character_01",
      "duration_hint_seconds": 1.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_002_001",
      "order": 4,
      "kind": "dialogue",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_04",
        "character_03"
      ],
      "text": "쥐띠 연애운. 낯익은 말 다섯 번. 끊으면 하트 차감.",
      "lyrics": null,
      "visual_intent": "갓포츈이 다섯 칸 시험표와 남은 하트 세 개를 한 화면에 펼쳐 반복 규칙과 현재 손실을 동시에 설명한다. / 운세 카드에 다섯 개 시험 칸과 '끝까지 듣기' 문구가 점등된다.",
      "audio_source_id": "voice_character_04",
      "duration_hint_seconds": 2.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_002_002",
      "order": 5,
      "kind": "dialogue",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_04",
        "character_03"
      ],
      "text": "세 개 남았네. 아직 부자.",
      "lyrics": null,
      "visual_intent": "갓포츈이 다섯 칸 시험표와 남은 하트 세 개를 한 화면에 펼쳐 반복 규칙과 현재 손실을 동시에 설명한다. / 소연이 하트 세 개를 동전처럼 쌓다가 하나를 떨어뜨릴 뻔한다.",
      "audio_source_id": "voice_character_03",
      "duration_hint_seconds": 2.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_003_001",
      "order": 6,
      "kind": "dialogue",
      "speaker_character_id": "character_05",
      "on_screen_character_ids": [
        "character_05",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": "소연 씨, 주말 비어요?",
      "lyrics": null,
      "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 점장이 근무표를 등 뒤에 감춘 채 빈 주말 칸만 가리킨다.",
      "audio_source_id": "voice_character_05",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_003_002",
      "order": 7,
      "kind": "dialogue",
      "speaker_character_id": "character_02",
      "on_screen_character_ids": [
        "character_05",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": "바다! 호텔!",
      "lyrics": null,
      "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 카페 바닥이 파도처럼 갈라지고 합창단이 여행 가방을 굴려 들어온다.",
      "audio_source_id": "voice_character_02",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_003_003",
      "order": 8,
      "kind": "dialogue",
      "speaker_character_id": "character_06",
      "on_screen_character_ids": [
        "character_05",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": "체크인!",
      "lyrics": null,
      "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 선글라스를 쓴 소연 분신들이 호텔 키를 동시에 들어 올린다.",
      "audio_source_id": "voice_character_06",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_003_004",
      "order": 9,
      "kind": "dialogue",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_05",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": "오션뷰면 좋아요!",
      "lyrics": null,
      "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 현실 소연이 근무표 대신 상상 속 호텔 키를 덥석 잡는다.",
      "audio_source_id": "voice_character_03",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_003_005",
      "order": 10,
      "kind": "dialogue",
      "speaker_character_id": "character_05",
      "on_screen_character_ids": [
        "character_05",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": "해변점 마감 대타요.",
      "lyrics": null,
      "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 호텔 키가 해변점 마감 근무표로 바뀌어 소연 손에 도장을 찍는다.",
      "audio_source_id": "voice_character_05",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_003_006",
      "order": 11,
      "kind": "dialogue",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_05",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": "하트보다 주말이 먼저 사라짐.",
      "lyrics": null,
      "visual_intent": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 하트 하나와 달력의 토·일 칸이 함께 쓰레기통으로 떨어진다.",
      "audio_source_id": "voice_character_04",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_004_001",
      "order": 12,
      "kind": "dialogue",
      "speaker_character_id": "character_07",
      "on_screen_character_ids": [
        "character_07",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": "이 상자 좀 받아...",
      "lyrics": null,
      "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 매일 3시 명찰이 붙은 단골이 흰 케이크 상자를 두 손으로 내민다.",
      "audio_source_id": "voice_character_07",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_004_002",
      "order": 13,
      "kind": "dialogue",
      "speaker_character_id": "character_02",
      "on_screen_character_ids": [
        "character_07",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": "반지! 프러포즈!",
      "lyrics": null,
      "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 케이크 상자가 벨벳 반지 상자로 변하고 합창단이 꽃잎을 폭발시킨다.",
      "audio_source_id": "voice_character_02",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_004_003",
      "order": 14,
      "kind": "dialogue",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_07",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": "왼손 비었어요!",
      "lyrics": null,
      "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 소연이 직원 장갑을 벗어 던지고 왼손을 상자 안으로 자신 있게 넣는다.",
      "audio_source_id": "voice_character_03",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_004_004",
      "order": 15,
      "kind": "dialogue",
      "speaker_character_id": "character_07",
      "on_screen_character_ids": [
        "character_07",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": "...서 냉장고에 넣어줘요. 케이크예요.",
      "lyrics": null,
      "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 상자가 다시 케이크 상자로 돌아오고 소연 손가락에 생크림이 묻는다.",
      "audio_source_id": "voice_character_07",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_004_005",
      "order": 16,
      "kind": "dialogue",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_07",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": "손 말고 냉장고.",
      "lyrics": null,
      "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 소연이 생크림 묻은 손을 냉장고에 넣으려다 멈춘다.",
      "audio_source_id": "voice_character_03",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_004_006",
      "order": 17,
      "kind": "dialogue",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_07",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": "하트 하나 남음.",
      "lyrics": null,
      "visual_intent": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 갓포츈이 마지막 하트를 케이크 촛불처럼 간신히 보호한다.",
      "audio_source_id": "voice_character_04",
      "duration_hint_seconds": 1.5,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_005_001",
      "order": 18,
      "kind": "dialogue",
      "speaker_character_id": "character_08",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_04"
      ],
      "text": "소연 씨.",
      "lyrics": null,
      "visual_intent": "준호가 들어오자 카페가 결승전 무대로 바뀌고 마지막 하트가 유리 케이스에 잠긴다. / 준호가 평소 컵을 들고 카페 문에서 소연을 부른다.",
      "audio_source_id": "voice_character_08",
      "duration_hint_seconds": 1.3333333333333333,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_005_002",
      "order": 19,
      "kind": "song",
      "speaker_character_id": "character_02",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_04"
      ],
      "text": null,
      "lyrics": "본선 진출!",
      "visual_intent": "준호가 들어오자 카페가 결승전 무대로 바뀌고 마지막 하트가 유리 케이스에 잠긴다. / 합창단이 카페 천장에 결승전 현수막을 펼친다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.3333333333333333,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_005_003",
      "order": 20,
      "kind": "song",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_04"
      ],
      "text": null,
      "lyrics": "마지막 하트.",
      "visual_intent": "준호가 들어오자 카페가 결승전 무대로 바뀌고 마지막 하트가 유리 케이스에 잠긴다. / 갓포츈이 마지막 하트를 투명 유리 케이스에 넣고 열쇠를 삼킨 척한다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.3333333333333333,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_006_001",
      "order": 21,
      "kind": "song",
      "speaker_character_id": "character_08",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "오늘 끝나고 저랑...",
      "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 준호의 말줄임표가 실제 세 개의 빈 원으로 화면 중앙에 멈춘다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.375,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_006_002",
      "order": 22,
      "kind": "song",
      "speaker_character_id": "character_02",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "저녁!",
      "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 합창단이 촛불 식탁을 첫 번째 빈 원에 밀어 넣는다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.375,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_006_003",
      "order": 23,
      "kind": "song",
      "speaker_character_id": "character_02",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "영화!",
      "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 두 번째 빈 원이 영화관 스크린으로 변하며 좌석이 소연을 덮친다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.375,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_006_004",
      "order": 24,
      "kind": "song",
      "speaker_character_id": "character_06",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "상견례!",
      "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 양가 명찰을 든 소연 분신들이 세 번째 원에서 행진한다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.375,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_006_005",
      "order": 25,
      "kind": "song",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "입 닫아. 혀도 대기.",
      "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 현실 소연이 자기 입에 카페 집게를 가로로 물고 분신들을 쟁반으로 막는다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.375,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_006_006",
      "order": 26,
      "kind": "song",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "하나.",
      "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 갓포츈이 첫 손가락을 들자 촛불 식탁이 꺼진다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.375,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_006_007",
      "order": 27,
      "kind": "song",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "둘.",
      "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 두 번째 손가락과 함께 영화관 좌석이 접힌다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.375,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_006_008",
      "order": 28,
      "kind": "song",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_06",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "셋.",
      "visual_intent": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 세 번째 손가락에 상견례 행진이 정지하고 마지막 하트가 안정된다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.375,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_007_001",
      "order": 29,
      "kind": "song",
      "speaker_character_id": "character_08",
      "on_screen_character_ids": [
        "character_08",
        "character_03",
        "character_02",
        "character_04"
      ],
      "text": null,
      "lyrics": "...신메뉴 테스트해줄래요?",
      "visual_intent": "모든 로맨틱 세트가 철수되고 준호가 신메뉴 평가표를 꺼내자 합창단이 악보를 접고 갓포츈이 시험 종료 도장을 찍는다. / 준호가 데이트 티켓 대신 체크박스가 빽빽한 신메뉴 평가표를 편다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 2.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_007_002",
      "order": 30,
      "kind": "song",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_08",
        "character_03",
        "character_02",
        "character_04"
      ],
      "text": null,
      "lyrics": "네. 신메뉴요.",
      "visual_intent": "모든 로맨틱 세트가 철수되고 준호가 신메뉴 평가표를 꺼내자 합창단이 악보를 접고 갓포츈이 시험 종료 도장을 찍는다. / 소연이 생크림 묻은 손으로 업무용 체크 표시를 차분히 한다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 2.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_007_003",
      "order": 31,
      "kind": "song",
      "speaker_character_id": "character_02",
      "on_screen_character_ids": [
        "character_08",
        "character_03",
        "character_02",
        "character_04"
      ],
      "text": null,
      "lyrics": "아, 업무였네.",
      "visual_intent": "모든 로맨틱 세트가 철수되고 준호가 신메뉴 평가표를 꺼내자 합창단이 악보를 접고 갓포츈이 시험 종료 도장을 찍는다. / 합창단이 낮은 음으로 악보를 접고 무대 조명을 하나씩 끈다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 2.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_007_004",
      "order": 32,
      "kind": "song",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_08",
        "character_03",
        "character_02",
        "character_04"
      ],
      "text": null,
      "lyrics": "검사 종료. 하트 하나 보존.",
      "visual_intent": "모든 로맨틱 세트가 철수되고 준호가 신메뉴 평가표를 꺼내자 합창단이 악보를 접고 갓포츈이 시험 종료 도장을 찍는다. / 갓포츈이 시험표를 닫고 마지막 하트에 보존 도장을 찍는다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 2.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_008_001",
      "order": 33,
      "kind": "song",
      "speaker_character_id": "character_08",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "테스트 끝나면...",
      "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 닫힌 시험표 뒤에서 새 말줄임표 세 개가 조용히 떠오른다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_008_002",
      "order": 34,
      "kind": "song",
      "speaker_character_id": "character_02",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "또 시작해?",
      "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 퇴장하던 합창단 한 명이 고개만 무대 커튼 밖으로 다시 내민다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_008_003",
      "order": 35,
      "kind": "song",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "아직 안 끝났어.",
      "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 소연이 합창단 쪽에만 작은 정지 표지판을 들고 준호에게는 시선을 유지한다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_008_004",
      "order": 36,
      "kind": "song",
      "speaker_character_id": "character_08",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "...저녁도 같이 먹어요.",
      "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 준호가 평가표 뒤에서 두 사람 몫의 식사 쿠폰을 꺼낸다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_008_005",
      "order": 37,
      "kind": "song",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": null,
      "lyrics": "세 박자.",
      "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 갓포츈이 말없이 세 칸짜리 박자등을 초록색으로 켠다.",
      "audio_source_id": "musical_number",
      "duration_hint_seconds": 1.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_008_006",
      "order": 38,
      "kind": "dialogue",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_08",
        "character_02",
        "character_03",
        "character_04"
      ],
      "text": "네. 좋아요.",
      "lyrics": null,
      "visual_intent": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 세 번째 불이 켜진 뒤 소연이 대답하고 마지막 하트가 두 사람 사이로 이동한다.",
      "audio_source_id": "voice_character_03",
      "duration_hint_seconds": 1.0,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_009_001",
      "order": 39,
      "kind": "dialogue",
      "speaker_character_id": "character_08",
      "on_screen_character_ids": [
        "character_08",
        "character_03",
        "character_04"
      ],
      "text": "몇 시 좋아요?",
      "lyrics": null,
      "visual_intent": "성공 직후 소연이 명확한 시간 질문에도 세 박자를 세어 학습이 과적용으로 뒤집히는 별도 인물 개그. / 준호가 평범한 시계 화면을 보여주며 명확하게 묻는다.",
      "audio_source_id": "voice_character_08",
      "duration_hint_seconds": 0.75,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_009_002",
      "order": 40,
      "kind": "dialogue",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_08",
        "character_03",
        "character_04"
      ],
      "text": "하나, 둘, 셋.",
      "lyrics": null,
      "visual_intent": "성공 직후 소연이 명확한 시간 질문에도 세 박자를 세어 학습이 과적용으로 뒤집히는 별도 인물 개그. / 소연이 시계 대신 자기 손가락 세 개를 엄숙하게 센다.",
      "audio_source_id": "voice_character_03",
      "duration_hint_seconds": 0.75,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_009_003",
      "order": 41,
      "kind": "dialogue",
      "speaker_character_id": "character_08",
      "on_screen_character_ids": [
        "character_08",
        "character_03",
        "character_04"
      ],
      "text": "셋을 세요?",
      "lyrics": null,
      "visual_intent": "성공 직후 소연이 명확한 시간 질문에도 세 박자를 세어 학습이 과적용으로 뒤집히는 별도 인물 개그. / 준호가 시계와 소연 손가락을 번갈아 보며 한쪽 눈썹을 올린다.",
      "audio_source_id": "voice_character_08",
      "duration_hint_seconds": 0.75,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_009_004",
      "order": 42,
      "kind": "dialogue",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_08",
        "character_03",
        "character_04"
      ],
      "text": "과적용.",
      "lyrics": null,
      "visual_intent": "성공 직후 소연이 명확한 시간 질문에도 세 박자를 세어 학습이 과적용으로 뒤집히는 별도 인물 개그. / 갓포츈이 합격 도장 위에 작은 '과적용' 경고 스티커를 붙인다.",
      "audio_source_id": "voice_character_04",
      "duration_hint_seconds": 0.75,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_010_001",
      "order": 43,
      "kind": "dialogue",
      "speaker_character_id": "character_05",
      "on_screen_character_ids": [
        "character_05",
        "character_08",
        "character_03",
        "character_04"
      ],
      "text": "대타 확정!",
      "lyrics": null,
      "visual_intent": "초반에 생긴 주말 대타표가 다시 화면을 가르고, 소연이 또 세려는 순간 모두가 즉시 대답하라고 막아 규칙과 결과를 동시에 회수한다. / 점장이 해변점 근무표를 데이트 하트 한가운데에 도장처럼 찍는다.",
      "audio_source_id": "voice_character_05",
      "duration_hint_seconds": 0.75,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_010_002",
      "order": 44,
      "kind": "dialogue",
      "speaker_character_id": "character_08",
      "on_screen_character_ids": [
        "character_05",
        "character_08",
        "character_03",
        "character_04"
      ],
      "text": "평일 7시.",
      "lyrics": null,
      "visual_intent": "초반에 생긴 주말 대타표가 다시 화면을 가르고, 소연이 또 세려는 순간 모두가 즉시 대답하라고 막아 규칙과 결과를 동시에 회수한다. / 준호가 달력의 평일 칸으로 하트를 옮겨 놓는다.",
      "audio_source_id": "voice_character_08",
      "duration_hint_seconds": 0.75,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_010_003",
      "order": 45,
      "kind": "dialogue",
      "speaker_character_id": "character_03",
      "on_screen_character_ids": [
        "character_05",
        "character_08",
        "character_03",
        "character_04"
      ],
      "text": "하나...",
      "lyrics": null,
      "visual_intent": "초반에 생긴 주말 대타표가 다시 화면을 가르고, 소연이 또 세려는 순간 모두가 즉시 대답하라고 막아 규칙과 결과를 동시에 회수한다. / 소연이 다시 첫 손가락을 들자 화면 전체가 긴급 정지 색으로 바뀐다.",
      "audio_source_id": "voice_character_03",
      "duration_hint_seconds": 0.75,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    },
    {
      "segment_id": "scene_010_004",
      "order": 46,
      "kind": "dialogue",
      "speaker_character_id": "character_04",
      "on_screen_character_ids": [
        "character_05",
        "character_08",
        "character_03",
        "character_04"
      ],
      "text": "바로 답해!",
      "lyrics": null,
      "visual_intent": "초반에 생긴 주말 대타표가 다시 화면을 가르고, 소연이 또 세려는 순간 모두가 즉시 대답하라고 막아 규칙과 결과를 동시에 회수한다. / 갓포츈과 합창단이 화면 양쪽에서 손가락을 눌러 내리고 즉답 도장을 찍는다.",
      "audio_source_id": "voice_character_04",
      "duration_hint_seconds": 0.75,
      "comedy_devices": [],
      "retention_role": null,
      "planning_tasks": [
        "expand_to_benchmark_shots",
        "assign_character_pose_expression_and_motion",
        "assign_background_props_camera_caption_and_transition",
        "align_visual_events_to_voice_or_music"
      ]
    }
  ],
  "visual_asset_inputs": [
    {
      "asset_id": "background_scene_001",
      "asset_type": "background",
      "source": "generate",
      "catalog_ref": null,
      "path": null,
      "prompt": "주문 단말의 42번과 소연 휴대전화의 010 숫자가 맞부딪히고 입단속 하트 하나가 깨지는 즉시 이해 가능한 첫 실패. / 9:16 Korean animated musical comedy background, readable staging",
      "negative_prompt": null,
      "reference_asset_ids": [],
      "reusable": false,
      "availability": "not_checked"
    },
    {
      "asset_id": "background_scene_002",
      "asset_type": "background",
      "source": "generate",
      "catalog_ref": null,
      "path": null,
      "prompt": "갓포츈이 다섯 칸 시험표와 남은 하트 세 개를 한 화면에 펼쳐 반복 규칙과 현재 손실을 동시에 설명한다. / 9:16 Korean animated musical comedy background, readable staging",
      "negative_prompt": null,
      "reference_asset_ids": [],
      "reusable": false,
      "availability": "not_checked"
    },
    {
      "asset_id": "background_scene_003",
      "asset_type": "background",
      "source": "generate",
      "catalog_ref": null,
      "path": null,
      "prompt": "카페가 과장된 휴양지 뮤지컬로 바뀌었다가 점장이 해변점 근무표를 내미는 현실로 급전환하고, 하트와 주말 일정이 함께 차감된다. / 9:16 Korean animated musical comedy background, readable staging",
      "negative_prompt": null,
      "reference_asset_ids": [],
      "reusable": false,
      "availability": "not_checked"
    },
    {
      "asset_id": "background_scene_004",
      "asset_type": "background",
      "source": "generate",
      "catalog_ref": null,
      "path": null,
      "prompt": "매일 같은 시간에 오는 케이크 단골의 상자를 합창단이 반지 상자로 바꾸고, 소연이 내민 왼손이 생크림에 박히는 물리 개그. / 9:16 Korean animated musical comedy background, readable staging",
      "negative_prompt": null,
      "reference_asset_ids": [],
      "reusable": false,
      "availability": "not_checked"
    },
    {
      "asset_id": "background_scene_005",
      "asset_type": "background",
      "source": "generate",
      "catalog_ref": null,
      "path": null,
      "prompt": "준호가 들어오자 카페가 결승전 무대로 바뀌고 마지막 하트가 유리 케이스에 잠긴다. / 9:16 Korean animated musical comedy background, readable staging",
      "negative_prompt": null,
      "reference_asset_ids": [],
      "reusable": false,
      "availability": "not_checked"
    },
    {
      "asset_id": "background_scene_006",
      "asset_type": "background",
      "source": "generate",
      "catalog_ref": null,
      "path": null,
      "prompt": "저녁·영화·상견례가 서로 다른 소품 공격으로 밀려오지만 소연이 자기 입과 상상 분신을 물리적으로 제압하며 처음으로 기다린다. / 9:16 Korean animated musical comedy background, readable staging",
      "negative_prompt": null,
      "reference_asset_ids": [],
      "reusable": false,
      "availability": "not_checked"
    },
    {
      "asset_id": "background_scene_007",
      "asset_type": "background",
      "source": "generate",
      "catalog_ref": null,
      "path": null,
      "prompt": "모든 로맨틱 세트가 철수되고 준호가 신메뉴 평가표를 꺼내자 합창단이 악보를 접고 갓포츈이 시험 종료 도장을 찍는다. / 9:16 Korean animated musical comedy background, readable staging",
      "negative_prompt": null,
      "reference_asset_ids": [],
      "reusable": false,
      "availability": "not_checked"
    },
    {
      "asset_id": "background_scene_008",
      "asset_type": "background",
      "source": "generate",
      "catalog_ref": null,
      "path": null,
      "prompt": "시험 종료판 뒤에서 준호의 두 번째 문장이 시작되고, 합창단의 마지막 유혹에도 소연이 기다려 실제 저녁 제안을 완성시킨다. / 9:16 Korean animated musical comedy background, readable staging",
      "negative_prompt": null,
      "reference_asset_ids": [],
      "reusable": false,
      "availability": "not_checked"
    },
    {
      "asset_id": "background_scene_009",
      "asset_type": "background",
      "source": "generate",
      "catalog_ref": null,
      "path": null,
      "prompt": "성공 직후 소연이 명확한 시간 질문에도 세 박자를 세어 학습이 과적용으로 뒤집히는 별도 인물 개그. / 9:16 Korean animated musical comedy background, readable staging",
      "negative_prompt": null,
      "reference_asset_ids": [],
      "reusable": false,
      "availability": "not_checked"
    },
    {
      "asset_id": "background_scene_010",
      "asset_type": "background",
      "source": "generate",
      "catalog_ref": null,
      "path": null,
      "prompt": "초반에 생긴 주말 대타표가 다시 화면을 가르고, 소연이 또 세려는 순간 모두가 즉시 대답하라고 막아 규칙과 결과를 동시에 회수한다. / 9:16 Korean animated musical comedy background, readable staging",
      "negative_prompt": null,
      "reference_asset_ids": [],
      "reusable": false,
      "availability": "not_checked"
    }
  ],
  "audio_inputs": [
    {
      "audio_source_id": "voice_character_01",
      "kind": "dialogue",
      "source": "tts",
      "path": null,
      "catalog_ref": null,
      "voice": "ko-KR-first_test_trigger",
      "lyrics": null,
      "music_style": null,
      "vocal_style": null,
      "target_duration_seconds": null
    },
    {
      "audio_source_id": "voice_character_02",
      "kind": "dialogue",
      "source": "tts",
      "path": null,
      "catalog_ref": null,
      "voice": "ko-KR-musical_counterforce_ensemble",
      "lyrics": null,
      "music_style": null,
      "vocal_style": null,
      "target_duration_seconds": null
    },
    {
      "audio_source_id": "voice_character_03",
      "kind": "dialogue",
      "source": "tts",
      "path": null,
      "catalog_ref": null,
      "voice": "ko-KR-protagonist",
      "lyrics": null,
      "music_style": null,
      "vocal_style": null,
      "target_duration_seconds": null
    },
    {
      "audio_source_id": "voice_character_04",
      "kind": "dialogue",
      "source": "tts",
      "path": null,
      "catalog_ref": null,
      "voice": "ko-KR-fortune_host_and_judge",
      "lyrics": null,
      "music_style": null,
      "vocal_style": null,
      "target_duration_seconds": null
    },
    {
      "audio_source_id": "voice_character_05",
      "kind": "dialogue",
      "source": "tts",
      "path": null,
      "catalog_ref": null,
      "voice": "ko-KR-reality_counterforce",
      "lyrics": null,
      "music_style": null,
      "vocal_style": null,
      "target_duration_seconds": null
    },
    {
      "audio_source_id": "voice_character_06",
      "kind": "dialogue",
      "source": "tts",
      "path": null,
      "catalog_ref": null,
      "voice": "ko-KR-imagined_protagonist_variants",
      "lyrics": null,
      "music_style": null,
      "vocal_style": null,
      "target_duration_seconds": null
    },
    {
      "audio_source_id": "voice_character_07",
      "kind": "dialogue",
      "source": "tts",
      "path": null,
      "catalog_ref": null,
      "voice": "ko-KR-regular_customer_third_trigger",
      "lyrics": null,
      "music_style": null,
      "vocal_style": null,
      "target_duration_seconds": null
    },
    {
      "audio_source_id": "voice_character_08",
      "kind": "dialogue",
      "source": "tts",
      "path": null,
      "catalog_ref": null,
      "voice": "ko-KR-love_interest",
      "lyrics": null,
      "music_style": null,
      "vocal_style": null,
      "target_duration_seconds": null
    },
    {
      "audio_source_id": "continuous_underscore",
      "kind": "bgm",
      "source": "song_generate",
      "path": null,
      "catalog_ref": null,
      "voice": null,
      "lyrics": "[INSTRUMENTAL_ONLY_NO_VOCALS]",
      "music_style": "{\"genre\":\"Korean comic musical pop with light trot phrasing\",\"mood\":\"follow the approved script's comic tension and emotional changes\",\"tempo\":\"fast enough for Shorts dialogue while preserving Korean diction\",\"dramatic_function\":\"승인된 대사와 가사가 만드는 행동·감정 변화를 강화하되 새 사건을 만들지 않는다\",\"structure\":\"dialogue-driven setup, one uninterrupted musical number, dialogue resolution\",\"continuity_rule\":\"do not restart melody, groove, vocal identity, room sound, or mix inside the main musical block\",\"instrumental_score\":\"continuous 62-second underscore with no generated vocal before the main number\",\"generated_vocal_number\":\"one contiguous 28.333333-55.0 second Korean musical number\",\"continuity\":\"one continuous instrumental bed across the full timeline; resolve before final dialogue\",\"vocal_rule\":\"no generated vocal before 28.333333 seconds\"}",
      "vocal_style": "instrumental only; do not synthesize or perform the control marker as vocals",
      "target_duration_seconds": 62.0
    },
    {
      "audio_source_id": "musical_number",
      "kind": "song",
      "source": "song_generate",
      "path": null,
      "catalog_ref": null,
      "voice": null,
      "lyrics": "본선 진출!\n마지막 하트.\n오늘 끝나고 저랑...\n저녁!\n영화!\n상견례!\n입 닫아. 혀도 대기.\n하나.\n둘.\n셋.\n...신메뉴 테스트해줄래요?\n네. 신메뉴요.\n아, 업무였네.\n검사 종료. 하트 하나 보존.\n테스트 끝나면...\n또 시작해?\n아직 안 끝났어.\n...저녁도 같이 먹어요.\n세 박자.",
      "music_style": "{\"genre\":\"Korean comic musical pop with light trot phrasing\",\"mood\":\"follow the approved script's comic tension and emotional changes\",\"tempo\":\"fast enough for Shorts dialogue while preserving Korean diction\",\"dramatic_function\":\"승인된 대사와 가사가 만드는 행동·감정 변화를 강화하되 새 사건을 만들지 않는다\",\"structure\":\"dialogue-driven setup, one uninterrupted musical number, dialogue resolution\",\"continuity_rule\":\"do not restart melody, groove, vocal identity, room sound, or mix inside the main musical block\",\"instrumental_score\":\"continuous 62-second underscore with no generated vocal before the main number\",\"generated_vocal_number\":\"one contiguous 28.333333-55.0 second Korean musical number\"}",
      "vocal_style": "연속된 한국어 코믹 뮤지컬 넘버. 화자별 정체성과 발음을 유지하고 대사형 라인은 리드미컬한 레치타티보로 연결한다.",
      "target_duration_seconds": 26.666667
    }
  ],
  "requester_constraints": {
    "source_rights_confirmed": true,
    "prohibited_elements": [
      "실존 인물 또는 상표의 무단 사용",
      "벤치마크의 대사·캐릭터·가사·개그 순서 복제",
      "의료·재무·법률 조언",
      "운세가 거짓이라는 결론",
      "승인되지 않은 캐릭터 외형 변경",
      "대본 승인 전 영상 생성 또는 게시"
    ],
    "required_elements": [
      "승인된 운세 문장과 행동 조언",
      "승인된 장면 순서, 대사, 가사, 상황과 결과",
      "모든 대사와 가사에 연결된 의미적 시각 비트",
      "승인된 캐릭터 외형과 장면 간 정체성 연속성",
      "오락 목적 운세 고지"
    ],
    "character_change_limits": [
      "배달기사: hair: 헬멧을 계속 착용해 머리는 보이지 않음",
      "배달기사: outfit: 청록색 배달 재킷과 무광 검정 헬멧",
      "배달기사: palette: matte black, teal",
      "배달기사: props: 주문 확인 휴대전화",
      "배달기사: 머리 형태와 길이",
      "배달기사: 복장 종류와 주조색",
      "배달기사: 고유 소품의 형태와 색상",
      "배달기사: 장면 사이의 연령대와 얼굴 정체성",
      "행운합창단: hair: 세 멤버의 머리 실루엣을 고정",
      "행운합창단: outfit: 금색·산호색 합창단 무대복",
      "행운합창단: palette: gold, coral, white",
      "행운합창단: props: 별 모양 브로치와 손 마이크",
      "행운합창단: 머리 형태와 길이",
      "행운합창단: 복장 종류와 주조색",
      "행운합창단: 고유 소품의 형태와 색상",
      "행운합창단: 장면 사이의 연령대와 얼굴 정체성",
      "소연: hair: 짙은 갈색 턱선 단발",
      "소연: outfit: 흰 셔츠와 민트색 카페 앞치마",
      "소연: palette: white, mint, red",
      "소연: props: 빨간 휴대전화 스트랩",
      "소연: 머리 형태와 길이",
      "소연: 복장 종류와 주조색",
      "소연: 고유 소품의 형태와 색상",
      "소연: 장면 사이의 연령대와 얼굴 정체성",
      "갓포츈: hair: 검은 갓 아래 짧은 검은 머리",
      "갓포츈: outfit: 옅은 하늘색 한복 도포",
      "갓포츈: palette: black, pale blue, gold",
      "갓포츈: props: 금색 테두리 운세 카드",
      "갓포츈: 머리 형태와 길이",
      "갓포츈: 복장 종류와 주조색",
      "갓포츈: 고유 소품의 형태와 색상",
      "갓포츈: 장면 사이의 연령대와 얼굴 정체성",
      "점장: hair: 단정히 묶거나 넘긴 검은 머리",
      "점장: outfit: 갈색 셔츠와 짙은 초록 앞치마",
      "점장: palette: brown, dark green, white",
      "점장: props: 근무표 클립보드",
      "점장: 머리 형태와 길이",
      "점장: 복장 종류와 주조색",
      "점장: 고유 소품의 형태와 색상",
      "점장: 장면 사이의 연령대와 얼굴 정체성",
      "상상 속 소연들: hair: 주인공과 동일한 머리",
      "상상 속 소연들: outfit: 주인공과 동일한 카페 복장",
      "상상 속 소연들: palette: white, mint, red",
      "상상 속 소연들: props: 빨간 휴대전화 스트랩",
      "상상 속 소연들: 머리 형태와 길이",
      "상상 속 소연들: 복장 종류와 주조색",
      "상상 속 소연들: 고유 소품의 형태와 색상",
      "상상 속 소연들: 장면 사이의 연령대와 얼굴 정체성",
      "단골손님: hair: 짧은 검은색 웨이브 머리",
      "단골손님: outfit: 자주색 재킷과 밝은 블라우스",
      "단골손님: palette: plum, white, cream",
      "단골손님: props: 매일 3시 표식이 붙은 흰 케이크 상자",
      "단골손님: 머리 형태와 길이",
      "단골손님: 복장 종류와 주조색",
      "단골손님: 고유 소품의 형태와 색상",
      "단골손님: 장면 사이의 연령대와 얼굴 정체성",
      "준호: hair: 단정한 검은 머리",
      "준호: outfit: 남색 카디건과 밝은 셔츠",
      "준호: palette: navy, white, neutral",
      "준호: props: 무지 테이크아웃 컵",
      "준호: 머리 형태와 길이",
      "준호: 복장 종류와 주조색",
      "준호: 고유 소품의 형태와 색상",
      "준호: 장면 사이의 연령대와 얼굴 정체성"
    ],
    "notes": "승인된 대사·가사·사건·결말은 변경하지 않고 제작 표현만 보완한다."
  },
  "publication_release_blocked": false,
  "execution_stages": [
    "validate_and_fingerprint_character_seeds",
    "expand_content_segments_to_shots",
    "compile_required_character_states",
    "queue_best_of_n_character_master_background_voice_and_music_candidates",
    "automatically_rank_and_shortlist_candidates",
    "human_approve_character_master_background_voice_and_music",
    "generate_controlled_character_states_and_shot_assets",
    "human_approve_identity_gate_states_and_lossless_assets",
    "align_words_beats_and_visual_events",
    "render_multiple_shot_candidates_from_approved_assets",
    "select_shot_winners_and_composite_vertical_master",
    "mix_encode_and_run_quality_gates",
    "human_review_generate_only_artifacts"
  ],
  "production_ready": false,
  "next_stage": "quality_asset_generation",
  "upload": {
    "mode": "generate_only",
    "youtube_channel_ref": "fortune_story_kr_channel",
    "privacy_status": "private",
    "title": "쥐띠 연애운이 소연의 입을 막았다",
    "description": "운세는 재미로, 해석은 뮤지컬로. 갓포츈.",
    "hashtags": [
      "#shorts",
      "#운세",
      "#연애운",
      "#갓포츈"
    ],
    "category_id": "22"
  },
  "metadata": {
    "source_system": "youtube-content-ops",
    "episode_plan_id": "plan_8cae3e136639",
    "approved_package_version": "2026-07-22.pre-media.revision.v1",
    "approved_package_checksum": "2a17ce7dacde33490ccefa7c21a8002ad496b19860a26e47e6bbfb8695c5dc9d",
    "script_version": "2026-07-22.fortune-content.v6",
    "fortune_interpretation": {
      "analysis_scope": "쥐띠_연애운_zodiac",
      "full_saju_analysis": false,
      "missing_inputs": [
        "birth_date",
        "birth_time",
        "birth_place"
      ],
      "disclosure": "이번 편은 생년월일시 기반 개인 사주가 아니라 쥐띠 단위의 오락형 연애운 해석이다.",
      "fortune_line": "오늘 쥐띠는 낯익은 사람이 먼저 말을 걸어올 수 있습니다. 기대가 커질수록 말에 없는 결론을 먼저 채우기 쉬우니, 문장을 끝까지 듣고 세 박자 뒤에 답하면 인연을 알아볼 수 있습니다.",
      "positive_signal": "평소 얼굴을 알고 지내던 사람이 먼저 대화를 시작함",
      "risk_signal": "애매한 첫마디를 원하는 의미로 완성하고 즉시 행동함",
      "recommended_action": "상대의 문장을 끝까지 들은 다음 속으로 세 박자를 세고 대답하기",
      "dramatic_tension": "상대의 말을 기다려야 한다는 조언과 기대한 결론을 먼저 내리고 싶은 마음이 충돌한다.",
      "causal_principle": "애매한 말을 성급히 완성하지 않으면 상대가 자신의 의도를 직접 드러낼 여지가 생기고, 두 사람은 기대 속 역할이 아니라 실제 선택으로 서로를 확인할 수 있다.",
      "truth_rule": "운세 조언은 끝까지 듣는 선택을 돕고, 그 선택의 현실 결과가 좋은 인연인지 드러낸다."
    },
    "voice_semantic_requirements": [
      {
        "character_key": "character_01",
        "speaker": "배달기사",
        "language": "ko-KR",
        "semantic_direction": "짧고 실무적인 배달 현장 말투. 주문번호 질문이 전화번호와 혼동되지 않도록 명료하게 발음한다.",
        "delivery_rules": [
          "대사 의미를 우선한다",
          "펀치라인 직전 호흡을 과장하지 않는다",
          "노래와 일반 대사의 캐릭터 음색을 유지한다"
        ]
      },
      {
        "character_key": "character_02",
        "speaker": "행운합창단",
        "language": "ko-KR",
        "semantic_direction": "세 명이 한 박자로 들리되 각 음색이 구분되는 코믹 합창. 주인공의 성급함을 부추기는 에너지를 유지한다.",
        "delivery_rules": [
          "대사 의미를 우선한다",
          "펀치라인 직전 호흡을 과장하지 않는다",
          "노래와 일반 대사의 캐릭터 음색을 유지한다"
        ]
      },
      {
        "character_key": "character_03",
        "speaker": "소연",
        "language": "ko-KR",
        "semantic_direction": "현대적인 20대 한국어 여성 음색. 현실 대사는 빠르고 자연스럽게, 상상 뮤지컬에서는 기대가 폭주하되 발음은 선명하게 유지한다.",
        "delivery_rules": [
          "대사 의미를 우선한다",
          "펀치라인 직전 호흡을 과장하지 않는다",
          "노래와 일반 대사의 캐릭터 음색을 유지한다"
        ]
      },
      {
        "character_key": "character_04",
        "speaker": "갓포츈",
        "language": "ko-KR",
        "semantic_direction": "소년 도사 이미지의 밝은 중저음. 운세는 신뢰감 있게, 판정 개그는 건조하고 짧게 처리한다.",
        "delivery_rules": [
          "대사 의미를 우선한다",
          "펀치라인 직전 호흡을 과장하지 않는다",
          "노래와 일반 대사의 캐릭터 음색을 유지한다"
        ]
      },
      {
        "character_key": "character_05",
        "speaker": "점장",
        "language": "ko-KR",
        "semantic_direction": "일상적인 카페 관리자 말투. 뮤지컬의 과장을 전혀 인지하지 않는 건조한 현실감을 유지한다.",
        "delivery_rules": [
          "대사 의미를 우선한다",
          "펀치라인 직전 호흡을 과장하지 않는다",
          "노래와 일반 대사의 캐릭터 음색을 유지한다"
        ]
      },
      {
        "character_key": "character_06",
        "speaker": "상상 속 소연들",
        "language": "ko-KR",
        "semantic_direction": "주인공과 같은 기본 음색을 겹쳐 쓰되 좌우 위치와 억양만 달리해 상상 분신임을 표시한다.",
        "delivery_rules": [
          "대사 의미를 우선한다",
          "펀치라인 직전 호흡을 과장하지 않는다",
          "노래와 일반 대사의 캐릭터 음색을 유지한다"
        ]
      },
      {
        "character_key": "character_07",
        "speaker": "단골손님",
        "language": "ko-KR",
        "semantic_direction": "친근하고 일상적인 40대 한국어 여성 음색. 케이크 보관 부탁을 연애 암시 없이 자연스럽고 느긋하게 전달한다.",
        "delivery_rules": [
          "대사 의미를 우선한다",
          "펀치라인 직전 호흡을 과장하지 않는다",
          "노래와 일반 대사의 캐릭터 음색을 유지한다"
        ]
      },
      {
        "character_key": "character_08",
        "speaker": "준호",
        "language": "ko-KR",
        "semantic_direction": "차분하고 따뜻한 20대 한국어 남성 음색. 서두르지 않고 문장 끝의 실제 의도를 분명하게 전달한다.",
        "delivery_rules": [
          "대사 의미를 우선한다",
          "펀치라인 직전 호흡을 과장하지 않는다",
          "노래와 일반 대사의 캐릭터 음색을 유지한다"
        ]
      }
    ],
    "music_semantic_requirements": {
      "genre": "Korean comic musical pop with light trot phrasing",
      "mood": "follow the approved script's comic tension and emotional changes",
      "tempo": "fast enough for Shorts dialogue while preserving Korean diction",
      "dramatic_function": "승인된 대사와 가사가 만드는 행동·감정 변화를 강화하되 새 사건을 만들지 않는다",
      "structure": "dialogue-driven setup, one uninterrupted musical number, dialogue resolution",
      "continuity_rule": "do not restart melody, groove, vocal identity, room sound, or mix inside the main musical block",
      "instrumental_score": "continuous 62-second underscore with no generated vocal before the main number",
      "generated_vocal_number": "one contiguous 28.333333-55.0 second Korean musical number"
    },
    "musical_structure": [
      {
        "start_seconds": 0.0,
        "end_seconds": 28.333333,
        "mode": "dialogue_driven_setup",
        "music_rule": "No generated vocal song. A continuous low instrumental underscore and short non-vocal stings are allowed.",
        "content_rule": "Preserve the setup, misunderstandings, fortune rule, heart deductions, and character identities."
      },
      {
        "start_seconds": 28.333333,
        "end_seconds": 55.0,
        "mode": "continuous_musical_number",
        "music_rule": "Start one continuous musical number at the current '본선 진출!' beat and do not restart the song between lines. Dialogue may become sung lines, rhythmic recitative, or speech over the same uninterrupted score.",
        "content_rule": "Preserve the final-heart escalation, dinner/movie/family-meeting exaggeration, three-beat restraint, work-test reversal, and real dinner invitation."
      },
      {
        "start_seconds": 55.0,
        "end_seconds": 62.0,
        "mode": "dialogue_resolution_and_callback",
        "music_rule": "Resolve or stop the musical number before the final dialogue exchange. A short instrumental button may follow the last callback.",
        "content_rule": "Preserve acceptance, time question, over-application joke, substitute-shift callback, and immediate-answer ending."
      }
    ],
    "segment_performance_plan": [
      {
        "segment_id": "scene_001_001",
        "start_seconds": 0.0,
        "end_seconds": 1.0,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_001_002",
        "start_seconds": 1.0,
        "end_seconds": 2.0,
        "performance_mode": "rhythmic_chant",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_001_003",
        "start_seconds": 2.0,
        "end_seconds": 3.0,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_001_004",
        "start_seconds": 3.0,
        "end_seconds": 4.0,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_002_001",
        "start_seconds": 4.0,
        "end_seconds": 6.5,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_002_002",
        "start_seconds": 6.5,
        "end_seconds": 9.0,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_003_001",
        "start_seconds": 9.0,
        "end_seconds": 10.5,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_003_002",
        "start_seconds": 10.5,
        "end_seconds": 12.0,
        "performance_mode": "rhythmic_chant",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_003_003",
        "start_seconds": 12.0,
        "end_seconds": 13.5,
        "performance_mode": "rhythmic_chant",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_003_004",
        "start_seconds": 13.5,
        "end_seconds": 15.0,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_003_005",
        "start_seconds": 15.0,
        "end_seconds": 16.5,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_003_006",
        "start_seconds": 16.5,
        "end_seconds": 18.0,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_004_001",
        "start_seconds": 18.0,
        "end_seconds": 19.5,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_004_002",
        "start_seconds": 19.5,
        "end_seconds": 21.0,
        "performance_mode": "rhythmic_chant",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_004_003",
        "start_seconds": 21.0,
        "end_seconds": 22.5,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_004_004",
        "start_seconds": 22.5,
        "end_seconds": 24.0,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_004_005",
        "start_seconds": 24.0,
        "end_seconds": 25.5,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_004_006",
        "start_seconds": 25.5,
        "end_seconds": 27.0,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_005_001",
        "start_seconds": 27.0,
        "end_seconds": 28.333333,
        "performance_mode": "spoken_dialogue",
        "music_block_id": "dialogue_setup"
      },
      {
        "segment_id": "scene_005_002",
        "start_seconds": 28.333333,
        "end_seconds": 29.666667,
        "performance_mode": "sung_chorus",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_005_003",
        "start_seconds": 29.666667,
        "end_seconds": 31.0,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_006_001",
        "start_seconds": 31.0,
        "end_seconds": 32.375,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_006_002",
        "start_seconds": 32.375,
        "end_seconds": 33.75,
        "performance_mode": "sung_chorus",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_006_003",
        "start_seconds": 33.75,
        "end_seconds": 35.125,
        "performance_mode": "sung_chorus",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_006_004",
        "start_seconds": 35.125,
        "end_seconds": 36.5,
        "performance_mode": "sung_chorus",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_006_005",
        "start_seconds": 36.5,
        "end_seconds": 37.875,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_006_006",
        "start_seconds": 37.875,
        "end_seconds": 39.25,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_006_007",
        "start_seconds": 39.25,
        "end_seconds": 40.625,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_006_008",
        "start_seconds": 40.625,
        "end_seconds": 42.0,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_007_001",
        "start_seconds": 42.0,
        "end_seconds": 44.0,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_007_002",
        "start_seconds": 44.0,
        "end_seconds": 46.0,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_007_003",
        "start_seconds": 46.0,
        "end_seconds": 48.0,
        "performance_mode": "sung_chorus",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_007_004",
        "start_seconds": 48.0,
        "end_seconds": 50.0,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_008_001",
        "start_seconds": 50.0,
        "end_seconds": 51.0,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_008_002",
        "start_seconds": 51.0,
        "end_seconds": 52.0,
        "performance_mode": "sung_chorus",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_008_003",
        "start_seconds": 52.0,
        "end_seconds": 53.0,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_008_004",
        "start_seconds": 53.0,
        "end_seconds": 54.0,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_008_005",
        "start_seconds": 54.0,
        "end_seconds": 55.0,
        "performance_mode": "rhythmic_recitative",
        "music_block_id": "main_musical_number"
      },
      {
        "segment_id": "scene_008_006",
        "start_seconds": 55.0,
        "end_seconds": 56.0,
        "performance_mode": "spoken_resolution",
        "music_block_id": "dialogue_resolution"
      },
      {
        "segment_id": "scene_009_001",
        "start_seconds": 56.0,
        "end_seconds": 56.75,
        "performance_mode": "spoken_resolution",
        "music_block_id": "dialogue_resolution"
      },
      {
        "segment_id": "scene_009_002",
        "start_seconds": 56.75,
        "end_seconds": 57.5,
        "performance_mode": "spoken_resolution",
        "music_block_id": "dialogue_resolution"
      },
      {
        "segment_id": "scene_009_003",
        "start_seconds": 57.5,
        "end_seconds": 58.25,
        "performance_mode": "spoken_resolution",
        "music_block_id": "dialogue_resolution"
      },
      {
        "segment_id": "scene_009_004",
        "start_seconds": 58.25,
        "end_seconds": 59.0,
        "performance_mode": "spoken_resolution",
        "music_block_id": "dialogue_resolution"
      },
      {
        "segment_id": "scene_010_001",
        "start_seconds": 59.0,
        "end_seconds": 59.75,
        "performance_mode": "spoken_resolution",
        "music_block_id": "dialogue_resolution"
      },
      {
        "segment_id": "scene_010_002",
        "start_seconds": 59.75,
        "end_seconds": 60.5,
        "performance_mode": "spoken_resolution",
        "music_block_id": "dialogue_resolution"
      },
      {
        "segment_id": "scene_010_003",
        "start_seconds": 60.5,
        "end_seconds": 61.25,
        "performance_mode": "spoken_resolution",
        "music_block_id": "dialogue_resolution"
      },
      {
        "segment_id": "scene_010_004",
        "start_seconds": 61.25,
        "end_seconds": 62.0,
        "performance_mode": "spoken_resolution",
        "music_block_id": "dialogue_resolution"
      }
    ],
    "content_revision": {
      "schema_version": "2026-07-22.media-content-revision-request.v1",
      "issue_code": "FRAGMENTED_MUSICAL_STRUCTURE",
      "source_checksum": "9e46343ce0fec855cf550edaf04e3f983cdd59a10c703959825ed2203c393049",
      "changed_segment_ids": [
        "scene_001_002",
        "scene_003_002",
        "scene_003_003",
        "scene_004_002",
        "scene_005_003",
        "scene_006_001",
        "scene_006_005",
        "scene_006_006",
        "scene_006_007",
        "scene_006_008",
        "scene_007_001",
        "scene_007_002",
        "scene_007_004",
        "scene_008_001",
        "scene_008_003",
        "scene_008_004",
        "scene_008_005"
      ],
      "text_changed_segment_ids": []
    },
    "youtube_execution_deferred": true,
    "production_promotion": {
      "decision": "approve",
      "reason": "content revision approved: FRAGMENTED_MUSICAL_STRUCTURE",
      "decided_by": "content_revision_editor",
      "decided_at": "2026-07-22T07:17:12.465449+00:00",
      "approved_checksum": "2a17ce7dacde33490ccefa7c21a8002ad496b19860a26e47e6bbfb8695c5dc9d"
    },
    "parent_request_id": "media_req_3edc7ce3e377"
  }
}
