{
  "project_id": "11062026-001-Biet-Du-Thi-Khong-Nhuc",
  "project_name": "Biết đủ thì không nhục",
  "created_at": "2026-06-11",
  "channel": "Lời Cổ Nhân",
  "workflow_version": "loi-co-nhan-short-v1",
  "current_step": 6,
  "defaults": {
    "format": "9:16",
    "duration_target": "under_3_minutes",
    "image_style": "cổ phong, giấy vàng",
    "thumbnail_count": 1,
    "character_refs": false,
    "render_mode": "one_pass",
    "intro": "one thumbnail frame plus topic sentence",
    "outro": false,
    "bgm": "/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/paulyudin-sentimental-story-182512.mp3",
    "watermark_logo": "/data/video-pipeline/Channel-Loi-Co-Nhan/data/logo/logoloiconhan.png"
  },
  "steps": [
    {
      "step": 1,
      "id": "receive_input_create_project",
      "name": "Receive story/input and create project folder",
      "status": "completed"
    },
    {
      "step": 2,
      "id": "clean_story_split_dense_plan",
      "name": "Clean story and split scene/dense plan",
      "status": "completed"
    },
    {
      "step": 3,
      "id": "create_character_bible",
      "name": "Create character bible",
      "status": "completed"
    },
    {
      "step": 4,
      "id": "approve_scenes_dense_plan",
      "name": "Create/validate/approve scenes dense plan",
      "status": "completed"
    },
    {
      "step": 5,
      "id": "image_provider_style_preflight",
      "name": "Image provider and style preflight",
      "status": "completed"
    },
    {
      "step": 6,
      "id": "scene_images_thumbnail",
      "name": "9:16 scene images and single vertical thumbnail",
      "status": "in_progress"
    },
    {
      "step": 7,
      "id": "scene_tts",
      "name": "Scene-level TTS",
      "status": "pending"
    },
    {
      "step": 8,
      "id": "master_narration_timeline",
      "name": "Build master narration timeline",
      "status": "pending"
    },
    {
      "step": 9,
      "id": "probe_audio_durations",
      "name": "Probe real audio durations",
      "status": "pending"
    },
    {
      "step": 10,
      "id": "asr_word_timestamps",
      "name": "ASR master narration word timestamps",
      "status": "pending"
    },
    {
      "step": 11,
      "id": "map_narration_to_asr",
      "name": "Map original narration to ASR word timing",
      "status": "pending"
    },
    {
      "step": 12,
      "id": "subtitle_safe_gaps",
      "name": "Clamp subtitle safe gaps and validate no overlap",
      "status": "pending"
    },
    {
      "step": 13,
      "id": "prepare_onepass_render",
      "name": "Prepare one-pass 9:16 render",
      "status": "pending"
    },
    {
      "step": 14,
      "id": "render_full_main_story_once",
      "name": "Render full 9:16 main story once",
      "status": "pending"
    },
    {
      "step": 15,
      "id": "validate_register_main_story",
      "name": "Validate and register main story video",
      "status": "pending"
    },
    {
      "step": 16,
      "id": "qa_main_story",
      "name": "QA early/mid/late main story video",
      "status": "pending"
    },
    {
      "step": 17,
      "id": "one_frame_thumbnail_intro",
      "name": "Create one-frame thumbnail intro",
      "status": "pending"
    },
    {
      "step": 18,
      "id": "final_package_intro_main_bgm",
      "name": "Final package intro + main + BGM audio-safe",
      "status": "pending"
    },
    {
      "step": 19,
      "id": "final_qa_info_approve",
      "name": "Final QA, write output/info.json, approve output",
      "status": "pending"
    }
  ]
}