docs: hand off reasoning reading and scroll behavior

This commit is contained in:
Codex committed 2026-10-21 17:22:21 +09:00
1 parent 4a72008b2e
commit 607afd2f39
3 files changed
+37

No files matched your search

@@ -0,0 +1,35 @@
# 思考区展开与滚动:交付 01
2026-10-21。源码:`4a72008b2e54f495411edb8869a64751e4331946`。
基线:`35b9a62ed4cc29c75d1dfaf072d4161a43de2b5c`。
## 用户确认的规则
最新正在生成的思考默认展开并在内部追尾;后续工具/正文/新思考出现后,旧的自动段收起。手动展开/收起优先,手动滚轮、触摸、滚动键、滚动条或鼠标阅读后暂停;**仅点击“查看最新”恢复内部跟随,不因接近底部自动恢复**。不修改消息内容、工具、发送/队列或回合逻辑。
## 实现
- 原布尔 disclosure 不再承担思考自动/手动混合语义。独立消息级思考状态包含 auto/manual-open/manual-closed、following/paused、scrollTop;稳定 part identity 保留分组/重挂载状态,session+message key 防止导入消息 ID 跨会话复用串状态。原计划/任务折叠机制保留。
- 实际最高 200px 的思考内部区域追尾;未限高正文与视口 ResizeObserver、文本变化统一进入单个 RAF。记录原生钳制后的真实 scrollTop;用户意图同步修改 ref,使已排队帧失效。
- 隐藏/关闭/不布局时不写滚动位置;重新出现恢复位置。首次手动打开旧段从顶部阅读,以后恢复读到的位置;历史首次挂载默认收起,不模拟正在生成。
- 手动阅读的子段保护其过程/完成祖先,不被自动隐藏;用户明确收起祖先仍优先。
- ChatPane 内部局部阅读事件暂停外层追尾,并按消息+思考块及视口偏移保留锚点;重挂载后重找同一节点,只补偿实际残余位移。不使用 scrollIntoView,不全局阻止默认滚动。缺失/隐藏/无布局目标不操作。
- 内部暂停时保留浏览器原生 scroll anchoring,帮助异步重排时保持阅读位置;外层不禁用原生 anchoring,脚本只补偿残余偏移。边界处受原生滚动范围钳制,不承诺任意布局下像素完全不动。
- “查看最新”只恢复该思考区域。外层阅读保护仍保留,用户在思考区之外进行滚轮/触控/滚动键/指针操作,或发送/切换会话时释放。不会点击旧段“查看最新”就把整页拖到最新消息。
## 验证
- 独立 DOM 回归 **63 项通过**:最新/旧段、手动优先、所有输入暂停、无自动恢复、显式恢复、RAF 竞态、异步 resize、隐藏折叠、历史顶部/恢复、跨 session 相同 message ID、实际 MessageBubble 祖先保护、外层真实 helper 的锚点差值/重挂载/取消/清理。
- `npm test` 通过;严格 alignment 为 11 套 offline + 8 套 DOM,通过。
- 图片生命周期 159 项、85 个 DOM 样本通过;生产构建和类型检查通过。
- 独立审查已修正空文本首次挂载漏观察、旧段首次手动展开误跳底、选择正文未暂停、隐藏布局归零覆盖锚点、完成前异步 scroll 事件丢位置、跨会话 ID 碰撞等问题。
- CRLF 文件保持原换行;`git -c core.whitespace=cr-at-eol diff --check` 通过。
- 证据:[DOM](evidence/reasoning-follow-01/dom.txt)、[图片回归](evidence/reasoning-follow-01/image.txt)。
## 原生验收边界
这里执行的是实际 ReactDOM 加合成几何/RAF/ResizeObserver,不是 Windows 原生滚动、像素或图片重排实测。完整 ChatPane 装配以源码连线检查,外层 helper 本体在 DOM 中实际执行。Windows 仍需验证鼠标/触屏/键盘、连续长思考、Markdown/图片迟加载、窗口宽度变化、原生滚动锚定和焦点体验。
重点:连续 A→工具→B 默认旧收新开;小幅上滚/下滚后都不抢位置;查看最新能恢复内部追尾;手动展开的旧段及祖先不被自动关闭;手动收起不被 token 打开;切会话不串状态;外层正在读历史时不突然跳底。
上下文占用/内核离线缓存是随后讨论的独立优化,本提交未改该通路。