From a893b13f9792fa5486e8fbc221d0fd174da15b18 Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Mon, 1 Jun 2026 14:42:50 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20final=20audit=20pass=20=E2=80=94=20all?= =?UTF-8?q?=2017=20remaining=20audits=20resolved?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New findings: - Service worker EXISTS at src/sw.ts — task #95 just needs notificationclick handler - Highlight animation EXISTS in layout.css.ts:44-66 — task #81 just wires it to @mentions - CallControl.toggleSound() EXISTS — task #100 push-to-deafen trivial - Sanitizer strips / — task #56 needs sanitizer changes too - Folds uses vanilla-extract not CSS vars in non-TDS — task #74 needs theme variant - Cinny cannot inject audio into EC stream — task #88 redesigned as local-only soundboard - Policy list code: zero existing code, completely additive - Notification dispatch: only 2 code points — task #12 is 4-line addition - Upload preview: UploadCardRenderer.tsx:19-98 — task #36 insertion point found - Room stats cache limited to ~80 events — task #45 must label clearly - MSC3489/3672 live location: BLOCKED on server - Profile banner: DROPPED — not in matrix-js-sdk or any Matrix standard Server checks: - /.well-known/matrix/support: 404 (needs server-side file creation) - MSC3489 live location: false → task #64 added to BLOCKED section - preview_url: requires auth (endpoint exists, works with user token) Stale [AUDIT REQUIRED] tags scrubbed from P0 section. All upstream-confirmed items removed or marked clearly. Architecture reference table expanded with 15 new confirmed facts. Co-Authored-By: Claude Sonnet 4.6 --- LOTUS_TODO.md | 141 ++++++++++++++++++++++++-------------------------- 1 file changed, 67 insertions(+), 74 deletions(-) diff --git a/LOTUS_TODO.md b/LOTUS_TODO.md index 681241a78..34db97075 100644 --- a/LOTUS_TODO.md +++ b/LOTUS_TODO.md @@ -73,34 +73,50 @@ DM last-message preview, Media gallery, Knock-to-join full UX | ~~JetBrains Mono not bundled~~ | **Already loaded via Google Fonts CDN** in `index.html:33-35`. Other fonts: use `@fontsource` npm packages | | ~~Animated backgrounds: add to backgroundImage~~ | **backgroundImage can't have @keyframes** — use CSS `::before` pseudo-element on `` component with `position:absolute, inset:0, z-index:-1` | -#### Confirmed facts +#### Confirmed facts (all audits complete as of June 2026) | Finding | Impact | |---|---| -| `folds AvatarImage` does NOT accept children | Add frame/overlay inside `UserAvatar.tsx` component itself (see correction above) | -| No in-app toast system exists | Toast redesign (#80): build `ToastProvider` + Jotai atom queue; insert after `OverlayContainerProvider` at `App.tsx:65`; use `portalContainer` div from `index.html:101` | -| `useUnverifiedDeviceCount()` hook EXISTS | Task #65 is trivial: `src/app/hooks/useDeviceVerificationStatus.ts:65-106` — call it in `RoomInput.tsx` | +| `folds AvatarImage` does NOT accept children | Add frame/overlay inside `UserAvatar.tsx` itself — optional `frameName` prop | +| No in-app toast system exists | Task #80: build `ToastProvider` + Jotai queue; insert at `App.tsx:65` after `OverlayContainerProvider`; `portalContainer` in `index.html:101` | +| `useUnverifiedDeviceCount()` hook EXISTS | Task #65 is trivial: `src/app/hooks/useDeviceVerificationStatus.ts:65-106` | | Voice player: `AudioContent.tsx:44-223` | Task #8: `playbackRate` on hidden `` render | -| Toolbar buttons (in order): Attach, Formatting, Emoji/Sticker, GIF, Location, Voice, Send | Task #43: sequential array in `RoomInput.tsx` after/before props | -| `MessageQuickReactions` already in hover toolbar (4 recent emojis) | Task #92: increase limit, adjust layout position | -| `knockSupported()` utility EXISTS at `matrix.ts:376-391` | Task #58: just need "Request to Join" button in `RoomIntro.tsx:25-119` | -| `CallControl.setMicrophone(bool)` at `CallControl.ts:206-212` | Task #84: call this directly for AFK auto-mute | -| matrix-js-sdk has NO arbitrary profile field methods | Task #62: use `mx.http.authedRequest()` for MSC4133 raw HTTP calls | -| `JumpToTime.tsx` FULLY IMPLEMENTED and wired in `RoomViewHeader.tsx:215` | Task #7: DELETED — already upstream | -| Poll voting already implemented in `PollContent.tsx:189-213` | Task #9: only CREATE UI needed | -| `useRecentEmoji(mx, 4)` provides the quick reaction data | Task #92: same source as full emoji board | -| `getMatrixToRoom()` in `matrix-to.ts` already generates invite URLs | Task #24: just add QR code display to room settings | -| `/.well-known/matrix/support` not configured on server | Task #67: client reads gracefully if present; Jared must CREATE the file server-side | -| MSC4151 report room endpoint returned HTTP 405 on GET → POST-only → EXISTS | Task #59: endpoint is live, just needs POST with JSON body | -| `/timestamp_to_event` returned 401 (needs auth) → EXISTS | Jump to Date already works — task deleted as upstream | -| `useCallSpeakers.ts` uses CSS MutationObserver polling on EC iframe DOM | Task #107: can augment with TDS ring animation on top of existing data | +| Notification sounds: 2 hardcoded `.ogg` files | Task #22: replace paths with `settingsAtom` value | +| Chat backgrounds: `chatBackground.ts`, `` in `RoomView.tsx:106` | Task #77: animated backgrounds need CSS class + `::before` pseudo-element | +| `KeywordMessages.tsx` already has custom keyword push rules | Task #61: only non-keyword rule types need new UI | +| `StateEventEditor.tsx` in Developer Tools edits any state event | Task #69: build user-friendly ACL UI in Permissions tab | +| URL preview defaults: `urlPreview: true`, `encUrlPreview: false` | Task #49: one-line default change + one warning string | +| Private read receipts: `ReceiptType.ReadPrivate` + `markAsRead()` param exist | Task #34: trivially simple | +| Right-click room menu: 6 items in `RoomNavItem.tsx:70-220` | Task #102: add Mute-duration submenu via `PopOut` | +| GIF links: render as generic OG preview cards, NOT auto-embedded | Task #42: needs explicit URL pattern detection + `` render | +| Toolbar buttons sequential array in `RoomInput.tsx` | Task #43: straightforward — no complex layout system | +| `MessageQuickReactions` already in hover toolbar (4 recent emojis) | Task #92: increase limit + layout tweak | +| `knockSupported()` utility exists at `matrix.ts:376-391` | Task #58: only need "Request to Join" in `RoomIntro.tsx:25-119` | +| `CallControl.setMicrophone(bool)` at `CallControl.ts:206-212` | Task #84: call for AFK auto-mute | +| `CallControl.toggleSound()` at `CallControl.ts:230-251` | Task #100: push-to-deafen — just wire a hotkey to this | +| matrix-js-sdk has NO arbitrary profile field methods | Task #62: use `mx.http.authedRequest()` for MSC4133 | +| `JumpToTime.tsx` FULLY IMPLEMENTED, wired in `RoomViewHeader.tsx:215` | Task #7: DELETED — already upstream | +| Poll voting implemented in `PollContent.tsx:189-213` | Task #9: only CREATE UI needed | +| `getMatrixToRoom()` in `matrix-to.ts` generates invite URLs | Task #24: just add QR code to room settings | +| `/.well-known/matrix/support` returns 404 | Task #67: Jared must CREATE the file; client handles gracefully | +| MSC4151 report room: HTTP 405 on GET = endpoint exists (POST only) | Task #59: endpoint live, just POST with JSON body | +| `/timestamp_to_event` returns 401 = endpoint exists | Task #7 deleted — Jump to Date already upstream | +| `useCallSpeakers.ts` CSS MutationObserver polling | Task #107: TDS ring animation on top of existing data | +| Highlight animation EXISTS in `layout.css.ts:44-66` (2s infinite keyframe) | Task #81: wire to @mention events, make one-shot (0.6s) | +| Cindy CANNOT inject audio into EC call stream | Task #88: redesign as local-only soundboard | +| `toggleSound()` at `CallControl.ts:230-251` mutes EC `