From 5b94a44eb34e1a62304725c053f0d9ece44aeabd Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Thu, 2 Jul 2026 23:53:33 -0400 Subject: [PATCH] docs: add Matrix Protocol Gaps backlog (audited spec/MSC gaps) Six confirmed client-buildable gaps + server-gated items from a spec/MSC audit: Mark as Unread (MSC2867), Low Priority rooms (m.lowpriority), Disappearing Messages (MSC1763), QR Device Verification, Room Widgets (MSC1236), Sliding Sync (MSC3575/4186). Phased build order. Co-Authored-By: Claude Opus 4.8 --- LOTUS_TODO.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/LOTUS_TODO.md b/LOTUS_TODO.md index 331bf137d..39ddd63bc 100644 --- a/LOTUS_TODO.md +++ b/LOTUS_TODO.md @@ -91,6 +91,29 @@ Observed live in prod 2026-06-30 during a 2-person **Element Call** (E2EE). Thes --- +## ๐ŸŒ Matrix Protocol Gaps + +Genuine Matrix client-spec / MSC features Lotus does **not** yet implement (audited 2026-07 against the codebase โ€” almost everything else is built: pinning, stickers+picker, room directory, mutual rooms MSC2666, blurhash, key backup/recovery/SSSS, SAS verification, ignore list, invite spam-filter, voice messages, polls, threads, spaces, OIDC, extended profiles, delayed events, authed media). Build each **fully** โ€” spec-correct events, native-Cinny folds UI, tests. Order = clean wins first. + +**Phase A (small, room-tag/account-data + `RoomNavItem` menu + room-list category):** + +- [ ] **Mark as Unread โ€” MSC2867 `m.marked_unread`.** Room account data `{ unread: true }` (+ unstable `com.famedly.marked_unread`) via `mx.setRoomAccountData`; clear on read. Context-menu item in `RoomNavItem` + light the existing unread dot; integrate `state/room/roomToUnread.ts`. +- [ ] **Low Priority rooms โ€” `m.lowpriority` tag.** Mirror the favourite impl (`RoomNavItem.tsx:331-337` `setRoomTag/deleteRoomTag` + the favourites category in `home/Home.tsx`): context-menu toggle + a collapsed "Low Priority" category sorted to the bottom, excluded from normal unread nudging. + +**Phase B:** + +- [ ] **Disappearing Messages โ€” MSC1763 `m.room.retention`.** PL-gated room-settings `SettingTile` to set `{ max_lifetime }`; retention badge; a client-side sweep hides/self-redacts own expired events (pattern like the mute-timer restore in `ClientNonUIFeatures.tsx`). True server deletion also wants Synapse `retention:` (LXC 151). +- [ ] **QR Device Verification โ€” reciprocate QR.** Add the QR path beside emoji-SAS in `components/DeviceVerification.tsx`: render with `qrcode.react` (already a dep), scan via `BarcodeDetector` (fallback `jsQR`); uses the SDK `VerificationRequest` QR/reciprocate support. + +**Phase C (large โ€” each its own planning session):** + +- [ ] **Room Widgets โ€” MSC1236 + widget API.** No general widget UI exists (only the PL entry `im.vector.modular.widgets`; the EC call widget is hardcoded). Read `im.vector.modular.widgets`/`m.widget` state, add an Add/Manage panel + sandboxed iframe renderer via `matrix-widget-api` โ€” **extend the existing EC widget plumbing** (`plugins/call/CallEmbed.ts`). Enables Etherpad/notes/dashboards/integrations. +- [ ] **Sliding Sync โ€” MSC3575 / simplified MSC4186.** Lotus is on **legacy full `/sync`** though the server advertises `simplified_msc3575`. matrix-js-sdk ships `SlidingSync`; migration โ†’ near-instant cold start + low memory + huge-account scale. Touches the sync/room-list/spaces/unread core โ€” behind a feature flag with a legacy fallback. **Plan separately before touching.** + +**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). + +--- + ## ๐Ÿ“‹ Open Feature Backlog ### [ ] P4-4 ยท Math / LaTeX Rendering (LOW PRIORITY)