# [recycle] 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/`。