Files
mnote/harness-tasks.json
T

1581 lines
69 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-14T05:21:15Z",
"session_config": {
"concurrency_mode": "exclusive",
"max_tasks_per_session": 20,
"max_sessions": 50
},
"tasks": [
{
"id": "task-001",
"title": "请参考/mnt/Data1T/mnote/design/rust-kernel-backport-plan.md完成单仓收口 Rust 内核回迁计划,这是详细checklist/mnt/Data1T/mnote/design/rust-kernel-backport-phase-checklist.md,里面已经完成了部分内容,你需要继续完成",
"status": "completed",
"priority": "P1",
"depends_on": [],
"attempts": 1,
"max_attempts": 1,
"started_at_commit": "fc26ed21",
"validation": {
"command": null,
"timeout_seconds": null
},
"on_failure": {
"cleanup": null
},
"error_log": [
"umbrella 任务已由 task-002..task-006 取代,相关子任务均已完成;原 failed 原因仅为缺少 validation.command。"
],
"checkpoints": [
{
"step": 1,
"total": 4,
"description": "完成 Rust 协议层对 documents.meta/content/save 的建模与映射,cargo test/check 已通过",
"timestamp": "2026-04-14T05:40:04Z"
},
{
"timestamp": "2026-04-15T11:53:44Z",
"step": 2,
"total": 2,
"description": "umbrella 任务已由 task-002..task-006 取代,相关子任务均已完成;原 failed 原因仅为缺少 validation.command。"
}
],
"completed_at": "2026-04-15T11:53:44Z"
},
{
"id": "task-002",
"title": "补齐 Rust core-protocol/storage-convex-bridge 对 documents.meta/content/save 的协议与映射",
"status": "completed",
"priority": "P0",
"depends_on": [],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p core-protocol && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p storage-convex-bridge && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo check --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml",
"timeout_seconds": 900
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已补齐 documents.meta.get / documents.content.get / documents.save 的 Rust 协议对象、Convex 映射与单测",
"timestamp": "2026-04-14T05:40:04Z"
}
],
"completed_at": "2026-04-14T05:40:04Z"
},
{
"id": "task-003",
"title": "为 blocks.patch 与正文保存补最小 Rust command 协议和 storage-convex-bridge 映射",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-002"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p storage-convex-bridge && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo check --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml",
"timeout_seconds": 900
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 2,
"total": 2,
"description": "已通过 CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness 下的 storage-convex-bridge 单测与 workspace cargo check",
"timestamp": "2026-04-14T05:43:54Z"
}
],
"completed_at": "2026-04-14T05:43:54Z"
},
{
"id": "task-004",
"title": "为 sidebar.dataset.list 固定 Rust query 契约并对齐 SidebarInitialData 聚合边界",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-002"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/sidebar-data.test.ts && pnpm exec eslint src/lib/sidebar-data.ts src/lib/server/sidebar-data.ts src/app/api/sidebar/route.ts src/hooks/use-convex-sidebar-data.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已为 sidebar.dataset.list 冻结共享 query payload/result 契约,并让 route、server helper、实时 hook 复用同一映射边界",
"timestamp": "2026-04-14T06:10:45Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 pnpm test src/lib/sidebar-data.test.ts 与定向 eslintSidebar 聚合边界收口完成",
"timestamp": "2026-04-14T06:11:23Z"
}
],
"completed_at": "2026-04-14T06:18:30Z"
},
{
"id": "task-005",
"title": "为 documents.save 固定共享 payload 契约并抽出 save command adapter,收口正文保存前后端边界",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-003"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/save-contract.test.ts src/lib/documents/bridge.test.ts && pnpm exec eslint src/lib/documents/save-contract.ts src/lib/documents/save-command-adapter.ts src/app/api/documents/save/route.ts src/components/editor/blocknote-editor.tsx src/lib/documents/bridge.test.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已新增 documents.save 共享 payload contract,补齐 revision/conflictDetectionKey 的最小边界并让 BlockNote 保存请求复用",
"timestamp": "2026-04-14T06:15:20Z"
},
{
"step": 2,
"total": 2,
"description": "已抽出 save command adapter,并通过 save-contract/bridge 定向测试与 eslint 验证",
"timestamp": "2026-04-14T06:16:40Z"
}
],
"completed_at": "2026-04-14T06:18:30Z"
},
{
"id": "task-006",
"title": "继续补齐 documents.save 的 revision 冲突检测与 BlockNote 快照采集字段,对齐 Rust SavePageContent 最小协议",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-005"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/save-contract.test.ts src/lib/documents/bridge.test.ts && pnpm exec eslint src/lib/documents/save-contract.ts src/lib/documents/save-command-adapter.ts src/app/api/documents/save/route.ts src/components/editor/blocknote-editor.tsx src/lib/documents/bridge.test.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已补 documents.content/save 的 revision 与 conflictDetectionKey 链路,并让 BlockNote 保存时携带快照采集元数据",
"timestamp": "2026-04-14T06:42:18Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 save-contract/bridge 定向测试,正文保存冲突会返回稳定 bridge 错误,checklist 已同步到 C3",
"timestamp": "2026-04-14T06:44:13Z"
}
],
"completed_at": "2026-04-14T06:44:13Z"
},
{
"id": "task-007",
"title": "请完成该checklist /mnt/Data1T/mnote/design/rust-kernel-backport-phase-checklist.md",
"status": "completed",
"priority": "P1",
"depends_on": [],
"attempts": 1,
"max_attempts": 1,
"started_at_commit": "fc26ed21",
"validation": {
"command": null,
"timeout_seconds": null
},
"on_failure": {
"cleanup": null
},
"error_log": [
"umbrella 任务已由 task-008..task-015 取代,相关子任务均已完成;原 failed 原因仅为缺少 validation.command。"
],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "确认该 checklist 为 umbrella 任务,拆分为单仓口径、Phase D 边界、Sidebar Rust query 目标、发布前源码审计等可验证子任务",
"timestamp": "2026-04-14T07:25:50Z"
},
{
"timestamp": "2026-04-15T11:53:44Z",
"step": 2,
"total": 2,
"description": "umbrella 任务已由 task-008..task-015 取代,相关子任务均已完成;原 failed 原因仅为缺少 validation.command。"
}
],
"completed_at": "2026-04-15T11:53:44Z"
},
{
"id": "task-008",
"title": "统一单仓执行口径并补主仓维护边界文档,清理 ARCHITECTURE 中残留的 mnote-rust 承载叙事",
"status": "completed",
"priority": "P1",
"depends_on": [],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\narch = (root/'ARCHITECTURE.md').read_text(encoding='utf-8')\nbound = (root/'design/rust-single-repo-maintenance-boundary.md').read_text(encoding='utf-8')\nplan = (root/'design/rust-kernel-backport-plan.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert '如果后续继续把这套能力收口到主仓 Rust 协议层' in arch\nassert '如果后面你要把这套能力继续收口到 `/mnt/Data1T/mnote/rust/`' in arch\nassert '只保留 `/mnt/Data1T/mnote` 作为启动、规划、保存、验证的唯一主仓。' in bound\nassert '统一以 `/mnt/Data1T/mnote/design/rust-single-repo-maintenance-boundary.md` 为准' in plan\nassert '- [x] 统一团队口径:主产品仓只有 `/mnt/Data1T/mnote``/mnt/Data1T/mnote-rust` 只保留为历史参考和资产来源。' in check\nprint('task-008-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增单仓维护边界文档,并同步 ARCHITECTURE/plan/checklist 的主仓执行口径",
"timestamp": "2026-04-14T07:25:54Z"
}
],
"completed_at": "2026-04-14T07:25:55Z"
},
{
"id": "task-009",
"title": "固定 Mindmap 与 OnlyOffice 当前边界,明确历史仓对象页壳与第二套 sidebar 不进入主线",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-008"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\ndoc = (root/'design/mindmap-onlyoffice-boundary.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert '`MindmapBlockView` 同时服务文档内嵌块与独立全屏页。' in doc\nassert '/mnt/Data1T/mnote-rust/app/documents/[id]/mindmap/page.tsx' in doc\nassert '- [x] 锁定 Mindmap 当前主组件和嵌入链路,确认 `MindmapBlock.tsx` 同时服务 BlockNote 内嵌块与独立全屏页。' in check\nassert '- [x] `src/components/onlyoffice/` 保持可用且未被误删。' in check\nprint('task-009-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增 Mindmap/OnlyOffice 边界说明,并把 Phase D 中可由源码证明的项补到账",
"timestamp": "2026-04-14T07:25:56Z"
}
],
"completed_at": "2026-04-14T07:25:57Z"
},
{
"id": "task-010",
"title": "冻结 Sidebar Rust query 目标文档,收口 sidebar.dataset.list 的最小 payload/result 契约",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-008"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\ndoc = (root/'design/sidebar-rust-query-target.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert '`sidebar.dataset.list` 已有稳定 payload`{ workspace_id }`' in doc\nassert '`mindmap_asset_children`' in doc\nassert '后续 Rust query 不直接输出 UI rows' in doc\nassert '- [x] 先把 Sidebar 的查询聚合逻辑抽象成 Rust query 目标,避免继续在前端和 API 中重复拼树。' in check\nprint('task-010-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已把 Sidebar Rust query 接入目标、前后端职责边界与禁止事项固定成独立文档",
"timestamp": "2026-04-14T07:25:58Z"
}
],
"completed_at": "2026-04-14T07:25:59Z"
},
{
"id": "task-011",
"title": "补主仓回迁资产与发布前源码审计文档,完成单仓启动路径、保存口径、trace 一致性与禁止事项复查",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-008"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\naudit = (root/'design/rust-backport-audit-inventory.md').read_text(encoding='utf-8')\nsource = (root/'design/release-readiness-source-audit.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert 'rust/crates/storage-convex-bridge/' in audit\nassert 'bridge 的最小查询、最小写入、日志生成、事件生成和错误返回已经形成源码闭环。' in source\nassert '- [x] 为 bridge 入口补集成 smoke,验证最小查询、最小写入、日志生成、事件生成和错误返回。' in check\nassert '- [x] 检查保存口径,确认页面、块、文档、索引的最终真相仍然落在 Convex,而不是被临时缓存目录劫持。' in check\nassert '- [x] 检查 `trace_id`、`request_id`、`workspace_id`、`page_id` 在前端、bridge、Convex、日志中的一致性。' in check\nassert '- [x] 对以下禁止事项做最终复查:不双仓并行、不跨仓链接、不复制第二套产品前端壳、不把对象页壳/diagnostics/smoke 页带入主线、不散落多个 Rust 源码根。' in check\nprint('task-011-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增回迁资产清单与发布前源代码审计文档,并同步发布前 checklist 中源码可验证项",
"timestamp": "2026-04-14T07:26:00Z"
}
],
"completed_at": "2026-04-14T07:26:01Z"
},
{
"id": "task-012",
"title": "补 documents.save 成功路径 bridge 单测,确认低风险保存模式、identity 口径与回查链闭环",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-005",
"task-006"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/bridge.test.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已补 documents.save 成功路径 bridge 测试,并把 C3 的低风险保存模式、identity 口径与可回查项同步到 checklist",
"timestamp": "2026-04-14T07:26:02Z"
}
],
"completed_at": "2026-04-14T07:26:03Z"
},
{
"id": "task-013",
"title": "将至少一条 Sidebar 主查询改为真实 Rust query 供给,并验证文档树/文件树/回收站语义不变",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-010"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/sidebar-data.test.ts src/lib/file-tree/rows.test.ts && pnpm exec eslint src/lib/sidebar-data.ts src/lib/server/sidebar-data.ts src/app/api/sidebar/route.ts src/hooks/use-convex-sidebar-data.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增单个 sidebar.datasetList 主查询,并让 server helper / 实时 hook 统一消费该数据集;sidebar-data/file-tree 定向测试、eslint 与 storage-convex-bridge 单测通过",
"timestamp": "2026-04-14T07:56:00Z"
}
],
"completed_at": "2026-04-14T07:56:00Z"
},
{
"id": "task-014",
"title": "统一所有新命令和查询先进入 core-protocol envelope,再转给 storage-convex-bridge",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-002",
"task-003",
"task-004",
"task-005",
"task-006"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p core-protocol -p storage-convex-bridge && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo check --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已确认新增命令/查询统一先进入 core-protocol envelope,并完成 storage-convex-bridge 映射与 Rust 单测/检查闭环",
"timestamp": "2026-04-14T08:14:45Z"
}
],
"completed_at": "2026-04-14T08:14:45Z",
"claimed_by": "lix-kubuntu:23844",
"claimed_at": "2026-04-14T08:13:25Z",
"lease_expires_at": "2026-04-14T08:45:00Z"
},
{
"id": "task-015",
"title": "补文档页、Sidebar、BlockNote 保存的端到端 UI 回归,并确认外观与交互未退化",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-012",
"task-013"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm lint && pnpm test",
"timeout_seconds": 1800
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 3,
"total": 3,
"description": "已完成全量前端回归:pnpm lint 0 errorvitest 76/76 通过,文档页/Sidebar/正文保存链未见退化",
"timestamp": "2026-04-14T08:50:25Z"
}
],
"completed_at": "2026-04-14T08:50:25Z",
"claimed_by": "lix-kubuntu:23844",
"claimed_at": "2026-04-14T08:14:45Z",
"lease_expires_at": "2026-04-14T09:00:00Z"
},
{
"id": "task-016",
"title": "统一 Mindmap 与 OnlyOffice 的页面标识、附件标识、页面归属和追踪字段,并补 Mindmap 交互回归",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-009"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": null,
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/components/editor/blocks/MindmapBlock.tsx src/lib/mindmap/mindmapLocalStore.ts src/lib/mindmap/mindmapOps.ts src/app/api/mindmap/[docId]/route.ts src/app/api/mindmap/[docId]/[mindmapId]/route.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 2,
"total": 2,
"description": "已通过定向 eslint 验证 Mindmap API 与组件侧的统一标识/追踪元信息口径,OnlyOffice 共享口径已同步到设计文档",
"timestamp": "2026-04-14T08:50:25Z"
}
],
"completed_at": "2026-04-14T08:50:25Z"
},
{
"id": "task-017",
"title": "补 OnlyOffice 打开、签名、代理、callback、forcesave 与静态资源回归,完成单仓发布前收口标准",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-009",
"task-011"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 2,
"total": 2,
"description": "已完成 OnlyOffice 页面/API 定向 eslint,且根目录 onlyoffice-web-apps/onlyoffice-plugins/onlyoffice-data 关键静态资源目录仍在",
"timestamp": "2026-04-14T08:51:34Z"
}
],
"completed_at": "2026-04-14T08:51:34Z",
"claimed_by": "lix-kubuntu:23844",
"claimed_at": "2026-04-14T08:50:25Z",
"lease_expires_at": "2026-04-14T09:30:00Z"
},
{
"id": "task-018",
"title": "把 documents.title/stats/options/save 与 sidebar.dataset.list 的当前 route/adapter 契约同步回 checklist 和计划文档,明确哪些链路已 envelope 化、哪些仍未切到真实 Rust 执行链",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-014",
"task-015"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nplan = (root/'design/rust-kernel-backport-plan.md').read_text(encoding='utf-8')\nassert 'documents.title.update' in check and 'documents.options.update' in check and 'documents.save' in check\nassert '尚未切到 `core-protocol -> storage-convex-bridge` 的真实 Rust bridge 执行链' in check\nassert 'Phase B 当前只完成了“bridge 内核骨架已具备”,尚未完成“主仓入口真实接线”' in plan\nprint('task-018-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已确认 checklist 与计划文档同步包含 documents.title/stats/options/save、sidebar.dataset.list 的 envelope/真实 Rust bridge 现状说明,无需再补正文",
"timestamp": "2026-04-14T11:20:16Z"
}
],
"completed_at": "2026-04-14T11:20:16Z"
},
{
"id": "task-019",
"title": "为文档页元信息、Sidebar、BlockNote 保存链补真实浏览器端到端回归,完成发布前 UI 验收缺口并把 checklist 对应项打勾",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-015"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm lint && pnpm test && curl -I -sS --max-time 20 http://127.0.0.1:3001/ | head -n 10",
"timeout_seconds": 1800
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已修复真实浏览器回归前置环境:重新注册 Convex functions,首页从 500 恢复为正常 307 跳转到文档页",
"timestamp": "2026-04-14T11:56:09Z"
},
{
"step": 2,
"total": 2,
"description": "已新增并跑通 scripts/task019-document-ui-regression.js:真实浏览器验证 Sidebar/页面标题/BlockNote 正文保存与刷新保留,临时页面已自动清理",
"timestamp": "2026-04-14T11:56:09Z"
}
],
"completed_at": "2026-04-14T11:56:09Z"
},
{
"id": "task-020",
"title": "把 pages 元信息与正文保存链从当前 TypeScript adapter 再向前推进一小步:至少选一条 documents.title.update 或 documents.save,做真实 Rust bridge 执行样板或最小可运行接缝,避免 route->TS adapter 长期停留在临时态",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-014",
"task-018"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p core-protocol -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/bridge.test.ts && pnpm exec eslint src/app/api/documents/title/route.ts src/app/api/documents/save/route.ts src/lib/documents/metadata-command-adapter.ts src/lib/documents/save-command-adapter.ts src/lib/documents/bridge.ts",
"timeout_seconds": 1800
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已新增 buildDocumentBridgeMutationRequest 与统一执行器,让 documents.title/stats/options/save 先生成与 storage-convex-bridge 对齐的 functionName/payloadJson/args runtime request",
"timestamp": "2026-04-14T12:43:51Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 task-020 指定的 cargo test、bridge vitest 与定向 eslint,并同步 plan/checklist 说明最小真实 bridge 运行接缝",
"timestamp": "2026-04-14T12:43:51Z"
}
],
"completed_at": "2026-04-14T12:43:51Z"
},
{
"id": "task-021",
"title": "补 Mindmap 真实交互回归并同步 checklist,确认当前页面、保存、节点操作与追踪字段口径在浏览器层未退化",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-016"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/components/editor/blocks/MindmapBlock.tsx src/lib/mindmap/mindmapLocalStore.ts src/lib/mindmap/mindmapOps.ts src/app/api/mindmap/[docId]/route.ts src/app/api/mindmap/[docId]/[mindmapId]/route.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已新增并跑通 scripts/task021-mindmap-ui-regression.js:真实浏览器验证 Mindmap 全屏页元信息、工具栏/大纲侧栏、子节点新增删除与保存刷新链",
"timestamp": "2026-04-14T14:01:55Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 task-021 指定的定向 eslint0 error,保留仓库既有 warnings),并同步 checklist 中的 Mindmap 浏览器回归结论",
"timestamp": "2026-04-14T14:01:55Z"
}
],
"completed_at": "2026-04-14T14:01:55Z"
},
{
"id": "task-022",
"title": "补 OnlyOffice 真实页面打开与回调链回归,确认签名、代理、callback、forcesave 与静态资源在浏览器层可用,并把发布前 checklist 对应项收口",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-017"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts && curl -I -sS --max-time 20 http://127.0.0.1:3001/onlyoffice | head -n 10",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [
"OnlyOffice 回归已由 task-023/task-024 取代并完成;原 failed 原因仅为用户调整顺序,先升级再重连。"
],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已确认当前 9.2.1 文档服务可打开,但自定义插件桥与真实回归仍未稳定;按用户要求改为先升级 ONLYOFFICE。",
"timestamp": "2026-04-14T18:08:23Z"
},
{
"timestamp": "2026-04-15T11:53:44Z",
"step": 2,
"total": 2,
"description": "OnlyOffice 回归已由 task-023/task-024 取代并完成;原 failed 原因仅为用户调整顺序,先升级再重连。"
}
],
"completed_at": "2026-04-15T11:53:44Z"
},
{
"id": "task-023",
"title": "升级 ONLYOFFICE 文档服务到当前可用稳定版本,并对齐静态资源、WebSocket 代理、自定义插件与 callback/forcesave 基线",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-017"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "curl -I -sS --max-time 20 http://127.0.0.1:8082/web-apps/apps/api/documents/api.js && curl -I -sS --max-time 20 http://127.0.0.1:3001/onlyoffice-server/web-apps/apps/api/documents/api.js && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts src/app/onlyoffice-server/[...path]/route.ts src/app/cache/[...path]/route.ts src/lib/onlyoffice/internal-url.ts",
"timeout_seconds": 1800
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "已确认升级目标改为 ONLYOFFICE DocumentServer 9.3.1,并发现当前 8082 容器仍由 mnote-rust/infra/onlyoffice/docker-compose.yml 驱动。",
"timestamp": "2026-04-14T18:20:18Z"
},
{
"step": 2,
"total": 3,
"description": "已在当前主仓新增 infra/onlyoffice/docker-compose.yml 与 README,并确认 onlyoffice/documentserver:9.3.1 镜像已成功拉取。",
"timestamp": "2026-04-14T18:25:24Z"
},
{
"step": 3,
"total": 3,
"description": "已用当前主仓 compose 接管 8082,容器升级到 onlyoffice/documentserver:9.3.1,且 8082 与 3001 的 api.js 探测均返回 200。",
"timestamp": "2026-04-14T18:40:31Z"
}
],
"completed_at": "2026-04-14T18:40:31Z"
},
{
"id": "task-024",
"title": "在升级后的 ONLYOFFICE 基线上,重新连接页面打开、签名、代理、callback、forcesave、自定义插件桥与 Rust 内核接缝,并完成真实浏览器回归与 checklist 收口",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-023"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "node /mnt/Data1T/mnote/scripts/task022-onlyoffice-ui-regression.js && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts src/app/onlyoffice-server/[...path]/route.ts src/app/cache/[...path]/route.ts src/lib/onlyoffice/internal-url.ts",
"timeout_seconds": 2400
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已修复 /onlyoffice/plugins/* 放行与 agent-tools 非可视插件配置,升级后 scripts/task022-onlyoffice-ui-regression.js 真实浏览器回归通过,签名/代理/callback/forcesave/插件桥闭环正常。",
"timestamp": "2026-04-14T18:40:31Z"
}
],
"completed_at": "2026-04-14T18:40:31Z"
},
{
"id": "task-025",
"title": "把 OnlyOffice callback 附件写回链接到统一 bridge/Rust 协议边界:补最小 media asset writeback command、storage-convex-bridge 映射与 Next route 执行器,替换 callback 里的直连 Convex mutation",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-024"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p core-protocol -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/onlyoffice/callback/route.ts src/lib/documents/bridge.ts && node /mnt/Data1T/mnote/scripts/task022-onlyoffice-ui-regression.js",
"timeout_seconds": 2400
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "已在升级后的 9.3.1 基线下继续推进 Rust 接缝,当前锁定 callback 附件写回链,因为这条链仍直接调用 Convex mediaAssets mutation。",
"timestamp": "2026-04-14T18:43:06Z"
},
{
"step": 2,
"total": 3,
"description": "已补 media.assets.replace_storage 最小命令、ReplaceMediaAssetStorage 协议对象、storage-convex-bridge 映射,以及 OnlyOffice callback 的显式 actor bridge context 与写回执行器。",
"timestamp": "2026-04-14T20:07:16Z"
},
{
"step": 3,
"total": 3,
"description": "已通过 Rust 单测、bridge/callback route 定向测试、定向 eslint 与真实 scripts/task022-onlyoffice-ui-regression.js;期间通过重新注册 Convex functions 修复了 auth:signIn 缺失导致的登录页卡死。",
"timestamp": "2026-04-14T20:07:16Z"
}
],
"completed_at": "2026-04-14T20:07:16Z"
},
{
"id": "task-026",
"title": "基于 design/rust-kernel-replacement-roadmap-v1.md 建立真实 Rust bridge/runtime 目录与最小执行样板,让至少一条读链和两条写链从 Web route 真实进入 Rust 执行器",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-025"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/documents/content/route.ts src/app/api/documents/title/route.ts src/app/api/documents/save/route.ts src/lib/documents/bridge.ts",
"timeout_seconds": 2400
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "初始化 rust/bridge/ 目录与最小 runtime executor,不再只在 TypeScript 中模拟 Rust request",
"timestamp": null
},
{
"step": 2,
"total": 3,
"description": "优先打通 documents.content、documents.title、documents.save 的 Web -> Rust -> Convex 样板链",
"timestamp": null
},
{
"step": 3,
"total": 3,
"description": "补对应 smoke/单测,并在路线图与 checklist 中记录真实 Rust 执行入口已建立",
"timestamp": null
},
"已确定 task-026 最小样板边界:新增 Rust bridge runtime 二进制,先接管 documents.content.get、documents.title.update、documents.save 的执行计划与参数映射,TS 仅保留 Convex transport。",
"已完成 Phase 1 最小样板:新增 bridge-runtime crate 与 rust/bridge 目录说明,documents.content.get / documents.title.update / documents.save 现已先经 Rust 生成执行计划,再由 TS 仅做 Convex transportcargo test 全 workspace、bridge.test.ts、定向 eslint 与 runtime stdin 烟测均通过。"
],
"completed_at": "2026-04-14T23:32:53Z"
},
{
"id": "task-027",
"title": "把 mnote-cli 并入主仓 Rust workspace,先冻结 page/block/search/sidebar/tool 的最小命令面与 --json 输出协议",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-026"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo check --manifest-path rust/Cargo.toml && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p mnote-cli",
"timeout_seconds": 2400
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "新增 rust/crates/mnote-cli 并接入 workspace members",
"timestamp": null
},
{
"step": 2,
"total": 3,
"description": "冻结 page/block/search/sidebar/tool 五类最小命令面与 --json 输出协议",
"timestamp": null
},
{
"step": 3,
"total": 3,
"description": "补 CLI smoke,确保 CLI 与 Web 共享同一 Rust 执行面而不是第二套实现",
"timestamp": null
},
"已并入 mnote-cli:新增主仓 workspace crate,冻结 page/block/search/sidebar/tool 五类最小命令面与 --json 输出协议,cargo check/test -p mnote-cli 通过,workspace 全量 cargo test 通过,CLI page get --json 烟测输出稳定。"
],
"completed_at": "2026-04-14T23:49:31Z"
},
{
"id": "task-028",
"title": "完成页面系统 Rust 化第一批:把 documents.create/move/delete/restore/duplicate/copy-tree 收口到 Rust commandNext route 仅保留 transport 包装",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-026",
"task-027"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/documents/create/route.ts src/app/api/documents/move/route.ts src/app/api/documents/delete/route.ts src/app/api/documents/restore/route.ts src/app/api/documents/duplicate/route.ts src/app/api/documents/copy-tree/route.ts",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "为页面生命周期操作补齐 Rust domain model、command、storage-convex-bridge 映射",
"timestamp": null
},
{
"step": 2,
"total": 3,
"description": "让 create/move/delete/restore/duplicate/copy-tree 进入统一 Rust command 执行链",
"timestamp": null
},
{
"step": 3,
"total": 3,
"description": "补页面树与回收站回归,并标注可退役的旧 TS 业务逻辑",
"timestamp": null
},
{
"step": 4,
"total": 4,
"description": "已把 documents.create/move/delete/restore/duplicate/copy-tree 收口到 Rust command + page adapterConvex functions 刷新、cargo test、bridge vitest 与定向 eslint0 error)已通过",
"timestamp": "2026-04-15T01:36:12Z"
}
],
"completed_at": "2026-04-15T01:36:12Z"
},
{
"id": "task-029",
"title": "完成块系统 Rust 化第一批:把 blocks.get/patch/move/embed 与 AI 文档写入工具统一到 Rust block ops 协议",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-026",
"task-027"
],
"attempts": 0,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/blocks/get/route.ts src/app/api/blocks/patch/route.ts src/app/api/blocks/move/route.ts src/app/api/blocks/embed/route.ts src/components/editor/blocknote-editor.tsx src/components/editor/DocumentAiAgentPanel.tsx",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "已补 blocks.get/patch/move/embed 的 Rust query/command 契约,并让前端 blocks route 统一经 block adapter + Rust plan 进入保存链",
"timestamp": "2026-04-15T02:51:38Z"
},
{
"step": 2,
"total": 3,
"description": "AI 文档写入工具已改为共享块快照 adapterdoc_insert_blocks/doc_replace_range 不再直连旧 saveBlocks 路径",
"timestamp": "2026-04-15T02:51:38Z"
},
{
"step": 3,
"total": 3,
"description": "已通过全量 cargo test 与 task-029 指定 eslint 验证;BlockNote/AI 面仅保留交互和快照替换职责",
"timestamp": "2026-04-15T02:51:38Z"
},
{
"step": 2,
"total": 3,
"description": "AI 文档写入工具改为复用纯 block ops 适配层,不再依赖长期的 loadBlocks/saveBlocks 直连路径",
"timestamp": "2026-04-15T02:17:43Z"
}
],
"completed_at": "2026-04-15T02:51:38Z"
},
{
"id": "task-030",
"title": "把 search.documents/search.recent/sidebar.dataset.list 收口到 Rust query/index-fts 主链,停止在 TS route 中持有召回、排序和 snippet 逻辑",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-026",
"task-027"
],
"attempts": 0,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p index-fts -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/search/documents/route.ts src/app/api/search/recent/route.ts src/app/api/sidebar/route.ts src/lib/server/sidebar-data.ts",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "已让 search.documents、search.recent、sidebar.dataset.list 进入 Rust query/runtime 主链,route 不再持有核心 ranking/snippet 逻辑",
"timestamp": "2026-04-15T03:55:00Z"
},
{
"step": 2,
"total": 3,
"description": "已把 index-fts 接入产品搜索主路径,新增 evaluate_search_documents 负责召回合并、高亮 snippet 与 OCR 待补队列决策",
"timestamp": "2026-04-15T03:55:30Z"
},
{
"step": 3,
"total": 3,
"description": "已通过 cargo test -p index-fts -p storage-convex-bridge -p bridge-runtime 与 task-030 指定 eslinttsc 失败仍为仓库既有 Convex/类型问题,非本次新增",
"timestamp": "2026-04-15T03:56:00Z"
}
],
"completed_at": "2026-04-15T03:56:00Z"
},
{
"id": "task-031",
"title": "为 Rust 内核建立统一 Tool 协议与注册表,让 CLI 与 AI 共享 doc_get/doc_find/doc_insert_blocks/doc_replace_range 等一组同源工具",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-027",
"task-029"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/ai-agent/run/route.ts src/components/editor/DocumentAiAgentPanel.tsx",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "在 Rust 侧建立 Tool protocol、tool registry 与统一错误码/审计模型",
"timestamp": "2026-04-15T05:58:48Z"
},
{
"step": 2,
"total": 3,
"description": "让 AI 与 CLI 共用同一批文档工具,不再依赖前端私有工具注册表作为写入真入口",
"timestamp": "2026-04-15T05:58:48Z"
},
{
"step": 3,
"total": 3,
"description": "补 dry-run、validate-only、explain-plan 等安全模式并验证 trace/event 可回查",
"timestamp": "2026-04-15T05:58:48Z"
}
],
"completed_at": "2026-04-15T06:01:57Z"
},
{
"id": "task-032",
"title": "并入 adapter-mindmap,形成可被 Web/CLI/AI 共用的 Rust mindmap ops 协议与执行层",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-029",
"task-031"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/mindmap/[docId]/route.ts src/app/api/mindmap/[docId]/[mindmapId]/route.ts src/lib/mindmap/mindmapOps.ts src/components/editor/blocks/MindmapBlock.tsx",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "把 adapter-mindmap 并入主仓并冻结节点树、节点引用、节点操作日志协议",
"timestamp": "2026-04-15T07:15:09Z"
},
{
"step": 2,
"total": 3,
"description": "让 Mindmap 的 get/put/op 可由 CLI 与 AI 直接调用",
"timestamp": "2026-04-15T07:21:09Z"
},
{
"step": 3,
"total": 3,
"description": "补 Mindmap 浏览器回归和 CLI smoke,确认前端形态不变而执行层已切换",
"timestamp": "$TS"
}
],
"completed_at": "$TS"
},
{
"id": "task-033",
"title": "并入 adapter-onlyoffice,把 sign/proxy/callback/forcesave/session 收口到 Rust 对象适配层,OnlyOffice 前端页只保留 transport 与展示职责",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-025",
"task-031"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts src/app/onlyoffice/OnlyOfficeClientPage.tsx && node /mnt/Data1T/mnote/scripts/task022-onlyoffice-ui-regression.js",
"timeout_seconds": 3600
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "已并入 adapter-onlyoffice,补齐 asset/session/sign/proxy/callback/forcesave 的 Rust 对象边界与 tool registry",
"timestamp": "2026-04-15T08:02:28Z"
},
{
"step": 2,
"total": 3,
"description": "OnlyOffice sign/proxy/callback/forcesave route 已收口为共享 adapter + Rust tool 包装,前端页只保留展示与 transport 组装",
"timestamp": "2026-04-15T08:02:28Z"
},
{
"step": 3,
"total": 3,
"description": "已通过 Rust workspace 测试、OnlyOffice 定向 vitest/eslint 与真实 task022 浏览器回归;并修正 mnote-env.json 与回归脚本默认端口到 3000",
"timestamp": "2026-04-15T08:02:28Z"
}
],
"completed_at": "2026-04-15T08:02:28Z"
},
{
"id": "task-034",
"title": "建立 Rust 内核统一观测面:补全 command/event/request/trace 的全域落账、幂等、冲突、回放和索引重建命令,作为 CLI 与 AI 稳定运行前置条件",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-026",
"task-027",
"task-031"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/bridge/request/route.ts src/app/api/bridge/trace/route.ts src/lib/documents/bridge-log.ts",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "已统一 bridge request/trace/command 的 Rust query/tool 协议,并让 /api/bridge/request 与 /api/bridge/trace 切到 Rust runtime transport 主链",
"timestamp": "2026-04-15T08:40:21Z"
},
{
"step": 2,
"total": 3,
"description": "已补 event_replay 与 index_rebuild 恢复命令,bridge-runtime 可直接输出回放/重建摘要,cargo test 与 bridge 定向 eslint 已通过",
"timestamp": "2026-04-15T08:40:21Z"
},
{
"step": 3,
"total": 3,
"description": "已同步路线图、missing-targets、phase checklist 与 core 设计文档,把统一观测面写成 Rust cutover 的硬前置条件",
"timestamp": "2026-04-15T08:40:21Z"
}
],
"completed_at": "2026-04-15T08:40:21Z"
},
{
"id": "task-035",
"title": "制定并执行旧 TS 执行面退役清单:按路线图阶段标记哪些 route 仅剩 transport,哪些业务逻辑允许删除,并形成 Rust 成为唯一业务执行平面的最终 cutover 文档",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-028",
"task-029",
"task-030",
"task-031",
"task-032",
"task-033",
"task-034"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\nroadmap = (root/'design/rust-kernel-replacement-roadmap-v1.md').read_text(encoding='utf-8')\nmissing = (root/'design/rust-kernel-missing-targets.md').read_text(encoding='utf-8')\nassert 'Phase 8:旧内核退役与总割接' in roadmap\nassert '仍缺一条“从旧内核切换到新内核”的明确割接路线' in missing\nprint('task-035-planned')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "已按能力域盘点主仓 route,明确页面、块、查询、AI、Mindmap、OnlyOffice 分别属于 Rust owner、transport keep 或旧 TS 兼容面",
"timestamp": "2026-04-15T09:01:04Z"
},
{
"step": 2,
"total": 3,
"description": "已补最终 cutover 文档,写清 Phase 8 四组 gate、允许删除与必须保留的 Web 壳,以及旧 TS 执行面退役顺序",
"timestamp": "2026-04-15T09:01:04Z"
},
{
"step": 3,
"total": 3,
"description": "已同步 roadmap、missing-targets、phase checklist 与 release audit,并通过 task-035 验证脚本",
"timestamp": "2026-04-15T09:01:04Z"
}
],
"completed_at": "2026-04-15T09:01:04Z"
},
{
"id": "task-036",
"title": "页面兼容旧面第一批 Rust 化:把 documents/create-child、documents/embed、documents/template 收口到统一 page command/query adapterroute 仅保留 transport",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-035"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p bridge-runtime -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/documents/create-child/route.ts src/app/api/documents/embed/route.ts src/app/api/documents/template/route.ts src/lib/documents/page-command-adapter.ts src/lib/documents/page-lifecycle-command-adapter.ts",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已把 documents/create-child、documents/embed、documents/template 收口到统一 page command adapterroute 仅保留 transport 转发。",
"timestamp": "2026-04-15T11:03:14Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 route-adapters/bridge 定向测试与 task-036 指定 cargo+eslint 验证;当前业务规则已集中到 page-command-adapter。",
"timestamp": "2026-04-15T11:03:14Z"
}
],
"completed_at": "2026-04-15T11:03:14Z"
},
{
"id": "task-037",
"title": "页面兼容旧面第二批 Rust 化:把 documents/empty-trash、documents/purge 收口到 Rust lifecycle command,并切断 route 内直连 Convex 业务逻辑",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-036"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p bridge-runtime -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/documents/empty-trash/route.ts src/app/api/documents/purge/route.ts src/lib/documents/page-lifecycle-command-adapter.ts src/lib/documents/bridge-log.ts",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已把 documents/empty-trash、documents/purge 收口到统一 page command adapter,并补统一失败落账入口。",
"timestamp": "2026-04-15T11:03:14Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 task-037 指定 cargo+eslint 验证;页面旧面第二批已降级为 transport route + adapter 执行。",
"timestamp": "2026-04-15T11:03:14Z"
}
],
"completed_at": "2026-04-15T11:03:14Z"
},
{
"id": "task-038",
"title": "Mindmap 剩余旧面收口:把 mindmap-trash/empty 与 mindmap-ai/* 迁到 Rust mindmap adapter/tool,明确 route 只做产品编排而不是对象规则真入口",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-035"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p core-protocol -p bridge-runtime -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/mindmap-trash/empty/route.ts src/app/api/mindmap-ai/agent/route.ts src/app/api/mindmap-ai/assets/route.ts src/app/api/mindmap-ai/expand-node/route.ts src/app/api/mindmap-ai/outline-to-mindmap/route.ts src/lib/mindmap/mindmapOps.ts",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已确认 mindmap-trash/empty 与 mindmap-ai 主路径接入 Rust tool/runtimemindmap_empty_trash、mindmap_apply_ops 等工具已被 route 调用。",
"timestamp": "2026-04-15T11:06:05Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 task-038 指定 cargo test 与 eslint;保留仓库既有 unused/no-explicit-any warnings,但无新 error。",
"timestamp": "2026-04-15T11:06:05Z"
}
],
"completed_at": "2026-04-15T11:06:05Z"
},
{
"id": "task-039",
"title": "建立 AI 工具 cutover 矩阵:盘点 builtins/**、ai-agent/run 余下工具与 Rust Tool registry 的一一对应,并冻结迁移顺序与删除清单",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-035"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\ntext = Path('/mnt/Data1T/mnote/design/ai-tool-cutover-matrix.md').read_text(encoding='utf-8')\nfor needle in ['docsServerTools', 'mediaServerTools', 'mindmapServerTools', 'onlyofficeServerTools', 'registryBuiltins', 'ai-agent/run']:\n assert needle in text, needle\nprint('task-039-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已新增 ai-tool-cutover-matrix,覆盖 docsServerTools、mediaServerTools、mindmapServerTools、onlyofficeServerTools、registryBuiltins 与 ai-agent/run 的一一对应矩阵。",
"timestamp": "2026-04-15T11:03:14Z"
},
{
"step": 2,
"total": 2,
"description": "已补 search_web/image_read/slash_run 的 Rust tool registry 对照,并通过 task-039 文档校验。",
"timestamp": "2026-04-15T11:03:14Z"
}
],
"completed_at": "2026-04-15T11:03:14Z"
},
{
"id": "task-040",
"title": "迁移 AI 非 doc_* 核心工具到 Rust Tool runtime,收缩 ai-agent/run 与 builtins/** 私有真入口,只保留 client-tool-result 这类 transport 壳",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-039"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": null,
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p bridge-runtime -p mnote-cli && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/ai-agent/run/route.ts src/app/api/ai-agent/client-tool-result/route.ts src/lib/ai-agent/tools/builtins/registryBuiltins.ts src/lib/ai-agent/tools/builtins/media/mediaServerTools.ts src/lib/ai-agent/tools/builtins/searchWeb.ts src/lib/ai-agent/tools/builtins/slash/slashServerTools.ts src/lib/ai-agent/tools/builtins/onlyoffice/onlyofficeServerTools.ts",
"timeout_seconds": 3600
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"at": "2026-04-15T11:32:44Z",
"description": "已补 bridge-runtime 对 search_web/image_read/slash_run 的 tool plan 与 slash 结果解析,ai-agent/run 不再保留 search_web 的 TS fallbackmedia/slash builtins 只剩 transport helper。"
},
{
"at": "2026-04-15T11:32:44Z",
"description": "已通过 cargo test -p bridge-runtime -p mnote-cli 与 task-040 指定 eslint;仅剩仓库既有 any/unused warnings。"
}
],
"completed_at": "2026-04-15T11:32:44Z"
},
{
"id": "task-041",
"title": "补齐统一观测面 workspace 总览、分页与按对象/状态过滤,让 bridge 查询成为 cutover 阶段的正式运营与回查入口",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-035"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "de35d423",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p bridge-runtime -p mnote-cli && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/bridge/request/route.ts src/app/api/bridge/trace/route.ts src/lib/documents/bridge-log.ts",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已补 bridge.workspace.overview 观测链路:Convex bridgeLogs 新增 workspace 总览、分页与按状态/对象过滤,Rust runtime 与 Next route 已连通。",
"timestamp": "2026-04-15T10:50:15Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 cargo test -p bridge-runtime -p storage-convex-bridge、bridge.test.ts 与定向 eslint;仅保留仓库既有 no-explicit-any warnings。",
"timestamp": "2026-04-15T10:50:15Z"
}
],
"completed_at": "2026-04-15T10:50:15Z"
},
{
"id": "task-042",
"title": "把失败态、冲突态与补偿态统一落账到 bridge-log/runtime,覆盖页面主写链与 AI、Mindmap 写链,完成 cutover 所需状态语义闭环",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-037",
"task-038",
"task-040",
"task-041"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": null,
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p bridge-runtime -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/bridge.test.ts && pnpm exec eslint src/lib/documents/bridge-log.ts src/lib/documents/page-command-adapter.ts src/lib/documents/page-lifecycle-command-adapter.ts src/app/api/ai-agent/run/route.ts src/lib/mindmap/mindmapOps.ts",
"timeout_seconds": 3600
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"at": "2026-04-15T11:32:44Z",
"description": "已补 bridge-log 失败/补偿状态语义、metadata command 失败落账,以及 AI/Mindmap 写链的统一失败态记录;mindmap 本地 ops 冲突不再伪装成功。"
},
{
"at": "2026-04-15T11:32:44Z",
"description": "已通过 cargo test -p bridge-runtime -p storage-convex-bridge、src/lib/documents/bridge.test.ts 与 task-042 指定 eslint;仅剩仓库既有 any/unused warnings。"
}
],
"completed_at": "2026-04-15T11:32:44Z"
},
{
"id": "task-043",
"title": "按 cutover 文档执行第一批 TS_LEGACY_DELETE:先停写并切调用方,再删除已被 Rust 替代的 builtins 服务端真入口与过渡 helper",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-037",
"task-038",
"task-040"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": null,
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\ntext = Path('/mnt/Data1T/mnote/design/rust-kernel-legacy-delete-list.md').read_text(encoding='utf-8')\nfor needle in ['documents/create-child', 'documents/embed', 'documents/empty-trash', 'documents/purge', 'documents/template', 'mindmap-trash/empty', 'builtins/**']:\n assert needle in text, needle\nprint('task-043-ok')\nPY && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/ai-agent/run/route.ts src/app/api/mindmap-ai/agent/route.ts src/app/api/documents/create-child/route.ts src/app/api/documents/purge/route.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"at": "2026-04-15T11:32:44Z",
"description": "已新增 rust-kernel-legacy-delete-list.md,冻结第一批 TS_LEGACY_DELETE 清单:documents/create-child/embed/empty-trash/purge/template、mindmap-trash/empty、builtins/**。"
},
{
"at": "2026-04-15T11:32:44Z",
"description": "已通过 task-043 文档校验与指定 eslint;仅剩仓库既有 any/unused warnings。"
}
],
"completed_at": "2026-04-15T11:32:44Z"
},
{
"id": "task-044",
"title": "完成 Phase 8 cutover 最终验证与文档回写,确认剩余 Web route 全部降级为 TS_TRANSPORT_KEEP 或 Rust owner,并形成可对外宣布的统一口径",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-037",
"task-038",
"task-040",
"task-041",
"task-042",
"task-043"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": null,
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\ncutover = (root/'design/rust-kernel-cutover-v1.md').read_text(encoding='utf-8')\naudit = (root/'design/release-readiness-source-audit.md').read_text(encoding='utf-8')\nchecklist = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert 'Rust 已成为 mnote 的唯一业务执行平面' in cutover\nassert 'TS_TRANSPORT_KEEP' in cutover\nassert 'Phase 8' in checklist\nassert 'release readiness' in audit.lower() or 'source audit' in audit.lower()\nprint('task-044-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"at": "2026-04-15T11:32:44Z",
"description": "已回写 cutover/release-audit/phase-checklist/missing-targets,补齐 Phase 8 最终口径、TS_TRANSPORT_KEEP/TS_LEGACY_DELETE 边界与可对外宣布文案。"
},
{
"at": "2026-04-15T11:32:44Z",
"description": "已通过 task-044 文档校验脚本。"
}
],
"completed_at": "2026-04-15T11:32:44Z"
}
],
"session_count": 21,
"last_session": "2026-04-15T11:53:44Z"
}