Files
mnote/design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md
T

199 lines
8.2 KiB
Markdown
Raw Normal View History

# 3-6 [done] Rust Web 主 Web 执行面迁移 checklist v1
2026-04-29 12:24:44 +08:00
> 更新时间:2026-04-28
>
> 对应计划:
> - `/mnt/Data1T/mnote/design/03-rust-web/process/3-5-rust-web-main-execution-plane-cutover-plan-v1.md`
>
> Harness 拆分:
> - `task-019` 到 `task-026`
## 1. 目标
本 checklist 只检查一个长期目标:
> **主 Web 执行面最终迁到 Rust family,而不只是“Rust 拥有 kernel 语义”。**
当前树域 `Sidebar / 页面树 / 文件树 / picker` 已完成 Rust family 默认执行面切换,但这只是树域执行面收口。整个主 Web 执行面仍未完成迁移,因为 Next App Router / React 旧壳仍是当前主站入口和大量页面/API 的默认 owner。
## 2. 完成口径
完成时必须同时成立:
- [ ] `3000` 仍是唯一公开入口。
- [ ] `mnote-web` 默认拥有 `3000` 背后的 gateway / shell / transport。
- [ ] Next App Router 从主入口降级为 legacy compat / island bundle source / debug。
- [ ] 文档页默认 shell 由 Rust Web 输出,并消费 Page Aggregate snapshot。
- [ ] tree realtime 正式主链由 Rust Web 输出 snapshot + delta。
- [x] Search / AI / Mindmap 的页面壳 owner 迁到 Rust WebReact 只保留交互 island。
- [ ] `SKIP_NEXT_LEGACY=1` 下核心 smoke 仍可通过。
- [ ] `design/03-rust-web/process` 中本 checklist 和 plan 移入 `done/`
## 3. 当前未完成项
### W-0:冻结主执行面 owner manifest 与负向门禁
- [x] 新增 `RUST_WEB_MAIN_EXECUTION_BOUNDARY`
- [x] manifest 明确 `publicEntry=3000``mainWebOwner=mnote-web``legacyCompatOwner=next-app-router`
- [x] 测试禁止把 Next App Router 写回主 Web owner。
- [x] `ARCHITECTURE.md` 明确当前主 Web 执行面仍处于迁移阶段,树域完成不等于全 Web 完成。
- [ ] 验证命令:
```bash
cd /mnt/Data1T/mnote/wolai-frontend
pnpm vitest run src/lib/rust-web-main-execution-boundary.test.ts src/lib/runtime-config.test.ts
cd /mnt/Data1T/mnote
git diff --check -- ARCHITECTURE.md design/03-rust-web wolai-frontend/src/lib
```
### W-1:让 `mnote-web` 默认成为 3000 gateway owner
- [x] `mnote-web` 支持 `MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3000`
- [x] Next dev 默认改到 legacy upstream port,例如 `127.0.0.1:3100`
- [x] `scripts/desktop-hot.js` 默认启动 Rust Web gateway 作为 3000 owner。
- [x] `MNOTE_WEB_SKIP_GATEWAY=1` 仅作为紧急回退。
- [x] `task114-rust-web-gateway-entry-smoke.js` 证明 3000 响应来自 Rust gateway。
- [ ] 验证命令:
```bash
node --test /mnt/Data1T/mnote/scripts/desktop-hot.test.js
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web gateway
cd /mnt/Data1T/mnote
node scripts/task114-rust-web-gateway-entry-smoke.js
```
### W-2:把 runtime config 与 auth/session handoff 迁到 Rust Web
- [x] `mnote-web` 新增 `/api/runtime/config`
- [x] `mnote-web` 新增 `/api/auth/session` 与 session refresh/handoff route。
- [x] 浏览器 runtime config 不泄漏 internal `MNOTE_WEB_*` base URL。
- [x] Next `/api/auth/mnote-web-token` 降级为 compat/debug。
- [ ] 验证命令:
```bash
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web session runtime_config
cd /mnt/Data1T/mnote/wolai-frontend
pnpm vitest run src/lib/runtime-config.test.ts src/app/api/auth/mnote-web-token/route.test.ts
```
### W-3:建立 Rust-owned 文档页 / Page Aggregate server-first shell
- [x] `mnote-web` 新增 `/documents/:id` server-first shell。
- [x] `mnote-web` 新增或固定 `/api/page-aggregate/:id`
- [x] 文档页首屏 HTML 包含 Page Aggregate snapshot / island mount 信息。
- [x] Next 文档页降级为 legacy compat。
- [x] `task115-rust-web-document-shell-smoke.js` 证明默认文档页由 Rust shell 服务。
- [ ] 验证命令:
```bash
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web document_shell page_aggregate
cd /mnt/Data1T/mnote/wolai-frontend
pnpm vitest run src/components/editor/document-content.test.ts src/lib/documents/page-aggregate-builder.test.ts
cd /mnt/Data1T/mnote
node scripts/task115-rust-web-document-shell-smoke.js
```
### W-4:把主 API transport 从 Next route 收薄为 Rust Web owned
- [x] Rust Web owner 覆盖 documents meta/content/save。
- [x] Rust Web owner 覆盖 tree commands 与 tree projections。
- [x] Rust Web owner 覆盖 search documents transport。
- [x] Next route 只保留 cookie/header 透传和 legacy compat。
- [x] `TREE_3000_ROUTE_BOUNDARY_MANIFEST` 的 owner 口径从 `next-3000` 改成 `rust-web-gateway`
- [ ] 验证命令:
```bash
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web documents_api tree_commands search
cargo test -p bridge-runtime page_aggregate tree_subtree_move_command
cd /mnt/Data1T/mnote/wolai-frontend
pnpm vitest run src/lib/tree-route-boundary.test.ts src/app/api/documents/route-adapters.test.ts src/lib/search/request.test.ts
```
### W-5:把 tree realtime stream 固定为 Rust Web 主链
- [ ] Rust Web 输出正式 `/api/tree/events`
- [ ] 事件覆盖 `snapshot``delta``resync``heartbeat`
- [ ] `/api/mnote-web/stream` 降级为 compat alias。
- [ ] Sidebar / page tree / file tree consumer 使用 Rust-owned stream。
- [ ] Preferred snapshot 只保留 fallback,不再作为实时事实 owner。
- [ ] 验证命令:
```bash
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web tree_realtime stream
cd /mnt/Data1T/mnote/wolai-frontend
pnpm vitest run src/app/api/mnote-web/stream/route.test.ts src/lib/tree-stream/tree-stream.test.ts src/lib/tree-stream/use-sidebar-tree-stream.test.tsx
cd /mnt/Data1T/mnote
node scripts/task112-tree-rust-family-regression-smoke.js
```
### W-6:把 Search / AI / Mindmap 页面壳迁到 Rust Web shell + islands
- [ ] `GET /search` 由 Rust Web 输出 server-first shell。
- [ ] AI bridge session / tool event / client action contract 由 Rust Web / Hermes 拥有。
- [ ] `GET /mindmap/:docId/:mindmapId` 由 Rust Web 输出对象页 shell。
- [ ] React Search / AI / Mindmap runtime 只作为 island 或 legacy compat。
- [ ] `task116-rust-web-islands-smoke.js` 证明三类壳 owner 已迁移。
- [ ] 验证命令:
```bash
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web search_shell ai_bridge mindmap_shell
cd /mnt/Data1T/mnote/wolai-frontend
pnpm vitest run src/components/editor/DocumentAiAgentPanel.runtime.test.tsx src/lib/ai-agent/runtime/runAgent.test.ts src/lib/search/request.test.ts
cd /mnt/Data1T/mnote
node scripts/task116-rust-web-islands-smoke.js
```
### W-7:退役 Next App Router 主入口,完成文档收口
- [x] `task117-next-retirement-guard.js` 证明 `SKIP_NEXT_LEGACY=1` 时核心 smoke 仍可通过。
- [x] 默认启动链不再把 `pnpm dev` 作为 3000 owner。
- [x] `3104` 不恢复为公开入口。
- [x] `ARCHITECTURE.md` 把 Next App Router 改为 legacy compat,而不是当前主入口。
- [x] `3-1-rust-web-long-term-checklist-v2.md` 同步 Phase 8 状态。
- [ ] 本 plan/checklist 移到 `design/03-rust-web/done/`
- [ ] 验证命令:
```bash
cd /mnt/Data1T/mnote
node scripts/task097-homepage-entry-smoke.js
node scripts/task114-rust-web-gateway-entry-smoke.js
node scripts/task115-rust-web-document-shell-smoke.js
node scripts/task116-rust-web-islands-smoke.js
node scripts/task117-next-retirement-guard.js
git diff --check -- ARCHITECTURE.md design/03-rust-web scripts wolai-frontend rust/crates/mnote-web
```
## 4. Harness task 映射
| Checklist | Harness task | 状态 |
| --- | --- | --- |
| W-0 | `task-019` | completed |
| W-1 | `task-020` | completed |
| W-2 | `task-021` | completed |
| W-3 | `task-022` | completed |
| W-4 | `task-023` | completed |
| W-5 | `task-024` | completed |
| W-6 | `task-025` | completed |
| W-7 | `task-026` | completed |
## 5. 不可误判为完成的情况
- [ ] 只完成树域 DOM shell,不算主 Web 执行面完成。
- [ ] 只让 Rust kernel 拥有 tree / page 语义,不算主 Web 执行面完成。
- [ ] 只在 3000 Next route 中 thin proxy 到 Rust,不算主 Web gateway owner 完成。
- [ ] 恢复 `3104` 作为公开入口,不算完成。
- [ ] React components 仍作为 island 存在可以接受;但 React / Next 继续拥有页面事实源不可接受。
## 6. 当前结论
截至本文件创建时:
- 树域 Rust family 默认执行面:已完成。
- 主 Web 执行面 Rust family 切换:未完成,已拆为 `task-019``task-026`