Files
mnote/harness-tasks.json
T

1052 lines
46 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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-53000 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 treeWriteOperationConvex documents.move 优先执行 Rust write operationnormalizedMove 保留旧 fallbackbridge-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 modellegacy 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_hostTreeShellIframeHost 仅由 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 Qpage / 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 fallbackRust plan 不再输出 normalizedMoveTS transport 强制 treeWriteOperationConvex 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 pageAggregateEmbedPlan3000 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 metamnote-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 streamNext /api/mnote-web/stream 保留 compat aliasconsumer 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 shellReact 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 WebReact runtime 标记为 island/legacy compattask116 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 owner3104 不恢复为公开入口",
"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 legacydesktop-hot 支持跳过 Next legacyARCHITECTURE/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。"
}
}