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