Event Stream Validation Runbook
Pre-event validation of mercator-talks streams across all event districts using a flatscreen kiosk head and the streaming monitor dashboard.
1. Overview
Purpose: validate that mercator-talks streams correctly from each render body to cheeky-cactus-86 (hydraheadflatscreen) before bringing iPad heads online for an event.
Components involved:
- hydrastreamingmonitor — real-time stream status dashboard (hydrastreamingmonitor.experiencenet.com)
- hydraheadflatscreen (cheeky-cactus-86) — Mac Mini kiosk head used for visual validation
- hydracluster — node management, district and venue assignment (hydracluster.experiencenet.com)
- hydrabody — Windows render bodies (one per district)
- hydraneck — venue network relay
- hydraheadipad — event iPad heads; brought online after cheeky validation passes
2. Prerequisites
Before starting, verify all of the following:
- [ ] All render bodies are online in hydracluster (status=online, stream_status=idle)
- [ ] Each body is in its own district (no two bodies share a district — avoids race conditions)
- [ ] Body venues reflect the physical location (e.g. cloud-seven)
- [ ] cheeky-cactus-86 is online at the event venue (e.g. nerdland)
- [ ] Only mercator-talks is visible in each event district — no rupelmonde-castle-viewer, no third-person-demo
- [ ] Streaming monitor dashboard is open: hydrastreamingmonitor.experiencenet.com
- [ ] Screenshot tool ready:
hydracluster execon cheeky's node, or HTTP proxy screenshot endpoint
Verify via hydracluster API:
curl -s -H "Authorization: Bearer <admin_token>" https://hydracluster.experiencenet.com/api/v1/nodes \
| jq '.[] | select(.roles[] == "hydrabody") | {name, district, venue, status, stream_status}'
3. Screenshot Validation Protocol
Apply this protocol for each district. Capture all screenshots for the record.
| Step | Action | Expected result | |------|--------|----------------| | 1 | Screenshot before launch | Idle home screen on cheeky — baseline | | 2 | Move cheeky to target district (see §4) | API returns 200 | | 3 | Launch mercator-talks from cheeky | Only mercator-talks visible in the grid | | 4 | Screenshot after ~5s | Loading indicator visible | | 5 | Screenshot during active stream (×3-5) | mercator-talks running in portrait orientation | | 6 | Stop stream | — | | 7 | Screenshot after stop (×2-3) | Clean exit, back to home screen |
Screenshot via exec (requires hydraheadflatscreen v2.0.38+):
curl -s -H "Authorization: Bearer <admin_token>" \
https://hydracluster.experiencenet.com/api/v1/nodes/<cheeky-node-id>/screenshot
4. Streaming Monitor Checks
Open hydrastreamingmonitor.experiencenet.com and monitor throughout each validation.
| Phase | Expected state | |-------|---------------| | Before launch | body=online, neck=healthy, no active sessions | | Stream loading | body=connecting, neck=relay-establishing | | Active stream | body=streaming, neck=relaying, head=connected, session=active | | After stop | All components idle, session=ended |
Any deviation from expected state is a blocker — do not proceed to the next district until resolved.
5. Session Registry Checks (hydracluster v2.0.84+)
The session registry infers sessions from body status transitions and tracks the active head via live_body_id heartbeats. Check it alongside the streaming monitor.
Before launch — no active sessions:
curl -s -H "Authorization: Bearer <admin_token>" \
https://hydracluster.experiencenet.com/api/v1/sessions | jq .
# Expect: empty array []
During active stream — one session per district:
curl -s -H "Authorization: Bearer <admin_token>" \
https://hydracluster.experiencenet.com/api/v1/sessions | jq .
# Expect: session with body_id=<target-body-node-id>, head_id=<cheeky-node-id>,
# app="mercator-talks", started_at set, ended_at null
After stop — session closed, history updated:
curl -s -H "Authorization: Bearer <admin_token>" \
https://hydracluster.experiencenet.com/api/v1/sessions | jq .
# Expect: empty array [] (no active sessions)
curl -s -H "Authorization: Bearer <admin_token>" \
https://hydracluster.experiencenet.com/api/v1/sessions/history | jq .
# Expect: closed session appears with ended_at set
Any orphan active session after a clean stop is a blocker — it indicates the session registry is out of sync with body state.
6. Per-District Sequence
Run districts in this order (start with the district least likely to affect others if something goes wrong).
6.1 — Move cheeky to target district
Only the district changes. Cheeky's venue stays fixed at its physical location (e.g. nerdland) throughout — cross-venue streaming (nerdland head → cloud-seven body) is supported.
curl -s -X POST https://hydracluster.experiencenet.com/api/v1/nodes/<cheeky-node-id>/district \
-H "Authorization: Bearer <admin_token>" \
-H "Content-Type: application/json" \
-d '{"district":"<target-district>","venue":"nerdland"}'
6.2 — Validate
Follow the screenshot protocol (§3), streaming monitor checks (§4), and session registry checks (§5).
6.3 — Pass criteria
- [ ] Screenshot series shows mercator-talks loading, running in portrait, exiting cleanly
- [ ] Only mercator-talks appears in the grid (no other experiences visible)
- [ ] Streaming monitor: all components show expected states at each phase
- [ ] Session registry: active session during stream, no orphan sessions after stop
- [ ] No errors in hydrabody or hydraneck logs
6.4 — Move to next district
Repeat §6.1-6.3 for each remaining district.
7. iPad Go-Live (after all cheeky districts pass)
Once all cheeky validations pass:
- Power on each event iPad
- Verify each iPad comes online in hydracluster (status=online)
- Each iPad should see only mercator-talks in its district
- Each iPad streams from the body in its district
- Confirm portrait orientation
iPad districts must match body districts 1:1 (same district, same owner).
8. Go / No-Go Criteria
| Check | Pass condition | |-------|---------------| | All cheeky districts validated | Screenshot protocol passed for each | | No unexpected experiences visible | Only mercator-talks in event districts | | Streaming monitor clean | Start + stop clean for every district | | Session registry clean | Active session during stream, no orphans after stop | | iPads online | Each iPad connects and streams |
Do not open the event if any criterion is unresolved.
9. Troubleshooting
| Symptom | Where to look |
|---------|---------------|
| Body not streaming | hydrabody/docs/runbooks/ |
| Neck relay not establishing | hydraneck/docs/runbooks/ |
| Streaming monitor shows wrong state | hydrastreamingmonitor/docs/runbooks/session-monitoring.md |
| Flatscreen kiosk not responding | hydraheadflatscreen/docs/runbooks/runbook.md |
| iPad not connecting | hydraheadipad/docs/runbooks/ |
| Experience grid shows wrong experiences | hydraexperiencelibrary API — verify district venue lists |
| Body online but no experiences visible | Check head district matches body district and owner |
| Session stays active after stream stop | Body status stuck at streaming — force stop via POST /api/v1/nodes/{id}/exec with stream/stop, then verify session/history |
| Session registry returns 404 | hydracluster not yet on v2.0.84+ — skip session checks and rely on streaming monitor |
10. Post-Event
- Move cheeky back to its home district after validation
- Delete any streaming sessions left open (headless Chrome does not close WebSockets automatically)
- Review streaming monitor for any anomalies during the event