Upgrading a room silently drops all Lotus room state (voice limit, audio-only/quality caps, soundboard) and its retention policy #327

Closed
opened 2026-10-05 18:40:33 -04:00 by jared · 1 comment
Owner

Room Settings → General → Room Upgrade (src/app/features/common-settings/general/RoomUpgrade.tsx, upstream code) calls POST /rooms/{id}/upgrade and nothing else. Synapse copies only a fixed list of state into the replacement room: power levels, join rules, name, topic, avatar, history visibility, guest access, encryption, server ACL, and space parent/child. Everything Lotus stores in room state is lost.

Measured (room version 10 → 11 on the dev Synapse):

before: io.lotus.room_quality, io.lotus.soundboard, io.lotus.voice_limit, m.room.retention, m.room.pinned_events
after : (none of them)

Consequences:

  • Retention (privacy): a room set to delete messages after 7 days gets no m.room.retention in its replacement, so new messages are kept forever. Nothing tells the admin, and the "Disappearing messages" setting just reads "off" in the new room.
  • Call policy: an audio-only voice channel (allow_camera/allow_screenshare: false, enforced server-side by the voice-limit guard) becomes camera and screenshare allowed. A user limit (max_users: 5) becomes unlimited. Bitrate caps disappear.
  • Soundboard: the room's clip pack is gone.
  • Pins are dropped too (upstream behaviour; worth carrying over at the same time).

Fix: after a successful upgrade, copy the client-owned state into replacement_room. That means io.lotus.* (voice_limit, room_quality, soundboard with all state keys), m.room.retention, and optionally m.room.pinned_events filtered to nothing (old event ids don't exist in the new room). Show what was carried over. Also list these in the upgrade dialog ("Voice limits, call policy, soundboard and message retention will be copied"), and add a test that upgrades a seeded room and checks the replacement's state.


Found in the October 2026 client audit (Playwright against a local Synapse + LiveKit stack, plus code reading). Code refs are at cinny 30e2dbcd, cinny-desktop 8f67ec7, element-call 3b0050e8.

Room Settings → General → Room Upgrade (`src/app/features/common-settings/general/RoomUpgrade.tsx`, upstream code) calls `POST /rooms/{id}/upgrade` and nothing else. Synapse copies only a fixed list of state into the replacement room: power levels, join rules, name, topic, avatar, history visibility, guest access, encryption, server ACL, and space parent/child. Everything Lotus stores in room state is lost. **Measured** (room version 10 → 11 on the dev Synapse): ``` before: io.lotus.room_quality, io.lotus.soundboard, io.lotus.voice_limit, m.room.retention, m.room.pinned_events after : (none of them) ``` **Consequences:** - **Retention (privacy):** a room set to delete messages after 7 days gets no `m.room.retention` in its replacement, so new messages are kept forever. Nothing tells the admin, and the "Disappearing messages" setting just reads "off" in the new room. - **Call policy:** an audio-only voice channel (`allow_camera/allow_screenshare: false`, enforced server-side by the voice-limit guard) becomes camera and screenshare allowed. A user limit (`max_users: 5`) becomes unlimited. Bitrate caps disappear. - **Soundboard:** the room's clip pack is gone. - Pins are dropped too (upstream behaviour; worth carrying over at the same time). **Fix:** after a successful upgrade, copy the client-owned state into `replacement_room`. That means `io.lotus.*` (voice_limit, room_quality, soundboard with all state keys), `m.room.retention`, and optionally `m.room.pinned_events` filtered to nothing (old event ids don't exist in the new room). Show what was carried over. Also list these in the upgrade dialog ("Voice limits, call policy, soundboard and message retention will be copied"), and add a test that upgrades a seeded room and checks the replacement's state. --- _Found in the October 2026 client audit (Playwright against a local Synapse + LiveKit stack, plus code reading). Code refs are at cinny `30e2dbcd`, cinny-desktop `8f67ec7`, element-call `3b0050e8`._
jared added the bugpriority: mediumarea: settings labels 2026-10-05 18:40:33 -04:00
Author
Owner

Spaces too (tested a space upgrade v10 → v11): Synapse carries the m.space.child events over (✔), but the space's io.lotus.soundboard (space-wide clips inherited by every voice room) is dropped. The children's m.space.parent still point at the old space id. The migration step should run for spaces as well: copy io.lotus.*, and for children the user can edit, update m.space.parent to the replacement.

**Spaces too** (tested a space upgrade v10 → v11): Synapse carries the `m.space.child` events over (✔), but the space's **`io.lotus.soundboard`** (space-wide clips inherited by every voice room) is dropped. The children's `m.space.parent` still point at the **old** space id. The migration step should run for spaces as well: copy `io.lotus.*`, and for children the user can edit, update `m.space.parent` to the replacement.
jared closed this issue 2026-10-17 17:51:42 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#327