You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
packages/web/src/pages/workspace/center/chat-by-id.tsx fires markMeChatRead(chatId) unconditionally on mount, on every chat:message frame for the open chat, and on ws:reconnect. The server-side mark is chat-granular — it has no watermark concept — so it clears the conversation list's unread badge / mention count for messages the viewer never actually saw:
Pre-existing: while a blocking question truncates the timeline (takeover), newer messages behind the block are never rendered, yet an incoming chat:message still marks the chat read.
The local timeline anchors (durable watermark, persisted scroll anchor, live session high-water, divider anchor) are all bounded by the rendered-prefix ceiling since #2164, so in-chat attention (divider/pill) stays honest — the gap is only the server-side chat-level mark feeding the conversation list.
Fix directions both have costs and deserve a product decision:
Skip/defer markMeChatRead while the rendered timeline hides messages (list keeps showing unread for a chat the user has open — possibly correct, possibly annoying);
Teach the server mark a watermark (schema/API change);
Accept as-is and keep the boundary documented (current state — the Context Tree rule in first-tree-context#888 is explicitly scoped to local timeline anchors and names this exclusion).
Surfaced by the review agent during #2164 review (non-blocking, since the coarse behavior predates that PR).
packages/web/src/pages/workspace/center/chat-by-id.tsxfiresmarkMeChatRead(chatId)unconditionally on mount, on everychat:messageframe for the open chat, and onws:reconnect. The server-side mark is chat-granular — it has no watermark concept — so it clears the conversation list's unread badge / mention count for messages the viewer never actually saw:chat:messagestill marks the chat read.chat:messageframe clears the list badge even though the row never rendered.The local timeline anchors (durable watermark, persisted scroll anchor, live session high-water, divider anchor) are all bounded by the rendered-prefix ceiling since #2164, so in-chat attention (divider/pill) stays honest — the gap is only the server-side chat-level mark feeding the conversation list.
Fix directions both have costs and deserve a product decision:
markMeChatReadwhile the rendered timeline hides messages (list keeps showing unread for a chat the user has open — possibly correct, possibly annoying);Surfaced by the review agent during #2164 review (non-blocking, since the coarse behavior predates that PR).