From 098e3c900ffc54967321b14e974c74e35717628d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Jul 2026 13:33:56 -0400 Subject: [PATCH] docs(todo): park Matrix 2.0 / MSC4354 sticky-events call rollout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Records the 3-agent + live-infra investigation into moving MatrixRTC call membership to sticky events. Conclusion: enabling msc4354_enabled on Synapse is low-risk/reversible but a no-op by itself (EC stays in Legacy mode behind a per-device dev toggle; fleet is single-hosted so upgrades atomically). The one unverified risk is media-layer interop (lk-jwt /get_token vs /sfu/get resolving to the same LiveKit room) — needs a two-account cross-mode test before any default change. Parked as a scoped future rollout, not a flag flip. Co-Authored-By: Claude Opus 4.8 --- LOTUS_TODO.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/LOTUS_TODO.md b/LOTUS_TODO.md index 271aa7070..432b08b92 100644 --- a/LOTUS_TODO.md +++ b/LOTUS_TODO.md @@ -193,6 +193,19 @@ Genuine Matrix client-spec / MSC features Lotus does **not** yet implement (audi **Server-gated / advanced (capture, don't build yet):** QR sign-in for a new device (**MSC4108** rendezvous — needs an HS-side endpoint); dehydrated devices (**MSC3814** — offline key delivery, also helps the E2EE KE cluster); E2EE history key sharing on invite (**MSC3061** `shared_history`, niche); voice broadcast (Element MSC3888, low value — skip). +### [PARKED] Matrix 2.0 call membership — MSC4354 Sticky Events (investigated 2026-07, 3 agents + live infra check) + +Move MatrixRTC/Element Call call-membership from state events (MSC3401) to **sticky events** — the "Matrix 2.0" path. **Not a flag flip; a coordinated rollout. Parked deliberately.** + +Findings: + +- **Server (Synapse 1.157.1, LXC 151):** `msc4354_enabled` defaults `false`. Enabling is **low-risk, additive, reversible** — schema (`sticky_events` table) already ships unconditionally, no migration/backfill, all runtime paths flag-gated, residual rows self-expire ≤1h. The one historical `/sync` EDU-filter bug (#19787) was fixed in 1.155.0; SQLite guard N/A (we're Postgres). +- **The flag alone is a no-op for behavior.** Our EC fork (upstream **v0.20.1** base, `@lotusguild/element-call-embedded`, bundled into Cinny at build → fleet upgrades atomically) gates sticky mode behind BOTH server support AND a per-device **developer-settings** radio (`matrix-rtc-mode`, defaults `Legacy`). Enabling the flag only un-greys that radio; no client changes what it sends until a human toggles it. +- **Matrix-layer mixed-mode = safe:** js-sdk (v41.6.0) reads + merges sticky and state membership, so cross-mode participants see each other. +- **Open risk before any real rollout:** media layer. Sticky mode drops `livekit_alias` + uses lk-jwt-service `/get_token` (slot `m.call#ROOM`); legacy uses `/sfu/get` (`room=roomId`). Both endpoints are **live** on our lk-jwt-service, but whether they resolve to the **same LiveKit room** is unverified — must confirm with a **two-account cross-mode test call** (one device `Matrix_2_0`, one `Legacy`) before changing the default, else split-at-media. + +To actually adopt (future): (1) enable `msc4354_enabled: true` + restart; (2) two-account media-interop test; (3) if unified, flip EC default mode `Legacy`→`Compatibility`/`Matrix_2_0` in the fork + redeploy; (4) keep legacy fallback during transition. **No user benefit until step 3.** + ### [ ] Matrix 2.0 call membership — MSC4354 sticky events (INVESTIGATED 2026-07, deliberately NOT enabled) 3-agent investigation after the 1.157.1 upgrade (EC-fork behavior · Synapse/upstream readiness · client-fleet composition). **Conclusion: leave `msc4354_enabled` OFF for now** — enabling it is safe but delivers **zero user-visible benefit on its own**, and introduces a latent footgun.