From bf128e1bad852e557d4bf7d818da7493f6a2f87b Mon Sep 17 00:00:00 2001 From: christian Date: Wed, 14 Oct 2026 20:46:00 -0400 Subject: [PATCH] READY page: drop the MICS and STAGE keys BOH MIX is the one tap key left. Co-Authored-By: Claude Opus 5.5 --- README.md | 7 +++---- config.json | 30 ------------------------------ ready-page.companionconfig | Bin 4249 -> 3986 bytes schema.py | 2 +- settings/ui/app.js | 2 +- status_panel.py | 2 +- tests/test_readiness.py | 1 - 7 files changed, 6 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 5d52e1a..e6c3381 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ HyperDeck is recording). **STATUS PAGE** (bottom left) goes back. |--------|-------|-------|-------|-------|-------| | row 0 (Ableton) | TRACKS | FOH MIX | BOH MIX (tap) | LIGHTS | MIDI | | row 1 (ProP / Resolume) | PROP | TIMECODE | BKGDS | LED CROSS | | -| row 2 (backstage, stage) | LINEUP TV | | MICS (tap) | STAGE (tap) | | +| row 2 (backstage) | LINEUP TV | | | | | | row 3 (outgoing) | TRACKS OUT | PROP OUT | | | | The READY key at row 3 col 7 (and the one on the status page) shows how many keys still have something to do and @@ -116,9 +116,8 @@ the first of them. still missing turns **blinking red**. A song that is not mixed stays amber, because it is only a guess. These keys are not part of ALL, so an unfinished checklist on a Tuesday never turns the page-number keys red. -**Tap keys** (BOH MIX, MICS, STAGE) are things only a person can see. Tap once when it is done; the key -shows `DONE THU 14:02`. Tap again to take it back. Everything resets on Monday at midnight. MICS also says which mics -this weekend needs, from Planning Center (`4 VOX MC TIM`). +**BOH MIX** is a tap key: only a person can judge it. Tap once when it is done; the key shows `DONE THU 14:02`. +Tap again to take it back. It resets on Monday at midnight. **Hold any key for 2 s** to fix what can be fixed, or to look again now if there is no fix. **Hold READY** to fix everything on the page at once. diff --git a/config.json b/config.json index 1658f7e..2d4a8ae 100644 --- a/config.json +++ b/config.json @@ -1186,36 +1186,6 @@ } ] }, - { - "id": "rd_mics", - "label": "MICS", - "pos": [ - 2, - 3 - ], - "checks": [ - { - "type": "ready_manual", - "item": "mics", - "msg": "TAP WHEN SET" - } - ] - }, - { - "id": "rd_stage", - "label": "STAGE", - "pos": [ - 2, - 4 - ], - "checks": [ - { - "type": "ready_manual", - "item": "stage", - "msg": "HELIX, RISERS: TAP" - } - ] - }, { "id": "rd_trk_out", "label": "TRACKS OUT", diff --git a/ready-page.companionconfig b/ready-page.companionconfig index 2decef754d5e3734dc998065ee6dad4599d51543..66fb25d4ec94337128aa91d463c8cdd8a15badaa 100644 GIT binary patch literal 3986 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 diff --git a/schema.py b/schema.py index 9e9c11c..28f3380 100644 --- a/schema.py +++ b/schema.py @@ -316,7 +316,7 @@ field("ready.due", "list", [], "From when gaps are red instead of amber.", "Read field("ready.due[].days", "days", None, "", "Ready", required=True) field("ready.due[].start", "hhmm", None, "", "Ready", required=True) field("ready.due[].end", "hhmm", None, "", "Ready", required=True) -field("ready.reset_day", "enum", "mon", "Taps (BOH mix, mics, stage) count from midnight on this day.", "Ready", +field("ready.reset_day", "enum", "mon", "Taps (BOH mix) count from midnight on this day.", "Ready", options=list(sp.DAYS)) field("ready.pco_credentials", "path", "~/Library/Application Support/ProdDash/modules.json", "ProdDash's settings " "file, which holds the Planning Center login.", "Ready", advanced=True) diff --git a/settings/ui/app.js b/settings/ui/app.js index f602ff3..4daed26 100644 --- a/settings/ui/app.js +++ b/settings/ui/app.js @@ -506,7 +506,7 @@ const snap = await api("/api/snapshot").catch(() => ({})); const r = snap.ready || {}; const plan = r.plan ? `

Plan: ${esc(r.plan.title || "")} ${esc(r.plan.dates || "")}${r.time ? ` ยท looked ${esc(new Date(r.time * 1000).toLocaleTimeString())}` : ""}

` : `

Not looked yet.

`; - if (i < 0) return `

The weekly checklist

${plan}

Amber: still to do. Blinking red: still missing once it is due (${esc(((c.ready || {}).due || []).map((w) => w.days.join("/") + " " + w.start + "-" + w.end).join(", "))}). Tap keys (BOH MIX, MICS, STAGE) are tapped done on the deck and reset every ${esc((c.ready || {}).reset_day || "mon")}. Hold any key ${esc(hold)} to fix it or look again; hold READY to fix everything.

Click a key to see what it checks and why it is amber or red.

`; + if (i < 0) return `

The weekly checklist

${plan}

Amber: still to do. Blinking red: still missing once it is due (${esc(((c.ready || {}).due || []).map((w) => w.days.join("/") + " " + w.start + "-" + w.end).join(", "))}). BOH MIX is tapped done on the deck and reset every ${esc((c.ready || {}).reset_day || "mon")}. Hold any key ${esc(hold)} to fix it or look again; hold READY to fix everything.

Click a key to see what it checks and why it is amber or red.

`; const k = c.ready_page.keys[i], chk = (k.checks || [])[0] || {}; const item = r.items && chk.item ? r.items[chk.item] : null; const fix = chk.fix && c.fixes[chk.fix]; diff --git a/status_panel.py b/status_panel.py index e01a6bb..328590f 100644 --- a/status_panel.py +++ b/status_panel.py @@ -553,7 +553,7 @@ def check_ready(chk, snap, ctx): def check_ready_manual(chk, snap, ctx): - """A checklist line only a person can see (BOH mix, stage): a tap marks it done for the week.""" + """A checklist line only a person can judge (BOH mix): a tap marks it done for the week.""" done = ctx.get("ready_done", {}).get(chk["item"]) if done: return [("done", Result(OK, info="DONE " + datetime.fromtimestamp(done).strftime("%a %H:%M").upper()))] diff --git a/tests/test_readiness.py b/tests/test_readiness.py index 2740bfb..705cd01 100644 --- a/tests/test_readiness.py +++ b/tests/test_readiness.py @@ -354,7 +354,6 @@ class TestWatchdog(unittest.TestCase): self.assertEqual(tiles["rd_trk_out"]["x"], "TRACKS OUT\nNOT SENT SC") self.assertEqual(tiles["rd_trk_out"]["b"], sp.COLORS["warn"][0][0]) self.assertEqual(tiles["rd_boh"]["x"], "BOH MIX\nTAP WHEN DONE") - self.assertEqual(tiles["rd_mics"]["x"], "MICS\n2 VOX MC TIM\nTAP WHEN SET") self.assertEqual(tiles["rd_cross"]["b"], sp.COLORS["ok"][0][0]) self.assertTrue(tiles["ready"]["x"].startswith("READY\n")) self.assertIn("TO DO", tiles["ready"]["x"])