- 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>
Fixes come from config.json only and run over SSH with NA Ingest's
status-panel key (ProPresenter restart, Ableton / Church Translate start,
reopen DVS), locally (Resi bridge, captions, ProdDash) or as a HyperDeck
reboot. A green button does nothing, each fix waits 60 s before it can run
again, and a recording deck is never rebooted. New remote checks ask the Macs
every 10 s whether their apps are running. Group buttons and INGEST now have a
hold too; tests never run a real fix or open an SSH connection.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The converted key's "startup" page resolves to the current page on surfaces
set to "use last page", so a tap did nothing. The tap page is now
nav_tap_page in config.json (1).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A tap still goes to the start page, now on release so a hold does not flash
through page 1 first. Hold time is nav_hold_ms in config.json.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New config setting nav_keys (now ["pagenum"]) picks which nav keys are
coloured; nav_keys.py restores the built-in key for any kind not listed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
nav_templates.json holds Companion's own UP / page number / DOWN keys after
'convert to regular button'; make_page.py colours them from the ALL tile and
nav_keys.py copies them onto all 96 other pages (288 keys, recorded in
nav_locations.json; --revert restores the built-in keys). Also rewrites the
README's top half, which an earlier edit had duplicated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
status_panel.py runs on NA Ingest as a LaunchAgent. Every second it reads
Companion's connection statuses and module variables, adds what Companion
cannot see (network MIDI peers, Bonjour sessions, pings, launchd services,
disk, Resi cloud, the Bible TV app), and writes one JSON custom variable that
page 19 renders. Buttons acknowledge alarms, mute them, and restart a stuck
Companion connection on a two second hold. If the watchdog stops, the page
turns purple instead of freezing on stale green.
make_page.py builds the page export from config.json; tests/ runs offline
against a fake Companion and a CoreMIDI loopback.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>