{
  "project_id": "24052026-001-Ly-Thuong-Kiet",
  "rule": "19-step workflow checklist regenerated from actual project files. Update status/evidence before moving to next step. No shortcut/skip without explicit boss approval.",
  "regenerated_utc": "2026-05-25T00:35:25.296387+00:00",
  "current_step": 19,
  "overall_status": "completed_step_19_approved_output_subfix",
  "summary": {
    "scene_images": 199,
    "scene_audio": 199,
    "render_part_mp4": 8,
    "thumbnails_complete": true,
    "intro_video_exists": true,
    "main_concat_exists": true,
    "existing_final_packaged_exists": true,
    "info_json_exists": true,
    "audio_safe_final_exists": true
  },
  "steps": [
    {
      "step": 1,
      "name": "Receive story/input and create project folder",
      "status": "completed",
      "evidence": "Project folder exists; script/source_story.txt saved"
    },
    {
      "step": 2,
      "name": "Clean story and split scene/dense plan",
      "status": "completed",
      "evidence": "script/scenes.json + script/scenes_validation.json; dense validation reports 199 scenes, 0 duplicates; roman century numerals normalized for TTS in scenes 2,171,172,173,174"
    },
    {
      "step": 3,
      "name": "Create character_bible.json",
      "status": "completed",
      "evidence": "script/character_bible.json"
    },
    {
      "step": 4,
      "name": "Create/validate/approve scenes.json or dense plan",
      "status": "completed",
      "evidence": "script/scenes_validation.json; source words preserved, max 38 words/scene"
    },
    {
      "step": 5,
      "name": "Generate all scene images",
      "status": "completed",
      "evidence": "images/scenes scene images: 199/199"
    },
    {
      "step": 6,
      "name": "Generate 2 final thumbnails by GPT image: thumb_16x9_final.png at 16:9 (1920x1080) and thumb_9x16_final.png at 9:16 (1080x1920)",
      "status": "completed",
      "evidence": "thumb_16x9_final.png: True; thumb_9x16_final.png: True"
    },
    {
      "step": 7,
      "name": "Generate TTS for each scene",
      "status": "completed",
      "evidence": "199/199 scene wav files exist; scenes 002,171,172,173,174 regenerated after Roman numeral TTS fix; logs/tts_roman_fix_scene_*.log"
    },
    {
      "step": 8,
      "name": "Build master narration timeline on worker",
      "status": "completed",
      "evidence": "audio/master_narration.wav exists and worker compose/probe artifacts present; duration 1043.300s after Roman numeral TTS fix."
    },
    {
      "step": 9,
      "name": "Probe real audio/part durations on worker",
      "status": "completed",
      "evidence": "logs/step9_master_probe.json and worker probe confirm master narration duration 1043.300s."
    },
    {
      "step": 10,
      "name": "Run ASR on master audio for word timestamps",
      "status": "completed",
      "evidence": "script/asr_master_words.json and logs/step10_asr_master.json exist."
    },
    {
      "step": 11,
      "name": "Create subtitles from source text mapped to ASR word timestamps",
      "status": "completed",
      "evidence": "Subtitles regenerated from source mapped to ASR word timestamps; output/invalidated downstream no longer used."
    },
    {
      "step": 12,
      "name": "Clamp subtitle safe gaps and validate no overlap",
      "status": "completed",
      "evidence": "script/subtitles_safe_gap_validation.json exists."
    },
    {
      "step": 13,
      "name": "Split render into sync-safe parts by timeline/audio/subtitle offsets",
      "status": "completed",
      "evidence": "script/render_parts_plan.json exists; 8 sync-safe render parts planned."
    },
    {
      "step": 14,
      "name": "Render each part with 8015 offset/slice-safe workflow",
      "status": "completed",
      "evidence": "8/8 romanfix render parts exist in output/render_parts/part_01.mp4..part_08.mp4; logs/step14_render_parts_summary.json ok."
    },
    {
      "step": 15,
      "name": "Concat sync-safe parts on worker",
      "status": "completed",
      "evidence": "/data/video-pipeline/Youtube-Video-Maker/Project/24052026-001-Ly-Thuong-Kiet/output/main/24052026-001-Ly-Thuong-Kiet_main_parts_concat_SUBFIX.mp4"
    },
    {
      "step": 16,
      "name": "QA early/mid/late main file",
      "status": "completed",
      "evidence": "/data/video-pipeline/Youtube-Video-Maker/Project/24052026-001-Ly-Thuong-Kiet/logs/step16_subfix_blackdetect.json and logs/main_subfix.blackdetect.log"
    },
    {
      "step": 17,
      "name": "Create project intro using the required intro format",
      "status": "completed",
      "evidence": "output/intro/intro_logo_thumbnail.mp4 created via approved 8015 render service; intro_tts_tailpause2s.wav duration 16.94s; logs/step17_render_intro.json."
    },
    {
      "step": 18,
      "name": "Final package intro/outro/BGM sync-safe on worker, including required intro and thumbnails",
      "status": "completed",
      "evidence": "/data/video-pipeline/Youtube-Video-Maker/Project/24052026-001-Ly-Thuong-Kiet/output/final/24052026-001-Ly-Thuong-Kiet_final_AUDIO_SAFE_SUBFIX_20260525.mp4"
    },
    {
      "step": 19,
      "name": "QA final, write output/info.json, and only then report approved output",
      "status": "completed",
      "evidence": "/data/video-pipeline/Youtube-Video-Maker/Project/24052026-001-Ly-Thuong-Kiet/output/info.json; /data/video-pipeline/Youtube-Video-Maker/Project/24052026-001-Ly-Thuong-Kiet/logs/step19_subfix_final_qa.json"
    }
  ],
  "updated_utc": "2026-05-25T03:16:46.779332Z",
  "notes": [
    {
      "utc": "2026-05-25T00:38:56.598212+00:00",
      "note": "Roman numerals in century phrases normalized in scenes 2,171,172,173,174 and corresponding scene TTS regenerated. Downstream master narration, probe, ASR, subtitles, render parts, concat, QA, intro/final/info must be redone from step 8."
    },
    {
      "utc": "2026-05-25T00:41:07.047442+00:00",
      "note": "Boss approved deleting invalid downstream files after Roman numeral TTS fix. Invalidated master/audio/sub/render/main/final moved to output/invalidated_roman_fix_20260525T0040Z. Step 8 is blocked because approved AGENTS services do not include an audio compose/master narration endpoint; old 8005 compose exists in scripts but was removed from approved 19-step service list, so Erza must not use it without explicit approval."
    },
    {
      "utc": "2026-05-25T02:19:50Z",
      "note": "Cron inspection found steps 8-15 already rebuilt after Roman numeral TTS fix: master narration, ASR/subtitles/plan, 8 render parts, and main concat exist. Checklist advanced to step 16 QA main; no final approval yet."
    },
    {
      "utc": "2026-05-25T02:20:39Z",
      "note": "Step 16 basic main QA passed by worker probe. Advanced to step 17; blocked on safe approved method/assets for intro video generation before final package."
    },
    {
      "utc": "2026-05-25T02:37:28Z",
      "note": "Cron continued step 17: intro rendered with 8015 using thumbnail/logo format and intro TTS tail pause. Step 18 partially progressed by composing intro+master+outro voice on approved 8005. Blocked before final package because no local ffmpeg and approved worker services lack concat/mux/BGM endpoint."
    },
    {
      "utc": "2026-05-25T03:16:46.779353Z",
      "note": "Cron completed step 19: probed audio-safe final via worker 8002, QA passed (1920x1080, audio 24000 Hz, A/V delta <1s), wrote output/info.json."
    }
  ]
}