RESI VOX: the lineup counts; a PCO Audio note naming another VOX is only mentioned

User 2026-10-25: 'V2 was a mistake, lineup is right.'

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-25 07:55:24 -04:00
co-authored by Claude Opus 5.5
parent 32e071e169
commit 8753451830
5 changed files with 6 additions and 8 deletions
+1 -1
View File
@@ -164,7 +164,7 @@ everything on the page at once.
| 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 |
| TRACKS OUT | every location in `"locations"` (AB, SC) has this weekend's project folder | copies NA's project to the locations that have none (as `261018 AB Project`, without `Backup/`). It is copied under a temporary name and renamed at the end, so a half-finished copy never looks sent. It never overwrites a folder that is already there and never runs by itself. |
| PROP OUT | a `.probundle` is in this weekend's folder of the Chronicles share (`/Volumes/Location Assets/261025`, read on the ProPresenter Mac). **SHARE NOT MOUNTED**: the share itself is not mounted there (2026-10-22: it had dropped off and the key said NOT IN 261025 although the bundle was there). The ProP Mac keeps it mounted by itself: a LaunchAgent (`org.waterschurch.keep-mounted.location-assets`, from `remote-access/mac-keep-mounted.sh`) looks every minute and at login, mounts it again with the Chronicles login saved in the Keychain, and unmounts and remounts it when it hangs after sleep or a network drop (log: `~/Library/Logs/keep-mounted-location-assets.log` on the ProP Mac). | starts that agent now and waits for the share (about 6 s), then looks again. Also an auto-fix. |
| RESI VOX | the Resi song (PCO description says RESI, else the last song before the message) goes to the locations with its lead singer's mic: the lead from the description ("Genesis lead"), their VOX from the lineup screen ("[VOX 4] MIX 4"; PCO team positions if the lineup has none), against what the Resi AJA's `5 - Lead Vocal` channel (21) really receives, read from the card with Dante's own query (UDP 4440, read only). **RESI V2 NOT VOX 4** (red). Only flagged, never switched: **2 LEADS: MIKE DJ**, **JOSH NOT ON LINEUP**, **PCO SAYS V2, LEAD V4** (the song's Audio note names another VOX), **LEAD ON VOX 5: NO BUTTON**. | presses that VOX's AJA button (Companion page 13, row 3, col 1-4: AJA ch 21 <- BOH-AD4Q-A ch n), then reads the AJA back. Also an auto-fix (any time, never while a deck records: the READY page is not looked at then). |
| RESI VOX | the Resi song (PCO description says RESI, else the last song before the message) goes to the locations with its lead singer's mic: the lead from the description ("Genesis lead"), their VOX from the lineup screen ("[VOX 4] MIX 4"; PCO team positions if the lineup has none), against what the Resi AJA's `5 - Lead Vocal` channel (21) really receives, read from the card with Dante's own query (UDP 4440, read only). **RESI V2 NOT VOX 4** (red). Only flagged, never switched: **2 LEADS: MIKE DJ**, **JOSH NOT ON LINEUP**, **LEAD ON VOX 5: NO BUTTON**. The lineup is what counts: a PCO Audio note naming another VOX is only mentioned in the details. | presses that VOX's AJA button (Companion page 13, row 3, col 1-4: AJA ch 21 <- BOH-AD4Q-A ch n), then reads the AJA back. Also an auto-fix (any time, never while a deck records: the READY page is not looked at then). |
| START | every service Planning Center lists this week (this location's Sunday and every special service: First / Together Tuesday, Morning Worship, ...) has its Ableton set. **NO SET SUN 11/1** (red when due): hold START. While it builds the key shows what it is doing (**SAVING JEHOVAH**, **COPYING 40/120**). After a build, for a day: **CONSOLIDATE THE LORD IS** (a song transposed to its PCO key: consolidate it in Live), **NEW SONG GRACE** (not in Finished Songs: build it by hand, page 3 of the workflow PDF). See *START* below. | builds the missing sets (on the Tracks Mac, in the background). Never runs by itself. |
**Where the answers come from:**
+2 -4
View File
@@ -2235,10 +2235,8 @@ def eval_resi_vox(rc, plan, lineup, now_vox, now_got):
where, " and ".join(n for n, _, _, _ in found), ", ".join(str(v) for _, v, _, _ in found)))
audio = (song.get("notes") or {}).get(rv.get("note", "Audio"), "")
said = re.search(r"\bV(?:OX)?\s*(\d)\b", audio or "", re.I)
if want and said and int(said.group(1)) != want:
line.fault(WARN, "PCO SAYS V%s, LEAD V%d" % (said.group(1), want), "%s: the Audio note says %s, but %s is on VOX %d "
"on the lineup: check which is right (nothing is switched while they differ)" % (where, audio, found[0][2], want))
want = None
if want and said and int(said.group(1)) != want: # the lineup is right (user, 2026-10-25: "V2 was a mistake")
line.notes.append("%s: PCO's Audio note says %s; the lineup (VOX %d) is what counts" % (where, audio, want))
if want and buttons and want not in buttons:
line.fault(ERR, "LEAD ON VOX %d: NO BUTTON" % want, "%s is on VOX %d; page 13 only has VOX %s AJA" % (
found[0][2], want, ", ".join(str(b) for b in sorted(buttons))))
+1 -1
View File
@@ -557,7 +557,7 @@ GLOSSARY = {
"NOT ON PLAN", "DECLINED", "WRONG DECK", "NOTHING ON", "NOT SENT", "COPYING TO", "NO PCO LOGIN",
"PCO UNREACHABLE", "NO PLAN IN PCO", "PROP UNREACHABLE", "LINEUP UNREACHABLE", "RESOLUME UNREACHABLE",
"UNREACHABLE", "CHECK FAILED", "TURNED OFF", "COL", "COLUMNS OK", "NO COLUMNS USED", "LTC WRONG", "PCO WRITE FAILED", "IN PCO", "NO SET TO COPY", "SYNC SLOW", "NO PLAN YET", "VOX",
"RESI VOX", "RESI", "NOT VOX", "MIC WRONG", "NO RESI SONG", "NO LEAD", "NOT ON LINEUP", "LEADS", "PCO SAYS", "LEAD",
"RESI VOX", "RESI", "NOT VOX", "MIC WRONG", "NO RESI SONG", "NO LEAD", "NOT ON LINEUP", "LEADS", "LEAD",
"NO BUTTON", "AJA NO ANSWER", "START", "START FAILED", "BUILDING", "SAVING", "COPYING", "CONSOLIDATE", "NEW SONG", "NO SERVICES",
"NO SERVICES IN PCO", "SERVICE ON", "ALREADY BUILDING", "DID NOT START", "NOTHING TO DO",
],
+1 -1
View File
@@ -595,7 +595,7 @@
lineup: "The Band Lineup TV shows this plan, nobody who is not on it or declined, and everyone on the band and communication teams.",
track_bundle: "Every location has this weekend's Ableton project folder on the shared drive.",
prop_bundle: "A ProPresenter bundle was saved for the locations since Monday.",
resi_vox: "The Resi song (marked RESI in Planning Center, else the last song before the message) goes out to the locations with its lead singer's mic: the lead from the song's description (\"Genesis lead\"), their VOX from the lineup screen, and what the Resi AJA's Lead Vocal channel really receives (read from the card over Dante). Hold, or auto-fix, presses that VOX's AJA button on page 13. Two leads, a lead not on the lineup, or an Audio note in Planning Center that names another VOX are only flagged: a person decides.",
resi_vox: "The Resi song (marked RESI in Planning Center, else the last song before the message) goes out to the locations with its lead singer's mic: the lead from the song's description (\"Genesis lead\"), their VOX from the lineup screen, and what the Resi AJA's Lead Vocal channel really receives (read from the card over Dante). Hold, or auto-fix, presses that VOX's AJA button on page 13. Two leads, a lead not on the lineup are only flagged: a person decides.",
start: "Every service Planning Center lists this week (Sunday and any special service: First / Together Tuesday...) has its Ableton set. Hold START on Monday: it saves last weekend's songs to Finished Songs, then builds each set from the newest weekend set (locators, tempos, Waves Tune cues, songs, markers, guide, lighting cues, pads, routing, in-ear sends). A song in another key is transposed and named here, to consolidate in Live; a song not in Finished Songs is named, to build by hand.",
};
async function readyKeyPanel(i, hold) {
+1 -1
View File
@@ -950,7 +950,7 @@ class TestResiVox(unittest.TestCase):
def test_what_is_not_switched_by_itself(self):
self.assertEqual(self.run_eval("Mike and DJ lead", 1)[0], ["2 LEADS: MIKE DJ"]) # two leads: a person picks
self.assertEqual(self.run_eval("Genesis lead", 4, audio="V2")[0], ["PCO SAYS V2, LEAD V4"]) # PCO and the lineup differ
self.assertEqual(self.run_eval("Genesis lead", 4, audio="V2"), ([], "VOX 4 GENESIS", 4)) # the lineup counts, not the note
self.assertEqual(self.run_eval("Bianca lead", 4)[0], ["LEAD ON VOX 5: NO BUTTON"])
self.assertEqual(self.run_eval("Josh lead", 4)[0], ["JOSH NOT ON LINEUP"])
self.assertEqual(self.run_eval("*CONDENSED*", 4)[0], ["NO LEAD NAME ABOVE."])