{ "version": 2, "created": "2026-04-19T15:01:07Z", "session_config": { "concurrency_mode": "exclusive", "max_tasks_per_session": 8, "max_sessions": 80 }, "tasks": [ { "id": "task-001", "title": "执行 P0.5-1:冻结主编辑器接入点与 runtime shell 退场策略,明确真实文档页切流入口、flag、debug/prototype 边界", "status": "completed", "priority": "P0", "depends_on": [], "attempts": 1, "max_attempts": 3, "started_at_commit": "a0edc9d1", "validation": { "command": "python3 - <<'PY'\nfrom pathlib import Path\npath = Path('/mnt/Data1T/mnote/design/05-editor-mainline/process/5-1-main-editor-cutover-entry-v1.md')\ntext = path.read_text(encoding='utf-8')\nassert '主编辑器接入点' in text\nassert 'runtime shell' in text\nassert 'debug/prototype' in text\nprint('task-001-cutover-entry-doc-ok')\nPY", "timeout_seconds": 120 }, "on_failure": { "cleanup": null }, "error_log": [], "checkpoints": [ { "step": 1, "total": 1, "description": "已冻结真实文档页主链、DocumentContent 接入点、切流 flag 归属,以及 runtime shell 仅保留 debug/prototype 的边界。", "timestamp": "2026-04-19T15:29:25Z" } ], "completed_at": "2026-04-19T15:29:25Z" }, { "id": "task-002", "title": "执行 P0.5-2:把 leptos-tiptap host 接入真实文档页壳与真实路由,退出 localhost:8123 作为唯一验证入口的状态", "status": "completed", "priority": "P0", "depends_on": [ "task-001" ], "attempts": 1, "max_attempts": 3, "started_at_commit": "a0edc9d1", "validation": { "command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/components/editor/main-editor-host.test.tsx && cd /mnt/Data1T/mnote && node test/scripts/block-editor-main-editor-smoke.js", "timeout_seconds": 900 }, "on_failure": { "cleanup": null }, "error_log": [], "checkpoints": [ { "step": 1, "total": 1, "description": "已改为真实 /documents/[id] 承载 8123 runtime,去掉 bridge 假壳,补齐 embed/postMessage 协议,并通过自动拉起 8123 的 smoke 验收截图。", "timestamp": "2026-04-19T18:24:24Z" } ], "completed_at": "2026-04-19T18:24:24Z" }, { "id": "task-003", "title": "执行 P0.5-3:引入稳定 block_id 策略,明确 Rust EditorBlock.block_id 为真相,Tiptap UniqueID 仅作 runtime 辅助", "status": "pending", "priority": "P0", "depends_on": [ "task-001" ], "attempts": 0, "max_attempts": 3, "started_at_commit": null, "validation": { "command": "cargo test -p core-protocol editor_block_id && cargo test -p mnote-web editor_block_id_bridge", "timeout_seconds": 600 }, "on_failure": { "cleanup": null }, "error_log": [], "checkpoints": [], "completed_at": null }, { "id": "task-004", "title": "执行 P0.5-4:打通 EditorBlockDocument -> Tiptap doc 最小 load adapter,先覆盖 Paragraph/Heading/BulletListItem/NumberedListItem/Todo/Quote/CodeBlock", "status": "pending", "priority": "P0", "depends_on": [ "task-002", "task-003" ], "attempts": 0, "max_attempts": 3, "started_at_commit": null, "validation": { "command": "cargo test -p mnote-web tiptap_load_adapter && cargo test -p mnote-editor-core editor_block_roundtrip_load", "timeout_seconds": 900 }, "on_failure": { "cleanup": null }, "error_log": [], "checkpoints": [], "completed_at": null }, { "id": "task-005", "title": "执行 P0.5-5:打通 Tiptap doc -> EditorBlockDocument 最小 save adapter,并把真实页面保存链接到 Rust truth", "status": "pending", "priority": "P0", "depends_on": [ "task-002", "task-003", "task-004" ], "attempts": 0, "max_attempts": 3, "started_at_commit": null, "validation": { "command": "cargo test -p mnote-web tiptap_save_adapter && cargo test -p mnote-editor-core editor_block_roundtrip_save", "timeout_seconds": 900 }, "on_failure": { "cleanup": null }, "error_log": [], "checkpoints": [], "completed_at": null }, { "id": "task-006", "title": "执行 P0.5-6:对齐最小块类型映射与 reload/re-enter 稳定性,确保常用块在真实页面中可稳定往返", "status": "pending", "priority": "P0", "depends_on": [ "task-004", "task-005" ], "attempts": 0, "max_attempts": 3, "started_at_commit": null, "validation": { "command": "cargo test -p core-protocol editor_block_schema && cargo test -p mnote-web editor_reload_roundtrip", "timeout_seconds": 900 }, "on_failure": { "cleanup": null }, "error_log": [], "checkpoints": [], "completed_at": null }, { "id": "task-007", "title": "执行 P0.5-7:对齐最小 EditorCommand 合同,先覆盖 ReplaceBlock/InsertBlockAfter/DeleteBlock/SplitBlock/MergeWithPrevious/MoveBlock", "status": "pending", "priority": "P0", "depends_on": [ "task-005", "task-006" ], "attempts": 0, "max_attempts": 3, "started_at_commit": null, "validation": { "command": "cargo test -p core-protocol editor_command_catalog && cargo test -p mnote-web editor_command_mapping", "timeout_seconds": 900 }, "on_failure": { "cleanup": null }, "error_log": [], "checkpoints": [], "completed_at": null }, { "id": "task-008", "title": "执行 P0.5-8:把当前已有的 slash、floating toolbar、左侧手柄、块菜单、turn into 迁入主编辑器,并按官方行为模型微调", "status": "pending", "priority": "P0", "depends_on": [ "task-002", "task-006" ], "attempts": 0, "max_attempts": 3, "started_at_commit": null, "validation": { "command": "cargo test -p mnote-web tiptap_surface_ui && cd /mnt/Data1T/mnote && node test/scripts/block-editor-interaction-smoke.js", "timeout_seconds": 1200 }, "on_failure": { "cleanup": null }, "error_log": [], "checkpoints": [], "completed_at": null }, { "id": "task-009", "title": "执行 P0.5-9:为图片上传、表格、页面引用、块引用、heading collapse、普通块缩进增强建立显式降级和 feature guard,避免污染正式合同", "status": "pending", "priority": "P0", "depends_on": [ "task-004", "task-005" ], "attempts": 0, "max_attempts": 3, "started_at_commit": null, "validation": { "command": "cargo test -p mnote-web editor_feature_guards && python3 - <<'PY'\nfrom pathlib import Path\npath = Path('/mnt/Data1T/mnote/design/05-editor-mainline/process/5-1-main-editor-cutover-entry-v1.md')\ntext = path.read_text(encoding='utf-8')\nassert '未支持能力降级' in text or '降级策略' in text\nprint('task-009-feature-guard-doc-ok')\nPY", "timeout_seconds": 600 }, "on_failure": { "cleanup": null }, "error_log": [], "checkpoints": [], "completed_at": null }, { "id": "task-010", "title": "执行 P0.5-10:建立主编辑器验收链路,覆盖打开文档、编辑常用块、slash 插入、turn into、刷新保留、再次进入保留", "status": "pending", "priority": "P0", "depends_on": [ "task-005", "task-006", "task-007", "task-008", "task-009" ], "attempts": 0, "max_attempts": 3, "started_at_commit": null, "validation": { "command": "cd /mnt/Data1T/mnote && node test/scripts/block-editor-main-editor-acceptance.js && cargo test -p mnote-web main_editor_acceptance", "timeout_seconds": 1800 }, "on_failure": { "cleanup": null }, "error_log": [], "checkpoints": [], "completed_at": null } ], "session_count": 2, "last_session": "2026-04-19T18:24:24Z" }