fix(desktop): hide non-contiguous islands until scrollback heals them#1486
Open
tlongwell-block wants to merge 2 commits into
Open
fix(desktop): hide non-contiguous islands until scrollback heals them#1486tlongwell-block wants to merge 2 commits into
tlongwell-block wants to merge 2 commits into
Conversation
Out-of-band merges (thread ancestors fetched by id, thread-panel reply subtrees) splice old events into the timeline cache marked nonContiguous. The pager already ignores them when anchoring its cursor, but the render path did not: an island painted the start of an old day immediately, while the middle and end of that day only arrived when contiguous paging caught up — so they visibly popped in above the reader. Hide marked events from the main timeline until paging heals them: - TimelineMessage carries the nonContiguous mark through formatTimelineMessages, - buildMainTimelineEntries skips marked entries (the single seam both ChannelPane and TimelineMessageList render through); island replies still count toward their visible parent's thread summary, - countTopLevelTimelineRows mirrors the filter so the pager's row floor counts only rows that actually render, - the channel unread marker skips hidden islands so the pill and New divider never anchor on an invisible row. Healing is unchanged: when contiguous paging reaches an island the unmarked copy wins the merge and the whole day appears in one commit, in order. Thread panels are unaffected — they derive from the full cache, not the main-timeline entries. Reported by Tyler while hammering #1483: scrolling up sometimes loaded the beginning of a day before its end, then the rest popped in. Co-authored-by: Tyler Longwell <tlongwell@block.xyz> Signed-off-by: Tyler Longwell <tlongwell@block.xyz>
Wren's #1486 review: the island-reply summary test exercised main-timeline aggregation, not buildThreadPanelData. Pin the exact panel shape — a marked island head with a marked descendant renders head + reply in the thread panel while producing zero main-timeline entries. Co-authored-by: Tyler Longwell <tlongwell@block.xyz> Signed-off-by: Tyler Longwell <tlongwell@block.xyz>
tlongwell-block
commented
Jul 3, 2026
tlongwell-block
left a comment
Collaborator
Author
There was a problem hiding this comment.
Independent delta review clean at 1bc8e24accddfd022d65e765b0807afa9f485869.
Verified:
- deep-link/search events enter the render list through ordinary
mergeMessages, unmarked; a same-ID route target also replaces a cached marked island in the resolved render list; - an island thread head and marked descendants remain available through
buildThreadPanelDatawhilebuildMainTimelineEntrieshides only their main-timeline rows; the exact shape is now pinned by1bc8e24a; - pager row-floor and channel unread marker count the same visible top-level set as the render seam;
- contiguous history still heals a marked event through last-copy-wins without a downgrade race.
Validation on the exact PR head: desktop 1505/1505, pnpm check, pnpm typecheck, and git diff --check all clean.
Scores: Minimalness 9/10, Elegance 9/10, Correctness 9/10.
GitHub credentials resolve to the PR owner, so I cannot submit a formal approval; this comment is my approval-equivalent verdict. Manual scrollback remains the final UX gate.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #1483. Fixes the pop-in Tyler hit while hammering the stack: scrolling up sometimes rendered the beginning of a day before its end/middle, which then popped in above the reader.
Mechanism
Out-of-band merges (
useLoadMissingAncestorsfetching thread roots by id,useThreadRepliesfetching subtrees) splice old events into the cache markednonContiguous. #1483 made the pager ignore them when anchoring its cursor — but nothing filtered them from the render. An island (typically a day-leading thread root) painted instantly at its day position; the rest of that day only arrived when contiguous paging caught up.Fix
Hide marked events from the main timeline until paging heals them:
TimelineMessagecarries thenonContiguousmark throughformatTimelineMessagesbuildMainTimelineEntriesskips marked entries — the single seam bothChannelPaneandTimelineMessageListrender through. Island replies still count toward a visible parent's thread summary (the thread index sees the full cache)countTopLevelTimelineRowsmirrors the filter, so the pager's row floor counts only rows that actually renderHealing is unchanged: when contiguous paging reaches an island, the unmarked copy wins the merge and the whole day appears in one commit, in order. Thread panels are unaffected (they derive from the full cache, not the entries).
Validation
pnpm checkclean,tsc --noEmitclean