Repository navigation
perf(messages): measure read-tracking rows once per frame - #1527
Conversation
Every scroll, list mutation and resize measured every row of the timeline synchronously, which forced a fresh layout per event. These high-rate triggers now cancel dwell at once and measure rows in the next animation frame. Discrete actions such as focus, pointer, key and visibility still start dwell at once. Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Signed-off-by: Logan Johnson <[email protected]>
A scroll, mutation or resize used to drop the current view at once and re-measure in the next frame. A pending Notify-while-viewing alert whose permission probe resolved in that gap saw a still-visible row as not viewed and was dropped for good. The current view now stays until the frame replaces it. Dwell is still cancelled at the event. While a frame is pending, the view confirms a row only when a consumer asks, so a row scrolled out of view is not reported as viewed. ReadingHandle.view's predicate now takes the message ID. Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Signed-off-by: Logan Johnson <[email protected]>
This comment has been minimized.
This comment has been minimized.
The previous fix kept the last view until the next frame, but that view only covered the rows it had measured. A row scrolled into view before the frame still counted as not viewed. With Notify while viewing off, a pending alert for that row could be shown. Each deferred measurement's lease now answers for the list on demand: until its frame runs, any row of this list is checked when a consumer asks. The old view is again released at the event. The view predicate now receives whether the row was among the measured IDs, and unread matches views by channel. Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Signed-off-by: Logan Johnson <[email protected]>
This comment has been minimized.
This comment has been minimized.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/concurrency), and Groot (product/accessibility) reviews.
No actionable findings in this follow-up. Both previously reported notification defects are addressed in source: the deferred lease now checks any requested row in its channel before the next frame, preserving still-visible notifications and suppressing alerts for newly visible rows when Notify while viewing is off. Event-time manual-unread fencing, dwell cancellation and lifecycle cleanup remain intact. Source assessment: 9/10.
Reviewed a9fe637 → 1e5e230 against base 3d1938a (merge-base f941667), including the changed view contract and its notification/timeline/thread consumers. Public PR description and three commit messages inspected; no attached images or disclosure findings.
The new held-permission regression test exercises the newly-visible-row case through the real reading hook and unread service, with mocked geometry; hook assertions cover measured and deferred views. No browser cases were added or removed. Tests and fail-before/pass-after behavior were not executed in this review.
Source-only: no tests, builds or app execution; CI not assessed. Per-message attention queries may still scan row IDs and read geometry outside the batched frame, so actual performance gains need browser measurement. Browser/native timing, rendered accessibility, error/retry focus behavior and human acceptance remain unverified. This COMMENT review is not approval or merge authorization.
Co-authored-by: Aaron <f425b86c3b780d43f8d9cf1802429d04dd985bf92eac44fca9468b5ad3887c5e@buzz.block.builderlab.xyz> * origin/main: fix(channels): confirm a requested member when the relay stores bot (#1519) test(browser): settle dialog motion and startup errors before strict checks (#1492) perf(messages): measure read-tracking rows once per frame (#1527) fix(settings): keep the chosen plugin row in place when details open or close (#1551) fix(messages): polish reaction pills and mention badges (#1506) Signed-off-by: John Tennant <[email protected]>
Signed-off-by: morgmart <[email protected]> Co-authored-by: Carl <c217fe6b9d958f41c3a5e030dccc7f626775a923089cb6491305eade75ea1f1b@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> * origin/main: (24 commits) Unify chat and channel access, tidy the Solo chat menu (#1446) fix(todos): render nested TODOs with collapsible hierarchy and Markdown (#1483) fix(agents): Allow agents to propose updates to agents (#1478) fix(composer): prevent plugins from updating the recipient on a WIP draft message (#1497) fix(agents): can't delete an agent belonging to an archived channel (#1560) Bump tokio to 1.53.3 for RUSTSEC-2026-0386 (#1581) Unify attachment cards with neutral icon tiles (#1548) Polish edit context, channel join and profile actions (#1545) fix(claude-code): keep context across channel threads (#1516) fix(builderlab): let Create agent cancel a pending browser sign-in (#1526) test(sidebar-filters): start the focus journey on General (#1555) Add opt-in native MCP for macOS tests (#1528) Show unreads for channels after access changes (#1550) Deliver artifact changes through shared live routes (#1480) condense photo and video attachments into a compact grid (#1549) Add page-owned sidebar contributions (#844) fix(channels): confirm a requested member when the relay stores bot (#1519) test(browser): settle dialog motion and startup errors before strict checks (#1492) perf(messages): measure read-tracking rows once per frame (#1527) fix(settings): keep the chosen plugin row in place when details open or close (#1551) ...
🤖
Summary
Details