Repository navigation
fix(mobile): read mentions taller than the screen - #9243
blakemcanally wants to merge 2 commits into
Conversation
Opening an Inbox mention in a Solo chat could leave the row unread: a long agent answer never fits on a phone screen, and automatic reading only marked fully visible rows. Bottom catch-up also skipped mentions. - Bottom catch-up now writes msg: marks for loaded top-level mentions and broadcasts through the bottom row (newest 128), as buzz-app does since block/buzz-app#1679. - A row taller than the reading area counts as read once it covers the whole area for the dwell. Co-authored-by: BlakeBot <85bbd70443139fd5c5762e34c2e214240939eb243c37f98380f69fed3b3bb4a6@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Blake McAnally <bmcanally@squareup.com>
A Solo chat shows replies inline, so bottom catch-up there also marks reply mentions through the bottom row. Adds widget tests for that and for a tall row read away from the bottom. Co-authored-by: BlakeBot <85bbd70443139fd5c5762e34c2e214240939eb243c37f98380f69fed3b3bb4a6@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Blake McAnally <bmcanally@squareup.com>
🤖 Reviewer guideWhere to look
Evidence: regression tests that fail on
To run them: cd mobile && flutter test test/features/channels/channel_detail_page_test.dart --plain-name "tall"
flutter test test/features/channels/channel_detail_page_test.dart --plain-name "inline reply mention"
flutter test test/features/channels/reading_marks_test.dart
Behavior change to check: Reaching the bottom of a channel now reads every loaded top-level mention above it, up to the newest 128. Before this change, a mention stayed unread until its row was fully on screen. Messages that the reader marked unread stay unread. Media: I did not attach the original bug recording or any screenshots. The recording shows internal conversations, and this repository is public. To reproduce on a device, open a long agent reply that mentions you in a Solo chat from the Inbox. On Comment written by BlakeBot, the AI agent of bmcanally. |
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
🔐 Codex Security Review
Review SummaryOverall Risk: NONE
FindingsNo concrete security, correctness, or reliability findings were identified. Notes
Generated by Codex Security Review | |
Problem
Bug report (mobile 0.28.0 (46)): opening a mention from the Inbox in an archived Solo chat leaves the Inbox row unread.
The video shows the cause. Each unread row is a long agent answer. On a phone, the answer is taller than the screen, or it lands partly cut off after the deep-link jump. Mobile automatic reading writes a
msg:mark only for a row that is fully visible for the 300 ms dwell. A mention row is high priority, soactivity:<channel>does not read it. The mention can stay unread until the reader marks it read by hand.The archived state is not the cause. A widget test shows that an archived Solo chat writes read marks for short messages. Archived chats make the problem easy to see, because there is no composer and the reader only reads.
Fix
msg:mark for each loaded top-level mention and broadcast through the bottom row. It marks at most the newest 128 unread ones. Messages that the reader marked unread stay unread. This is the rule from fix(unread): read timeline mentions when catching up at the bottom buzz-app#1679 (docs/unread.md: "so a mention taller than the viewport is still read"). In a Solo chat, which shows replies inline, catch-up also marks the reply mentions through the bottom row. Threads and DMs do not change.Open question
A deep link places its target at 35% of the list height. A long target can still land cut off. In that case, the reader must scroll until the target fills the screen, or reach the bottom. Do we want the deep-link target to count as read when it is visible? Desktop does not do this, so I left it out.
Tests
reading_marks_test.dart: catch-up marks unseen top-level mentions and broadcasts. It skips replies, forced-unread messages, and messages that are already read. It applies the 128 limit to unread mentions only. A jump into history does not mark them. AddedisReadableRowcases.channel_detail_page_test.dart: a new regression test opens an archived Solo chat at the bottom, with a mention that is taller than the screen. The test fails onmainand passes with this change.channel_detail_page_test.dart: a tall row away from the bottom is read once it fills the screen. A Solo chat reads an inline reply mention at the bottom. Both tests fail onmain.just mobile-checkandjust mobile-testpass.Human test steps
🤖 Generated with Claude Code