decentraland / decentraland/godot-explorer

comms: Pulse failure must not degrade to LiveKit-only (island is bound to Pulse after the Archipelago ⇒ Pulse migration)

Open
#2,879 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
18
Forks
19
Avg merge
4d 2h
Merged PRs (30d)
43

Description

## Context

The backend is retiring archipelago-core (Archipelago ⇒ Pulse migration): Pulse now does peer clustering and comms-gatekeeper mints the island LiveKit tokens. From the cutover on, **the island room is bound 1:1 to the Pulse session — no Pulse, no island.**

The `pulse` flag is already on in prod/zone and `use_pulse` is a default feature, so most users are fine. But every place where the client currently degrades to "LiveKit-only" becomes a **silent empty world** (no island, no modal, no retry):

- `PULSE_SESSION_FAILURE_LIMIT`: 5 consecutive failed Pulse attempts → `pulse_disabled_for_session` for the rest of the session (`communication_manager.rs` `poll_pulse_room`).
- `pulse_activation` is fail-closed while the flag fetch hasn't settled or failed (`pulse_flag_enabled == None`).

## What to do

- [ ] Replace the "5 failures → LiveKit-only" fallback with the regular disconnected/retry modal (`DisconnectHandler`), keep retrying Pulse with backoff instead of disabling it for the session.
- [ ] Make `pulse_activation` fail-open (flag absent/unsettled → Pulse on). Decide what `--no-pulse` / local preview mean now (dev-only opt-out is fine, but it must be explicit that it means no island).
- [ ] **Verify on zone** (with the gatekeeper/definitions PRs deployed) that mobile background → resume converges: our island reconnect (`adapter/archipelago.rs` retry: 1s → 5s×3 → WS recycle) runs independently of Pulse's reconnect and retries the cached token. If it loops instead of converging once Pulse is `Established`, sequence the island join/retry after Pulse `Established` and drop the island on Pulse `Dead` — that becomes part of this issue.

## Test plan

- [ ] Point the client at a dead Pulse server (`--pulse-server` to a closed port), open the app → after a few seconds the regular disconnected modal with **Retry** appears; no silent empty world.
- [ ] Zone, with the migration deployed: log in, walk near another player, minimize the app 10s, reopen → the other player reappears within a few seconds, no modal, no reconnect loop in the logs.
- [ ] Regression: normal login on prod, teleport between realms, scene room voice chat still work.

## Related

- Follow-up (not blocking the cutover): superseded-session eviction UX — see #2880.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.