diff --git a/README.md b/README.md index a1b6e81..68146da 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,8 @@ Row 0 holds the group buttons. Each one shows the first problem in its group, pl It checks over SSH every 10 s that ProPresenter, Ableton and Church Translate are running, using NA Ingest's key `~/.ssh/id_status_panel`. That key was authorized on the Macs with `remote-access/mac-authorize.sh`. - **ALARMS:** alarms are armed all the time (`service_windows` in `config.json`: every day, 00:00–23:59). Press ALARMS to mute the blinking; press it again to turn them back on; they come back by themselves at midnight. Holds still fix while muted; the Sunday stream-audio failover still switches by itself. The settings page's Overview has the same switch. On a page with no AUTO-FIX key (NA today), ALARMS also stops every auto-fix and the key says both (`ALARMS OFF` / `AUTO-FIX OFF` / `TIL 12AM`). -- **AUTO-FIX** (beside ALARMS on the campuses; `kind: autofix`): its own switch since 2026-10-21. On in the auto-fix hours. Press: pause it (`AUTO-FIX OFF / TIL SUN 5AM`: until the hours next start), or run it outside the hours until they next start or end; it goes back to its hours by itself. Holds always fix. With this key, ALARMS only silences. From NA's CAMPUS page a hold is the press. The Overview has a Pause auto-fix button. -- **LIGHTS** (Southcoast; `kind: bypass`, `"bypass": {"peers": ["Lighting"], "hosts": ["", "sc_tracks_new"]}`): hold 2 s to hand the lights to a lighting operator. Every network MIDI link to Lighting (ProPresenter's session, Tracks' session, and Companion's 56 Midi-Lighting buttons, which go out through ProPresenter's session) is taken out, the MIDI checks stop calling it lost and auto-fix stops putting it back; the key says `LIGHTS / OPERATOR / MIDI OFF` (steady blue). A link that comes back while the operator has it is taken out again within 10 s. Hold again: everything taken out is put back as it was, and every watched link to Lighting is reconnected (`LIGHTS / AUTO`). A peer that had called in (no address, ":5004") is not called back: it rejoins when Lighting calls again. Survives a restart; a hold from NA's CAMPUS page works too. `"conns"` can also switch Companion connections off for the operator. +- **AUTO-FIX** (beside ALARMS on the locations; `kind: autofix`): its own switch since 2026-10-21. On in the auto-fix hours. Press: pause it (`AUTO-FIX OFF / TIL SUN 5AM`: until the hours next start), or run it outside the hours until they next start or end; it goes back to its hours by itself. Holds always fix. With this key, ALARMS only silences. From NA's LOCATION page a hold is the press. The Overview has a Pause auto-fix button. +- **LIGHTS** (Southcoast; `kind: bypass`, `"bypass": {"peers": ["Lighting"], "hosts": ["", "sc_tracks_new"]}`): hold 2 s to hand the lights to a lighting operator. Every network MIDI link to Lighting (ProPresenter's session, Tracks' session, and Companion's 56 Midi-Lighting buttons, which go out through ProPresenter's session) is taken out, the MIDI checks stop calling it lost and auto-fix stops putting it back; the key says `LIGHTS / OPERATOR / MIDI OFF` (steady blue). A link that comes back while the operator has it is taken out again within 10 s. Hold again: everything taken out is put back as it was, and every watched link to Lighting is reconnected (`LIGHTS / AUTO`). A peer that had called in (no address, ":5004") is not called back: it rejoins when Lighting calls again. Survives a restart; a hold from NA's LOCATION page works too. `"conns"` can also switch Companion connections off for the operator. ## Auto-fix on Sundays (06:30–13:30) @@ -81,7 +81,7 @@ During that window, with ALARMS on, the panel fixes a problem by itself once it - Never automatic: restarting a running ProPresenter, Bible app, ProdCom (or DVS on NA Ingest, which restarts ProdCom), captions or the bridge, power-cycling a switch port, or turning on a connection someone switched off. `load_config` refuses an auto fix that closes a program. - **Daily log:** everything auto-fix does is written as it happens to `~/Desktop/Auto-Fix Logs/ Auto-Fix.log` on NA Ingest (e.g. `2026-10-11 Sunday Auto-Fix.log`): the problem, what it did, whether it worked, when the fault cleared, when it gave up or held back. Double-click it to open it in Console, which shows new lines live. One file per day; each is deleted a calendar month after its date (the 11 Oct file on 11 Nov). - **Stopping it:** press ALARMS (on the fly; nothing at all fixes itself until you press it again or midnight), or switch auto-fix off as a whole under Settings › Auto-fix (stays off until switched on). The window and the list are `"auto_fix"` in `config.json`. -- **READY page fixes** ticked under Settings › Auto-fix act on the checklist's gaps too, amber or red. A fix marked `"anytime": true` (only a READY fix may be; today the LTC write, `ready_ltc`) runs at any hour, not only in the auto-fix hours: once the weekend's set is on Tracks, every song's timecode is written into Planning Center for all four campuses by itself. ALARMS muted stops it like every other auto-fix; it catches up once they are back on. +- **READY page fixes** ticked under Settings › Auto-fix act on the checklist's gaps too, amber or red. A fix marked `"anytime": true` (only a READY fix may be; today the LTC write, `ready_ltc`) runs at any hour, not only in the auto-fix hours: once the weekend's set is on Tracks, every song's timecode is written into Planning Center for all four locations by itself. ALARMS muted stops it like every other auto-fix; it catches up once they are back on. ## Audio failover (Studio B -> FOH Backup) @@ -153,7 +153,7 @@ everything on the page at once. | LIGHTS | the `LIGHTING CUES` track has a clip under every song | looks again | | MIDI | the Tracks Mac's MIDI links (FX LIGHTS, TRK LIVEBOX, TRK STUDIO B) and Ableton running | reconnects the MIDI link that dropped | | PROP | the ProPresenter playlist for the plan's date has every PCO item. **MC n/m SLIDES**: PCO lists more announcements than there are slides. **MC SLIDES OLD?**: the slide notes still list last week's announcements. **BAPTISM: NO SAMANTHA**: a person PCO lists has no slide | looks again | -| TIMECODE | every song's presentation has a timeline in ProPresenter, and PCO's `LTC` note for every song is the timecode the tracks actually play at that song's start; the other campuses' plans (`ready.ltc_campuses`: Apollo Beach, Southcoast, Woonsocket) get the same timecode for the same songs in this campus's order, and a song that is missing or out of order there is left alone. That timecode is worked out from the set: where its locator ("2 - REJOICE AGAIN - Bb") sits, through the tempo map, on the `LTC` track's file (`LTC_00000000_..._30fps`). **NO LTC** / **LTC WRONG** name the song. | writes the tracks' timecode into each song's `LTC` note in Planning Center where it is missing or different (nothing is written when they already match), then looks again | +| TIMECODE | every song's presentation has a timeline in ProPresenter, and PCO's `LTC` note for every song is the timecode the tracks actually play at that song's start; the other locations' plans (`ready.ltc_campuses`: Apollo Beach, Southcoast, Woonsocket) get the same timecode for the same songs in this location's order, and a song that is missing or out of order there is left alone. That timecode is worked out from the set: where its locator ("2 - REJOICE AGAIN - Bb") sits, through the tempo map, on the `LTC` track's file (`LTC_00000000_..._30fps`). **NO LTC** / **LTC WRONG** name the song. | writes the tracks' timecode into each song's `LTC` note in Planning Center where it is missing or different (nothing is written when they already match), then looks again | | BKGDS | every song has at least one slide with a background | looks again | | LED CROSS | every Resolume column Sunday's playlist calls up has content: each slide's macro (read from the ProPresenter Mac's `Macros` and `.pro` files) sends RossTalk `CC page/row/col` to Companion, that button (and the buttons it presses, e.g. page 17 → page 6 "Arena") sends `/composition/columns/N/connect`; **COL 11 EMPTY** names the column and the items that use it. Also: Resolume on the **Service** deck. | selects the Service deck, then looks again (an empty column is filled in Resolume) | | LINEUP TV | ProdDash's Band Lineup shows this plan, nobody who is not on it or who declined, and everyone on the Band and Communication teams | re-syncs the board from Planning Center | @@ -168,7 +168,7 @@ everything on the page at once. Nothing on the READY page writes to Companion, ProPresenter or the Ableton set. -**Another campus:** copy `"ready_page"`, `"ready"`, the four `ready_*` fixes and the READY tile from this config, +**Another location:** copy `"ready_page"`, `"ready"`, the four `ready_*` fixes and the READY tile from this config, then change these in `"ready"`: - `pco_service_type` - `prop_url` @@ -176,7 +176,7 @@ then change these in `"ready"`: - `lineup_url` - `resolume_url` -For a campus that receives tracks rather than sending them, leave `locations` empty and take out the `prop_bundle_*` +For a location that receives tracks rather than sending them, leave `locations` empty and take out the `prop_bundle_*` lines; TRACKS OUT and PROP OUT then show `NOT SET UP`. A line whose address is blank shows `NOT SET UP` instead of an alarm. @@ -223,29 +223,29 @@ A problem has to last 3 seconds before it shows, so one bad reading doesn't trig With Editing on every screen grows inputs. Changes go into one shared draft on the Ingest Mac (two people editing see each other's version; a stale tab is told); the badge at the top counts them and opens **Review & Apply**, which reads every change back in plain words, says what will happen (the deck goes purple for about 5 s only when something the watchdog reads changed; pages re-import only when the layout changed) and runs the pipeline: check the config, keep the old version in `history/`, write, restart the watchdog and wait for its start stamp, re-import the pages (refused if any unmarked key sits on them), recolour the page-number keys. If the watchdog does not come back the previous version is put back by itself. Apply is refused while a HyperDeck is recording (the Emergency button needs a reason and the word LIVE, and is logged). History keeps every version with who/when/note; **Go back** and **Undo** make the chosen version the draft. -**Keys** draws both pages as the deck; with Editing on a key is a chip you drag to move (or drop on the tray to hide), + New key / + New restart key add one, Delete this key removes one, the page numbers and "this campus has a Restart page" sit under the tabs. **Overview** carries the jobs people actually do: Change the playlist (paste the link; the key, the play fix and the key guide follow), Add or remove a HyperDeck (tick the decks in use; the HD keys and the REC group follow, "may have no disk" per deck), Add a MIDI link (the Mac, its session and peer from the live list or typed, which key), and under More jobs: Add a computer, Make a PC program startable. Site setup › Companion offers "Add a key for it" on every connection nothing watches. **Computers › Setup** is the one-time checklist per computer with a light and a [how] per line and the set-up scripts generated from that computer's record (`settings/scripts.py` fills the templates in `remote-access/`: the login key, this Mac's addresses, one scheduled task per program listed); Remove this computer drops the fixes and checks that used it and says so. **Site setup › Site** shows the running and staged code with **Install the staged folder** (install.sh runs as a one-shot launchd job with the config left alone), **Export site bundle** (a zip to drop in as `sites//`) and **New campus from a bundle** (this campus's name, addresses and code stay; every copied computer is flagged until touched). +**Keys** draws both pages as the deck; with Editing on a key is a chip you drag to move (or drop on the tray to hide), + New key / + New restart key add one, Delete this key removes one, the page numbers and "this location has a Restart page" sit under the tabs. **Overview** carries the jobs people actually do: Change the playlist (paste the link; the key, the play fix and the key guide follow), Add or remove a HyperDeck (tick the decks in use; the HD keys and the REC group follow, "may have no disk" per deck), Add a MIDI link (the Mac, its session and peer from the live list or typed, which key), and under More jobs: Add a computer, Make a PC program startable. Site setup › Companion offers "Add a key for it" on every connection nothing watches. **Computers › Setup** is the one-time checklist per computer with a light and a [how] per line and the set-up scripts generated from that computer's record (`settings/scripts.py` fills the templates in `remote-access/`: the login key, this Mac's addresses, one scheduled task per program listed); Remove this computer drops the fixes and checks that used it and says so. **Site setup › Site** shows the running and staged code with **Install the staged folder** (install.sh runs as a one-shot launchd job with the config left alone), **Export site bundle** (a zip to drop in as `sites//`) and **New location from a bundle** (this location's name, addresses and code stay; every copied computer is flagged until touched). Fixes and the remote checks are built from fields (`settings/builders.py`): a builder (Start a Windows program, Restart a Mac program, Restart a helper, Reopen Ableton with its last set, Restart DVS, Press a Companion button (page, row, column)...) and its fields make the command; the stored command must equal what the fields build or the config is refused. Every Mac value is shell-quoted, every Windows value is regex-checked. A Custom command (Advanced) is the one place a command is typed by hand; Review shows commands in red. A fix built with Press a Companion button can be ticked failover (under more) and given an undo; the Failover calendar and its `after_seconds` sit under Settings › Auto-fix, under the auto-fix window. The page reads what the watchdog writes next to its config (`snapshot.json` every 5 s, `started.json`, `live-now.json`, `fixes-running.json`) instead of asking the gear again. Its own look at the computers (`settings/probes.py`) runs fixed read-only commands over the same login key, fetches whole lists and matches them here, never while a fix runs. -## Other campuses: auto-setup +## Other locations: auto-setup -A campus sets itself up. All a person does is let the panel in: one line on the campus's Mac that runs Companion, +A location sets itself up. All a person does is let the panel in: one line on the location's Mac that runs Companion, one line on each other computer. -1. **The Companion Mac.** Terminal, paste the campus's line from Settings › Auto-setup on any running campus (North +1. **The Companion Mac.** Terminal, paste the location's line from Settings › Auto-setup on any running location (North Attleboro's page shows the Apollo Beach, Southcoast and Woonsocket lines), for example - `curl -fsSL "http://10.1.1.1:8020/campus/install?id=ab" | zsh`. It downloads the program from that page (code only, - never that campus's settings or keys), installs it, makes the panel's login key, and runs - `python3 -m settings.campus setup`: Companion gets the panel's custom variables and the blink-clock trigger (through + `curl -fsSL "http://10.1.1.1:8020/location/install?id=ab" | zsh`. It downloads the program from that page (code only, + never that location's settings or keys), installs it, makes the panel's login key, and runs + `python3 -m settings.location setup`: Companion gets the panel's custom variables and the blink-clock trigger (through Companion's own internal API, as its web UI does), the first two pages from 19 that hold nothing made by hand are used, the gear is found and the config is applied like any Apply. It prints the editing PIN. North Attleboro's key is added so it can help remotely (turn on Remote Login for that). Running the line again updates the program. 2. **Each other computer.** Mac: Terminal, `curl -fsSL http://:8020/join | sh` (adds the key, turns on Remote Login when it can, says it is here). PC: PowerShell as administrator, `irm http://:8020/join.ps1 | iex` (OpenSSH, the key, a StatusPanel start task for each known program running on it, Wake-on-LAN, then says it is here). - The lines are on that campus's Settings › Auto-setup. + The lines are on that location's Settings › Auto-setup. **What gets a key** (`settings/autoconf.py`): each Companion connection of a known kind (HyperDecks, Tascam, consoles, Dante with every device it sees, Shure receivers and PSMs with their channel count, ATEM, Videohub, Resolume, NovaStar, @@ -256,55 +256,55 @@ its wired address (with the wired-network rule). A program's key also carries it when it does not, REC AUDIO RF SHOW VIDEO STREAM group keys take the top row and wireless receivers fold into RF first. Generic connections and unknown programs are listed under Settings › Auto-setup, not guessed at. -**After that** (`discover.auto`, "add new gear by itself", on for a new campus, off at North Attleboro): the settings page +**After that** (`discover.auto`, "add new gear by itself", on for a new location, off at North Attleboro): the settings page looks every ten minutes and soon after a computer joins, and adds what is new (a key in the first free cell, a Dante device or MIDI link into its key). Never during the auto-fix hours or a recording; nothing is ever removed; a thing that was there before and was taken off by someone is not added back (`discover-seen.json`). "Look now" adds what is new at once. Everything it makes is ordinary settings, changed on the page like North Attleboro's. -## The campuses at a glance +## The locations at a glance -| Campus | Settings page (bookmark these) | Companion Mac | Status / Restart pages | +| Location | Settings page (bookmark these) | Companion Mac | Status / Restart pages | |---|---|---|---| -| North Attleboro (hub) | http://10.1.1.1:8020/ | NA Ingest | 19 / 20, READY 24, CAMPUSES 98, CAMPUS 99 | +| North Attleboro (hub) | http://10.1.1.1:8020/ | NA Ingest | 19 / 20, READY 24, LOCATIONS 98, LOCATION 99 | | Woonsocket | http://10.2.2.210:8020/ | WS ProPresenter Mac (wsprop) | 19 / 20 | | Southcoast | http://10.5.2.60:8020/ | SC ProPresenter Mac (watersmedia) | 19 / 20 | | Apollo Beach (standalone) | their own | their Companion Mac | 19 / 20 or the first free | -Every campus: alarms armed all day; auto-fix on NA's hours (Tue 14:00–22:00, Wed 09:00–21:00, Sun 05:00–14:00); -a hold on any key fixes it at any time, on that campus's own deck or from NA's CAMPUS page; ALARMS silences and AUTO-FIX pauses auto-fix, separately. -`python3 -m settings.campus rebuild` (on a campus's Companion Mac, in the panel folder) makes its setup again from -what is found now, keeping its name, PIN and pages. `python3 -m settings.campus upgrade-companion` brings an older +Every location: alarms armed all day; auto-fix on NA's hours (Tue 14:00–22:00, Wed 09:00–21:00, Sun 05:00–14:00); +a hold on any key fixes it at any time, on that location's own deck or from NA's LOCATION page; ALARMS silences and AUTO-FIX pauses auto-fix, separately. +`python3 -m settings.location rebuild` (on a location's Companion Mac, in the panel folder) makes its setup again from +what is found now, keeping its name, PIN and pages. `python3 -m settings.location upgrade-companion` brings an older Companion to 5.0.7 from NA's copy (settings come along; the old version stays installed). -## A campus on its own (Apollo Beach) +## A location on its own (Apollo Beach) Apollo Beach runs its panel itself: not on NA's deck, not in NA's backups, no NA key on its Macs. `python3 tools/standalone.py ab "Apollo Beach"` makes `dist/Apollo Beach Status Panel.zip` (the program, an `install.command` and a `READ ME FIRST.txt`; never anyone's settings, plug keys or login keys) to send them. -Installed, it sets itself up like any campus (`setup --standalone`: `campuses.json` gets `"standalone": true` +Installed, it sets itself up like any location (`setup --standalone`: `campuses.json` gets `"standalone": true` instead of a home, so it tells nobody and is no hub) and backs itself up nightly into `~/Documents/Status Panel Backups/` on its Companion Mac (or `$STATUS_PANEL_BACKUPS`). With an older -Companion: `python3 -m settings.campus upgrade-companion --from `. +Companion: `python3 -m settings.location upgrade-companion --from `. ## Backups Nightly at 04:30 NA's LaunchAgent `org.waterschurch.status-backup` (`backup/backup-campuses.sh`) copies every -campus's settings, Apply history and page-key record into Google Drive: Shared drives > Waters Creative > Apps > -Status Panel Backups > > -.tgz, newest 30 kept, the same pattern and alert email as the -checklist's backup-to-drive.sh. Other campuses are reached over SSH as the account they report. The repo keeps each -campus's settings too: `config.json` (NA) and `sites//config.json`; a reinstall with `--site ` starts from it. +location's settings, Apply history and page-key record into Google Drive: Shared drives > Waters Creative > Apps > +Status Panel Backups > > -.tgz, newest 30 kept, the same pattern and alert email as the +checklist's backup-to-drive.sh. Other locations are reached over SSH as the account they report. The repo keeps each +location's settings too: `config.json` (NA) and `sites//config.json`; a reinstall with `--site ` starts from it. Smart-plug keys (outlets.json) are never copied. -## Every campus on North Attleboro's deck (NA only) +## Every location on North Attleboro's deck (NA only) -Each campus set up from NA's install line tells NA's settings page where it is (`/api/campus/hello`) and learns -nothing back: no campus ever shows another, and only NA (the hub: no "home" in `campuses.json`) does -(`settings/campuses.py`). NA's settings page reads each campus's key states every two seconds (`/api/state`) and +Each location set up from NA's install line tells NA's settings page where it is (`/api/campus/hello`) and learns +nothing back: no location ever shows another, and only NA (the hub: no "home" in `campuses.json`) does +(`settings/campuses.py`). NA's settings page reads each location's key states every two seconds (`/api/state`) and keeps two pages in NA's Companion, added at the end when no page is empty (today 98 and 99): -- **CAMPUSES (98):** row 0, one key per campus, its ALL key with its name ("WS / ALL OK"); purple "WS ?" when it stops answering. Row 1, its RESTART key. Tap NA's: NA's own pages. Tap another's: the CAMPUS page showing it. -- **CAMPUS (99):** the tapped campus's status (or Restart) page, same places, colours and words, live. Tap = acknowledge, hold = fix, at that campus, exactly as on its own deck (a Restart key's hold restarts it there). Bottom-left ("WS / ALL SITES") goes back. +- **LOCATIONS (98):** row 0, one key per location, its ALL key with its name ("WS / ALL OK"); purple "WS ?" when it stops answering. Row 1, its RESTART key. Tap NA's: NA's own pages. Tap another's: the LOCATION page showing it. +- **LOCATION (99):** the tapped location's status (or Restart) page, same places, colours and words, live. Tap = acknowledge, hold = fix, at that location, exactly as on its own deck (a Restart key's hold restarts it there). Bottom-left ("WS / ALL SITES") goes back. ## SSH from the admin laptop to every machine @@ -336,7 +336,7 @@ Then run the installer there. It checks the config with the new code first (a ba ssh checklist-ingest 'zsh ~/status-panel-install/install.sh' ``` -`install.sh --keep-config` updates the code and leaves the live config alone; `install.sh --rollback` puts the previous code back; `install.sh --site ` (a new campus) installs `sites//config.json` when the folder exists, otherwise `sites/_template/config.json`, and never replaces a config that is already installed. +`install.sh --keep-config` updates the code and leaves the live config alone; `install.sh --rollback` puts the previous code back; `install.sh --site ` (a new location) installs `sites//config.json` when the folder exists, otherwise `sites/_template/config.json`, and never replaces a config that is already installed. If you add or move tiles, rebuild the page: @@ -396,7 +396,7 @@ To go back, pick 1.3.0 on the connection again. | `status_panel.py` | the watchdog | | `netgear.py` | reads the Netgear Dante switches (MAC tables, PoE) and power-cycles one PoE port | | `coremidi.py` | reads network MIDI sessions and listens to MIDI sources (ctypes, no extra installs) | -| `config.json` | tiles, positions, checks, fixes, hosts, windows: every setting (the `site` block names the campus; `spotify` holds the playlist; `timing` and `page_hold_ms` the numbers behind HOLD 2s and WAIT 1 MIN) | +| `config.json` | tiles, positions, checks, fixes, hosts, windows: every setting (the `site` block names the location; `spotify` holds the playlist; `timing` and `page_hold_ms` the numbers behind HOLD 2s and WAIT 1 MIN) | | `schema.py` | the registry of every setting: type, default, help, which screen of the settings page owns it, and the rules a config must pass (`tests/test_schema.py` keeps it in step with the code) | | `make_page.py` | builds `status-page.companionconfig` from `config.json` | | `install.sh` | installs or updates the LaunchAgent on NA Ingest | diff --git a/backup/backup-campuses.sh b/backup/backup-campuses.sh index e138201..f7d199f 100755 --- a/backup/backup-campuses.sh +++ b/backup/backup-campuses.sh @@ -1,15 +1,15 @@ #!/bin/bash -# backup-campuses.sh - every campus's status panel settings, off-site in Google Drive, nightly. +# backup-campuses.sh - every location's status panel settings, off-site in Google Drive, nightly. # # The same pattern as the checklist's backup-to-drive.sh on this Mac: a LaunchAgent runs it at 04:30, -# it copies into the shared Drive (Waters Creative > Apps > Status Panel Backups > ), keeps -# the newest 30 per campus, and emails an alert (through the checklist's alert.js) when something +# it copies into the shared Drive (Waters Creative > Apps > Status Panel Backups > ), keeps +# the newest 30 per location, and emails an alert (through the checklist's alert.js) when something # fails, because a backup nobody hears about failing is no backup. # # Only the hub (North Attleboro: no "home" in campuses.json) does anything; elsewhere it exits, except -# on a standalone campus (Apollo Beach), which backs up only itself into ~/Documents/Status Panel Backups. -# Each campus is reached over SSH with the panel's own key, as the account it reported. What is -# copied: config.json (the settings), history/ (every Apply), the page-key record and the campus +# on a standalone location (Apollo Beach), which backs up only itself into ~/Documents/Status Panel Backups. +# Each location is reached over SSH with the panel's own key, as the account it reported. What is +# copied: config.json (the settings), history/ (every Apply), the page-key record and the location # lists. Never outlets.json (the smart-plug keys stay on their Mac). set -uo pipefail @@ -25,13 +25,13 @@ alert() { [ -f "$js" ] && node "$js" "Status panel backup: $1" "${2:-}$(printf '\n\nLog: %s' "$LOG")" >> "$LOG" 2>&1 || true } -MODE=$(/usr/bin/python3 -c 'import json,sys; d=json.load(open(sys.argv[1])); print("standalone" if d.get("standalone") else "campus" if d.get("home") else "hub" if d.get("list") else "")' \ +MODE=$(/usr/bin/python3 -c 'import json,sys; d=json.load(open(sys.argv[1])); print("standalone" if d.get("standalone") else "location" if d.get("home") else "hub" if d.get("list") else "")' \ "$DEST/campuses.json" 2>/dev/null) [ "$MODE" = hub ] || [ "$MODE" = standalone ] || { log "not the hub: nothing to back up from here"; exit 0; } DRIVE="" if [ "$MODE" = standalone ]; then - # A campus on its own (Apollo Beach) keeps its own copies, in this Mac's Documents (or wherever + # A location on its own (Apollo Beach) keeps its own copies, in this Mac's Documents (or wherever # STATUS_PANEL_BACKUPS points, e.g. a Google Drive folder). DRIVE="${STATUS_PANEL_BACKUPS:-$HOME/Documents/Status Panel Backups}" else @@ -82,7 +82,7 @@ for cid, e in sorted((d.get("list") or {}).items()): PY ) if [ -n "$FAILED" ]; then - alert "no backup tonight for:$FAILED" "The other campuses were backed up. A campus missing here is usually off, off the network, or no longer letting this Mac log in." + alert "no backup tonight for:$FAILED" "The other locations were backed up. A location missing here is usually off, off the network, or no longer letting this Mac log in." exit 1 fi log "── done ──" diff --git a/docs/settings-inventory.md b/docs/settings-inventory.md index 6a727be..99d39e2 100644 --- a/docs/settings-inventory.md +++ b/docs/settings-inventory.md @@ -1,556 +1,556 @@ # Status Panel: inventory of everything configurable (2026-10-13) -Every setting, hard-coded value, installed piece, Companion-side object, secret and workflow step the system has today: 544 items in four lenses, gathered by four readers (the "what runs where" reader checked NA Ingest live, read-only). Each line: [kind] area :: name @ where | how it is changed today | values/validation | what another campus would change | whether it needs to be editable. Used by the settings-page plan (settings-plan.md) and its coverage table (settings-plan-details.md). +Every setting, hard-coded value, installed piece, Companion-side object, secret and workflow step the system has today: 544 items in four lenses, gathered by four readers (the "what runs where" reader checked NA Ingest live, read-only). Each line: [kind] area :: name @ where | how it is changed today | values/validation | what another location would change | whether it needs to be editable. Used by the settings-page plan (settings-plan.md) and its coverage table (settings-plan-details.md). -### Lens: Operator workflow (every step a person does today to change something) and the Companion-side state the panel depends on (what another campus must recreate inside Companion) -- [workflow-step] workflow: edit :: Edit config.json in the repo on the MacBook (source of truth) @ /Users/christian/Documents/Status Indicators/config.json (README.md:139) | today: Open config.json in a text editor; every tile/check/fix/host/window change starts here. Nothing on NA Ingest is edited directly. | JSON only; no schema file; typos are caught only by install.sh's json.load or by load_config (unknown check type, unknown member/fix/host, duplicate tile id, restart key with a tile's id, auto_fix fix that pkill/taskkill/killall's without restart_ok). | other campus: Another campus needs its own config.json (and its own repo or branch); today there is one file for NA only. -- [workflow-step] workflow: edit :: Validate config.json before deploying (load_config) @ status_panel.py:2234-2276 load_config; .claude/settings.local.json allowlist shows the command | today: /usr/bin/python3 -c "import status_panel as sp; sp.load_config('config.json')" from the repo folder (also runs implicitly in make_page.py and in the tests' CONFIG = sp.load_config(...)). | Raises ValueError on: duplicate tile id; unknown check type (not in CHECKS); member not a tile id; check 'fix' not in fixes (except restart-connection / dante-auto); ssh fix whose host is not in hosts; remote check with unknown host; hold_always not in fixes; auto_fix fix unknown or containing pkill|taskkill|killall without restart_ok; restart key id equal to a tile id; restart key fix or watch entry unknown (watch may be 'conn: