账户菜单里点充值,仍然打开充值面板,来源仍是账户菜单。只改了这一条按源码对照的检查,业务代码没动。tsc 通过,lint 0 个错误(125 条原有警告),这条检查 13 通过、0 失败。 Co-Authored-By: Grok (agent loop)
5.4 KiB
PROGRESS · 流式回答时侧栏不再跟着每帧重画(issue #59)
- 分支:
codex/home-sidebar-rerender-20261013 - 实际基线:
origin/staging66cd60081f37a57680274633fcb3fb942d01bb2f - 任务书基线写成
77057a819,计划评论里的 base 是2994588ad4d858dead4835943e5883c5aa2b03f8。开工时远端 staging 已是上面的66cd6008。A/B 就跑在这个提交上,没有另开只读工作树(本轮不能离开当前工作树)。方向没有改,不需要拍板。 docs/BUG_HISTORY.md在这个基线上停在 BUG-1322。BUG-1323~1328、1345、1346 属于还没合入的别的分支,本单只用 BUG-1329。- 未改
page.tsx。没有运行时开关。没有启用 React Compiler。Skill 版本不变。浏览器 A/B 未跑。
做了什么
外壳拿到的点击函数不再每次渲染换新,点下去仍执行首页刚渲染的那一版。注册只在数据变了才发给侧栏:会话行要逐条还是同一个对象才算没变,没变就不重建行。可见会话按当前人物记忆。侧栏自己的上下文对象也不再每次新建。卸载首页时仍会清掉注册。
断言三栏
| 位置 | 原值 | 新值 | 原因 |
|---|---|---|---|
frontend/tests/session-list-lifecycle.test.tsx 外壳「打开资料」函数 |
assert.notEqual(onOpenProfile, initialCallback) |
assert.equal(...);再改一版后仍是同一个函数,调用记录从 [1] 加强到 [1, 2] |
包装函数身份稳定。调用必须落到最新一次渲染,不能只删掉「不相等」 |
HomeProbe 仍是每次渲染新回调、新数组,没有改成常量。
基线失败(改代码之前,同一测试,3 次,退出码都是 1)
失败停在 assert.equal(duringFrames.registers, 0),实际是 60。60 帧里侧栏提交也是 60。换当前项、改标题、换人各注册 1 次;只改回调版本也会再注册 1 次。剔除函数后的内容摘要:
| 档 | 60 帧注册 | 60 帧提交 | 60 帧耗时三次(毫秒) | 中位 | 内容摘要 |
|---|---|---|---|---|---|
| 30 条虚构会话 | 60 | 60 | 2774.964 / 2778.961 / 4202.085 | 2778.961 | b18f05a3d83be5b41584787b7c0495f1fcec8ef7b8ecfbdbb3c083c40796c103 |
| 100 条虚构会话 | 60 | 60 | 10530.828 / 11799.253 / 12284.103 | 11799.253 | cef0a63d6f3fe72e541f9ac882b8eaf305b6933fdd07ca3002e8cd03bb139d25 |
更早一次探针把注册函数也做成每次渲染新建,60 帧数到 120 次注册、60 次提交。那是清理函数跟着新函数又清了一次,不是产品路径。交付用的测试和生产一样,用提供者给出的稳定注册函数,所以改前是 60 而不是 120。
改后(同一测试,3 次,退出码都是 0)
| 档 | 60 帧注册 | 60 帧提交 | 60 帧耗时中位 | 换当前项 | 改标题 | 只改回调版本 | 换人 | 内容摘要 |
|---|---|---|---|---|---|---|---|---|
| 30 | 0 | 0 | 0 | 注册 1、提交 1 | 注册 1,标题更新 | 注册 0,调用记到第 4 版 | 注册 1,列表换成另一人 | 与改前相同 |
| 100 | 0 | 0 | 0 | 注册 1、提交 1 | 注册 1,标题更新 | 注册 0,调用记到第 4 版 | 注册 1,列表换成另一人 | 与改前相同 |
三次摘要都与上表相同。门槛达到:60 帧内注册 0、侧栏提交 0,内容摘要逐字节一致。
自测
| 检查 | 命令 | 结果 |
|---|---|---|
| 类型 | node frontend/node_modules/typescript/bin/tsc --noEmit -p frontend |
退出码 0 |
| 规范 | npm run lint --prefix frontend |
0 error,126 条原有 warning。本单文件没有新增 warning,没有 eslint-disable |
| 定向测试 | tsx --test 下表 10 个文件 |
tests 94,pass 94,fail 0,cancelled 0 |
| 数据库 | 未跑 | 本单不碰数据库 |
| 浏览器 | 未跑 | 浏览器 A/B 未跑。步骤在 docs/testing/home-sidebar-rerender-20261013.md |
| 隐私标记 | .venv\Scripts\python.exe -m pytest tests/test_repo_privacy_markers.py -q |
通过 |
定向文件:home-sidebar-rerender、session-list-lifecycle、session-list-provider、sidebar-contract、sidebar-state、secondary-page-entry、account-dialog-inert-20260918、home-shell-growth-contract、home-streaming-render-split、chat-profile-picker。
全量 npm test、next build、Python 快速门未跑,留给验收。
2026-10-14 修复单
按修复单合并了最新 origin/staging。只改了 frontend/tests/chat-navigation-a11y-contract.test.ts 里账户菜单「充值」那一条源码断言,改成认稳定包装的写法,仍然要求打开 billing 且来源是 account-menu。业务代码没有改。
又搜了一遍 onOpenProfile、onOpenGeneral、onOpenLogout、onNewChat、onSelectSession、onLoadMore。测试里其余命中的是侧栏组件自己的入口,或校正点数不足时打开充值,不是这条旧写法,没有改。
和上一版 63509431 比,网页业务目录里多出来的只有合并测试线带入的校正提速(engine-client.ts),不是这单写的。这单自己的提交不碰 frontend/src。
| 检查 | 命令 | 结果 |
|---|---|---|
| 类型 | tsc --noEmit -p frontend |
通过,退出码 0 |
| 规范 | npm run lint(在 frontend) |
0 error,125 条原有 warning。本单改的测试文件没有新增 warning |
| 这条旧检查 | tsx --test tests/chat-navigation-a11y-contract.test.ts |
13 通过,0 失败,0 取消 |
全量 npm test 仍留给验收。