joule-moq-room: the clock's events track is published with each grant, so a viewer can enter an empty room #529

Merged
dcharlot merged 2 commits from room/viewer-of-an-empty-room into main 2026-10-29 02:28:02 -04:00
Owner

On wai.transaction.science a viewer cannot enter the live room while nobody is in it. /room/'s Watch, and WAI Studio's Rooms panel, both stop at "entering" with SUBSCRIBE <room>/<clock>/events--0: REQUEST_ERROR 2 no publisher within RENDEZVOUS_TIMEOUT. Found by the Studio's production e2e on 2026-10-29. Restarting the room service doesn't help: a fresh room refuses its viewer the same way.

Cause. The clock published its events track at the room's first event, which is a publisher's join. A viewer's first step is to subscribe to that track. In an empty room it has no publisher, so the relay refuses the subscription at its rendezvous wait. Every test let a publisher enter first, so none of them saw this.

Change. Service::open_events(generation) publishes the clock's events track if it isn't published yet. Each grant spawns it, so the track is there by the time the grantee subscribes. The first event takes the same path (events_track), so the track is still published once per room.

Test. room_service::a_viewer_enters_a_room_nobody_has_joined: a viewer is granted in an empty room and its subscription to the clock's events track is answered. Then a publisher enters, and the clock's join reaches the viewer on that subscription.

  • Falsified on the build host. With the grant's publish removed, it fails with "REQUEST_ERROR DOES_NOT_EXIST: no publisher of the track", the production symptom.
  • cargo test --locked --all-targets in joule-moq-room (what joule-moq-room.yml runs) passes there: every test, 0 failed.

The README's "authors the lifecycle" says when the track is published.

After merge, the room service on prod (~/sites/wai-room/joule-moq-room, launchd science.transaction.wai-room) is rebuilt from main and restarted.

🤖 Generated with Claude Code

On wai.transaction.science a viewer cannot enter the live room while nobody is in it. `/room/`'s Watch, and WAI Studio's Rooms panel, both stop at "entering" with `SUBSCRIBE <room>/<clock>/events--0: REQUEST_ERROR 2 no publisher within RENDEZVOUS_TIMEOUT`. Found by the Studio's production e2e on 2026-10-29. Restarting the room service doesn't help: a fresh room refuses its viewer the same way. **Cause.** The clock published its events track at the room's first event, which is a publisher's `join`. A viewer's first step is to subscribe to that track. In an empty room it has no publisher, so the relay refuses the subscription at its rendezvous wait. Every test let a publisher enter first, so none of them saw this. **Change.** `Service::open_events(generation)` publishes the clock's events track if it isn't published yet. Each grant spawns it, so the track is there by the time the grantee subscribes. The first event takes the same path (`events_track`), so the track is still published once per room. **Test.** `room_service::a_viewer_enters_a_room_nobody_has_joined`: a viewer is granted in an empty room and its subscription to the clock's events track is answered. Then a publisher enters, and the clock's `join` reaches the viewer on that subscription. - Falsified on the build host. With the grant's publish removed, it fails with "REQUEST_ERROR DOES_NOT_EXIST: no publisher of the track", the production symptom. - `cargo test --locked --all-targets` in `joule-moq-room` (what `joule-moq-room.yml` runs) passes there: every test, 0 failed. The README's "authors the lifecycle" says when the track is published. After merge, the room service on prod (`~/sites/wai-room/joule-moq-room`, launchd `science.transaction.wai-room`) is rebuilt from main and restarted. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The clock published its events track at the room's first event, a publisher's join. A viewer
who entered a room nobody had joined subscribed to a track with no publisher, and the relay
refused it at its rendezvous wait ("no publisher within RENDEZVOUS_TIMEOUT"): on
wai.transaction.science, /room/'s Watch and WAI Studio's Rooms panel never entered while the
room was empty. The track is now published by Service::open_events, which each grant spawns;
the first event uses the same path (events_track), so the track is published once per room.

room_service: a_viewer_enters_a_room_nobody_has_joined, a viewer's subscription answered in
an empty room and the first publisher's join reaching it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
joule-moq-room README: the events track is published with the room's first grant
All checks were successful
joule-code conformance gate / joule-moq-relay, its own energy on a counter (macos) (pull_request) Successful in 1m22s
joule-code conformance gate / Build + round-trip C1-C4 vectors (pull_request) Successful in 1m13s
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Successful in 7s
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Successful in 6s
wai-app and Create / wai-app · does this change touch it (pull_request) Successful in 7s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (pull_request) Successful in 28s
joule-code conformance gate / joule-moq-relay, every target (pull_request) Successful in 4m11s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 25s
WAI examples / WAI examples · does this change touch them (pull_request) Successful in 16s
WAI Studio / does this change touch it (pull_request) Successful in 14s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 57s
joule-code conformance gate / joule-moq-ingest, every target (pull_request) Successful in 6m50s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 3m21s
joule-moq-room room service / joule-moq-room, every target (pull_request) Successful in 4m27s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (pull_request) Successful in 7m26s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 5m1s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 6m19s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 8m35s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 9m29s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m2s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 15m44s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 12m27s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 10m5s
3b7f4299b8
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transaction-Science/open-standards!529
No description provided.