{
  "version": "2026-09-17",
  "scope": "English story and phrase video production",
  "priority": "Episode production_policy.json overrides older workflow_rules provider and chaining defaults.",
  "provider": "ComfyUI / 本機 MiniMax H3",
  "story_rules": [
    "正常對話負責交代目標、分歧、推理、反應與笑點；教學短句只在自然需要時出現，不把每句對話都縮成目標短句。",
    "先有角色目標、阻礙和結果，再放入自然用得到的教學短句。",
    "刪掉重複描述看得見的動作，不要求固定的教學短句占比。",
    "對話用收縮形式及簡短回應；目標短句本身保留標準拼寫。",
    "每個鏡頭最多一個核心動作；因果必須看得到，不能只靠台詞說明。"
  ],
  "shot_rules": {
    "target_seconds": [
      4,
      8
    ],
    "max_consecutive_extensions": 1,
    "max_continuous_shot_seconds": 12,
    "limit_note": "這是本專案防止累積漂移的保守製作上限，不是平台能力上限；有例外時必須記錄理由與 QA。",
    "default_transition": "motivated_cut",
    "same_shot": "只接立即前一段已核准 master 的實際尾幀；核對交付 frame0",
    "new_shot": "從核准原始角色、場景、道具素材重置；記錄視線、站位、道具狀態；不要拿劣化尾幀當新角色圖。"
  },
  "prompt_contract": [
    "鏡位與原始參考",
    "開場道具/站位狀態",
    "單一可見動作",
    "說話者與精確台詞",
    "聆聽者反應及結束狀態",
    "必要聲音限制：無配樂、旁白、字幕"
  ],
  "prompt_rules": [
    "生成指令只含當前鏡頭；歷史失敗、反覆否定及內部 QA 放在資料欄位，不塞進 prompt。",
    "延續只描述新增動作，不重述已完成的開蓋／拿起等動作。",
    "最多一位說話者為預設；需要自然雙人對話時記錄明確輪流時序並單獨驗嘴型。",
    "一輪失敗後先分類原因：語意、道具狀態、聲線、嘴型、畫質；最多兩次同設計重試，之後改鏡頭設計。"
  ],
  "qa_gates": [
    "story_causality",
    "speaker_and_exact_dialogue",
    "voice_identity",
    "lip_sync",
    "character_and_prop_identity",
    "color_against_original_anchor",
    "first_frame_if_same_shot",
    "audio_timestamps",
    "native_master_resolution"
  ],
  "qa_rules": [
    "PENDING 不等於 PASS；不得從備註內「已確認」等字眼推定狀態。",
    "顏色比對既比相鄰段，也比原始錨點；相鄰變化小仍可能累積嚴重偏色。",
    "STT 不取代聽感與嘴型審核。",
    "不得用凍格、局部貼圖或裁切掩蓋語意／角色漂移。",
    "任何新版本改動，都要將依賴它的 FULL 標記待重組；重組記錄每個輸入 master SHA256。"
  ],
  "master_policy": {
    "preserve_original": true,
    "never_promote_preview": true,
    "record": [
      "master_path",
      "master_sha256",
      "native_resolution",
      "preview_path",
      "transforms"
    ],
    "native_1080_preferred": true,
    "native_720_may_be_content_approved": true,
    "upscale_is_not_native_hd": true
  },
  "generation_state": "story_production",
  "budget_rule": "使用既有本機模型，不使用 Flow、不呼叫付費 API。",
  "sources": [],
  "voice_policy": "Use fixed EP01 S03-derived Mia/Leo F5-TTS references for all final dialogue; native H3 audio only for motion timing and QA, never published. No music. Validate mouth timing before publication.",
  "episode_structure": {
    "story_target_seconds": 170,
    "standalone_phrases": 7,
    "teaching_passes": [
      "no subtitles",
      "English",
      "English + Traditional Chinese"
    ]
  },
  "phrase_novelty": {
    "required": true,
    "include_story_dialogue": true,
    "source": "phrase_novelty.json",
    "normalization": "case, punctuation, apostrophe shape, whitespace and common contractions",
    "on_duplicate": "block submission and revise scene/dialogue; changing punctuation does not make a new phrase"
  },
  "revision_guard": "Canonical plan video pointers and ep04_completion selection files identify current r8 full-production outputs; earlier r7 jobs are preserved as provenance.",
  "dialogue_generation_paused": false,
  "voice_issue": "Historical cross-shot native voice variation: final dialogue now uses fixed original-character F5 references, with separate timing and visual checks before publication.",
  "voice_acceptance": "同角色至少兩句不同台詞並排聽測，確認音色、音高及語氣一致後，再與畫面做嘴型驗收。STT 只驗文字，不核准聲線。",
  "user_requested_trial_jobs": {
    "r7_s03c_v1": {
      "reason": "使用者明確指定製作 S03C 試片。僅本次試製，未核准聲線、不恢復其他對話批量生成。",
      "voice_review": "pending"
    },
    "r7_s01c_v3": {
      "reason": "使用者更正原指定：重新生成 S01C（非 S03C），沿用剛才更新進度頁的交付流程。僅本次試製，不代表聲線獲核准。",
      "voice_review": "pending"
    },
    "r7_s01c_v4": {
      "reason": "使用者更正原指定：重新生成 S01C（非 S03C），沿用剛才更新進度頁的交付流程。僅本次試製，不代表聲線獲核准。",
      "voice_review": "pending"
    }
  },
  "resume_authorization": {
    "at": "2026-09-19T22:52:12.658007+08:00",
    "reason": "User explicitly requested completion of all EP04 story and standalone phrase content, followed by soccer EP05; continue established fixed-reference voice workflow."
  },
  "shot_rule_exceptions": [
    {
      "shots": [
        "S01B",
        "S01C"
      ],
      "actual_continuous_seconds": 13.166666,
      "extension_depth": 1,
      "reason": "Keep the complete truck-arrival and bridge-suggestion exchange with one matching first/last-frame continuation. Slightly exceeds conservative 12-second target; no additional extension follows.",
      "qa": "Both clips separately corrected to original scene anchor; matching B-to-C joint inspected in S01 joins.jpg; original identities/props retained."
    },
    {
      "shots": [
        "S04D"
      ],
      "actual_continuous_seconds": 18.333333,
      "extension_depth": 2,
      "reason": "Maintain physical continuity through lift, removal and replacement. Ending is independently rebuilt and reviewed, full clip will be calibrated to original color anchor; next shot resets original identities with fresh references. No fourth or fifth extension permitted.",
      "qa": "Selected only after manual motion, identity, color and joining checks; see generated/r8_s04d_exact_v4/visual_qa.json"
    },
    {
      "shots": [
        "S05B"
      ],
      "actual_continuous_seconds": 15.291666,
      "extension_depth": 1,
      "reason": "One extension preserves actual completed character swap into a full hand-guided empty crossing. Independently constrained endpoint, original-anchor calibration and next closeup resets references.",
      "qa": "Selected only after manual motion, identity, color and joining checks; see generated/r8_s05b_crossing_v2/visual_qa.json"
    },
    {
      "shots": [
        "S06A"
      ],
      "actual_continuous_seconds": 21.875,
      "extension_depth": 2,
      "reason": "Returns to established wide geometry after two intervening original-reference closeups. First frame is selected calibrated empty crossing endpoint; endpoint is independent earlier calibrated left parking state. Full manual motion and original-anchor color QA required.",
      "qa": "Selected only after manual motion, identity, color and joining checks; see generated/r8_s06a_return_v1/visual_qa.json"
    },
    {
      "shots": [
        "S06C"
      ],
      "actual_continuous_seconds": 13.166666666666666,
      "extension_depth": 1,
      "reason": "Single short loaded crossing from checked loading endpoint, independently constrained arrival reference; original-anchor calibration and next closeup reset.",
      "qa": "Selected only after manual motion, identity, color and joining checks; see generated/r8_s06c_loaded_crossing_v1/visual_qa.json"
    }
  ]
}