- readiness.py looks every 2 minutes (never while a HyperDeck records) at this weekend's PCO plan
and what is in place for it: the Ableton set (songs, mix, routing, lighting cues), ProPresenter
(every PCO item, MC announcements, baptism names, timelines, backgrounds), the LTC note of every
song against the timecode the tracks play, the Band Lineup TV, Resolume's LED cross, and the
tracks and ProP bundles for the locations.
- READY key on the Status page (row 2, col 7; SPOTIFY now shows inside SHOW) opens page 24.
Amber until done, blinking red from Saturday noon; not part of ALL. Tap keys for BOH mix,
mics and stage reset every Monday.
- Holds fix what can be fixed: re-sync the lineup, put the cross back up, write LTC into PCO,
copy tracks to locations, look again. Hold READY fixes everything.
- Settings page: a READY page tab (live keys, drag to move, why each key is amber), and Apply
re-imports page 24.
- Auto-fix: "while_muted" fixes keep running with ALARMS muted (Spotify playlist).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- settings/apply.py: the Apply pipeline (check, keep history, write, restart the watchdog, re-import
pages by the marker-only rule, recolour page keys), rollback when the watchdog does not come back,
the recording guard with the Emergency (LIVE) override, history entries and Go back / Undo.
- settings/server.py: the write routes behind the editing code (draft PUT/DELETE with 409 on a
conflict, validate, apply, restore, undo, watchdog restart/stop/start, commands to the watchdog,
the switcher file upload / pick newest / discard, gear notes).
- settings/ui/app.js: every screen grows inputs with Editing on; keys (checks, fixes, hold-always,
members), computers, fixes, site setup (schedules, Dante devices, Spotify, ATEM), Review & Apply
with live progress, History with Go back and Undo, Run this fix now.
- schema.unmask, push_page.push, nav_keys.colour; tests for all of it (163 pass).
- Verified live on NA Ingest: a page-only Apply, a restart Apply, Undo, history.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- schema.py: every setting with type, default, help, owner screen and the rules a config must
pass; tests/test_schema.py keeps it in step with the code (every key the code reads is declared,
every default matches, check types and fix kinds agree, the glossary covers every word a key can
show, today's config still builds today's pages apart from the key notes)
- status_panel.py: VERSION + started.json; SIGTERM lets a running fix finish and starts nothing new
(RESTARTING SOON); fixes-running.json and live-now.json for the settings page; state.json keeps
the ALARMS override, acknowledgements, auto-fix tries and fix times across restarts, keyed by
what a check is about rather than its position; 'test' and 'resurvey' commands; queued commands
dropped at start; overnight windows; a HyperDeck switched off is always switched back on;
the spotify fix kind (playlist set once, in config 'spotify'); Windows remote checks batched for
cmd.exe with conditional echoes; every fix's kind and host validated; never_auto; wording and
numbers from config (site block, timing, page_hold_ms, auto-fix keep_months); hyperdeck_probe
removed; --check and --exit-timeout
- make_page.py: numbers from config, markers on every key, nav templates per Companion version,
--out; push_page.py: a page is overwritten only when every key carries a marker (foreign keys
named by position), secret-free fetch, host from the site; nav_keys.py: host from the site;
netgear.py: switches and the shared-port limit from config
- install.sh: validates with the new code first, keeps prev/ for --rollback, --keep-config,
derived ExitTimeOut, wider deploy list, waits for the start stamp
- config.json: site, timing, spotify sections; Windows hosts marked; deployed to NA Ingest and
both pages re-imported once (--force) so every key carries its marker
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- The remembered network blip is a flashing amber warning (new "notice"
level, not counted as DOWN): press NET to stop the flashing, hold NET 2 s
to clear it, otherwise it goes by itself after 5 minutes (was 3, solid).
- The user moved the Restart page to page 20: config, the RESTART PAGE key
on page 19 and both pages re-pushed. A scan of all pages finds no other
button pointing at the old page.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Page 23 "Restart": hold a key 2 s to restart DVS (4 Macs), ProPresenter,
Ableton, Church Translate, ProdCom, ProdDash, captions, the bridge or the
Tascam connection even when the status page says it is fine ("force",
shared 60 s guard). RESTART PAGE key on page 19, STATUS PAGE back.
- Holds carry Companion's clock; ones queued while the watchdog was down
are dropped instead of firing together later.
- TASCAM hold always reconnects and checks again after 20 s: HUNG - POWER
CYCLE IT (pings, control port hung), NO NETWORK, or turns a disabled
connection on. Tascam pinged at its Companion address.
- INGEST: ProdCom (:24480), ProdDash's page (:24500), the caption screen;
DVS on Ingest restarts ProdCom afterwards. RESI: the encoder (10.1.10.202).
- Windows starts check the app really started (FIX FAILED otherwise); OBS's
start task runs elevated (OBS is "Run as administrator"); setup script
does that for any such app and gives sshd restart-on-failure.
- push_page.py checks what is on the target page, not its name (pages 22
and 97 are named "PAGE" but hold buttons); --which restart.
- Companion custom variables are written in the request body (no URL limit).
Reviewed by a 3-lens review with per-finding verification; 7 confirmed
issues fixed. Tested live: OBS hold opens OBS; Restart page TASCAM key.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It uploads the page file over Companion's own API (tRPC over WebSocket, the
same calls the web UI makes) and imports it into page 19, refusing unless that
page is empty or already the status page.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>