Affected area
Desktop UI (agent-gui / React)。实际涉及 WebUI 转写区(agent-gateway/web)与两端共用的 virtual-core fork,桌面端走同一套滚动跟随引擎。
Version or commit
main@4eb6a4a8(v1.3.5)
Environment
OS: Windows 11 Pro 26100
Deployment: WebUI(gateway);复现与归因在无头 Edge 153(Chromium,关闭平滑滚动)
Model provider: 无关
Steps to reproduce
- 打开一段较长的对话,向上滚动一段后用滚轮向下滚回底部,观察正文。
- 让模型调用 AskUserQuestion,或触发一次工具审批;在卡片/审批到达前把正文向上滚一点,停在距底约 100~200px 处。
- 观察卡片或审批请求出现时正文的位置。
Expected behavior
- 向下滚动时正文按滚轮步进移动,到达底部后自然恢复跟随。
- 已脱离跟随的读者不应被新内容拖动:卡片或审批请求到达只在底部增高,视口里的内容不动。
Actual behavior
- 滚轮进入距底 192px 内的那一 tick,正文被直接钉到底,复现页实测单 tick 视觉位移 231px。
- 停在距底约 220px 内时:AskUserQuestion 卡片到达,视口被拖 305px;工具审批请求到达(工作轨迹强制展开)被拖 63px;末行流式增高 470px 被拖 302px。停在 400px 处均为 0。
根因
- 共享滚动跟随引擎
scrollFollowCore 的 192px 回贴区(reattachZonePx):手势下行进入区间即 pin 到底。
virtual-core resizeItem 的 wasAtEnd 用 getVirtualDistanceFromEnd()(列表局部坐标)判"在末端",不含转写 shell 的 18px padding 与 194px 底部占位,于是距真实 clamp 约 220px 内都算"在末端",任何底部行尺寸变化都经 applyScrollAdjustment 直写 scrollTop。
- WebUI 工作台背景 Pane 另有一套手写贴底:距底 48px 即视为跟随,行数一变就写 scrollTop。
Logs / screenshots
复现与归因工具随修复 PR 提交:crates/agent-gateway/web/test/browser/scroll-follow-probe.html + scroll-follow-probe.cdp.mjs,按调用栈把每次程序化滚动写入归到 follow-engine / virtualizer,并用视口顶部行的屏幕位移衡量肉眼可见的跳动。
Pre-submit checklist
Affected area
Desktop UI (agent-gui / React)。实际涉及 WebUI 转写区(agent-gateway/web)与两端共用的 virtual-core fork,桌面端走同一套滚动跟随引擎。
Version or commit
main@4eb6a4a8(v1.3.5)
Environment
OS: Windows 11 Pro 26100
Deployment: WebUI(gateway);复现与归因在无头 Edge 153(Chromium,关闭平滑滚动)
Model provider: 无关
Steps to reproduce
Expected behavior
Actual behavior
根因
scrollFollowCore的 192px 回贴区(reattachZonePx):手势下行进入区间即 pin 到底。virtual-coreresizeItem的wasAtEnd用getVirtualDistanceFromEnd()(列表局部坐标)判"在末端",不含转写 shell 的 18px padding 与 194px 底部占位,于是距真实 clamp 约 220px 内都算"在末端",任何底部行尺寸变化都经applyScrollAdjustment直写 scrollTop。Logs / screenshots
复现与归因工具随修复 PR 提交:
crates/agent-gateway/web/test/browser/scroll-follow-probe.html+scroll-follow-probe.cdp.mjs,按调用栈把每次程序化滚动写入归到 follow-engine / virtualizer,并用视口顶部行的屏幕位移衡量肉眼可见的跳动。Pre-submit checklist