Wiki · Evidence & Verdicts
Endpoints PIN-unlock + preset dropdown + HUD honesty fixes (2026-07-16)
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.
verdict: PASS evidence_class: B
Endpoints PIN-unlock + preset dropdown + HUD honesty fixes (2026-07-16)
Why
The operator's stream-key passphrase was set in an earlier session and never durably recorded — a real lockout (AES-256-GCM, no backdoor by design). Studio-track fix, requested directly by the owner: reset the dead store, add a platform preset dropdown (multi-account per platform), separate a short PIN from the real passphrase so the operator/HUD never has to retype it, and fix the HUD's own honesty (operator: "the HUD is not honest and in some ways not true").
What shipped
viewer/pin_store.cjs (new). A short 4-8 digit PIN wraps the SAME passphrase
(endpoints_pin.enc, AES-256-GCM, key=scrypt(PIN)) — a separate secret/file from
endpoints.enc. Setting the PIN requires the real passphrase once; after that the PIN alone
reconstructs it. Owner-accepted risk: a short PIN is weaker than the passphrase, accepted because
a leaked stream key only risks channel hijack (easy to rotate), never data exposure.
command_center.cjs /api/endpoints gains setpin, clearpin, pin-arm (PIN → unlock +
start fan-out in one step), pin-disarm (no PIN required — stopping is always one click). Never
touches /api/golive — the public StartStream + typed CONFIRM stays the operator's separate
action (G-PA, unchanged). status now honestly reports hasPin and armed (armed = fan-out
processes actually running, not inferred from unlock alone).
command_center.html gains an editable preset dropdown (YouTube, Twitch, Facebook Live — only
platforms with a stable, publicly-documented static ingest URL; anything dynamic-per-account was
deliberately omitted rather than guessed) and PIN setup/arm/disarm controls, mirroring the HUD.
Multi-account-same-platform was already structurally supported (name is the free-text key, not
platform); the preset picker auto-suggests "#2"/"#3" suffixes.
HUD honesty (3 real bugs, all "claims ok with insufficient evidence"):
PollWorker.csproducer_upaccepteddriver=produceralone as "UP" — fixed to requireverdict=LIVE(the project's own colony rule).SnapshotBuilder.cs,Enlightened.cs,MainWindow.xaml.cs(3 sites) defaulted a missingcircle_oktotrue— fixed to fail closed (false), matchingopen/locked's existing correct default.
HUD widget ARM/DISARM (MainWindow.xaml + .xaml.cs). A PIN box + ARM/DISARM in the Air-hero
panel. POSTs DIRECTLY to :8098 (command center), never proxied through the read-only :8100
service — :8100 remains exactly its pre-existing 2 narrow POSTs (audience/sight), unchanged.
Live receipts
- Server: save with 2 same-platform ("YouTube #1"/"#2") + 1 other endpoint,
pin=4242in the same call →hasPin:true. Lock (simulating a fresh restart). Wrong PIN → clean 401. Correct PIN →pin-armunlocks +fanout:2(both enabled endpoints), keys still masked in the response.pin-disarm→ fan-out processes actually killed (verified 0ffmpeg.exeprocesses after). - HUD: rebuilt + re-signed + redeployed BOTH binaries (
dotnet publish -r win-x64 --self-contained, elevated_stop_service_elevated.ps1→ publish → elevated_sign_and_reinstall_elevated.ps1). Verified independently (not just the install log): serviceRunning, accountNT AUTHORITY\NetworkService,:8100up, exe timestamp + snapshotpidmatches the fresh install. Widget relaunched from the freshly-signed exe (Get-AuthenticodeSignature→Valid), screenshotted: ARM/DISARM panel renders, correctly starts disabled ("no PIN set yet"), and correctly re-enables within one 3s poll after a PIN was set server-side — proving the widget's read/poll path is live end-to-end. The honesty fix is visibly in effect: "producer UP" reads true only because the colony is genuinelyverdict=LIVEright now (not fromdriver=produceralone). - Known gap, stated plainly: the literal ARM button click was not driven by an automated UI
test (the widget isn't a Start-Menu-registered app, so
computer-usecouldn't attach to it). The click wiring (Click="OnArm") is the identical pattern already proven by ~10 sibling buttons in the same file (dock/hide/quit, all currently working); the POST body it constructs was independently verified byte-for-byte against the server test above. Residual risk is low but non-zero until an operator clicks it once for real. - Final state: both
endpoints.encandendpoints_pin.encdeleted after testing — the operator gets a genuinely blank slate to enter real keys and a real PIN, not the test fixture.
Fence
viewer/** + docs/** only. No lib/sp/**, no science gate, no CONFIRM typed, no stream key
ever logged or committed. PIN is a deliberately lower security bar than the passphrase — an
explicit owner-accepted tradeoff, not an oversight.
sha256 bc4372e43e55cad7 — of the original file, so what was ingested stays checkable.
Plain — written for this website, not the source document
A record of several related changes made after a genuine lockout. The passphrase protecting the stored stream keys had been set in an earlier session and never written down, and the encryption has no back door by design. So the dead store was reset, and a short unlock code was added that wraps the real passphrase, so nobody has to retype it. A dropdown of platform presets was added, and three places where a display claimed things were fine without enough evidence were changed to fail closed instead. One gap is stated plainly: a button was never actually clicked by a person in a test, so the risk there is not yet zero.
Plain · written 2026-08-01 by claude-opus-5 · not yet checked by a person · about the document whose sha256 is bc4372e43e55cad7
Clear — written for this website, not the source document
A receipt — the file recording what was run — with a pass verdict and a stated evidence class. The reason for the work is a real lockout. The passphrase protecting an encrypted store of stream keys had been set once and never durably recorded, and the encryption has no back door by design.
Several things shipped. First a short unlock code, kept in its own file with its own derived secret, that wraps the same passphrase. Setting it needs the real passphrase once, and after that the short code alone reconstructs it. The tradeoff is stated as an owner-accepted risk rather than hidden: a short code is a weaker bar, accepted because a leaked stream key risks a channel being hijacked and rotated, never data being exposed.
Then routes to set, clear and use that code, including one that unlocks and starts the fan-out in a single step, and one that stops it with no code required at all, because stopping should always be one click. The status now reports whether processes are genuinely running rather than inferring it from having been unlocked. Going live in public stays a separate action with a typed confirmation, untouched by any of this.
The console gains an editable dropdown of platform presets, limited to platforms with a stable, publicly documented address, with anything that varies per account deliberately left out rather than guessed at.
The honesty fixes are three instances of one shape: claiming things are fine on insufficient evidence. One accepted a weaker signal as evidence of being up, and now requires the stronger one that the project's own rule names. The others defaulted a missing safety flag to true, and now fail closed, matching how neighbouring flags already behaved.
The receipts are live rather than described. A wrong code is cleanly refused, and the right one unlocks and starts both destinations, with the keys still masked in the reply. The stop actually kills the processes, rather than reporting that it had. One gap is then stated in full. A button click was not driven by an automated test, because the tool that would do it cannot attach to that window. The page argues the wiring is the same pattern as many working siblings in the same file, and that the request it builds was checked against the server test. It then says the residual risk is low but not zero until a person clicks it once for real. The test store was deleted afterwards, so the operator starts from blank rather than from a fixture.
Clear · written 2026-08-01 by claude-opus-5 · not yet checked by a person · about the document whose sha256 is bc4372e43e55cad7