diff --git a/docs/协作/evidence/reasoning-follow-01/dom.txt b/docs/协作/evidence/reasoning-follow-01/dom.txt new file mode 100644 index 0000000..798c19e --- /dev/null +++ b/docs/协作/evidence/reasoning-follow-01/dom.txt @@ -0,0 +1 @@ +{"result":"PASS","suite":"reasoning-follow-dom","assertions":63,"evidence":"Actual ReactDOM with synthetic geometry/RAF/resize; not native scroll or pixel evidence"} diff --git a/docs/协作/evidence/reasoning-follow-01/image.txt b/docs/协作/evidence/reasoning-follow-01/image.txt new file mode 100644 index 0000000..f148d2f --- /dev/null +++ b/docs/协作/evidence/reasoning-follow-01/image.txt @@ -0,0 +1 @@ +{"result":"PASS","checks":159,"samples":85,"output":"/workspace/scratch/0aaa9774aecc/single-package-staging/ycode/.tmp/b04-image-N13jf4","limits":"DOM lifecycle only; jsdom heights are not layout acceptance. Synthetic data only."} diff --git a/docs/协作/思考区展开与滚动-交付-01.md b/docs/协作/思考区展开与滚动-交付-01.md new file mode 100644 index 0000000..b45d5c6 --- /dev/null +++ b/docs/协作/思考区展开与滚动-交付-01.md @@ -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 打开;切会话不串状态;外层正在读历史时不突然跳底。 + +上下文占用/内核离线缓存是随后讨论的独立优化,本提交未改该通路。