# [recycle] 4-8 [done] Tree Shell Cutover Performance Report v1 > 更新时间:2026-04-18 > > 测试环境: > - 前端主站:`http://127.0.0.1:3000` > - Rust Web:`http://127.0.0.1:3104` > - 浏览器:Playwright Chromium headless > - 数据口径:同一工作区下真实 Sidebar + 临时父/子页面样本 + move/embed picker 对话框 ## 1. 测量口径 - `首包` - 指主树或 picker 打开后,到对应 surface 首次可见的时间。 - `首次可交互` - 指 surface 已出现,且首个可点击行/按钮已可交互。 - `切页延迟` - 指点击页面树或文件树行,到浏览器 URL 切到目标页面的时间。 - `大树展开延迟` - 指点击页面树真实可展开节点的展开/收起往返显隐完成时间。 - `fallback` - 指 `/api/stream/events` 被阻断或失败时,Sidebar 仍能在主站内回到可见可用树视图的结果。 ## 2. 实测结果 ### 2.1 首页与切流 smoke - `task097-homepage-entry-smoke.js` - `/auth` 返回 `200 text/html` - `/` 返回 `307 -> /auth` - `3104 /health` 返回 `200` ### 2.2 Sidebar 主树 cutover - `task101-tree-shell-cutover-smoke.js` - `首包 / 首次可交互`:`9ms` - `切页延迟`:`205ms` - `stream`:`/api/stream/events?stream=workspace&projection=sidebar_tree&workspaceId=...` - `fallback`:阻断 stream 后仍在 `22ms` 内显示可用主树 ### 2.3 filetree / picker 回归 - `task102-tree-shell-regression.js` - `filetree 首包 / 首次可交互`:`6ms` - `filetree 切页延迟`:`179ms` - `picker 首包 / 首次可交互`:`264ms` - `picker 搜索输入后结果/空态稳定出现`:`1005ms` ### 2.4 页面树展开样本 - 真实可展开节点往返展开/收起延迟:`124ms` ## 3. 对照与结论 - 旧 iframe/postMessage 实验壳已退出 Sidebar / filetree / picker 主路径。 - 当前默认主路径已经是 Next 内统一 tree surface + stream/projection 主链。 - `3104` 与 Convex 连接正常时,主树按 stream 路径工作;`3104`/stream 失败时,主树仍能通过 fallback 保持可见。 - 当前开发机口径下,主路径交互均在亚秒级,未再出现此前 `3000` 因 Convex/tree shell 卡死而无响应的问题。 ## 4. fallback 结果 - `fallback` 触发条件: - 主动阻断 `/api/stream/events` - 观测结果: - 页面不空白 - Sidebar 主树仍渲染 - 可继续看到目标页面树节点 - 结论: - `fallback` 已从“实验性兜底”变成正式切流护栏 ## 5. 残余风险 - 当前指标来自本地开发环境与小样本 smoke,不代表生产环境大规模树深/大附件工作区的长期 p95。 - picker 搜索链路仍受搜索索引可见性影响;本轮已验证“搜索后结果或空态稳定出现”,但未把索引收敛时间当作树域切流 blocker。 - 后续如继续增强 Rust-first renderer,可在不改变当前 cutover 结论的前提下,把这份报告升级为多样本趋势报表。