- 统一 local-first MVP 后阶段架构口径,补充 process 执行总序和 Reasonix 协作记录 - 归档已完成的 design checklist,标注参考型 process,更新 AGENTS/REASONIX/架构文档 - 补充文件树/主编辑器下载与上下文菜单相关实现、bug 记录和 smoke 脚本 验证:git diff --check;codegraph sync .;cargo test -p mnote-web;node --check scripts/task476-filetree-editor-context-menu-download-smoke.js
14 KiB
14 KiB
Design Governance Report — Worker B: 04-tree-domain
生成时间: 2026-05-21
范围:design/04-tree-domain/process/全部 12 个 process 文档
状态: 只读审查,未修改任何design/文件
Executive Summary
审查 12 个 process 文档,建议分布:
| 状态 | 数量 | 文档 |
|---|---|---|
| archive-done | 6 | 4-27, 4-39, 4-40, 4-41, 4-42, 4-43 |
| keep-process | 5 | 4-28, 4-34, 4-38, 4-44, 4-45 |
| mark-process-reference | 1 | 4-23 |
最高风险项:
- 4-45 checklist 完全未执行 — 4 项全部未勾选,Worker D 停留在计划阶段未产出任何变更
- 4-34 local folder 子项仍无 no-refresh 证据 — Convex 侧已全部通过但 local folder 侧仍标 reload,这是 dual-browser 矩阵的唯一缺口
- 4-44 仍有 3 个 browser smoke 未勾选 — Rust 代码改动已合入但 task430/task471 及新增 smoke 未通过
- 4-28 React DOM focus 仍缺浏览器证据 — 核心 restore location 已实现但前端焦点行为未验证
逐文档审查
4-23 — Local / Cloud 显式桥接 P3 候选合同 v1
建议状态:mark-process-reference
- 证据: 这是 P3 候选设计合同,定义了
tree.bridge.import/export/publish/sync的 preview/execute 契约。文档无 checklist、无 code change、无 execution record。 - 归档/保留原因: 这是一个候选策略文档,不是执行 checklist。P3 未排入当前 sprint,文档本身定义了清晰的 done gate(P0/P1/P2 smoke 全绿+preview UI 组件复用+rollback plan+浏览器 smoke)。作为长期架构参考保留比归档更有价值。
- 补充说明: 文档质量高,边界定义清晰。建议在文档头部加注 "P3 Candidate — 未进入实现,参考保留"。
4-27 — Resource Lifecycle Command Cutover v1
建议状态:archive-done
- 证据:
- Section 2 "已落地范围" 列出 7 个已实现条目:
bridge-runtime新增 4 个命令计划、storage-convex-bridge映射、wolai-frontend/api/media/batch和/api/media/purge迁移、mnote-webRust 3000 兼容 alias。 - Section 3 的 "未完成边界"(双浏览器 no-refresh、reveal/focus、projection delta)已由 4-34 和 4-28 覆盖。
- Section 7 "剩余边界"(rename 仅覆盖附件、empty-trash 仍为批量合同、前端 Sidebar 仍走旧 URL)是有意保留的边界,非未完成任务。
- Section 8 sub-stage(local_folder file_path resource lifecycle)已全部合入并通过:
tree.resource.archive/restore/purge进入.mnote/trash,trash-index.json,task437smoke 通过。 - 2026-05-15 验收测试全部:4 项
cargo test通过,2 项 wolai-frontend 测试通过。
- Section 2 "已落地范围" 列出 7 个已实现条目:
- 归档原因: 核心命令切换已完成归档。未完成项已明确转移至后续文档(4-34/4-28)或是有意保留的边界(empty-trash 批量合同、rename 范围限制)。
- 补充说明: 归档前建议在文件头部加注引用
4-34(dual browser)、4-28(reveal/focus) 和4-37(trash modal) 作为后续入口。
4-28 — Trash Restore Location Reveal Focus v1
建议状态:keep-process
- 证据:
- 已落地:
restore_parent_id/restore_sort_orderschema,documents.softDelete快照写入,documents.restore位置恢复与 fallback 逻辑,Sidebar 恢复后展开 focus。 - 已验证:4 个测试文件(32 items)通过,
task429browser smoke 通过覆盖 restore_location/fallback/sort_order 无重复。 - Section 5 "待补" 仍有 2 项未完成:React Sidebar Drawer 的恢复后 DOM focus 缺浏览器证据;双浏览器 no-refresh 归入阶段 8。
- 已落地:
- 留存原因: React Sidebar Drawer DOM focus 的浏览器证据未补。当前 3000 主壳 smoke 已覆盖 "恢复后无需刷新可见/reveal",但 "DOM focus" 断言是 React Drawer 代码路径的独立验证。
- 补充说明: React DOM focus 是一个较小的缺口,可考虑在下一轮补充一个 focused smoke 后归档。
4-34 — Filetree Trash Dual Browser No Refresh v1
建议状态:keep-process
- 证据:
- Convex 侧全部通过:task432(页面) + task433(附件) + task434(mindmap/table) 双浏览器 no-refresh smoke 全部通过且记录了事件来源。
- task435(empty-trash 汇总) 作为 3.4 提及但无独立执行记录,不过其实已被 task432-434 的 empty-trash 子步骤覆盖。
- local folder 侧未完成:3.5 task436 无执行记录。文档明确标注 "非 md 本地资源文件 watcher / trash / restore / purge 仍单列为待补"。
- 完成标准要求 local folder 子项也通过 task436 或等价 smoke;当前状态标 reload,不能标 no-refresh。
- 留存原因: local folder 双浏览器 no-refresh 仍然是明确缺口。同时
resync_requireddelta 事件合同需在后续新增资源 route 时补回归。 - 补充说明: 建议将 Convex 侧已完成的部分在文档内打上标记(如
[Convex ✓]),只保留 local folder 暴露项作为未完成。
4-38 — FileTree Resource Lifecycle 与 Open Target 收口 Checklist v1
建议状态:keep-process
- 证据:
- 已勾选:
local-file:<relativePath>、resolve_local_raw_file_id、local-filerestore/purge 测试、local mindmap 单独删除入 trash index、local movesortOrder返回_unsupportedFields、Rustcargo test通过。 - 未勾选:扩展 File Tree open target、保留
local:asset:/local:node:兼容、前端 delete/bulk delete 优先走/api/tree/commands、browser smoke 覆盖全链、task437 继续通过。 - 执行记录确认 "未完成:File Tree open target 合同扩展、前端 delete/bulk delete 全面 cutover、浏览器垃圾箱资源行全链 smoke"。
- 已勾选:
- 留存原因: 虽然核心 Rust 变更已合入,但 open target 扩展已有 4-39 承接,前端 cutover 和 browser smoke 尚未完成。需待这些子项完成后归档。
- 补充说明: 建议在文档头部加注 "open target 合同由 4-39/4-42 覆盖;bulk delete 由 4-41 覆盖"。本文件的剩余项(前端 cutover + browser smoke)可浓缩后移至更轻量文档。
4-39 — FileTree Open Target 与 Resource Identity Checklist v1
建议状态:archive-done
- 证据:
- 全部 5 项 checklist 已勾选:扩展
FileTreeOpenTarget(LocalFile/Directoryvariant +resourceKind)、open target 包含 canonical identity、parse_open_target_from_row兼容旧格式、camelCase 序列化、Rust 单测通过。 - 验收全部通过:
cargo test -p mnote-web filetree_runtime、runtime_api、tree_shell_filetree_mode_embeds_asset_state全部通过。
- 全部 5 项 checklist 已勾选:扩展
- 归档原因: Checklist 全部完成。唯一剩余项 "上游 row dataset 补齐 rootUri" 已由 4-42 承接。
- 补充说明: 归档时建议在头部引用 4-42 作为 rootUri 补齐的后续文档。
4-40 — Resource Lifecycle Command Cutover 与垃圾箱 Smoke Checklist v1
建议状态:archive-done
- 证据:
- 从 7 项 checklist 中,6 项已勾选:旧 route 保留 fallback、command response 保留 artifact、trash workbench 显示 local resource、新增 browser smoke (task437 + task464)。
- 唯一未勾选项:"前端 local resource delete/bulk delete 优先调用
/api/tree/commandsarchive/purge/restore" — 这已被 4-41 覆盖。 - 验收全部通过:
task437、task464smoke 通过,cargo test resource_trash和cargo test tree_command_local_folder通过。
- 归档原因: 文档定义的 smoke 覆盖率目标已完成。前端 cutover 的剩余项已由 4-41 清晰承接。
4-41 — FileTree Bulk Resource Command Cutover Checklist v1
建议状态:archive-done
- 证据:
- 全部 6 项 checklist 已勾选:local file asset/mindmap/table bulk delete 使用 tree command、成功后刷新 snapshot/trash、失败保留错误、smoke 覆盖不同 resource kind。
- 验收全部通过:
task464、task471smoke 通过,cargo test sidebar_filetree_local_table_bulk_delete_uses_tree_command和tree_command_local_folder通过。
- 归档原因: Checklist 已全部完成。云端 table 保留旧 fallback 是有意保留的边界(已勾选禁止事项)。
4-42 — FileTree Open Target RootUri Contract Checklist v1
建议状态:archive-done
- 证据:
- 全部 5 项 checklist 已勾选:
FileTreeRuntimeEnvironment.rootUri、resolve_open_target使用 rootUri、SSR state 传入 rootUri、反序列化兼容缺失 rootUri、Rust 单测覆盖。 - 验收全部通过:3 项
cargo test全部通过。
- 全部 5 项 checklist 已勾选:
- 归档原因: 文档定义的 rootUri 合同已全部实现。这是 P0-4 的收尾文档,已经完成其使命。
4-43 — Local Folder Sort Order Persistence Checklist v1
建议状态:archive-done
- 证据:
- 全部 6 项 checklist 已勾选:
.mnote/file-order.json持久化、move sortOrder 写入、projection 消费排序记录、rename/archive/restore 后清理悬挂项、Rust 合同测试、browser smoke。 - 验收全部通过:
cargo test local_tree_command_move_with_sort_order和tree_command_local_folder通过,task472smoke 通过。
- 全部 6 项 checklist 已勾选:
- 归档原因: 完整的端到端实现。
_unsupportedFields.sortOrder退役记录清晰。
4-44 — FileTree Action Layer Paste / Drop / Delete Checklist v1
建议状态:keep-process
- 证据:
- Rust 代码已合入:
recordFileTreeAction/recordFileTreeActionStatus、右键paste-into使用菜单触发 row、layout.rsreadonly 阻断(data 属性标记 + alert fallback)、paste/drop preflight。 - 验收 2/5 已勾选:
cargo test -p mnote-web layout和tree_command_local_folder通过。 - 3 项验收未勾选:
node scripts/task430-vscode-explorer-stage7-smoke.js、node scripts/task471-local-folder-bulk-resource-trash-smoke.js、新增task47*-filetree-action-layer-smoke.js。
- Rust 代码已合入:
- 留存原因: Rust 侧变更已合入但 browser smoke 验证未通过。task471 的语义断言依赖 environment preparation(4-45 也依赖同一个环境)。无法在不验证 smoke 的情况下确认动作层行为正确。
- 补充说明: task430 的 workspace bootstrap 问题(4-45 提及)是前置阻塞项。建议先修复 task430 前置条件,再补全 4-44 的 smoke 验收。
4-45 — FileTree / Open Editors Lifecycle Link Checklist v1
建议状态:keep-process
- 证据:
- 全部 4 项 checklist 未勾选:
- "跑或修复 task430 / task471 的可复现前置条件" — 未完成
- "明确哪些 smoke 已过、哪些因环境阻塞" — 未完成
- "补充 open editor / filetree active row / lifecycle 状态断言建议" — 未完成
- "更新 4-44 checklist 执行记录" — 未完成
- 执行记录仅包含 Worker D 的讨论和计划,没有实际变更。
- 全部 4 项 checklist 未勾选:
- 留存原因: 这是一份非常新的文档(2026-05-21),所有项都未验证。它不是高复杂度文档,但需要解决 task430 workspace bootstrap 前置问题后才能推进。如果 task430 环境问题没有阻碍,可在 1-2 小时内完成所有 4 项。
- 补充说明: 这是一份"接通型"文档 — 它的主要目标是让 4-44 的 smoke 验证可复现,以及让 open editor state 可观测。建议优先修 task430 workspace bootstrap,这同时解除 4-44 和 4-45 的阻塞。
交叉依赖分析
4-23 ──→ P3 候选,不依赖其他文档
4-27 ──→ 核心 cutover,4-34/4-28 承接其尾项
4-28 ──→ 依赖 4-27 的 restore 命令,React DOM focus 单列为待补
4-34 ──→ Convex 侧依赖 4-27 的命令,local folder 侧为独立待补
4-38 ──→ open target 子项由 4-39/4-42 完成;bulk delete 由 4-41 完成
4-39 ──→ rootUri 子项由 4-42 完成 [已归档]
4-40 ──→ bulk delete 子项由 4-41 完成 [已归档]
4-41 ──→ 独立完成 [已归档]
4-42 ──→ 独立完成 [已归档]
4-43 ──→ 独立完成 [已归档]
4-44 ──→ 依赖 task430 workspace bootstrap(同 4-45 阻塞项)
4-45 ──→ 依赖 task430 workspace bootstrap
全局风险排序
| 风险 | 文档 | 描述 | 影响 |
|---|---|---|---|
| 🔴 高 | 4-45 | 4 项 checklist 全部未勾选,Worker D 无产出 | open editor lifecycle 状态不可观测 |
| 🔴 高 | 4-34 | local folder 双浏览器 no-refresh 未解决 | 唯一未完成的 dual-browser 缺口 |
| 🟡 中 | 4-44 | 3 个 browser smoke 未通过 | action layer 代码合入但未经验证 |
| 🟡 中 | 4-28 | React DOM focus 无浏览器证据 | location restore 已实现但焦点行为未确认 |
| 🟢 低 | 4-38 | 前端 cutover 代码未完成但已有 4-39/4-41 覆盖 | 信息过期风险,非功能缺口 |
| 🟢 低 | 4-23 | P3 候选,从未进入实现 | 无实际风险 |
建议归档路径(非执行)
以下仅作为人工决策参考,本次报告未移动任何文件:
| 文档 | 建议目标 | 前提条件 |
|---|---|---|
| 4-27 | done/ |
添加引用 4-34/4-28 的头部注释 |
| 4-39 | done/ |
添加引用 4-42 的头部注释 |
| 4-40 | done/ |
无 |
| 4-41 | done/ |
无 |
| 4-42 | done/ |
无 |
| 4-43 | done/ |
无 |
| 4-23 | process/ 保留 |
添加 "P3 Candidate" 头注 |
| 4-28 | process/ 保留 |
React DOM focus smoke 通过后归档 |
| 4-34 | process/ 保留 |
task436 或等价 local folder no-refresh 证据通过后归档 |
| 4-38 | process/ 保留 |
剩余前端 cutover + UI smoke 通过后归档 |
| 4-44 | process/ 保留 |
3 个 smoke 全部通过后归档 |
| 4-45 | process/ 保留 |
所有 4 项 checklist 完成后归档 |
报告说明
路径: .codex/reasonix-tasks/results/design-governance-worker-b-04-tree.md
只读约束: 本文只创建了报告文件,未移动、修改或删除任何 design/ 文件。上述归档/移动建议需由人工或后续 Worker 执行。
验证命令:
# 确认报告文件存在
find .codex/reasonix-tasks/results/ -name '*worker-b*'
# 确认未修改任何设计文件
cd /mnt/Data1T/mnote && git diff --stat design/
# 复现 Rust 验收(抽样)
cargo test --manifest-path rust/Cargo.toml -p mnote-web filetree_runtime -- --test-threads=1
cargo test --manifest-path rust/Cargo.toml -p mnote-web tree_command_local_folder -- --test-threads=1
# 检查 smoke 脚本语法
node --check scripts/task430-vscode-explorer-stage7-smoke.js
node --check scripts/task471-local-folder-bulk-resource-trash-smoke.js