# 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 结论的前提下，把这份报告升级为多样本趋势报表。
