settings/builders.py renders a fix's command from a builder (template) and its fields; validate
refuses a config whose stored command no longer equals what its fields build; the Fixes screen and
the remote checks in the key editor rebuild through /api/build and /api/build-check. config.json
adopts templates for all 27 fixes and 5 remote checks (ProPresenter's restart loop and Ableton's
quoting normalised, same behaviour); tests/test_builders.py (174 tests pass). Deployed to NA Ingest.
Co-Authored-By: Claude Fable 5.1 <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>