{ "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" } ] } }