{
  "version": "v6-public-preview",
  "time_convention": "Clip-relative time; start inclusive, end exclusive. Dominant editorial phases, not hardware event timestamps.",
  "scope": "Action-label preview only. Videos include face blurring and ULOVE AI watermark. Hand overlays are 2D estimates, not 3D ground truth.",
  "episodes": [
    {
      "id": "01_weigh_fill",
      "title": "Weighing & filling",
      "duration_sec": 30,
      "fps": 30,
      "frame_count": 900,
      "video": "/assets/sample-weigh-fill.mp4",
      "poster": "/assets/case-01.webp",
      "description": "A container is filled, adjusted on a scale and transferred to a tray.",
      "actions": [
        {
          "start_sec": 0.0,
          "end_sec_exclusive": 2.4,
          "start_frame": 0,
          "end_frame_exclusive": 72,
          "label": "retrieve_and_place_container",
          "description_en": "Retrieve and place container"
        },
        {
          "start_sec": 2.4,
          "end_sec_exclusive": 19.6,
          "start_frame": 72,
          "end_frame_exclusive": 588,
          "label": "scoop_and_fill",
          "description_en": "Scoop and fill"
        },
        {
          "start_sec": 19.6,
          "end_sec_exclusive": 24.8,
          "start_frame": 588,
          "end_frame_exclusive": 744,
          "label": "adjust_fill_on_scale",
          "description_en": "Adjust fill on scale"
        },
        {
          "start_sec": 24.8,
          "end_sec_exclusive": 29.666666666666668,
          "start_frame": 744,
          "end_frame_exclusive": 890,
          "label": "transfer_to_tray",
          "description_en": "Transfer and arrange in tray"
        },
        {
          "start_sec": 29.666666666666668,
          "end_sec_exclusive": 30.0,
          "start_frame": 890,
          "end_frame_exclusive": 900,
          "label": "reset_for_next_cycle",
          "description_en": "Reset for next cycle"
        }
      ]
    },
    {
      "id": "02_seal",
      "title": "Machine sealing",
      "duration_sec": 10,
      "fps": 30,
      "frame_count": 300,
      "video": "/assets/sample-seal.mp4",
      "poster": "/assets/case-02.webp",
      "description": "A container and lid are positioned at the sealing machine, then removed.",
      "actions": [
        {
          "start_sec": 0.0,
          "end_sec_exclusive": 1.4666666666666666,
          "start_frame": 0,
          "end_frame_exclusive": 44,
          "label": "pick_container_and_lid",
          "description_en": "Pick container and lid"
        },
        {
          "start_sec": 1.4666666666666666,
          "end_sec_exclusive": 1.8333333333333333,
          "start_frame": 44,
          "end_frame_exclusive": 55,
          "label": "fit_metal_lid",
          "description_en": "Fit metal lid"
        },
        {
          "start_sec": 1.8333333333333333,
          "end_sec_exclusive": 2.4,
          "start_frame": 55,
          "end_frame_exclusive": 72,
          "label": "position_in_sealer",
          "description_en": "Position in sealer"
        },
        {
          "start_sec": 2.4,
          "end_sec_exclusive": 7.1,
          "start_frame": 72,
          "end_frame_exclusive": 213,
          "label": "hold_at_sealer",
          "description_en": "Hold container at sealer"
        },
        {
          "start_sec": 7.1,
          "end_sec_exclusive": 9.1,
          "start_frame": 213,
          "end_frame_exclusive": 273,
          "label": "remove_and_transfer",
          "description_en": "Remove and transfer"
        },
        {
          "start_sec": 9.1,
          "end_sec_exclusive": 10.0,
          "start_frame": 273,
          "end_frame_exclusive": 300,
          "label": "reset_for_next_cycle",
          "description_en": "Reset for next cycle"
        }
      ]
    },
    {
      "id": "03_floor_recovery",
      "title": "Floor retrieval & recovery",
      "duration_sec": 12,
      "fps": 30,
      "frame_count": 360,
      "video": "/assets/sample-recovery.mp4",
      "poster": "/assets/case-03.webp",
      "description": "A container is retrieved from the floor and returned to a tray. The initial drop is not shown.",
      "actions": [
        {
          "start_sec": 0,
          "end_sec_exclusive": 2.6,
          "start_frame": 0,
          "end_frame_exclusive": 78,
          "label": "approach_floor_container",
          "description_en": "Approach container on floor"
        },
        {
          "start_sec": 2.6,
          "end_sec_exclusive": 3.8,
          "start_frame": 78,
          "end_frame_exclusive": 114,
          "label": "retrieve_container_from_floor",
          "description_en": "Grasp and lift container from floor"
        },
        {
          "start_sec": 3.8,
          "end_sec_exclusive": 10.0,
          "start_frame": 114,
          "end_frame_exclusive": 300,
          "label": "carry_back_to_workstation",
          "description_en": "Carry container back to workstation"
        },
        {
          "start_sec": 10.0,
          "end_sec_exclusive": 10.6,
          "start_frame": 300,
          "end_frame_exclusive": 318,
          "label": "place_container_in_tray",
          "description_en": "Place container in tray"
        },
        {
          "start_sec": 10.6,
          "end_sec_exclusive": 12.0,
          "start_frame": 318,
          "end_frame_exclusive": 360,
          "label": "resume_tray_handling",
          "description_en": "Resume tray handling"
        }
      ]
    }
  ]
}
