fix: Stage 0 Signage production readiness #18

Open
ekklesia-bot wants to merge 8 commits from stage0/signage-production-readiness into main
8 Commits
Author SHA1 Message Date
ekklesiaandClaude Opus 5.5 b479ae9296 ci: follow the platform harness pin to Zayin/Ekklesia#92's current head
CI / lint (pull_request) Successful in 25s
CI / typecheck (pull_request) Successful in 17s
CI / test (pull_request) Successful in 30s
CI / build (pull_request) Successful in 25s
CI / package (pull_request) Successful in 20s
CI / integration (pull_request) Successful in 8m33s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 22:30:25 -05:00
ekklesiaandClaude Opus 5.5 f8b131f4ed docs(adr): point platform cross-references at the repository's current location
CI / typecheck (pull_request) Successful in 24s
CI / lint (pull_request) Successful in 24s
CI / build (pull_request) Successful in 36s
CI / test (pull_request) Successful in 38s
CI / package (pull_request) Successful in 29s
CI / integration (pull_request) Failing after 1m6s
Link targets only: the Ekklesia repository moved from
git.riverofglorymn.org/River_of_Glory_Church to git.zayin.net/Zayin, and the
old host no longer answers. No decision text changes, which is the
cross-reference correction the ADR rules allow.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 22:23:05 -05:00
ekklesiaandClaude Opus 5.5 649114ba1d ci: pin the platform harness that re-pairs the kiosk after revocation
CI / lint (pull_request) Successful in 23s
CI / typecheck (pull_request) Successful in 22s
CI / build (pull_request) Successful in 27s
CI / test (pull_request) Successful in 50s
CI / package (pull_request) Successful in 23s
CI / integration (pull_request) Successful in 8m38s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 22:02:49 -05:00
ekklesiaandClaude Opus 5.5 073fbc5855 build: fetch Ekklesia packages from the registry's current Zayin location
CI / typecheck (pull_request) Successful in 23s
CI / lint (pull_request) Successful in 23s
CI / build (pull_request) Successful in 26s
CI / test (pull_request) Successful in 28s
CI / package (pull_request) Successful in 22s
CI / integration (pull_request) Canceled after 4m3s
The @ekklesia package registry moved with the repositories to
git.zayin.net/api/packages/Zayin/npm/. The old River_of_Glory_Church address
now answers 502, so every CI job failed at install (Signage run 271). Only the
address changes: a frozen install from an empty store against the new location
verifies every pinned integrity hash, so the bytes are identical.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 21:57:38 -05:00
ekklesiaandClaude Opus 5.5 97de441b5f ci: pin the Stage 0 platform harness and run every display scenario
CI / lint (pull_request) Failing after 1m21s
CI / typecheck (pull_request) Failing after 1m21s
CI / test (pull_request) Failing after 1m24s
CI / build (pull_request) Failing after 1m23s
CI / package (pull_request) Failing after 1m21s
CI / integration (pull_request) Skipped
Pin the integration harness to Zayin/Ekklesia PR 92, whose display host keeps
a live display across reconnects and returns a revoked one to pairing, and
fetch it from the repository's canonical Zayin location. With those fixes the
connectivity-blip, caching-probe, and revoke scenarios pass, so CI now runs
them too; previously they were left out because they failed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 21:48:13 -05:00
ekklesiaandClaude Opus 5.5 7c17282616 fix(ui): keep Signage state consistent across tabs, and confirm destructive actions
Activating a timeline from Playback left Timelines showing it as inactive,
because each tab read its own stale copy of the channel groups; operators
read that as activation not sticking. Tabs also mounted every panel afresh, so
each switch flashed a spinner and collapsed the page before regrowing. Panels
now share one stale-while-revalidate resource cache, and Playback follows the
management realtime channel so Now showing tracks the wall.

Deleting an image, a timeline, a slot, a source, or an audience happened on a
single click; each is now a two-step in-place confirmation (DESIGN 21.3).

The audience key was presented as a field to fill in. Audiences are now named
in plain words, explained (images look the same for every audience), and the
content key is derived from the name with an Advanced override. The roster
labels signed-in browsers and lets an offline entry be removed after
confirmation, so test tabs and retired screens no longer accumulate. The
preview keeps nothing in the Dashboard origin's storage, and the narrow-screen
notice no longer names the platform.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 21:32:04 -05:00
ekklesiaandClaude Opus 5.5 67d89f1020 fix(display): keep blackout across reloads and follow the display's current assignment
A kiosk that reloaded during a blackout restored its last frame from local
state without the blackout, so the hidden slide flashed on the wall until the
server answered.

A display resolved its channel once, at registration. Moving it to another
group or audience, or deleting the channel it was on, never reached a running
screen: it kept showing the old channel, or fell into offline continuation
against a 404 forever. The display now fetches its state by viewer, so the
server resolves the current assignment on every fetch, and the heartbeat reply
names the assigned channel so a reassignment lands within one heartbeat. A
display removed from the roster registers again once, on backoff; only
Signage's own not-found means removal, so a foreign 404 can never cause a
registration loop. The channel route stays for the preview and for display
code a kiosk cached earlier. A replaced realtime subscription can no longer
schedule a stray resubscription when it reports closing.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 21:32:04 -05:00
ekklesiaandClaude Opus 5.5 6bf9167f85 docs: add CLAUDE.md and mark display management as transitional
Signage had no agent guidance at all. Add a CLAUDE.md that records the
standalone-module architecture, that the parent ROADMAP.md and DESIGN.md are
authoritative, the ownership, branding, token, dark-mode, no-native-dialog and
plain-language rules, that display pairing is transitional until Stage 1
Settings -> Displays, and the branch-per-PR, no-push-to-main, no-release-tag
workflow.

The README listed a mobile management UI as out of scope, which contradicts
the design contract's responsive requirement; it is a Stage 1 deferral, and
now says so alongside how displays work today.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 21:32:04 -05:00