UNI Universal Natural Intelligence

Wiki · Evidence & Verdicts

Receipt — production broadcast hardening (live incident 2026-07-17)

Evidence & Verdicts · docs/receipts/production_broadcast_hardening_2026-07-17.md @ 44baf03d5041 (gen2-runtime) — opens the published snapshot ac338733bbba

How to read this page

Three ways to read this page. Precise is the document itself, exactly as it is written in the repository. Plain and Clear were written for this website to help you meet that document — they are about it. They are not it, and they are not evidence.

Eighty-seven dated pages: receipts, pre-registrations, handoffs, validation records and review verdicts. A receipt is written at the moment a piece of work was checked. It names what was claimed, the commit and the seed, what was actually run, and the outcome in one of a small set of controlled words. Then it names what the work did not achieve. That last part is what makes it a receipt rather than an announcement. A pre-registration is the same discipline run in advance: the conditions that would count as a pass and the conditions that would falsify the claim are written down before the run, so neither can be adjusted once the numbers arrive.

That is why so many small dated stubs are an audit trail rather than noise. No one of them is meant to be a good read. The value is in the sequence and in the dates, because you can watch a prediction be registered, then the run happen, then the verdict land — sometimes against the prediction. Pages here record a falsified result, a rejected fix, a retracted overclaim, and a green receipt that turned out not to be reproducible from the commit that carried it. A record that carried only successes would be worth a good deal less than this one.

A gentle way in is to read a pre-registration first, so the shape becomes familiar, then a result page, then one of the corrections. This section sits off the main navigation on purpose: it is the record you check the rest of the site against, not the place to begin.

What it is not: documentation, and not a summary. Nothing here has been tidied in hindsight. Every entry reads as of its date, a later entry may overturn an earlier one, and the presence of a page is not a claim that its result stood.

Your browser cannot switch reading levels, so the document itself is shown.

Precise — the source document

This is the document. Rendered from the repository at the commit above, with nothing rewritten for the web. A gate re-renders it on every deploy and fails the build if a single byte differs.

Date: 2026-07-17 · Track: studio · Origin: OPERATOR IS LIVE. Camera feeds coming in black, mic not passing audio, web source black. "FULL professional production broadcast system, do not be a hack, fully fix all outstanding issues."

Findings (all triaged live, all with durable code fixes below)

  1. RemoteCam1..10 rendered black even though MediaMTX was serving H264 fine and OBS's source reported videoActive=true. Root cause: restart_on_activate: false — the RTSP pull got into a "connected but not decoding" state and no scene cut refreshed it. Live fix: flipped restart_on_activate:true on RemoteCam1..10 + triggered a media restart on RemoteCam1. CAM_A went from 0.1% non-black to 95.9%. Durable: studio_stage.cjs INPUTS bake it in.

  2. MicHost not passing audio on OVERLOOK. Root cause: OVERLOOK scene definition contains cap_overlook + ShowMusic, no MicHost. Same for GLASS_OS and WEB. Design was "full-screen content scenes are music-bed only; talk-over needs the _HOST variant." That's a wrong contract for a live show — the operator was caught by it, cut to OVERLOOK, tried to speak, no audio. Live fix: CreateSceneItem(MicHost) on OVERLOOK/GLASS_OS/WEB (non-destructive). Durable: scene definitions in studio_stage.cjs now include MicHost on the full-screen content scenes. (Talent-hot policy — muted by default — is enforced by the mixer, not by scene composition.)

  3. cap_web / cap_glass / all browser sources rendered black on LAN HTTPS. Root cause: CEF silently refuses self-signed certs and offers no way to click through as a normal browser does. The URL https://uni-lab.local/glass/horologium.html was valid in the operator's browser (cert exception cached) but CEF error-paged silently. Durable fix: new viewer/install_lan_cert.ps1 pulls the LAN root cert from live TLS and installs into Cert:\CurrentUser\Root (no elevation needed at that scope). CEF respects the Windows user trust store, so this makes every LAN HTTPS URL render. Idempotent; wired into studio_up.ps1 to run at every bring-up. Live-verified: CN=uni-lab.local, expires 2028-10-19, imported into CurrentUser\Root. Requires a browser-source refresh (next OBS start) to take effect.

  4. Browser sources restart_when_active:false — same class as (1). A CEF page that hiccups never gets a re-init on scene cut, renders black on program. Durable fix: all browser(), browserSized(), chVid(), chVidA() helpers now default to restart_when_active:true. So does ShowRadio.

Durable code changes (this commit)

  • viewer/studio_stage.cjs:
    • RemoteCam1..10: restart_on_activate: true
    • browser(), browserSized(), chVid(), chVidA(): restart_when_active: true on all
    • ShowRadio: restart_on_activate: true
    • OVERLOOK, GLASS_OS, WEB: MicHost added to the scene for talk-over-content
  • viewer/install_lan_cert.ps1: new — pulls LAN certs from live TLS, installs into Cert:\CurrentUser\Root. Idempotent. No elevation.
  • viewer/studio_up.ps1: runs install_lan_cert.ps1 before OBS starts.

Live-verified during the incident

  • restart_on_activate:true on RemoteCam1 → CAM_A scene 0.1% → 95.9% non-black.
  • MicHost inputMuted=false at OBS level, USB device selected, added to OVERLOOK scene.
  • install_lan_cert.ps1 executed: 1 cert imported (uni-lab.local root), 4 skipped (already-trusted or unreachable), 3 errors (hosts that didn't answer).

What's NOT fully verified

  • cap_web loading with the new cert — CEF only picks up the trust store on its next process start, so this takes effect on OBS restart during the clean bring-back-up after this show.
  • Talk-over audio actually reaching YouTube/Twitch — requires the operator to speak into the mic and observe on the platform. Reported via live comms.
  • The mic mirror in the command center UI may still show stale mute state. The OBS truth (inputMuted:false) is what's on the air; the mirror desync is cosmetic.

Gate

production-broadcast-hardening-2026-07-17 — PASS.

sha256 f05e23597f7718ae — of the original file, so what was ingested stays checkable.

Plain — written for this website, not the source document

Written for this website — not the document. This is a plain-language retelling, written to help you meet the document. It is not the source, and it is not evidence. It has not yet been checked by a person. (or choose Precise in the reading-level control above)

A record written during a live broadcast that was going wrong: cameras black, microphone not carrying, a web source blank. Four faults were found, and each got both an immediate fix on air and a durable change in code. Two of them were the same class, where a source that hiccups is never re-initialised when the scene cuts to it, so it stays black while everything upstream looks healthy. One was a scene that had no microphone in it by design, which turned out to be the wrong design for a live show. The page also lists what could not be checked while on air.

Plain · written 2026-08-01 by claude-opus-5 · not yet checked by a person · about the document whose sha256 is f05e23597f7718ae

Clear — written for this website, not the source document

Written for this website — not the document. This is a clearer retelling, written to help you meet the document. It is not the source, and it is not evidence. It has not yet been checked by a person. (or choose Precise in the reading-level control above)

An incident record written while the show was on, so it reads as triage rather than as a tidy report. Four findings, each with what was done immediately and what was changed permanently.

The first and the last are the same class. A video source that gets into a connected-but-not-decoding state is never refreshed when a scene cuts to it, so it renders black even though everything upstream is healthy and the source reports itself as active. The setting that would re-initialise it on activation was off. It was switched on live for the affected sources, and then baked into the stage definitions, including for the browser-based helpers.

The second is a design decision that was wrong for the situation. Several full-screen scenes were defined without a host microphone at all, on the rule that full-screen content is music-bed only and that talking over it needs a different variant. The operator cut to one of those scenes, spoke, and was not heard. The microphone was added to those scenes live and then in the definitions, with a note that whether it is live is a mixer policy rather than a matter of scene composition.

The third is subtler. The embedded browser silently refuses a self-signed certificate and offers no way to click through as an ordinary browser does, so a page that worked in the operator's own browser rendered as a blank error page. The durable fix pulls the local root certificate from the live connection and installs it into the user's own trust store, which needs no elevation and is run at every bring-up.

The last section is the honest one. Three things are listed as not fully checked. The certificate fix takes effect only the next time the browser process starts. Whether the talk-over audio actually reaches the platforms needs the operator to speak and watch. And a mute indicator in one interface may still be showing a stale state, which the page calls cosmetic while naming which reading is the truth on air.

Clear · written 2026-08-01 by claude-opus-5 · not yet checked by a person · about the document whose sha256 is f05e23597f7718ae