# 3-8 [done] Rust Web 3000 Wolai UI Parity Checklist v1

> 更新时间：2026-04-29
>
> 对应计划：
> - `/mnt/Data1T/mnote/design/03-rust-web/process/3-7-rust-web-3000-wolai-ui-parity-plan-v1.md`
>
> 参考输入：
> - 当前 3000 截图：`/mnt/Data1T/mnote/tmp/image copy 30.png`
> - 当前 3100 legacy/Next 对照截图：`/mnt/Data1T/mnote/tmp/image copy 31.png`
> - 目标 UI：`/mnt/Data1T/mnote/design/design/html/image.png`
> - 目标 HTML：`/mnt/Data1T/mnote/design/design/html/个人.html`

## 1. 当前结论

当前已经完成的是：

- [x] `3000` 默认由 `mnote-web` 监听。
- [x] `GET /` 返回 `x-mnote-web-owner: mnote-web`。
- [x] `3100` 已降为 legacy/Next 对照链，不是公开主入口 owner。
- [x] `harness-tasks.json` 中 `task-001` 到 `task-026` 全部为 `completed`。

当前没有完成的是：

- [x] `3000` 首屏恢复到 3100 的 workspace/document 产品壳。
- [x] `3000` 首屏达到目标 Wolai UI 的结构与视觉效果。
- [x] `3000` 文档页在当前真实运行态下稳定打开，不返回 `未登录` 502。
- [x] smoke 验收从“owner header 通过”升级为“产品壳 UI parity 通过”。

一句话判断：

> **Rust Web owner cutover 已完成；本轮已把 3000 恢复为 Rust Web 持有的 Wolai workspace/document 产品壳，并用 task114/task115/task118/task119 固化验收。**

## 2. 不可误判为完成的情况

- [x] 只看到 `x-mnote-web-owner: mnote-web`，不算 UI parity 完成。
- [x] 只看到极简 `MNOTE` 欢迎页，不算工作区 shell 完成。
- [x] 只在 `MNOTE_WEB_ALLOW_DEV_FIXTURES=1` 下通过，不算当前真实 3000 完成。
- [x] 只把 3000 proxy 回 3100，不算 Rust Web 产品壳完成。
- [x] 只恢复 3100 legacy UI，不算 Rust Web 3000 UI 完成。
- [x] 只补 CSS 像截图，但 session/document shell 仍 502，不算完成。

## 3. Phase U-0：冻结 UI parity smoke

目标：先让当前差距可自动失败，避免继续靠人工看截图判断。

- [x] 新增 `scripts/task118-rust-web-wolai-ui-parity-smoke.js`。
- [x] smoke 断言 `GET /` 是 `data-mnote-shell="workspace"`。
- [x] smoke 断言根页包含账号/工作区身份。
- [x] smoke 断言根页包含 `星标置顶`。
- [x] smoke 断言根页包含 `我的页面`。
- [x] smoke 断言根页包含 `垃圾箱`。
- [x] smoke 断言根页包含 `模板中心`。
- [x] smoke 断言根页包含 `data-testid="wolai-topbar"`。
- [x] smoke 断言根页包含 `data-testid="wolai-floating-ai"`。
- [x] smoke 负向断言根页不再包含 `欢迎使用 MNOTE 知识管理平台`。
- [x] `task114-rust-web-gateway-entry-smoke.js` 不再检查 `Rust Web gateway` 调试文案。
- [x] `task115-rust-web-document-shell-smoke.js` 在 502 时输出 body，能看见 `未登录` 根因。

验证命令：

```bash
cd /mnt/Data1T/mnote
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task118-rust-web-wolai-ui-parity-smoke.js
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task114-rust-web-gateway-entry-smoke.js
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task115-rust-web-document-shell-smoke.js
```

## 4. Phase U-1：修复真实 session / document shell 基线

目标：当前 3000 文档页不能继续因为 Rust Web 到 Convex 的 session/handoff 问题返回 `未登录` 502。

- [x] 确认当前 3000 进程环境和浏览器请求中的 auth/session 来源。
- [x] 固定 Rust Web session handoff 优先级：浏览器 cookie / session handoff token > `mnote_web_convex_token` > 显式开发态 fallback。
- [x] `transport/convex.rs` 能把必要 cookie/header/token 传到 Convex。
- [x] `/documents/:id` 在当前登录态或开发态下不返回 `convex_upstream_error: 未登录`。
- [x] 文档页仍返回 `x-mnote-web-owner: mnote-web`。
- [x] 文档页仍返回 `x-mnote-web-shell: document`。
- [x] 文档页仍嵌入 `__MNOTE_PAGE_AGGREGATE__`。
- [x] 文档页仍标记默认 `data-editor-host="leptos_tiptap_island"`。

验证命令：

```bash
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web document_shell session
cd /mnt/Data1T/mnote
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task115-rust-web-document-shell-smoke.js
```

## 5. Phase U-2：建立 workspace shell projection

目标：Rust Web 根页不再手写欢迎页，而是消费稳定 workspace/sidebar/page projection。

- [x] 新增 `WorkspaceShellProjection` 或等价 Rust 类型。
- [x] projection 包含 `workspaceId`。
- [x] projection 包含 `workspaceName`。
- [x] projection 包含 `activePageId` / `activePageTitle`。
- [x] projection 包含 `starredItems`。
- [x] projection 包含 `myPageItems`。
- [x] projection 包含 `bottomEntries`，至少覆盖 `垃圾箱` 与 `模板中心`。
- [x] projection 从 `sidebar.dataset.list` 或 Rust kernel sidebar projection 构建，不在 UI 层另造树真相。
- [x] 空数据时输出空 workspace shell，不回到极简营销欢迎页。

验证命令：

```bash
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web workspace_shell
```

## 6. Phase U-3：替换极简 PageLayout 为 Wolai workspace shell

目标：`mnote-web` SSR 输出与目标 UI 同级的产品壳结构。

- [x] SSR layout 根节点标记 `data-mnote-shell="workspace"`。
- [x] 左侧栏标记 `data-testid="wolai-sidebar"`。
- [x] 左侧栏顶部包含头像/首字母块与工作区名称。
- [x] 左侧栏快捷操作区包含搜索、图谱/关系、快捷动作、收纳/文件、更多等 slot。
- [x] 左侧栏包含 `星标置顶` section。
- [x] 左侧栏包含 `我的页面` section。
- [x] 左侧栏 page row 支持 active/selected 视觉状态。
- [x] 左侧栏底部包含 `垃圾箱` 与 `模板中心`。
- [x] 主区顶部包含 `data-testid="wolai-topbar"`。
- [x] 主区右上包含收藏、演示/评论/关系/成员/历史/更多等 action slot。
- [x] 右下包含 `data-testid="wolai-floating-ai"`。
- [x] 右下包含 `data-testid="wolai-floating-help"`。
- [x] CSS 左栏宽度、浅灰背景、选中行浅红背景、主内容居中宽度与目标图接近。

验证命令：

```bash
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web wolai_workspace_layout
```

## 7. Phase U-4：恢复 3000 根路径产品首屏

目标：`GET /` 是真实 workspace/document 入口，而不是极简欢迎页。

- [x] `gateway.rs::root_entry` 不再直接渲染 `HomePage` 欢迎页。
- [x] 根路径选择 active page 的顺序固定：URL `pageId` > session 最近页面 > projection active page > 第一个我的页面 > 空 workspace。
- [x] 根路径返回 HTML 包含 `data-mnote-shell="workspace"`。
- [x] 根路径返回 HTML 不包含 `欢迎使用 MNOTE 知识管理平台`。
- [x] 根路径返回 HTML 不包含旧三项导航壳 `首页 / 搜索 / 文档` 作为主 UI。
- [x] `MNOTE_WEB_ENABLE_LEGACY_NEXT_COMPAT=0` 时根路径仍可打开核心 shell。

验证命令：

```bash
cd /mnt/Data1T/mnote
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task118-rust-web-wolai-ui-parity-smoke.js
```

## 8. Phase U-5：文档页内容区对齐

目标：`/documents/:id` 恢复 workspace/document 产品壳，同时继续保持 Page Aggregate 与 `leptos-tiptap` 主链。

- [x] 文档页包含 workspace sidebar。
- [x] 文档页包含 topbar / breadcrumb。
- [x] 文档页包含收藏/更多/AI action slot。
- [x] 文档页标题来自 Page Aggregate。
- [x] 文档页正文 mount 保持 `leptos_tiptap_island`。
- [x] 文档页不重新把 BlockNote 设为默认主编辑器。
- [x] 文档页在真实 3000 下通过 smoke，不返回 502。

验证命令：

```bash
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web document_shell page_aggregate
cd /mnt/Data1T/mnote
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task115-rust-web-document-shell-smoke.js
```

## 9. Phase U-6：补视觉回归 smoke

目标：用浏览器自动化把“看起来像目标 UI”变成可回归指标。

- [x] 新增 `scripts/task119-rust-web-wolai-visual-regression-smoke.js`。
- [x] 检查左栏存在且宽度稳定。
- [x] 检查 topbar 存在且不遮挡正文。
- [x] 检查主内容区未被侧栏覆盖。
- [x] 检查右下浮动按钮存在且不遮挡正文。
- [x] 检查根页没有极简欢迎页。
- [x] 输出截图到 `/mnt/Data1T/mnote/test-results/`。

验证命令：

```bash
cd /mnt/Data1T/mnote
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task119-rust-web-wolai-visual-regression-smoke.js
```

## 10. Harness 映射建议

当前 `harness-tasks.json` 中 `task-001` 到 `task-026` 已全部 completed。若进入执行，建议追加新任务，不修改旧任务状态：

| 新任务 | Phase | 标题 | 优先级 |
| --- | --- | --- | --- |
| `task-027` | U-0 | 冻结 Rust Web 3000 Wolai UI parity smoke | P0 |
| `task-028` | U-1 | 修复 Rust Web session/document shell 当前 502 基线 | P0 |
| `task-029` | U-2 | 建立 workspace shell projection 聚合器 | P0 |
| `task-030` | U-3 | 替换极简 PageLayout 为 Wolai workspace shell | P0 |
| `task-031` | U-4 | 恢复 3000 根路径 workspace/document 产品首屏 | P0 |
| `task-032` | U-5 | 对齐文档页 topbar/content/Page Aggregate shell | P1 |
| `task-033` | U-6 | 补 Wolai UI visual regression smoke | P1 |

说明：本 checklist 建立阶段不直接修改 `harness-tasks.json`，避免把分析结果误登记为已排队执行任务。

## 11. 完成判定

- [x] `GET http://127.0.0.1:3000/` 返回 `x-mnote-web-owner: mnote-web`。
- [x] 根页 body 标记 `data-mnote-shell="workspace"`。
- [x] 根页不再出现极简欢迎页文案。
- [x] 根页包含目标 UI 的核心结构区。
- [x] `/documents/:id` 不返回 `未登录` 502。
- [x] 文档页继续消费 Page Aggregate snapshot。
- [x] 文档页默认编辑 host 仍是 `leptos_tiptap_island`。
- [x] `3100` 只作为 legacy/reference/debug。
- [x] `task114`、`task115`、`task118` 和可选 `task119` 在当前 3000 上通过。
- [x] 本 checklist 才能移动到 `design/03-rust-web/done/`。
