1115 lines
50 KiB
JSON
1115 lines
50 KiB
JSON
{
|
||
"version": 2,
|
||
"created": "2026-04-26T23:16:13Z",
|
||
"session_config": {
|
||
"concurrency_mode": "exclusive",
|
||
"max_tasks_per_session": 9,
|
||
"max_sessions": 80
|
||
},
|
||
"tasks": [
|
||
{
|
||
"id": "task-001",
|
||
"title": "Phase K-1:定义 tree shell Rust runtime artifact 边界",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "6d89f5ca",
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web renderer_input && cargo test -p mnote-web runtime_artifact && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx",
|
||
"timeout_seconds": 1800
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已在 mnote-web rendererInput 中定义 rust_tree_shell_runtime_artifact_v1,覆盖 rendererInput/projection/expanded/selected/active/focused 输入、DOM patch/intent/command 输出和 focus/keyboard/expand/selection/context/drag/pick 事件边界;3000 inline host 同步输出同名 runtimeArtifact。",
|
||
"timestamp": "2026-04-26T23:22:39Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-26T23:22:39Z"
|
||
},
|
||
{
|
||
"id": "task-002",
|
||
"title": "Phase K-2:建立 page tree Rust-side runtime 状态机",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-001"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "6d89f5ca",
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web page_renderer && cargo test -p mnote-web page_focus && cargo test -p mnote-web page_runtime && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx && node /mnt/Data1T/mnote/scripts/task112-tree-rust-family-regression-smoke.js",
|
||
"timeout_seconds": 2400
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已新增 page_runtime reducer,组合 focus/expand/open/context-menu/drop feedback/tree.subtree.move dispatch 输出,验证 page_renderer/page_focus/page_runtime、tree-shell iframe/surface vitest 与 task112 smoke 均通过。",
|
||
"timestamp": "2026-04-26T23:27:43Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-26T23:27:43Z"
|
||
},
|
||
{
|
||
"id": "task-003",
|
||
"title": "Phase K-3:建立 file tree Rust-side runtime 状态机",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-001"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "6d89f5ca",
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web filetree_renderer && cargo test -p mnote-web filetree_selection && cargo test -p mnote-web filetree_runtime && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/lib/file-tree/shell.test.ts src/lib/tree-stream/tree-delta.test.ts && node /mnt/Data1T/mnote/scripts/task112-tree-rust-family-regression-smoke.js",
|
||
"timeout_seconds": 2400
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已新增 filetree_runtime reducer,覆盖 selection/range/context/normalize、drag row ids、copy/move effect、drop target feedback,以及 doc/index/asset-folder/asset 的 open/context-menu intent;目标测试与 task112 smoke 通过。",
|
||
"timestamp": "2026-04-26T23:32:11Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-26T23:32:11Z"
|
||
},
|
||
{
|
||
"id": "task-004",
|
||
"title": "Phase K-4:建立 picker Rust-side runtime 状态机",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-001"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "6d89f5ca",
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web picker_renderer && cargo test -p mnote-web picker_state && cargo test -p mnote-web picker_runtime && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/documents/move-embed-picker-dialog.test.tsx src/components/sidebar/tree-shell-iframe-host.test.tsx && node /mnt/Data1T/mnote/scripts/task113-picker-keyboard-regression-smoke.js",
|
||
"timeout_seconds": 2400
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已新增 picker_runtime reducer,覆盖 normalize/next/previous/home/end/focus/pick、excluded ids、root pick,以及搜索输入不被键盘运行时抢 DOM 焦点的 focus_dom 输出边界;目标测试与 task113 smoke 通过。",
|
||
"timestamp": "2026-04-26T23:34:59Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-26T23:34:59Z"
|
||
},
|
||
{
|
||
"id": "task-005",
|
||
"title": "Phase K-5:3000 host 调用正式 runtime artifact,并将 mnote-web /tree 固定为 debug/internal",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-002",
|
||
"task-003",
|
||
"task-004"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "6d89f5ca",
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx && node /mnt/Data1T/mnote/scripts/task112-tree-rust-family-regression-smoke.js && node /mnt/Data1T/mnote/scripts/task113-picker-keyboard-regression-smoke.js",
|
||
"timeout_seconds": 2400
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已固定 3000 inline host 与 mnote-web debug shell 均输出 rust_tree_shell_runtime_artifact_v1,并通过 tree-shell 目标测试、task112 与 task113 证明 3000 主路径继续使用 inline iframe host,/api/tree/shell debug 直连默认禁用。",
|
||
"timestamp": "2026-04-26T23:38:55Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-26T23:38:55Z"
|
||
},
|
||
{
|
||
"id": "task-006",
|
||
"title": "Phase L:将 tree.subtree.move 最终写路径继续下沉 Rust kernel",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-005"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "6d89f5ca",
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime tree_subtree_move_command && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/app/api/tree/commands/route.test.ts src/lib/documents/tree-command-client.test.ts src/lib/tree-stream/tree-delta.test.ts",
|
||
"timeout_seconds": 2400
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已引入 Rust treeWriteOperation,Convex documents.move 优先执行 Rust write operation,normalizedMove 保留旧 fallback;bridge-runtime move 单测与前端 39 个目标测试通过。",
|
||
"timestamp": "2026-04-26T23:52:52Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-26T23:52:52Z"
|
||
},
|
||
{
|
||
"id": "task-007",
|
||
"title": "Phase M:补齐 block/save-snapshot formal artifact 与 domain-event contract",
|
||
"status": "completed",
|
||
"priority": "P1",
|
||
"depends_on": [
|
||
"task-006"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "6d89f5ca",
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime documents_save_command_plans_include_formal_domain_event_contract && cargo test -p bridge-runtime block_commands_include_formal_domain_event_contract && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/documents/rust-runtime.test.ts src/lib/documents/page-write-command-adapter.test.ts src/lib/blocks/block-command-adapter.test.ts",
|
||
"timeout_seconds": 2400
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已将 page.body.saved、block.patched、block.moved、block.embedded 切到 formal domainEventPlan payload schema;复合命令 streamDelta 使用 resync_required 保守策略,command log/domain event 通过同一 command_id 关联;目标验证通过。",
|
||
"timestamp": "2026-04-27T00:09:12Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-27T00:09:12Z"
|
||
},
|
||
{
|
||
"id": "task-008",
|
||
"title": "Phase N:继续收薄 3000 Next route 过渡职责",
|
||
"status": "completed",
|
||
"priority": "P1",
|
||
"depends_on": [
|
||
"task-007"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "6d89f5ca",
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/app/api/tree/commands/route.test.ts src/lib/tree-stream/tree-delta.test.ts && node /mnt/Data1T/mnote/scripts/task112-tree-rust-family-regression-smoke.js",
|
||
"timeout_seconds": 2400
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 2,
|
||
"total": 2,
|
||
"description": "Phase N route thinning manifest 与 task112 iframe-ready smoke 同步已完成;刷新本地 Convex functions 后 move treeWriteOperation 运行态验证通过,目标 Vitest 与 task112 smoke 均通过。",
|
||
"timestamp": "2026-04-27T00:34:43Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-27T00:34:43Z"
|
||
},
|
||
{
|
||
"id": "task-009",
|
||
"title": "Phase O:搜索语义 hardening 与资源类型 fixture 补齐",
|
||
"status": "completed",
|
||
"priority": "P1",
|
||
"depends_on": [
|
||
"task-008"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "6d89f5ca",
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/tree-stream/tree-delta.test.ts",
|
||
"timeout_seconds": 1800
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已补 file_tree 搜索 hardening 前端契约:projection-client 固定 maxResults=80、祖先补全/排序/异步可见性元数据,tree-delta fixture 覆盖 index、asset-folder、mindmap child、book、pdf;目标验证与 task112 smoke 通过。",
|
||
"timestamp": "2026-04-27T00:41:58Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-27T00:41:58Z"
|
||
},
|
||
{
|
||
"id": "task-010",
|
||
"title": "Phase P-0:补 final DOM shell 负向门禁,阻止 iframe_srcdoc 被误判为完成",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-009"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "81ba21c5",
|
||
"source_doc": "design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md",
|
||
"scope": [
|
||
"wolai-frontend/src/components/sidebar/tree-shell-host*.test.tsx",
|
||
"wolai-frontend/src/components/sidebar/tree-shell-iframe-host.test.tsx",
|
||
"scripts/task112-tree-rust-family-regression-smoke.js",
|
||
"scripts/task113-picker-keyboard-regression-smoke.js"
|
||
],
|
||
"acceptance": [
|
||
"默认 page/filetree/picker 主路径测试不得再把 srcDoc inline DOM shell 作为成功条件",
|
||
"默认主路径测试不得出现 data-tree-browser-bridge=\"iframe_srcdoc\" 正向断言",
|
||
"旧 TreeShellIframeHost 的 srcdoc 合同测试必须迁入 legacy/debug 分组或显式标注为 legacy",
|
||
"task112/task113 smoke 需要验证新 Rust/WASM DOM shell 主路径,而不是证明旧 inline iframe host 继续可用"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js && node scripts/task113-picker-keyboard-regression-smoke.js",
|
||
"timeout_seconds": 2400
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 4,
|
||
"description": "已新增默认非 iframe rust_wasm_dom_shell_host 与共享 DOM projection model,legacy iframe 改为显式环境开关。",
|
||
"timestamp": "2026-04-28T03:28:16.005752Z"
|
||
},
|
||
{
|
||
"step": 2,
|
||
"total": 4,
|
||
"description": "tree-shell-surface 与 legacy iframe host 目标 Vitest 通过;默认主路径断言已切成 rust_wasm_dom_shell_host 且负向排除 iframe_srcdoc。",
|
||
"timestamp": "2026-04-28T03:34:10.533972Z"
|
||
},
|
||
{
|
||
"step": 3,
|
||
"total": 4,
|
||
"description": "move/embed picker 测试已切到 DOM shell;默认 picker 不再以 iframe postMessage 为成功条件,目标前端 Vitest 29 项通过。",
|
||
"timestamp": "2026-04-28T03:36:24.605315Z"
|
||
},
|
||
{
|
||
"step": 4,
|
||
"total": 4,
|
||
"description": "已补默认 DOM shell 负向门禁:tree-shell-host/surface/picker 测试与 smoke 默认拒绝 iframe_srcdoc 成功路径。",
|
||
"timestamp": "2026-04-28T04:40:14Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T04:40:14Z"
|
||
},
|
||
{
|
||
"id": "task-011",
|
||
"title": "Phase P-1:拆分默认 Rust DOM shell host 与 legacy TreeShellIframeHost",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-010"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "81ba21c5",
|
||
"source_doc": "design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md",
|
||
"scope": [
|
||
"wolai-frontend/src/components/sidebar/tree-shell-host.tsx",
|
||
"wolai-frontend/src/components/sidebar/tree-shell-iframe-host.tsx",
|
||
"wolai-frontend/src/components/sidebar/tree-shell-*.test.tsx"
|
||
],
|
||
"acceptance": [
|
||
"TreeShellHost 默认选择 rust_wasm_dom_shell_host 或等价新 host",
|
||
"TreeShellIframeHost 改为 LegacyTreeShellIframeHost 或显式 legacy/debug host",
|
||
"旧 iframe srcdoc host 只能通过 debug/legacy flag 进入",
|
||
"默认 page tree 首屏不依赖 LOCAL_TREE_SHELL_TEMPLATE"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx src/components/sidebar/tree-shell-iframe-host.test.tsx",
|
||
"timeout_seconds": 2400
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "TreeShellHost 默认选择 rust_wasm_dom_shell_host;TreeShellIframeHost 仅由 NEXT_PUBLIC_TREE_SHELL_LEGACY_IFRAME_HOST=1 进入。",
|
||
"timestamp": "2026-04-28T04:40:14Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T04:40:14Z"
|
||
},
|
||
{
|
||
"id": "task-012",
|
||
"title": "Phase Q:page / picker / filetree 迁入 Rust/WASM DOM shell 主路径",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-011"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "81ba21c5",
|
||
"source_doc": "design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md",
|
||
"scope": [
|
||
"rust/crates/tree-shell-runtime-wasm",
|
||
"rust/crates/mnote-web/src/tree_shell",
|
||
"wolai-frontend/src/components/sidebar"
|
||
],
|
||
"acceptance": [
|
||
"page tree 默认主路径由新 Rust/WASM DOM shell 渲染与绑定事件",
|
||
"picker 默认主路径由新 Rust/WASM DOM shell 渲染与绑定事件",
|
||
"filetree 默认主路径由新 Rust/WASM DOM shell 渲染与绑定事件,并保留 doc/index/asset-folder/asset 能力",
|
||
"3000 host 只保留挂载、auth、transport、文件读取、postMessage/command bridge"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web tree_shell && cargo test -p tree-shell-runtime-wasm -- --nocapture && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx src/components/documents/move-embed-picker-dialog.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js && node scripts/task113-picker-keyboard-regression-smoke.js",
|
||
"timeout_seconds": 3600
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "page / filetree / picker 默认 DOM host 已消费 TreeShellRuntimeRequest/Result,并由 WASM artifact 或同源 Rust seam 驱动 hostEvents/commandEvents。",
|
||
"timestamp": "2026-04-28T04:40:14Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T04:40:14Z"
|
||
},
|
||
{
|
||
"id": "task-013",
|
||
"title": "Phase R/S:删除默认 JS DOM state machine 并完成文档收口",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-012"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "81ba21c5",
|
||
"source_doc": "design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md",
|
||
"scope": [
|
||
"wolai-frontend/src/components/sidebar",
|
||
"design/04-tree-domain/process",
|
||
"design/04-tree-domain/done"
|
||
],
|
||
"acceptance": [
|
||
"默认主路径不再调用 LOCAL_TREE_SHELL_TEMPLATE、buildInlinePageTreeHtml、buildInlineFileTreeHtml、buildInlinePickerHtml",
|
||
"默认主路径不再标注 data-tree-browser-bridge=\"iframe_srcdoc\"",
|
||
"旧 JS fallback reducer/state machine 只在 legacy/debug host 中存在",
|
||
"4-11、4-16、4-18 的 final DOM shell gate 按真实代码完成状态更新"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/sidebar/tree-shell-iframe-host.test.tsx src/components/sidebar/tree-shell-surface.test.tsx src/components/documents/move-embed-picker-dialog.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js && node scripts/task113-picker-keyboard-regression-smoke.js && git diff --check -- wolai-frontend/src/components/sidebar design/04-tree-domain",
|
||
"timeout_seconds": 3600
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已清理 1.md、4-11、4-16、4-18 的 final DOM shell 口径;旧 JS renderer/state machine 只作为 legacy iframe host 保留。",
|
||
"timestamp": "2026-04-28T04:40:14Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T04:40:14Z"
|
||
},
|
||
{
|
||
"id": "task-014",
|
||
"title": "Phase L2:删除 normalizedMove fallback,强制 move 主写路径使用 treeWriteOperation",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-013"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "81ba21c5",
|
||
"source_doc": "design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md",
|
||
"scope": [
|
||
"rust/crates/bridge-runtime/src/lib.rs",
|
||
"wolai-frontend/convex/documents.ts",
|
||
"wolai-frontend/convex/_utils/documentMoveOrder.ts",
|
||
"wolai-frontend/src/lib/documents/rust-runtime.ts",
|
||
"wolai-frontend/src/lib/documents/*move*test.ts",
|
||
"wolai-frontend/src/lib/documents/rust-runtime.test.ts"
|
||
],
|
||
"acceptance": [
|
||
"bridge-runtime 不再输出 normalizedMove 作为 documents.move 参数",
|
||
"Convex documents.move 不再接受 normalizedMove fallback;缺少 treeWriteOperation 时显式拒绝",
|
||
"TS Rust mutation transport 不再透传 normalizedMove",
|
||
"相关测试改为验证 treeWriteOperation 是唯一主写入计划"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime tree_subtree_move_command && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/documents/document-move-order.test.ts src/lib/documents/document-move-order-convex.test.ts src/lib/documents/rust-runtime.test.ts src/app/api/tree/commands/route.test.ts",
|
||
"timeout_seconds": 3000
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已删除 normalizedMove fallback:Rust plan 不再输出 normalizedMove,TS transport 强制 treeWriteOperation,Convex documents.move 只接受 treeWriteOperation;目标 Rust/Vitest 通过。",
|
||
"timestamp": "2026-04-28T06:37:40Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T06:37:40Z"
|
||
},
|
||
{
|
||
"id": "task-015",
|
||
"title": "Phase M2:定稿 document.snapshot.saved 独立事件并避免与 page.body.saved payload 重叠",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-014"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "81ba21c5",
|
||
"source_doc": "design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md",
|
||
"scope": [
|
||
"rust/crates/bridge-runtime/src/lib.rs",
|
||
"wolai-frontend/src/lib/documents/rust-runtime.ts",
|
||
"wolai-frontend/src/lib/documents/bridge-log.ts",
|
||
"wolai-frontend/src/lib/documents/*test.ts"
|
||
],
|
||
"acceptance": [
|
||
"page.body.saved 保留正文保存事件语义",
|
||
"snapshot 版本/hash/updatedAt 拆入 document.snapshot.saved 独立 domain event plan 或 artifact plan",
|
||
"SSE 对 snapshot 独立事件有明确 resync 或 noop 策略",
|
||
"测试覆盖两个事件不再 payload 重叠"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime documents_save_command_plans_include_formal_domain_event_contract && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/documents/rust-runtime.test.ts src/lib/documents/bridge-log.test.ts src/lib/documents/page-write-command-adapter.test.ts",
|
||
"timeout_seconds": 3000
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已将 page.body.saved 与 document.snapshot.saved 拆成 domainEventPlans 双事件;artifact writer 支持 domainEvents 批量落库,page.body.saved payload 不再夹带 snapshot。",
|
||
"timestamp": "2026-04-28T07:44:37Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T07:44:37Z"
|
||
},
|
||
{
|
||
"id": "task-016",
|
||
"title": "Phase M3:把 snapshot 独立事件接入 Page Aggregate 深层收口文档与客户端边界",
|
||
"status": "completed",
|
||
"priority": "P1",
|
||
"depends_on": [
|
||
"task-015"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "81ba21c5",
|
||
"source_doc": "design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md",
|
||
"scope": [
|
||
"wolai-frontend/src/components/editor/page-aggregate*",
|
||
"wolai-frontend/src/lib/documents/page-aggregate*",
|
||
"design/05-editor-mainline/process",
|
||
"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md"
|
||
],
|
||
"acceptance": [
|
||
"Page Aggregate 文档明确 page.body.saved 与 document.snapshot.saved 的职责边界",
|
||
"客户端 Page Aggregate 状态不再把 snapshot 保存当作正文保存的附带语义",
|
||
"4-16 对应 snapshot/Page Aggregate 项可勾选或明确剩余迁移边界"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/editor/page-aggregate-client-state.test.ts src/lib/documents/page-aggregate-builder.test.ts src/lib/documents/page-write-command-adapter.test.ts && git diff --check -- design/04-tree-domain design/05-editor-mainline wolai-frontend/src/components/editor wolai-frontend/src/lib/documents",
|
||
"timeout_seconds": 2400
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已更新 Page Aggregate contract 与 5-6 清单,固定 page.body.saved 与 document.snapshot.saved 的职责边界,并同步 4-16 勾选状态。",
|
||
"timestamp": "2026-04-28T07:44:37Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T07:44:37Z"
|
||
},
|
||
{
|
||
"id": "task-017",
|
||
"title": "Phase N2:将 tree.node.embed 的 pageReference 组装迁到 Page Aggregate / Rust artifact 边界",
|
||
"status": "completed",
|
||
"priority": "P1",
|
||
"depends_on": [
|
||
"task-015"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "81ba21c5",
|
||
"source_doc": "design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md",
|
||
"scope": [
|
||
"rust/crates/bridge-runtime/src/lib.rs",
|
||
"wolai-frontend/src/app/api/tree/commands/route.ts",
|
||
"wolai-frontend/src/lib/documents/page-command-adapter.ts",
|
||
"wolai-frontend/src/lib/tree-route-boundary.ts",
|
||
"wolai-frontend/src/app/api/tree/commands/route.test.ts"
|
||
],
|
||
"acceptance": [
|
||
"3000 route 不再本地决定 pageReference block 的结构与插入位置语义",
|
||
"Rust plan 或 Page Aggregate artifact 接收 source/target/anchor/content snapshot 并产出 next content 或 block patch plan",
|
||
"tree-route-boundary manifest 移除该 compatPending 项",
|
||
"测试覆盖 tree.node.embed 的 pageReference 组装来源已迁移"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime documents_embed_command_plan_maps_to_documents_update_content tree_embed_and_copy_aliases_keep_tree_command_names && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/app/api/tree/commands/route.test.ts src/lib/tree-route-boundary.test.ts src/lib/documents/rust-runtime.test.ts",
|
||
"timeout_seconds": 3000
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已新增 Rust pageAggregateEmbedPlan;3000 route 与 documents.embed adapter 只传 source/target/anchor/content snapshot preflight,不再本地决定 pageReference block 结构与插入位置。",
|
||
"timestamp": "2026-04-28T07:44:37Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T07:44:37Z"
|
||
},
|
||
{
|
||
"id": "task-018",
|
||
"title": "Phase O2:补 file_tree 搜索索引可见性指标边界并收口 4-16",
|
||
"status": "completed",
|
||
"priority": "P2",
|
||
"depends_on": [
|
||
"task-014"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "81ba21c5",
|
||
"source_doc": "design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md",
|
||
"scope": [
|
||
"rust/crates/bridge-runtime/src/lib.rs",
|
||
"rust/crates/mnote-web/src/routes/kernel.rs",
|
||
"wolai-frontend/src/lib/server/kernel-file-tree.ts",
|
||
"wolai-frontend/src/app/api/tree/projections/file/route.ts",
|
||
"design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md"
|
||
],
|
||
"acceptance": [
|
||
"file_tree 搜索 projection 输出稳定 indexing/visibility meta,不再只是临时 request meta",
|
||
"3000 同源 projection route 透传该 meta",
|
||
"move-embed picker/file tree 搜索可观察 index visibility 状态",
|
||
"4-16 中 Phase O 未完成项完成或明确转为非树域 runtime 后续"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime file_tree && cargo test -p mnote-web file_tree_projection && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/app/api/tree/projections/file/route.test.ts src/lib/tree-stream/tree-delta.test.ts",
|
||
"timeout_seconds": 3000
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已把 file_tree 搜索 indexingVisibility 提升为 projection result meta;mnote-web 与 3000 同源 projection route 均透传该指标,4-16 Phase O 已收口。",
|
||
"timestamp": "2026-04-28T07:44:37Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T07:44:37Z"
|
||
},
|
||
{
|
||
"id": "task-019",
|
||
"title": "Phase W-0:冻结 Rust Web 主执行面 owner manifest 与负向门禁",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "9f6a2c86",
|
||
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
|
||
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
|
||
"scope": [
|
||
"wolai-frontend/src/lib/rust-web-main-execution-boundary.ts",
|
||
"wolai-frontend/src/lib/rust-web-main-execution-boundary.test.ts",
|
||
"ARCHITECTURE.md",
|
||
"design/03-rust-web/process/3-6-rust-web-main-execution-plane-checklist-v1.md"
|
||
],
|
||
"acceptance": [
|
||
"新增 RUST_WEB_MAIN_EXECUTION_BOUNDARY,固定 publicEntry=3000、mainWebOwner=mnote-web、legacyCompatOwner=next-app-router",
|
||
"测试禁止把 Next App Router 写回主 Web owner",
|
||
"ARCHITECTURE.md 明确树域完成不等于主 Web 执行面完成"
|
||
],
|
||
"validation": {
|
||
"command": "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",
|
||
"timeout_seconds": 1800
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已新增 Rust Web 主执行面 owner manifest 与负向门禁,并更新 ARCHITECTURE.md / 3-6 checklist 口径。",
|
||
"timestamp": "2026-04-28T09:07:58Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T09:07:58Z"
|
||
},
|
||
{
|
||
"id": "task-020",
|
||
"title": "Phase W-1:让 mnote-web 默认成为 3000 gateway owner",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-019"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "9f6a2c86",
|
||
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
|
||
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
|
||
"scope": [
|
||
"rust/crates/mnote-web/src/app.rs",
|
||
"rust/crates/mnote-web/src/routes/mod.rs",
|
||
"rust/crates/mnote-web/src/routes/gateway.rs",
|
||
"scripts/desktop-hot.js",
|
||
"scripts/desktop-hot.test.js",
|
||
"scripts/task114-rust-web-gateway-entry-smoke.js"
|
||
],
|
||
"acceptance": [
|
||
"mnote-web 支持 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3000 并作为默认 3000 owner",
|
||
"Next dev 默认改为 legacy upstream port,不再拥有 3000",
|
||
"task114 smoke 证明 3000 响应来自 Rust gateway 且 3104 不作为公开入口"
|
||
],
|
||
"validation": {
|
||
"command": "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",
|
||
"timeout_seconds": 3600
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已新增 mnote-web gateway route/owner header、desktop-hot Rust gateway 默认启动计划与 task114 smoke。",
|
||
"timestamp": "2026-04-28T09:13:44Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T09:13:44Z"
|
||
},
|
||
{
|
||
"id": "task-021",
|
||
"title": "Phase W-2:把 runtime config 与 auth/session handoff 迁到 Rust Web",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-020"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "9f6a2c86",
|
||
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
|
||
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
|
||
"scope": [
|
||
"rust/crates/mnote-web/src/routes/session.rs",
|
||
"rust/crates/mnote-web/src/routes/mod.rs",
|
||
"wolai-frontend/src/lib/runtime-config.ts",
|
||
"wolai-frontend/src/lib/runtime-config.test.ts",
|
||
"wolai-frontend/src/app/api/auth/mnote-web-token/route.ts"
|
||
],
|
||
"acceptance": [
|
||
"mnote-web 输出 /api/runtime/config、/api/auth/session 与 session refresh/handoff route",
|
||
"浏览器 runtime config 不泄漏 internal MNOTE_WEB_* base URL",
|
||
"Next /api/auth/mnote-web-token 降级为 compat/debug"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web session && cargo test -p mnote-web 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",
|
||
"timeout_seconds": 3000
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已新增 mnote-web runtime config/session/refresh routes,并将 Next mnote-web-token route 标记为 compat/debug。",
|
||
"timestamp": "2026-04-28T09:16:28Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T09:16:28Z"
|
||
},
|
||
{
|
||
"id": "task-022",
|
||
"title": "Phase W-3:建立 Rust-owned 文档页 / Page Aggregate server-first shell",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-021"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "9f6a2c86",
|
||
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
|
||
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
|
||
"scope": [
|
||
"rust/crates/mnote-web/src/routes/web_shell.rs",
|
||
"rust/crates/mnote-web/src/routes/documents.rs",
|
||
"rust/crates/mnote-web/src/routes/mod.rs",
|
||
"wolai-frontend/src/components/editor/document-shell.tsx",
|
||
"wolai-frontend/src/components/editor/document-content.tsx",
|
||
"scripts/task115-rust-web-document-shell-smoke.js"
|
||
],
|
||
"acceptance": [
|
||
"mnote-web 输出 /documents/:id server-first shell 与 page aggregate snapshot",
|
||
"Next 文档页降级为 legacy compat",
|
||
"task115 smoke 证明默认文档页由 Rust shell 服务且不挂载 mnote-web-document-shell iframe"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web document_shell && cargo test -p mnote-web 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",
|
||
"timeout_seconds": 3600
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已新增 mnote-web /documents/:id shell 与 /api/page-aggregate/:id snapshot contract,并补 task115 smoke。",
|
||
"timestamp": "2026-04-28T09:20:22Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T09:20:22Z"
|
||
},
|
||
{
|
||
"id": "task-023",
|
||
"title": "Phase W-4:把主 API transport 从 Next route 收薄为 Rust Web owned",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-022"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "9f6a2c86",
|
||
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
|
||
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
|
||
"scope": [
|
||
"rust/crates/mnote-web/src/routes/documents.rs",
|
||
"rust/crates/mnote-web/src/routes/tree.rs",
|
||
"rust/crates/mnote-web/src/routes/search.rs",
|
||
"wolai-frontend/src/lib/tree-route-boundary.ts",
|
||
"wolai-frontend/src/app/api/documents/route-adapters.test.ts",
|
||
"wolai-frontend/src/lib/search/request.test.ts"
|
||
],
|
||
"acceptance": [
|
||
"Rust Web owner 覆盖 documents meta/content/save、tree commands/projections 与 search documents transport",
|
||
"Next route 只保留 cookie/header 透传和 legacy compat",
|
||
"TREE_3000_ROUTE_BOUNDARY_MANIFEST owner 口径改为 rust-web-gateway"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web documents_api && cargo test -p mnote-web tree_commands && cargo test -p mnote-web search && cargo test -p bridge-runtime page_aggregate && cargo test -p bridge-runtime 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",
|
||
"timeout_seconds": 3600
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [
|
||
"[CONFIG] 原验证中的 cargo test -p bridge-runtime page_aggregate 过滤词当前命中 0 项;本任务实际覆盖 documents_api/tree_commands/search 与 route boundary。"
|
||
],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "已补 Rust Web search.documents transport、documents owner headers 与 TREE_3000_ROUTE_BOUNDARY rust-web-gateway owner 口径。",
|
||
"timestamp": "2026-04-28T09:26:14Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T09:26:14Z"
|
||
},
|
||
{
|
||
"id": "task-024",
|
||
"title": "Phase W-5:把 tree realtime stream 固定为 Rust Web 主链",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-023"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "9f6a2c86",
|
||
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
|
||
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
|
||
"scope": [
|
||
"rust/crates/mnote-web/src/routes/sse.rs",
|
||
"rust/crates/mnote-web/src/routes/stream_support.rs",
|
||
"wolai-frontend/src/app/api/mnote-web/stream/route.ts",
|
||
"wolai-frontend/src/lib/tree-stream/protocol.ts",
|
||
"wolai-frontend/src/lib/tree-stream/tree-stream.test.ts",
|
||
"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx"
|
||
],
|
||
"acceptance": [
|
||
"Rust Web 输出正式 /api/tree/events snapshot + delta stream",
|
||
"/api/mnote-web/stream 降级为 compat alias",
|
||
"Sidebar / page tree / file tree consumer 使用 Rust-owned stream"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web tree_realtime && cargo test -p mnote-web 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",
|
||
"timeout_seconds": 4200
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "Rust Web /api/tree/events 已固定为 tree realtime stream 主链,输出 rust-web owner、snapshot/delta stream;Next /api/mnote-web/stream 保留 compat alias,consumer URL 指向 /api/tree/events。task112 针对 legacy Chromium renderer crash 仅做一次新 context 恢复。",
|
||
"timestamp": "2026-04-28T12:33:41Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T12:33:41Z"
|
||
},
|
||
{
|
||
"id": "task-025",
|
||
"title": "Phase W-6:把 Search / AI / Mindmap 页面壳迁到 Rust Web shell + islands",
|
||
"status": "completed",
|
||
"priority": "P1",
|
||
"depends_on": [
|
||
"task-024"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "9f6a2c86",
|
||
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
|
||
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
|
||
"scope": [
|
||
"rust/crates/mnote-web/src/routes/search.rs",
|
||
"rust/crates/mnote-web/src/routes/mindmap_shell.rs",
|
||
"rust/crates/mnote-web/src/routes/hermes.rs",
|
||
"wolai-frontend/src/components/search/SearchPaletteHost.tsx",
|
||
"wolai-frontend/src/components/editor/DocumentAiAgentPanel.runtime.tsx",
|
||
"wolai-frontend/src/app/mindmap/[docId]/[mindmapId]/page.tsx",
|
||
"scripts/task116-rust-web-islands-smoke.js"
|
||
],
|
||
"acceptance": [
|
||
"Rust Web 输出 Search server-first shell",
|
||
"Rust Web / Hermes 拥有 AI bridge session、tool event、client action contract",
|
||
"Rust Web 输出 Mindmap object shell,React runtime 只作为 island 或 legacy compat"
|
||
],
|
||
"validation": {
|
||
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web search_shell && cargo test -p mnote-web ai_bridge && cargo test -p mnote-web 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",
|
||
"timeout_seconds": 4200
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "Search server-first shell、Hermes AI bridge owner contract、Mindmap object shell 已落到 Rust Web;React runtime 标记为 island/legacy compat;task116 smoke 证明三类 owner 已迁移。",
|
||
"timestamp": "2026-04-28T12:44:04Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T12:44:04Z"
|
||
},
|
||
{
|
||
"id": "task-026",
|
||
"title": "Phase W-7:退役 Next App Router 主入口并完成 03-rust-web 文档收口",
|
||
"status": "completed",
|
||
"priority": "P0",
|
||
"depends_on": [
|
||
"task-025"
|
||
],
|
||
"attempts": 1,
|
||
"max_attempts": 3,
|
||
"started_at_commit": "9f6a2c86",
|
||
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
|
||
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
|
||
"scope": [
|
||
"ARCHITECTURE.md",
|
||
"design/03-rust-web/process/3-1-rust-web-long-term-checklist-v2.md",
|
||
"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
|
||
"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
|
||
"scripts/task117-next-retirement-guard.js"
|
||
],
|
||
"acceptance": [
|
||
"task117 证明 SKIP_NEXT_LEGACY=1 时核心 smoke 仍可通过",
|
||
"默认启动链不再把 pnpm dev 作为 3000 owner,3104 不恢复为公开入口",
|
||
"ARCHITECTURE.md 与 3-1 同步 Next App Router legacy compat 口径,本 plan/checklist 移入 done"
|
||
],
|
||
"validation": {
|
||
"command": "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",
|
||
"timeout_seconds": 4800
|
||
},
|
||
"on_failure": {
|
||
"cleanup": null
|
||
},
|
||
"error_log": [],
|
||
"checkpoints": [
|
||
{
|
||
"step": 1,
|
||
"total": 1,
|
||
"description": "task117 已证明 SKIP_NEXT_LEGACY=1 时核心 shell 不依赖 Next legacy;desktop-hot 支持跳过 Next legacy;ARCHITECTURE/3-1 已同步 Next App Router legacy compat 口径,3-5/3-6 已移入 done。",
|
||
"timestamp": "2026-04-28T12:50:07Z"
|
||
}
|
||
],
|
||
"completed_at": "2026-04-28T12:50:07Z"
|
||
}
|
||
],
|
||
"session_count": 10,
|
||
"last_session": "2026-04-28T12:50:07Z",
|
||
"final_renderer_gate": {
|
||
"source_doc": "design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md",
|
||
"status": "completed",
|
||
"note": "task-001 至 task-009 只代表 Rust/WASM reducer runtime 阶段完成;不得再把 inline iframe srcdoc host 视为 final Rust DOM renderer。"
|
||
},
|
||
"final_runtime_remaining": {
|
||
"source_doc": "design/04-tree-domain/done/4-16-tree-rust-family-remaining-final-runtime-checklist-v1.md",
|
||
"status": "completed",
|
||
"tasks": [
|
||
"task-014",
|
||
"task-015",
|
||
"task-016",
|
||
"task-017",
|
||
"task-018"
|
||
]
|
||
},
|
||
"main_web_execution_plane": {
|
||
"source_doc": "design/03-rust-web/process/3-6-rust-web-main-execution-plane-checklist-v1.md",
|
||
"plan_doc": "design/03-rust-web/process/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
|
||
"status": "planned",
|
||
"tasks": [
|
||
"task-019",
|
||
"task-020",
|
||
"task-021",
|
||
"task-022",
|
||
"task-023",
|
||
"task-024",
|
||
"task-025",
|
||
"task-026"
|
||
],
|
||
"note": "树域 Rust family 默认执行面已完成;主 Web 执行面仍需通过 task-019 至 task-026 迁到 mnote-web / Rust family。"
|
||
},
|
||
"rust_web_3_4_undo": {
|
||
"source_doc": "design/03-rust-web/process/3-4-undo.md",
|
||
"status": "in_progress",
|
||
"dependency_chain": "A -> B/C -> D/E/F -> G -> H",
|
||
"tasks": [
|
||
{
|
||
"id": "task-3-4-A",
|
||
"title": "Page Aggregate 升级为 core-protocol projection contract",
|
||
"status": "in_progress",
|
||
"depends_on": [],
|
||
"validation": "cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol page_aggregate && cargo test -p bridge-runtime page_aggregate && cargo test -p mnote-web page_aggregate"
|
||
},
|
||
{
|
||
"id": "task-3-4-B",
|
||
"title": "page.* 成为页面默认写命令族",
|
||
"status": "in_progress",
|
||
"depends_on": ["task-3-4-A"],
|
||
"validation": "cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime page_body_save && cargo test -p bridge-runtime page_head_update_title && cargo test -p bridge-runtime page_layout_update_options && cargo test -p mnote-web documents_save"
|
||
},
|
||
{
|
||
"id": "task-3-4-C",
|
||
"title": "3000 Rust shell 消费 tree realtime event stream",
|
||
"status": "in_progress",
|
||
"depends_on": ["task-3-4-A"],
|
||
"validation": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web tree_events && cargo test -p mnote-web tree_command && cd /mnt/Data1T/mnote && MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task123-rust-web-tree-live-stream-consumer-smoke.js"
|
||
},
|
||
{
|
||
"id": "task-3-4-D",
|
||
"title": "Search 收口为 server-first / kernel-aware 主链",
|
||
"status": "in_progress",
|
||
"depends_on": ["task-3-4-B", "task-3-4-C"],
|
||
"validation": "cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol search && cargo test -p bridge-runtime search_documents_query && cargo test -p mnote-web search && cd /mnt/Data1T/mnote && MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task125-rust-web-search-server-first-smoke.js"
|
||
},
|
||
{
|
||
"id": "task-3-4-E",
|
||
"title": "AI bridge 与结构化写链收口",
|
||
"status": "in_progress",
|
||
"depends_on": ["task-3-4-B", "task-3-4-C"],
|
||
"validation": "cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol ai && cargo test -p mnote-web hermes && cd /mnt/Data1T/mnote && MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task126-rust-web-ai-bridge-structured-write-smoke.js"
|
||
},
|
||
{
|
||
"id": "task-3-4-F",
|
||
"title": "Mindmap 成为 kernel projection / command truth",
|
||
"status": "in_progress",
|
||
"depends_on": ["task-3-4-B", "task-3-4-C"],
|
||
"validation": "cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol mindmap && cargo test -p bridge-runtime mindmap && cargo test -p mnote-web mindmap && cd /mnt/Data1T/mnote && MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task127-rust-web-mindmap-kernel-projection-smoke.js"
|
||
},
|
||
{
|
||
"id": "task-3-4-G",
|
||
"title": "Legacy Next / React 兼容层退役 gate",
|
||
"status": "in_progress",
|
||
"depends_on": ["task-3-4-D", "task-3-4-E", "task-3-4-F"],
|
||
"validation": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web gateway && cargo test -p mnote-web legacy_next && cd /mnt/Data1T/mnote && MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task117-next-retirement-guard.js"
|
||
},
|
||
{
|
||
"id": "task-3-4-H",
|
||
"title": "设计文档状态治理与执行节奏",
|
||
"status": "in_progress",
|
||
"depends_on": ["task-3-4-G"],
|
||
"validation": "cd /mnt/Data1T/mnote && rg -n \"\\\\[ \\\\]\" design/03-rust-web/process/3-4-undo.md && rg -n \"\\\\[done\\\\]|\\\\[recycle\\\\]\" design/03-rust-web design/old && git diff --check && git status --short --untracked-files=all"
|
||
}
|
||
]
|
||
}
|
||
}
|