{
  "project_id": "28052026-002-Tran-Quang-Dieu-Bui-Thi-Xuan",
  "step": 19,
  "passed": true,
  "status": "passed",
  "final_video_path": "/data/video-pipeline/Youtube-Video-Maker/Project/28052026-002-Tran-Quang-Dieu-Bui-Thi-Xuan/output/final/final_video.mp4",
  "final_duration_sec": 1464.0,
  "qa_points": [
    [
      "intro_transition",
      14.334
    ],
    [
      "early_main",
      45.334
    ],
    [
      "mid_main",
      726.3185
    ],
    [
      "late_main",
      1392.303
    ],
    [
      "outro",
      1444.0
    ]
  ],
  "qa_frames": [
    {
      "label": "intro_transition",
      "time_sec": 14.334,
      "path": "/data/video-pipeline/Youtube-Video-Maker/Project/28052026-002-Tran-Quang-Dieu-Bui-Thi-Xuan/output/final/final_qa_frames/intro_transition_14.3.jpg",
      "exists": true
    },
    {
      "label": "early_main",
      "time_sec": 45.334,
      "path": "/data/video-pipeline/Youtube-Video-Maker/Project/28052026-002-Tran-Quang-Dieu-Bui-Thi-Xuan/output/final/final_qa_frames/early_main_45.3.jpg",
      "exists": true
    },
    {
      "label": "mid_main",
      "time_sec": 726.3185,
      "path": "/data/video-pipeline/Youtube-Video-Maker/Project/28052026-002-Tran-Quang-Dieu-Bui-Thi-Xuan/output/final/final_qa_frames/mid_main_726.3.jpg",
      "exists": true
    },
    {
      "label": "late_main",
      "time_sec": 1392.303,
      "path": "/data/video-pipeline/Youtube-Video-Maker/Project/28052026-002-Tran-Quang-Dieu-Bui-Thi-Xuan/output/final/final_qa_frames/late_main_1392.3.jpg",
      "exists": true
    },
    {
      "label": "outro",
      "time_sec": 1444.0,
      "path": "/data/video-pipeline/Youtube-Video-Maker/Project/28052026-002-Tran-Quang-Dieu-Bui-Thi-Xuan/output/final/final_qa_frames/outro_1444.0.jpg",
      "exists": true
    }
  ],
  "blackdetect": {
    "returncode": 0,
    "events": [],
    "event_count": 0,
    "log_path": "/data/video-pipeline/Youtube-Video-Maker/Project/28052026-002-Tran-Quang-Dieu-Bui-Thi-Xuan/output/final/final_qa_blackdetect.log"
  },
  "validation": {
    "final_exists": true,
    "has_audio": true,
    "has_video": true,
    "thumbnail_16x9_exists": true,
    "thumbnail_9x16_exists": true,
    "black_event_count": 0,
    "blackdetect_clear": true,
    "qa_frames_extracted": true,
    "package_completed": true,
    "bgm_volume": 0.2,
    "decision": "approved_output_candidate_after_automated_qa; human spot-check recommended for subjective BGM/sync"
  },
  "notes": [
    "Automated QA checks streams, duration, black frames, frames at intro/early/mid/late/outro. User should still listen/spot-check BGM and sync before publishing."
  ]
}