Edits and reactions on a thread root are invisible in the thread panel #12

Closed
opened 2026-09-12 01:50:49 -04:00 by jared · 0 comments
Owner

Severity: high · Type: bug · Confidence: high

Location: src/app/features/room/thread/ThreadTimeline.tsx:718 (thread.getUnfilteredTimelineSet()), :660-680 (renderMessageContent), :551-570 (handleReactionToggle)

Problem

The thread panel resolves edits (getEditedEvent) and reactions (getEventReactions) against the thread's timeline set for every event including the root. Per Room.eventShouldLiveIn (matrix-js-sdk room.js:2110), a non-thread relation whose parent is a thread root lives only in the main room timeline — so edits and reactions targeting the root are never in the thread's timeline set. Result: after editing a thread root, the thread panel keeps showing the pre-edit text with no "(edited)" marker; reactions added to the root in the main timeline don't appear in the panel. Clicking the same emoji from inside the panel also can't find your existing reaction (myReaction lookup misses) and sends a duplicate m.reaction instead of toggling it off.

How to trigger

Start a thread, edit the root message and react to it from the main timeline, then open the thread panel.

Suggested fix

For the root event only (and any event whose relations live in the room), read edits/reactions from room.getUnfilteredTimelineSet(); the simplest fix is to pass mEventId === thread.id ? room.getUnfilteredTimelineSet() : thread.getUnfilteredTimelineSet() into getEditedEvent/getEventReactions/handleReactionToggle.


Filed from the September 2026 client audit (branch lotus @ 4bea4895).

**Severity:** high · **Type:** bug · **Confidence:** high **Location:** `src/app/features/room/thread/ThreadTimeline.tsx:718` (`thread.getUnfilteredTimelineSet()`), `:660-680` (`renderMessageContent`), `:551-570` (`handleReactionToggle`) ### Problem The thread panel resolves edits (`getEditedEvent`) and reactions (`getEventReactions`) against the **thread's** timeline set for every event including the root. Per `Room.eventShouldLiveIn` (matrix-js-sdk `room.js:2110`), a non-thread relation whose parent is a thread root lives **only in the main room timeline** — so edits and reactions targeting the root are never in the thread's timeline set. Result: after editing a thread root, the thread panel keeps showing the pre-edit text with no "(edited)" marker; reactions added to the root in the main timeline don't appear in the panel. Clicking the same emoji from inside the panel also can't find your existing reaction (`myReaction` lookup misses) and sends a duplicate `m.reaction` instead of toggling it off. ### How to trigger Start a thread, edit the root message and react to it from the main timeline, then open the thread panel. ### Suggested fix For the root event only (and any event whose relations live in the room), read edits/reactions from `room.getUnfilteredTimelineSet()`; the simplest fix is to pass `mEventId === thread.id ? room.getUnfilteredTimelineSet() : thread.getUnfilteredTimelineSet()` into `getEditedEvent`/`getEventReactions`/`handleReactionToggle`. --- _Filed from the September 2026 client audit (branch `lotus` @ 4bea4895)._
jared added this to the Audit 2026-09 · High milestone 2026-09-12 01:50:49 -04:00
jared added the bugpriority: higharea: threads labels 2026-09-12 01:50:49 -04:00
jared self-assigned this 2026-09-12 01:50:49 -04:00
jared closed this issue 2026-09-12 14:59:46 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
2026-10-14
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#12