Skip to content

fix(site): keep agent chat scroll on tool toggles and log streams - #29354

Merged
DanielleMaywood merged 9 commits into
mainfrom
fix/site/agent-chat-scroll-stability
Oct 12, 2026
Merged

DanielleMaywood merged 9 commits into
mainfrom
fix/site/agent-chat-scroll-stability

Conversation

@DanielleMaywood

@DanielleMaywood DanielleMaywood commented Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

Help keep position better in Coder Agents chat transcript during active scrolling

LLM slop description

In the agent chat, a tool call that expands or collapses can make the transcript jump. The clicked row can scroll out of view, or the next streamed output can pull the view to the bottom. The scroller cannot tell a layout change from new output, so it reacts to a toggle as if the reply grew.

ToolCall now tells the scroller before it toggles. The scroller then holds the view in place until the reader scrolls, a scroll command runs, or a new turn starts. The changes are LOCAL CHANGE edits to the scroller source that #29473 vendored.

The create_workspace and start_workspace rows also made the transcript jump while the workspace built. Their log boxes used scrollIntoView to show new lines, and that also scrolls the transcript. At the end of the build, the view could stop following the reply. Now each box scrolls only itself, and only while the reader is at its end, so a reader who scrolls up in the box keeps their place. Other pages use the scroll in the shared WorkspaceBuildLogs component, so that component does not change.

Four behavior changes are intentional. While a turn is anchored, a large block of output no longer pulls the view to the bottom. The reader stays on the turn and can use the jump-to-bottom button. Collapsing a tool while the view follows the reply also stops following, so the rows near the pointer stay put for the next click. A press on the scrollbar now counts as a scroll, so it releases the held view like a wheel or key scroll. Space on a button does not count as a scroll, because Space activates the button.

Related upstream bug reports, all open with no upstream fix: shadcn-ui/ui#11175, shadcn-ui/ui#11577, shadcn-ui/ui#11224

Note

Generated with Coder Agents


W6-start-reload-expand.mp4
W5-start-wheel-up.mp4
W4-start-no-input.mp4
W3-create-reload-expand.mp4
W2-create-wheel-up.mp4
W1-create-no-input.mp4
T11-next-turn-follows-after-toggle.mp4
T10-normal-turn-follows.mp4
T9-scrollbar-drag-after-toggle.mp4
T8-block-lands-while-anchored.mp4
T7-expand-previous-turn-tool.mp4
T6-mouse-collapse-while-anchored.mp4
T5-collapse-while-following.mp4
T4-space-collapse-while-anchored.mp4
T3-enter-while-following.mp4
T2-expand-while-following.mp4
T1-expand-while-anchored.mp4

@DanielleMaywood DanielleMaywood changed the title fix(site): keep agent chat scroll position stable across tool toggles and large stream blocks fix: keep agent chat scroll position stable across tool toggles and large stream blocks Sep 15, 2026
@DanielleMaywood
DanielleMaywood force-pushed the fix/site/agent-chat-scroll-stability branch from 1c39899 to d91e6d4 Compare September 15, 2026 15:15
@DanielleMaywood DanielleMaywood added the experimental Changes that might not necessarily be merged, until its approved to proceed with. label Sep 16, 2026
@DanielleMaywood
DanielleMaywood changed the base branch from main to vendor/message-scroller September 17, 2026 10:34
@DanielleMaywood
DanielleMaywood force-pushed the fix/site/agent-chat-scroll-stability branch from 794de60 to b22535d Compare September 17, 2026 10:35
@DanielleMaywood
DanielleMaywood added this pull request to stack #29474 September 17, 2026 10:36
@DanielleMaywood
DanielleMaywood force-pushed the fix/site/agent-chat-scroll-stability branch from b22535d to 7f24fe8 Compare September 17, 2026 12:29
Base automatically changed from vendor/message-scroller to main September 22, 2026 09:20
DanielleMaywood added a commit that referenced this pull request Sep 22, 2026
The agent chat transcript scrolls through `@shadcn/react`'s
MessageScroller, and its scroll defects have to be fixed in the package.
The package ships only minified dist, so the fix would be an
unreviewable patch against minified code, and 0.3.1 still has the
identical defect, so an upgrade buys nothing.

This vendors the readable upstream source (`@shadcn/react@0.3.0`, commit
`b1c580c63`, MIT) under `site/src/vendor/` and drops the npm dependency.
It is a pure move with no behavior change; the fix itself follows in
#29354. Each file header pins the upstream tree, and any deviation from
upstream must be marked `LOCAL CHANGE`.
@DanielleMaywood
DanielleMaywood force-pushed the fix/site/agent-chat-scroll-stability branch from 7f24fe8 to df2af46 Compare September 22, 2026 09:20
@DanielleMaywood DanielleMaywood changed the title fix: keep agent chat scroll position stable across tool toggles and large stream blocks fix(site): keep agent chat scroll position stable across tool toggles and large stream blocks Sep 22, 2026
@DanielleMaywood
DanielleMaywood force-pushed the fix/site/agent-chat-scroll-stability branch 2 times, most recently from 99fd41a to 7dafdc3 Compare September 22, 2026 12:39
@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-09T14:58:44.917463Z ddf8c59 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7dafdc3880

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread site/src/vendor/message-scroller/use-message-scroller-controller.ts
Comment thread site/src/pages/AgentsPage/components/ChatElements/tools/ToolCall.test.tsx Outdated
@linear-code

linear-code Bot commented Sep 30, 2026

Copy link
Copy Markdown

CODAGT-1109

@DanielleMaywood
DanielleMaywood force-pushed the fix/site/agent-chat-scroll-stability branch from 7dafdc3 to a741dd3 Compare October 5, 2026 08:29
@DanielleMaywood DanielleMaywood changed the title fix(site): keep agent chat scroll position stable across tool toggles and large stream blocks fix(site): keep agent chat scroll position when tool calls toggle Oct 5, 2026
The vendored message scroller cannot tell a tool call toggle from new
output. A toggle can scroll the transcript to the bottom, or move the
anchored prompt out of view.

ToolCall now reports the toggle through a Viewport context before it
changes size. The scroller then stops following until the next user
scroll or scroll command. While a prompt is anchored, the scroller hands
off to following only near the live edge, so a large block of output
does not move the view to the bottom.

When a collapse clamps the view at the bottom, browser scroll anchoring
can scroll back down as output arrives. The scroller now scrolls 1px and
back to make the browser pick a new anchor.
@DanielleMaywood
DanielleMaywood force-pushed the fix/site/agent-chat-scroll-stability branch from a741dd3 to 872eb9c Compare October 6, 2026 14:37
The build log and agent startup log boxes in create_workspace and
start_workspace rows used scrollIntoView to show new lines. That also
scrolled the chat transcript, so the view jumped while a workspace
built and could stop following the reply. The boxes now scroll only
themselves.
@DanielleMaywood DanielleMaywood changed the title fix(site): keep agent chat scroll position when tool calls toggle fix(site): keep agent chat scroll position when tool calls toggle or stream logs Oct 7, 2026
@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

/coder-agents-review

@coder-agents-review

coder-agents-review Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Chat: Review posted | View chat
Requested: 2026-10-08 13:36 UTC by @DanielleMaywood

Review history
  • R1 (2026-10-07): 9 reviewers, 8 Nit, 2 P2, 16 P3, 5 P4, COMMENT. Review
  • R2 (2026-10-08): 10 reviewers, 8 Nit, 2 P2, 21 P3, 7 P4, COMMENT. Review
  • R3 (2026-10-08): 9 reviewers, 8 Nit, 2 P2, 22 P3, 8 P4, COMMENT. Review
  • R4 (2026-10-08): 7 reviewers, 8 Nit, 2 P2, 22 P3, 8 P4, APPROVE. Review

deep-review v0.13.0 | Round 4 | 515bda9..d1c7408

Last posted: Round 4, 40 findings (2 P2, 22 P3, 8 P4, 8 Nit), APPROVE. Review

Finding inventory

Finding inventory: PR #29354

Findings

# Sev Status Location Summary Round Reviewer Posted
CRF-1 P2 Author fixed (0be0099) use-message-scroller-controller.ts:544 No test covers the distance-band handoff from anchored turn to follow R1 Netero Yes
CRF-2 P3 Author fixed (0cb57d6) use-message-scroller-controller.ts:674 resetScrollAnchor, removedNodes branch, nudgeScroll in userLayoutIntent untested R1 Netero Yes
CRF-3 P3 Author contested; panel closed R2 (1/1 accept) WorkspaceAgentLogSection.tsx:80 No test checks agent log box scrolls itself to newest line R1 Netero Yes
CRF-4 P3 Author contested; panel closed R2 (1/1 accept) WorkspaceBuildLogSection.tsx:108 No test checks build log box scrolls itself to newest line R1 Netero Yes
CRF-5 P3 Author fixed (0be0099) use-message-scroller-commands.ts:263 Latch cleared in shared scrollToPosition, forcing save/restore in reanchor R1 Netero Yes
CRF-6 Note Note (body) components.tsx:147 Overlay-scrollbar branch of isScrollbarPress untested R1 Netero No
CRF-7 Note Note (body) WorkspaceAgentLogSection.tsx:82 Agent log box now scrolls to bottom on every batch after completion R1 Netero No
CRF-8 P3 Author contested; panel closed R2 (2/2 accept) use-message-scroller-controller.ts:181 After a toggle, reaching the bottom without wheel/touch/key/scrollbar press never resumes following R1 Mafuuu P3, Nami P4 Yes
CRF-9 P3 Author fixed (0be0099) use-message-scroller-controller.ts:692 In anchored mode, expanding a tool above the anchored prompt still scrolls the clicked row away R1 Mafuuu Yes
CRF-10 P3 Author fixed (0be0099) use-message-scroller-controller.ts:710 Layout-intent MutationObserver runs handleResize on every commit while latched and is never disconnected R1 Nami, Mafuuu, Zoro Yes
CRF-11 P2 Author fixed (0be0099) use-message-scroller-commands.ts:107 No test fails when a scroll command stops releasing the latch R1 Bisky Yes
CRF-12 P3 Author fixed (0be0099) use-message-scroller-controller.ts:716 No test fails when the MutationObserver's handleResize call is removed R1 Bisky Yes
CRF-13 P3 Author fixed (0be0099) use-message-scroller-controller.ts:534 Handoff comment misstates the band's purpose and leaves its terms undefined R1 Gon P2, Pariston Nit, Leorio P4 Yes
CRF-14 P3 Author fixed (0be0099) ToolCall.tsx:151 Comment claims an ordering rule that React batching makes irrelevant R1 Gon P2 Yes
CRF-15 P3 Author fixed (0be0099) types.ts:177 resetScrollAnchor comment lists its callers wrong R1 Gon P2, Leorio P4 Yes
CRF-16 P4 Author fixed (0be0099) components.tsx:243 "not in the rAF. It only scrolls." does not give the reason (also :337) R1 Gon P2, Leorio P4 Yes
CRF-17 Nit Author fixed (0be0099) use-message-scroller-commands.ts:106 Comment restates the next line R1 Gon P2 Yes
CRF-18 Nit Author fixed (0be0099) use-message-scroller-controller.ts:656 Comment restates the next line R1 Gon P2 Yes
CRF-19 Nit Author fixed (0be0099) use-message-scroller-controller.ts:55 nudgeScroll comment describes the code before the reason R1 Gon P2 Yes
CRF-20 Nit Author fixed (0be0099) use-message-scroller-controller.ts:688 userLayoutIntent comment lists the body's steps R1 Gon P2 Yes
CRF-21 Nit Author fixed (0be0099) ToolCall.test.tsx:21 Fixture comment repeats constant values R1 Gon P2 Yes
CRF-22 Nit Author fixed (0be0099) ToolCall.test.tsx:96 Comment restates props instead of naming the copied code R1 Gon P2 Yes
CRF-23 P3 Author fixed (0be0099) use-message-scroller-refs.ts:63 One flag has three names; followLatchRef reads as the opposite of its true value R1 Gon P3, Leorio Nit, Zoro Nit Yes
CRF-24 P3 Author fixed (0be0099) components.tsx:31 Exported useMessageScrollerLayoutIntent has no doc comment and drops "user" from its name R1 Gon Yes
CRF-25 P3 Author fixed (0be0099) use-message-scroller-controller.ts:674 resetScrollAnchor reuses "scroll anchor", which means a message row in this module R1 Gon P3, Mafuuu P4, Zoro P4 Yes
CRF-26 P4 Author fixed (0be0099) use-message-scroller-controller.ts:67 Literal 0.5 duplicates SCROLL_POSITION_EPSILON R1 Gon Yes
CRF-27 P4 Author fixed (0be0099) ToolCall.test.tsx:130 readVisibleRows name hides that it advances scroller state R1 Gon Yes
CRF-28 P3 Author fixed (0be0099) components.tsx:257 Provider wrapper and new dependency entries lack LOCAL CHANGE markers R1 Leorio P3, Gon Nit Yes
CRF-29 P3 Author contested; panel closed R2 (1/1 accept) PR description Description omits scrollbar press, Space-on-button, and spacer remount behavior changes R1 Leorio Yes
CRF-30 P4 Author fixed (0be0099) use-message-scroller-controller.ts:672 "scroll anchoring can win the clamp back" does not state the mechanism R1 Leorio Yes
CRF-31 Nit Author fixed (0be0099) PR title Title is 80 characters; CONTRIBUTING.md sets 72 R1 Leorio Yes
CRF-32 P4 Author contested; panel closed R2 (1/1 accept) WorkspaceBuildLogSection.tsx:104 Same scroll-box effect and reason duplicated in both log sections R1 Zoro Yes
CRF-33 Nit Author fixed (0be0099) use-message-scroller-controller.ts:160 reconcileFollowMode doc comment no longer lists the latch or band conditions R1 Gon Yes
CRF-34 OOS Out of scope (body); accepted by maintainer R4 use-message-scroller-controller.ts:534 Distance band does not fix the second case in shadcn-ui/ui#11175 R1 Pariston No
CRF-35 Note Note (body) WorkspaceBuildLogSection.tsx:102 "scrollIntoView also scrolls the chat transcript" is written in four places R1 Gon No
CRF-36 Note Dropped by orchestrator (confirmation, asks for no change) WorkspaceBuildLogSection.tsx:105 Log sections keep the same loading/error/empty states R1 Nami No
CRF-37 Note Dropped by orchestrator (confirmation, asks for no change) ToolCall.test.tsx:224 The seven ToolCall tests check real behavior R1 Bisky No
CRF-38 Note Dropped by orchestrator (confirmation, asks for no change) PR description Workspace log paragraph gives symptom, cause, fix R1 Leorio No
CRF-39 Note Dropped by orchestrator (confirmation, asks for no change) components.tsx:28 Separate layout-intent context at the Viewport is justified R1 Zoro No
CRF-40 Note Dropped by orchestrator (confirmation, asks for no change) ScrollArea.tsx:16 viewportRef is needed and follows existing naming R1 Zoro No
CRF-41 P3 Author contested; panel closed R3 (1/1 accept) use-message-scroller-controller.ts:494 New-turn clear in the same-item-count branch has no test R2 Netero Yes
CRF-42 P3 Author fixed (0cb57d6) use-message-scroller-controller.ts:546 Handoff band comment omits scrollEdgeThreshold; band has five names across comments and tests R2 Gon P3, Leorio P4 Yes
CRF-43 P3 Author fixed (0cb57d6) components.tsx:35 Hook doc comment does not say which element to pass as target R2 Gon P3, Leorio P4 Yes
CRF-44 P4 Author fixed (0cb57d6) use-message-scroller-controller.ts:686 "fixed threshold allows for rounded scrollTop" does not explain the 8px default constant R2 Gon Yes
CRF-45 P4 Author contested; panel closed R3 (1/1 accept) ToolCall.test.tsx:241 Collapse-while-following test asserts only that next is absent, not that the row stays visible R2 Bisky Yes
CRF-46 P3 Author contested; panel closed R3 (1/1 accept) use-message-scroller-controller.ts:703 Collapse while following stops following, hiding the live reply; not listed as intentional R2 Pariston Yes
CRF-47 P3 Author contested; panel closed R3 (1/1 accept) WorkspaceAgentLogSection.test.tsx:187 Agent log scroll tests pass when the log box never renders R2 Chopper Yes
CRF-48 P3 Author fixed (d1c7408) components.tsx:347 Both ResizeObserver calls to resetBrowserScrollAnchor can be removed with no test failing R3 Bisky Yes
CRF-49 P4 Author contested; panel closed R4 (1/1 accept) ToolCall.test.tsx:257 Two handoff-band tests never touch ToolCall and live away from the scroller code R3 Meruem Yes
CRF-50 Note Note (body); author fixed (d1c7408) use-message-scroller-commands.ts:161 Rule that every scroll command clears followSuppressedRef is not written down R3 Meruem No

Contested and acknowledged

CRF-2 (P3, use-message-scroller-controller.ts:674) - browser-anchor reset paths untested

  • Finding: resetScrollAnchor, the removedNodes branch, the nudgeScroll call in userLayoutIntent, and the WebKit rounding branch could each be no-op'd with no test failing. Proposed a real-browser Storybook play test.
  • Author defense: Partly fixed: the collapse-while-following test now adds output before any scroll or resize report and fails when resetBrowserScrollAnchor or the removedNodes branch is a no-op. The nudge in userLayoutIntent and the WebKit rounding branch need smooth scroll or zoomed WebKit, which jsdom lacks; FE1 disallows assertions in play functions and CI does not run them.

CRF-3 (P3, WorkspaceAgentLogSection.tsx:80) - agent log box self-scroll untested

  • Finding: No test checks the agent log box scrolls to its newest line; proposed asserting viewport scrollTop equals scrollHeight.
  • Author defense: A scrollTop assertion is a DOM-geometry assertion, forbidden by FE10 (.claude/docs/FRONTEND_PATTERNS.md:259-265, verified by orchestrator that the rule text says "Never use ... DOM-geometry assertions"). The agent box uses the same three lines as the build log box, which Pixel covers.

CRF-4 (P3, WorkspaceBuildLogSection.tsx:108) - build log box self-scroll untested

  • Finding: Same as CRF-3 for the build log box, where disableAutoscroll makes this effect the only scroll.
  • Author defense: FE10 forbids the assertion. Five existing Tool.stories.tsx stories overflow the build log box and their Pixel screenshots change with the scroll removed.

CRF-8 (P3, use-message-scroller-controller.ts:181) - non-gesture scroll to bottom never resumes following

  • Finding: After a toggle, reaching the bottom via find-in-page, middle-click autoscroll, Tab focus, or text selection never releases the suppression flag, so following does not resume. Proposed releasing on a downward scroll with unchanged content height.
  • Author defense: Wheel, touch, scroll keys, scrollbar, and jump-to-bottom all resume. Tab cannot reach the bottom because focus leaves the transcript first. Text-selection drag does not resume. The proposed height check worked in a browser but missed 3 of 16 jumps during streaming, and adds a heuristic to vendored code for a rare case one click fixes.

Round 2 dispute check-in (Netero)

  • Panel closure (R2, Netero, the agent that raised it, CRF-3 and CRF-4): Accepted. FE10 forbids the proposed scrollTop assertion. Residual: no overflowing agent-log story exists (StartWorkspaceAgentLogsStreaming renders about 6 lines), so the agent box's self-scroll is unguarded; Pixel claim for the build box unverified by Netero.
  • CRF-2 (R2, Netero, the agent that raised it): Re-raised in part. The cited test passes with nudgeScroll replaced by a no-op, because the mocked scrollTop getter stores the clamped value. Accepted the defense for the userLayoutIntent nudge and the WebKit branch.

Round 2 dispute check-in (panel)

  • CRF-8 (R2, 2/2): Mafuuu and Nami, the agents that raised it, accepted. Both verified the jump-to-bottom button shows in this state (commitScrollState publishes end from geometry outside following-bottom), the next turn now clears the flag, and the per-commit cost from CRF-10 is gone. Residual: after a toggle, reaching the bottom by find-in-page, middle-click autoscroll, or selection drag needs one click to resume following.
  • CRF-29 (R2, 1/1): Leorio, the agent that raised it, accepted. The spacer reset changes nothing a user sees; its marker and test name explain it.
  • CRF-32 (R2, 1/1): Zoro, the agent that raised it, accepted. A hook file saves no lines; the reason comment now lives once.

CRF-29 (P3, PR description) - description omits behavior changes

  • Finding: Description omitted scrollbar-press, Space-on-button, and spacer-remount reset changes, and did not say what the shadcn refs are.
  • Author defense: Description now names scrollbar press and Space-on-button and states the shadcn links are open upstream bug reports. The spacer reset is an internal fix explained by its marker and test name, so it is not in the description.

CRF-32 (P4, WorkspaceBuildLogSection.tsx:104) - duplicated scroll-box effect

  • Finding: Both log sections add the same ref + useLayoutEffect + scrollTop write; proposed a shared hook.
  • Author defense: A hook adds a file for a three-line effect with two callers and saves no lines. The reason comment now lives only in the build log section.

CRF-41 (P3, use-message-scroller-controller.ts:494) - same-count new-turn clear untested

  • Finding: Deleting the clear in the same-item-count new-anchor branch fails no test; proposed a next-turn test that sets scrollAnchor on an already-rendered row.
  • Author defense: In the agent chat only an edit places a turn through this branch, and the edit path calls scrollToEnd first (submitChatTurn.ts:369), which already clears the flag. Logged in a dev build: normal, queued, and after-Stop sends went through line 476; an edit reached 494 with the flag already clear. The clear stays for symmetry.

CRF-45 (P4, ToolCall.test.tsx:241) - collapse-while-following test asserts too little

  • Finding: Test asserts only not.toContain("next"); proposed adding toContain("reply").
  • Author defense: Across 54 mutations of the scroller and ToolCall, none moved the collapsed row out of view without also showing next; after the collapse the reply is the last row at the clamp, so it leaves view only if something scrolls up more than its height.

CRF-46 (P3, use-message-scroller-controller.ts:703) - collapse while following stops following

  • Finding: Collapsing while following the bottom suppresses following though following would keep the row visible; proposed skipping suppression in following-bottom mode or listing it as intentional.
  • Author defense: Kept the code and added the case to the description's intentional changes. Following keeps the row in view only for the first frame: with the proposed change, in Chromium and Firefox the collapsed row left the view within 6 s in 9 of 12 runs and a second click on a nearby row hit 1 of 6; with the PR the rows stay, the second click hit 6 of 6, and jump-to-bottom shows within 2 s.

CRF-47 (P3, WorkspaceAgentLogSection.test.tsx:187) - agent log tests pass with no render

  • Finding: not.toHaveBeenCalled() passes when the box never renders; proposed a positive render assertion.
  • Author defense: A render check belongs to Pixel per FE1. Pixel catches the mutation: with logs.length >= 0 the StartWorkspaceAgentLogsStreaming screenshot changes and the play of StartWorkspaceCompletedWithAgentLogs throws. This round also extends StartWorkspaceAgentLogsStreaming with 10 lines so the box overflows.

Round 3 dispute check-in

  • CRF-41 (R3, 1/1): Netero, the agent that raised it, accepted. Verified submitChatTurn.ts:369 calls scrollToEnd on the edit path, which clears the flag; dev-build logging not verified.
  • CRF-45 (R3, 1/1): Bisky, the agent that raised it, accepted. A regression passes only if it scrolls up by more than the 40px reply without reaching the bottom, the opposite of the guarded bug; the test fails with removedNodes or nudgeScroll disabled.
  • CRF-46 (R3, 1/1): Pariston, the agent that raised it, accepted. Author's browser runs show following after a collapse moves rows next to the pointer within seconds; description now lists the behavior as intentional; jump-to-bottom recovers.
  • CRF-47 (R3, 1/1): Chopper, the agent that raised it, accepted. FE1 assigns render checks to Pixel; the StartWorkspaceCompletedWithAgentLogs play throws and the streaming screenshot changes under the render mutation.

CRF-49 (P4, ToolCall.test.tsx:257) - handoff-band tests live away from scroller code

  • Finding: Two tests that never click a ToolCall test the controller's handoff band; proposed moving them next to the controller.
  • Author defense: Biome (site/biome.jsonc:4), oxlint (site/.oxlintrc.jsonc:337), and the dash check (scripts/check_emdash.sh:35) all skip site/src/vendor/ (orchestrator verified the three excludes), so a test there would be unlinted, and it would need a copy of the 170-line layout harness. Renamed the second test so a search for "handoff band" finds both.

CRF-34 (OOS) - human acceptance

  • Author accepted: DanielleMaywood stated in IC_kwDOGkVX1s8AAAABaULItA "I accept this gap as a maintainer." Recorded as human acceptance from the PR author's account.

Round 4 dispute check-in

  • CRF-49 (R4, 1/1): Meruem, the agent that raised it, accepted. Verified the three lint excludes; both tests now carry "handoff band" in their names.
  • CRF-48 residual (Author accepted R4): the Viewport observer's resetBrowserScrollAnchor (components.tsx:252) remains untested; author says the fixed-height test viewport cannot model a viewport that grows. Bisky (raiser) accepts; consequence if it regresses: after a toggle and a viewport resize, output scrolls the view down until the next gesture or turn.

Round log

Round 1

Netero first pass: 1 P2, 4 P3, 2 Note. No P0, panel proceeds. Reviewed against 515bda9..9fdb72b.
Panel type: round 1 full panel. Focused (TypeScript/React frontend, scroll behavior), target 6-8. Specialists: ging-ts, ging-react, nami. Core: pariston, mafuuu. Pool: bisky (tests changed), gon, leorio (once-per-PR floor). Wildcard (shuf from distilled set): zoro.
Panel results: ging-ts and ging-react no findings. Cross-check: 2 P2, 15 P3, 6 P4, 9 Nit, 1 OOS, 4 Notes in body, 5 confirmation Notes dropped.
Severity decisions:

  • Gon rated every restating comment P2. Keep-argument: AGENTS.md requires substantive comments and a stale restating comment misleads. Downgraded: comments that state something false (CRF-14, CRF-15) or mislead about a guard (CRF-13) to P3; incomplete reason (CRF-16) to P4; pure restatement (CRF-17 to CRF-22) to Nit, because the consequence is reader time, not a wrong belief.
  • CRF-13: Gon P2, Pariston Nit, Leorio P4. Pariston verified the latch already blocks toggle handoff, so the comment names the wrong purpose; set P3 because a reader may delete either guard.
  • CRF-33: Gon listed as out of scope. Reclassified in scope: the diff adds a condition to reconcileFollowMode, so the unchanged doc comment is stale because of this PR.
  • CRF-32 vs Netero check 6: Netero judged the 6-line duplication too small for a hook; Zoro proposed one. Both noted; kept at P4.
  • Convergence: CRF-8 and CRF-10 interact. The latch is held until a listed gesture (CRF-8), and the MutationObserver work runs for as long as the latch is held (CRF-10), so a reader who arrives at the bottom by find-in-page pays the per-commit cost for the rest of the reply.
    Event: COMMENT (no P0/P1).

Round 2

Churn guard: PROCEED. 25 author fixed in 0be0099, 6 contested (CRF-2, 3, 4, 8, 29, 32), 0 silent.
Netero (reused R1 agent): closed CRF-3 and CRF-4 (accepts FE10 defense), re-raised CRF-2 (cited test passes with nudgeScroll no-op'd), new CRF-41.
Round type: fix round. Every change in 9fdb72b..0be0099 answers a round 1 finding; the renames (followSuppressedRef, resetBrowserScrollAnchor, useMessageScrollerUserLayoutIntent) and the userLayoutIntent(target) signature were requested by CRF-9/23/24/25. No new files, goal unchanged, effective additions +72.
Panel: contested raisers reused (mafuuu, nami for CRF-8; leorio for CRF-29; zoro for CRF-32). Specialists for changed .ts/.tsx: ging-ts, ging-react. Gon (comments touched, raised most fixed comment findings), bisky (tests changed, raised CRF-11/12), pariston (raised CRF-13, whose code changed) as new agents. Wildcard (shuf from distilled set minus mafuuu, zoro): chopper.
Cross-check: CRF-2 re-raised (Netero). New: CRF-41 (Netero), CRF-42 to CRF-47. Combined Gon P3 + Leorio P4 at the same lines into CRF-42 and CRF-43 at P3 (higher wins).

  • CRF-46 vs CRF-45 interaction: both target the collapse-while-following test. Bisky wants the hold asserted more strictly (toContain("reply")); Pariston argues the hold is wrong in following-bottom mode and the test should expect next. Bisky's assertion holds under either resolution (reply is visible in both), so both stay.
  • CRF-46 severity: keep-argument for P3: a reader who collapses a finished row while watching a reply loses live output with no listed reason, and with CRF-8 some routes back do not resume. Downward argument: the description names "the next streamed output can pull the view to the bottom" as a symptom, which may be this case. Pariston reproduced that following keeps the collapsed row visible in the harness; the description does not list this as intentional. Kept P3 and asked the author to either skip suppression for this case or list it as intentional.
  • CRF-34 (OOS): author accepted not fixing; still needs a human decision. Re-listed in body.
  • ging-ts, ging-react, mafuuu, nami, zoro: no new findings.
    Event: COMMENT (no P0/P1).

Round 3

Churn guard: PROCEED. CRF-2, 42, 43, 44 author fixed in 0cb57d6; CRF-41, 45, 46, 47 contested. Author accepted CRF-34 (OOS) gap in an issue comment; it still needs a human decision.
Round type: fix round (one commit, 4 files, comments/test mock/story only).
Netero (reused agent): no findings. Closed CRF-41 (1/1): verified submitChatTurn.ts:369 calls scrollToEnd on the edit path, which clears the flag; dev-build logging unverified. Verified CRF-2 fix by mutation (nudgeScroll no-op now fails 2 tests).
Panel: contested raisers reused (bisky CRF-45, pariston CRF-46, chopper CRF-47 from R2 agents). Gon and Leorio (comments changed; raised CRF-42/43/44), reused R2/R1 agents. Specialists for changed .ts/.tsx: ging-ts, ging-react, nami. Wildcard (shuf from distilled set minus chopper): meruem.
Panel results: all four contested findings closed by their raisers. Fixes for CRF-2, 42, 43, 44 verified (Netero, Gon, Leorio). New: CRF-48 (Bisky P3), CRF-49 (Meruem P4), CRF-50 (Meruem Note, body). ging-ts, ging-react, nami, chopper, pariston, gon, leorio: no new findings.

  • CRF-48 vs CRF-2: CRF-2 originally named the ResizeObserver calls too; the round 3 fix covers only the MutationObserver path. Logged as a new finding because it names a specific uncovered path with a test recipe, rather than reopening CRF-2.
  • CRF-34 (OOS): author accepted the gap in issue comment IC_kwDOGkVX1s8AAAABaSAMJw. Agent acceptance is not permanent acceptance; still needs a human decision.
    Event: COMMENT (no P0/P1).

Round 4

Churn guard: PROCEED. CRF-48 author fixed in d1c7408 (content observer covered; viewport observer reset still untested, author says fixed-height test viewport cannot model it). CRF-49 contested. CRF-50 note addressed in the ref comment. CRF-34 accepted by maintainer.
Round type: fix round (one commit, test + one comment).
Netero (reused agent): no findings; verified CRF-48 content-observer fix and CRF-50 comment against code.
Panel: meruem (contested CRF-49, reused R3 agent), bisky (raised CRF-48, reused), gon and leorio (comment changed in refs.ts, reused), ging-ts and ging-react (.tsx test changed, reused). Wildcard (shuf from distilled set minus meruem): kite (new).
Panel results: no findings from any reviewer. CRF-49 closed. All findings closed. Event: APPROVE (tool downgrades to COMMENT).

About deep-review

CRF = Coder Review Finding (P0-P4, Nit, Note)

Reviewer Focus
Bisky tests
Chopper ops/errors
Churn-guard change verification
Ging language modernization
Gon naming
Hisoka edge cases
Killua perf
Kite change integrity
Knov contracts
Knuckle SQL
Komugi flake/determinism
Kurapika security
Law decomposition
Leorio docs
Luffy product
Mafu-san process
Mafuuu contracts
Melody dispatch/pairing
Meruem structural
Nami frontend
Netero mechanical checks
Pariston premise testing
Pen-botter product gaps
Razor verification
Robin duplication
Ryosuke Go arch
Takumi concurrency
Zoro shape

🤖 Managed by Coder Agents.

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR adds a toggle latch to the vendored message scroller and makes the workspace log boxes scroll only themselves. Findings: 2 P2, 15 P3, 6 P4, 9 Nit.

The two P2s are missing tests: removing the latch release in scroll commands, or forcing the new handoff band to true or false, leaves every test passing.

Out of scope (needs a ticket or explicit acceptance by a human):

  • site/src/vendor/message-scroller/use-message-scroller-controller.ts:534: the PR refs shadcn-ui/ui#11175, but a status row that consumes a small spacer still ends within 64px of the live edge, so the handoff fires before reply text exists and the reply then pulls the prompt off the reading line.

Notes:

  • components.tsx:147: the overlay-scrollbar branch of isScrollbarPress (offsetWidth - OVERLAY_SCROLLBAR_WIDTH) has no test; the test viewport mocks a classic scrollbar, so macOS overlay scrollbars run untested code.
  • WorkspaceAgentLogSection.tsx:82: after the call completes, the agent log box now scrolls to its bottom on every batch, not only the first, so a reader who scrolls up inside the box is pulled back down.
  • WorkspaceBuildLogSection.tsx:102: "scrollIntoView also scrolls the chat transcript" is written in four places (both sections and both tests).

In reply to IC_kwDOGkVX1s8AAAABZ-tC-g:

P3 [CRF-29] The PR description leaves out three scroller behavior changes that apply to every MessageScroller user. (Leorio)

A scrollbar press now counts as user scroll intent (components.tsx:200), Space on a <button> no longer does (components.tsx:219), and the spacer ref setter resets spacerHeightRef when Content remounts (use-message-scroller-controller.ts:757); the reasons are only in test names. Add a sentence for each, and say whether the Refs shadcn-ui/ui#... links are upstream bug reports or fixes, so the next re-sync knows whether upstream replaces these local changes.

🤖

In reply to IC_kwDOGkVX1s8AAAABZ-tC-g:

Nit [CRF-31] The PR title is 80 characters; CONTRIBUTING.md:291-292 sets a 72-character maximum, and the squash merge uses the title as the commit subject. (Leorio)

For example: fix(site): keep agent chat scroll on tool toggles and log streams (65 characters).

🤖

🤖 This review was automatically generated with Coder Agents.

Comment thread site/src/vendor/message-scroller/use-message-scroller-controller.ts
Comment thread site/src/vendor/message-scroller/use-message-scroller-controller.ts Outdated
Comment thread site/src/vendor/message-scroller/use-message-scroller-commands.ts Outdated
Comment thread site/src/pages/AgentsPage/components/ChatElements/tools/ToolCall.test.tsx Outdated
Comment thread site/src/vendor/message-scroller/components.tsx Outdated
Comment thread site/src/vendor/message-scroller/use-message-scroller-controller.ts Outdated
Comment thread site/src/vendor/message-scroller/use-message-scroller-controller.ts
The anchored handoff again needs upstream's spacer transition, so a
turn that starts a little taller than the view no longer jumps to the
end. A toggle above the anchored turn now releases the anchor, so the
clicked row stays in view.

Scroll commands and new turns clear the follow flag where they start,
and the toggle's MutationObserver disconnects after its commit. Tests
now cover the handoff band, the new-turn release, and both fixes.
@DanielleMaywood DanielleMaywood changed the title fix(site): keep agent chat scroll position when tool calls toggle or stream logs fix(site): keep agent chat scroll on tool toggles and log streams Oct 7, 2026
@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

Replies to the items in the review body:

  • CRF-29: The description now names the scrollbar-press and Space-on-button changes. It also says the three shadcn links are open upstream bug reports with no fix. The spacer reset is an internal fix, and its marker and test name explain it.
  • CRF-31: Retitled to fix(site): keep agent chat scroll on tool toggles and log streams (65 characters).
  • Out of scope (flake: scaletest/workspacetraffic TestRun/RPTY #11175): Accepted, not fixing here. The base behaves the same. No distance threshold can tell a status row from reply text, so the fix is an upstream way to mark rows as ephemeral.
  • isScrollbarPress overlay branch: Not adding a test. The branch only moves where the track starts, and a miss costs one click on the jump-to-bottom button. Wheel, touch, and keys still resume following.
  • Agent log box after completion: Intended. The box no longer moves the transcript, so it follows its newest line after the call ends. A reader is pulled down only if the agent writes logs after it is ready, which we did not see in 30+ runs. The base already does this while the call runs.
  • "scrollIntoView also scrolls the chat transcript" in four places: Fixed. The comment is only in the build log section now.

Generated with Coder Agents

@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

/coder-agents-review

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2 checked 0be009961. 25 of the 32 round 1 findings are fixed, and the fixes hold up under mutation runs. Of the six you contested, I accept five: the FE10 defense for both log-box tests, the find-in-page and autoscroll resume gap, the spacer reset not being in the description, and the duplicated log-box effect. One I re-raise: the browser scroll-anchor reset still has no test that fails when nudgeScroll does nothing (reply on that thread). New in this round: 4 P3 and 2 P4.

Out of scope (needs a ticket or explicit acceptance by a human):

  • site/src/vendor/message-scroller/use-message-scroller-controller.ts:554: a status row that uses up a small tail spacer still ends within the 64px band, so the handoff fires before any reply text exists. This is the second case in shadcn-ui/ui#11175. The author has declined to fix it in this PR, so a human needs to file a ticket or accept the gap.

🤖 This review was automatically generated with Coder Agents.

Comment thread site/src/vendor/message-scroller/use-message-scroller-controller.ts
Comment thread site/src/vendor/message-scroller/use-message-scroller-controller.ts Outdated
Comment thread site/src/vendor/message-scroller/components.tsx Outdated
Comment thread site/src/vendor/message-scroller/use-message-scroller-controller.ts Outdated
Comment thread site/src/vendor/message-scroller/use-message-scroller-controller.ts
The ToolCall test mock now keeps a shrink's clamp only until the next
write, as Chromium does, so the tests fail without the scroll nudge.
The streaming agent log story now overflows its box, so its screenshot
shows the box scrolled to the newest line.

Also reword the handoff band, layout intent and scroll anchor comments.
@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

Out-of-scope item in the round 2 review (shadcn-ui/ui#11175): I accept this gap for this PR. The base behaves the same, and no local threshold can tell a status row from reply text. The fix needs an upstream way to mark rows as temporary.

Generated with Coder Agents

@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

/coder-agents-review

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 3 checked 0cb57d6bb. The fixes for the scroll-anchor nudge test, the handoff band comment, the hook doc comment, and the rounding-tolerance comment all hold, and the reviewers who raised the four contested findings accept your defenses. New in this round: 1 P3 and 1 P4.

Out of scope (needs a ticket or explicit acceptance by a human):

  • site/src/vendor/message-scroller/use-message-scroller-controller.ts:554: a status row that uses up a small tail spacer ends within the handoff band, so the handoff runs before any reply text exists (the second case in shadcn-ui/ui#11175). The author has accepted this gap for this PR. A maintainer still needs to file a ticket or accept it.

Notes:

  • use-message-scroller-commands.ts:161: scrollToStart, scrollToEnd, scrollToMessage, both new-turn branches, and userScrollIntent each clear followSuppressedRef themselves. No comment says that every new scroll command must do the same. An upstream resync that adds a command, or a new caller of scrollToElement, would keep the hold through that command. The ref comment in use-message-scroller-refs.ts:61-63 could state the rule.

🤖 This review was automatically generated with Coder Agents.

Comment thread site/src/vendor/message-scroller/components.tsx
A removed row can clamp the view after a collapse. The new test
reports that resize only to the content observer, as a browser does,
so it fails without that observer's scroll anchor reset.

Also rename a handoff band test and state when followSuppressedRef
must be cleared.
@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

Replies to the round 3 review body:

Generated with Coder Agents

@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

/coder-agents-review

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 4 checked d1c74087e. The new test fails when the Content ResizeObserver's anchor reset is removed, and the followSuppressedRef comment now matches every place that clears the flag. The reviewer who raised the test-placement finding accepts your reason: the vendor folder is excluded from Biome, oxlint, and the dash check. No findings remain open.

One untested path remains, and both the author and the reviewer have accepted it: the Viewport ResizeObserver's resetBrowserScrollAnchor at components.tsx:252. If it regresses, then after a toggle and a viewport resize, new output scrolls the view down until the next gesture or turn.

🤖 This review was automatically generated with Coder Agents.

@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d1c74087e4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread site/src/vendor/message-scroller/use-message-scroller-controller.ts
At the bottom, a wheel down, a scroll key, or a scrollbar press fires
no scroll event, so nothing re-armed following after a collapse or a
scrollbar press. These gestures now sync the scroll state themselves.
A scrollbar press at the bottom left following off if output landed
before the release, because the view was no longer at the end. The
release now catches up unless the press moved the view up.
@DanielleMaywood
DanielleMaywood marked this pull request as ready for review October 9, 2026 11:29
@DanielleMaywood
DanielleMaywood requested a review from a team as a code owner October 9, 2026 11:29

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 98ee74dbe2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

A log box jumped to its end on every new batch, even after the reader
scrolled up in it. Agent logs can keep arriving after the tool call
completes. Both boxes now follow new lines only while at their end.
@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

function handleTouchMove(event: React.TouchEvent<HTMLDivElement>) {
userScrollIntent()
onTouchMove?.(event)

P2 Badge Reconcile stationary touch gestures at the live edge

When a disclosure collapse clamps the viewport to the live edge, a swipe toward the end on a touch device can emit touchmove but no scroll because the viewport is already at the bottom. This handler clears followSuppressedRef through userScrollIntent() but never reconciles the scroll state, leaving the mode as free-scrolling; the next streamed chunk then grows below the viewport without being followed. Wheel and toward-end key handlers explicitly cover this stationary case, so touch gestures need equivalent reconciliation.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 172 to +174
expect(watchAgentLogs).toHaveBeenCalledTimes(1);
expect(socketServer()?.isConnectionOpen).toBe(true);
expect(scrollIntoView).toHaveBeenCalledTimes(1);
expect(scrollIntoView).not.toHaveBeenCalled();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Cover the inner log follow and preservation behavior

The fresh followLogEnd fix adds two important behaviors, following late lines at the end and preserving the position after the reader scrolls up, but this modified test only proves that the old global scrollIntoView command is absent. It never overflows or scrolls the inner viewport and would still pass if followLogEnd always scrolled or never scrolled; add behavior coverage through the consuming log section for both branches.

AGENTS.md reference: site/AGENTS.md:L7-L7

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed with unit tests of followLogEnd in utils.test.ts, one per branch. Each fails when the condition is forced the other way. Its parameter now takes only the three properties it reads, so the tests pass a plain object. We don't test this through the rendered section: that needs a scrollTop assertion, and our frontend rules (FE1, FE10) don't allow DOM-geometry assertions in component tests.

Generated with Coder Agents

At the bottom, a swipe toward the end fires no scroll event, so it did
not resume following after a collapse. It now syncs the scroll state,
as a wheel down does. Also cover both followLogEnd branches with unit
tests and drop two tests that other tests already cover.
@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

Re the touch finding in this review: fixed. touchstart records where the first finger starts. A touchmove above that point now syncs the scroll state, as a wheel down does. In Chromium touch emulation, a swipe up at the bottom fired 10 touchmove and 0 scroll events. The wheel test now runs for both a wheel and a swipe.

Generated with Coder Agents

@DanielleMaywood

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Breezy!

Reviewed commit: ddf8c59945

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@pr-queue-manager
pr-queue-manager Bot requested a review from jakehwll October 9, 2026 15:17
@DanielleMaywood
DanielleMaywood merged commit c735c1d into main Oct 12, 2026
27 checks passed
@DanielleMaywood
DanielleMaywood deleted the fix/site/agent-chat-scroll-stability branch October 12, 2026 08:03
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 12, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

experimental Changes that might not necessarily be merged, until its approved to proceed with.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug]: MessageScroller: anchored turn yanked to the end — registry item's content-visibility placeholder defeats the spacer >0→0 handoff guard

2 participants