{ "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" } ], "session_count": 8, "last_session": "2026-04-28T07:44:37Z", "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" ] } }