test(deploy): opt-in display-device scenarios for the split smoke #56

Merged
Zayin_Admin merged 2 commits from test/m0-display-device-repro into main 2026-10-06 00:24:47 +00:00
Member

test(deploy): opt-in display-device scenarios for the split smoke

Ready for review: Signage CI depends on it (Ekklesia_Signage #7 pins this PR's head commit f50e8f4). Merge with a merge commit, the repository default, and that pin stays valid on main. If this is squashed, Signage #7 needs a re-pin.

No product code changes. Off by default: platform CI never runs it, because several scenarios expect Signage.

What it adds

EKKLESIA_SMOKE_DISPLAY_DEVICE=1 (split topology only):

  • starts a second headless Chromium, the "kiosk", whose --user-data-dir is a Docker volume, so it survives a browser restart as a kiosk profile does;
  • seeds three Signage slides;
  • pairs the kiosk through the real flow;
  • closes it cleanly, restarts it on the same profile;
  • then runs the scenarios in EKKLESIA_SMOKE_DISPLAY_SCENARIOS.

EKKLESIA_SMOKE_WATCH_MS and EKKLESIA_SMOKE_RECYCLE_WATCH_MS change how long the scenarios watch.

Scenario Checks
two-pages two pages on one credential: no offline state, no remount
connectivity-blip an offline/online pair neither remounts nor shows offline
session-blip one refused viewer-session request is recovered from without a reload
stream-failure one refused realtime connection is re-established without a reload
caching-probe storage-origin images reach Cache Storage
stream-recycle stays live for the whole watch (across a realtime recycle when ≥ 5 min); live object URLs bounded
revoke an open, revoked display returns to the pairing screen

Hang guards

  • Every DevTools command and page-side request has a deadline (10 s and 8 s), and each step has a budget.
  • An overrun prints the exact call or request that never answered, since a call that hangs the driver may be a request that hangs a real display.
  • timeout is the shell backstop.
  • The proxy's aborting with incomplete response lines are listed afterwards by UTC time and path only. The proxy log is captured, never printed raw.

Results: platform main + Signage with #4, #5 and #6 merged locally

  • pair, restart, two-pages, session-blip, stream-failure, stream-recycle (120 s, 3 live object URLs) and caching-probe: pass.
  • connectivity-blip: fails, as expected. The host's remount-on-online is platform work still to do.
  • revoke: the guard caught a real hang. After revocation, Runtime.evaluate on the revoked page got no answer within 10 s, so the page's main thread was blocked. Under investigation with the device-lifecycle work.

Commits

  1. The harness. The CI-script redaction rule holds: compose logs are only ever captured.
  2. Check wording that fits any watch length (module CI uses 120 s).

🤖 Generated with Claude Code

## test(deploy): opt-in display-device scenarios for the split smoke **Ready for review: Signage CI depends on it** (Ekklesia_Signage #7 pins this PR's head commit `f50e8f4`). Merge with a merge commit, the repository default, and that pin stays valid on `main`. If this is squashed, Signage #7 needs a re-pin. No product code changes. Off by default: platform CI never runs it, because several scenarios expect Signage. ### What it adds `EKKLESIA_SMOKE_DISPLAY_DEVICE=1` (split topology only): - starts a second headless Chromium, the "kiosk", whose `--user-data-dir` is a Docker volume, so it survives a browser restart as a kiosk profile does; - seeds three Signage slides; - pairs the kiosk through the real flow; - closes it cleanly, restarts it on the same profile; - then runs the scenarios in `EKKLESIA_SMOKE_DISPLAY_SCENARIOS`. `EKKLESIA_SMOKE_WATCH_MS` and `EKKLESIA_SMOKE_RECYCLE_WATCH_MS` change how long the scenarios watch. | Scenario | Checks | |---|---| | `two-pages` | two pages on one credential: no offline state, no remount | | `connectivity-blip` | an offline/online pair neither remounts nor shows offline | | `session-blip` | one refused viewer-session request is recovered from without a reload | | `stream-failure` | one refused realtime connection is re-established without a reload | | `caching-probe` | storage-origin images reach Cache Storage | | `stream-recycle` | stays live for the whole watch (across a realtime recycle when ≥ 5 min); live object URLs bounded | | `revoke` | an open, revoked display returns to the pairing screen | ### Hang guards - Every DevTools command and page-side request has a deadline (10 s and 8 s), and each step has a budget. - An overrun prints **the exact call or request that never answered**, since a call that hangs the driver may be a request that hangs a real display. - `timeout` is the shell backstop. - The proxy's `aborting with incomplete response` lines are listed afterwards by UTC time and path only. The proxy log is captured, never printed raw. ### Results: platform `main` + Signage with #4, #5 and #6 merged locally - pair, restart, `two-pages`, `session-blip`, `stream-failure`, `stream-recycle` (120 s, 3 live object URLs) and `caching-probe`: **pass**. - `connectivity-blip`: fails, as expected. The host's remount-on-online is platform work still to do. - `revoke`: **the guard caught a real hang.** After revocation, `Runtime.evaluate` on the revoked page got no answer within 10 s, so the page's main thread was blocked. Under investigation with the device-lifecycle work. ### Commits 1. The harness. The CI-script redaction rule holds: compose logs are only ever captured. 2. Check wording that fits any watch length (module CI uses 120 s). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ekklesia-bot added 1 commit 2026-10-05 23:25:28 +00:00
test(deploy): add opt-in display-device scenarios to the split smoke
CI / verify (pull_request) Successful in 53s
CI / infrastructure-smoke (pull_request) Successful in 13s
CI / migration-smoke (pull_request) Successful in 1m48s
CI / image-build (pull_request) Successful in 20s
CI / deploy-smoke (same-origin) (pull_request) Successful in 48s
CI / deploy-smoke (split) (pull_request) Successful in 55s
ff8a3e8097
Reproduction harness for what the first production Signage deployment
found. With EKKLESIA_SMOKE_DISPLAY_DEVICE=1, the split smoke starts a
second headless Chromium (the "kiosk") whose profile directory is a
Docker volume. It pairs that kiosk through the real flow, closes it
cleanly, restarts it on the same profile, and then runs injected-failure
scenarios: two pages on one credential, a connectivity blip, one refused
viewer-session request, one refused realtime connection, a cross-origin
image-caching probe, a full realtime recycle, and revocation.

Every DevTools command and page-side request has its own deadline, and
each step has a budget. A step that overruns prints the exact call it
was waiting for. The proxy's "aborting with incomplete response" lines
are listed afterwards by UTC time and path only.

Off by default: several scenarios expect Signage and fail on today's
v0.1.1, by design.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Zayin_Admin added 1 commit 2026-10-06 00:09:54 +00:00
test(deploy): word the long-watch checks for any watch length
CI / verify (pull_request) Successful in 52s
CI / infrastructure-smoke (pull_request) Successful in 21s
CI / migration-smoke (pull_request) Successful in 1m48s
CI / image-build (pull_request) Successful in 18s
CI / deploy-smoke (same-origin) (pull_request) Successful in 41s
CI / deploy-smoke (split) (pull_request) Successful in 59s
f50e8f4201
The recycle step's checks spoke of "the realtime recycle" even when
run with a watch shorter than the five-minute connection age, as module
CI does. They now say what they check: live for the whole watch (plus
"across a realtime recycle" when the watch is long enough), and never
remounted.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
ekklesia-bot marked the pull request as ready for review 2026-10-06 00:18:08 +00:00
Zayin_Admin merged commit fa493365bd into main 2026-10-06 00:24:47 +00:00
Zayin_Admin deleted branch test/m0-display-device-repro 2026-10-06 00:24:47 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Zayin/Ekklesia#56