Files
mnote/.codex/reasonix-tasks/results/design-governance-worker-b-04-tree.md
T
lix-2026 1956a8a21a chore: align mvp design governance
- 统一 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
2026-05-21 09:04:13 +08:00

14 KiB
Raw Blame History

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

最高风险项:

  1. 4-45 checklist 完全未执行 — 4 项全部未勾选,Worker D 停留在计划阶段未产出任何变更
  2. 4-34 local folder 子项仍无 no-refresh 证据 — Convex 侧已全部通过但 local folder 侧仍标 reload,这是 dual-browser 矩阵的唯一缺口
  3. 4-44 仍有 3 个 browser smoke 未勾选 — Rust 代码改动已合入但 task430/task471 及新增 smoke 未通过
  4. 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 gateP0/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-web Rust 3000 兼容 alias。
    • Section 3 的 "未完成边界"(双浏览器 no-refresh、reveal/focus、projection delta)已由 4-34 和 4-28 覆盖。
    • Section 7 "剩余边界"rename 仅覆盖附件、empty-trash 仍为批量合同、前端 Sidebar 仍走旧 URL)是有意保留的边界,非未完成任务。
    • Section 8 sub-stagelocal_folder file_path resource lifecycle)已全部合入并通过:tree.resource.archive/restore/purge 进入 .mnote/trash, trash-index.json, task437 smoke 通过。
    • 2026-05-15 验收测试全部:4 项 cargo test 通过,2 项 wolai-frontend 测试通过。
  • 归档原因: 核心命令切换已完成归档。未完成项已明确转移至后续文档(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_order schemadocuments.softDelete 快照写入,documents.restore 位置恢复与 fallback 逻辑,Sidebar 恢复后展开 focus。
    • 已验证:4 个测试文件(32 items)通过,task429 browser 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_required delta 事件合同需在后续新增资源 route 时补回归。
  • 补充说明: 建议将 Convex 侧已完成的部分在文档内打上标记(如 [Convex ✓]),只保留 local folder 暴露项作为未完成。

4-38 — FileTree Resource Lifecycle 与 Open Target 收口 Checklist v1

建议状态:keep-process

  • 证据:
    • 已勾选:local-file:<relativePath>resolve_local_raw_file_idlocal-file restore/purge 测试、local mindmap 单独删除入 trash index、local move sortOrder 返回 _unsupportedFields、Rust cargo 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 已勾选:扩展 FileTreeOpenTargetLocalFile/Directory variant + resourceKind)、open target 包含 canonical identity、parse_open_target_from_row 兼容旧格式、camelCase 序列化、Rust 单测通过。
    • 验收全部通过cargo test -p mnote-web filetree_runtimeruntime_apitree_shell_filetree_mode_embeds_asset_state 全部通过。
  • 归档原因: 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/commands archive/purge/restore" — 这已被 4-41 覆盖。
    • 验收全部通过task437task464 smoke 通过,cargo test resource_trashcargo 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。
    • 验收全部通过task464task471 smoke 通过,cargo test sidebar_filetree_local_table_bulk_delete_uses_tree_commandtree_command_local_folder 通过。
  • 归档原因: Checklist 已全部完成。云端 table 保留旧 fallback 是有意保留的边界(已勾选禁止事项)。

4-42 — FileTree Open Target RootUri Contract Checklist v1

建议状态:archive-done

  • 证据:
    • 全部 5 项 checklist 已勾选FileTreeRuntimeEnvironment.rootUriresolve_open_target 使用 rootUri、SSR state 传入 rootUri、反序列化兼容缺失 rootUri、Rust 单测覆盖。
    • 验收全部通过3 项 cargo test 全部通过。
  • 归档原因: 文档定义的 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_ordertree_command_local_folder 通过,task472 smoke 通过。
  • 归档原因: 完整的端到端实现。_unsupportedFields.sortOrder 退役记录清晰。

4-44 — FileTree Action Layer Paste / Drop / Delete Checklist v1

建议状态:keep-process

  • 证据:
    • Rust 代码已合入recordFileTreeAction/recordFileTreeActionStatus、右键 paste-into 使用菜单触发 row、layout.rs readonly 阻断(data 属性标记 + alert fallback)、paste/drop preflight。
    • 验收 2/5 已勾选cargo test -p mnote-web layouttree_command_local_folder 通过。
    • 3 项验收未勾选node scripts/task430-vscode-explorer-stage7-smoke.jsnode scripts/task471-local-folder-bulk-resource-trash-smoke.js、新增 task47*-filetree-action-layer-smoke.js
  • 留存原因: Rust 侧变更已合入但 browser smoke 验证未通过。task471 的语义断言依赖 environment preparation4-45 也依赖同一个环境)。无法在不验证 smoke 的情况下确认动作层行为正确。
  • 补充说明: task430 的 workspace bootstrap 问题(4-45 提及)是前置阻塞项。建议先修复 task430 前置条件,再补全 4-44 的 smoke 验收。

建议状态:keep-process

  • 证据:
    • 全部 4 项 checklist 未勾选
      1. "跑或修复 task430 / task471 的可复现前置条件" — 未完成
      2. "明确哪些 smoke 已过、哪些因环境阻塞" — 未完成
      3. "补充 open editor / filetree active row / lifecycle 状态断言建议" — 未完成
      4. "更新 4-44 checklist 执行记录" — 未完成
    • 执行记录仅包含 Worker D 的讨论和计划,没有实际变更。
  • 留存原因: 这是一份非常新的文档(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 ──→ 核心 cutover4-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