Southcoast matches NA, per its startup checklist: X32s, ProPresenter to Lighting MIDI, pages 19/20

- An explicit look or rebuild may apply inside the auto-fix hours (never while live)
- A page move clears the page left behind when only our keys are on it
- A rebuild keeps MIDI links that are down now; first-setup import waits for the keys to land
- ProPresenter port drift fixed automatically (kind propresenter_port)
- sites/sc/config.json kept with the others

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-21 13:07:15 -04:00
co-authored by Claude Opus 5.5
parent ee4c97c699
commit bea587cfad
8 changed files with 554 additions and 20 deletions
+15
View File
@@ -241,6 +241,21 @@ class TestExtend(unittest.TestCase):
self.assertIn("PROP checks on the PROP key", added)
self.assertEqual(schema.validate(new)[0], [])
def test_a_rebuild_keeps_what_is_down_right_now(self):
"""Southcoast's rebuild dropped its MIDI key: the ProPresenter-to-Lighting link was down at that moment."""
old, _ = ac.build(BASE, small(), {"id": "sc", "name": "Southcoast"}, "1234")
now = small()
now["midi"] = {"": {"SC Ingest": {"port": 5004, "peers": []}}} # the link dropped
now["computers"]["lighting_pc"]["reachable"] = False # and the Lighting PC is off
new, _ = ac.build(BASE, now, {"id": "sc", "name": "Southcoast"}, "1234")
self.assertNotIn("MIDI", [t["label"] for t in new["tiles"]])
kept, words = ac.keep_from(new, old)
self.assertIn("MIDI", [t["label"] for t in kept["tiles"]])
self.assertIn("VISTA", [t["label"] for t in kept["tiles"]])
self.assertIn("lighting_pc", kept["hosts"])
self.assertIn("MIDI link Lighting PC", words)
self.assertEqual(schema.validate(kept)[0], [])
def test_a_key_someone_took_off_is_not_added_back(self):
cfg = json.loads(json.dumps(self.cfg))
cfg["tiles"] = [t for t in cfg["tiles"] if t["label"] != "X32"]