# 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 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-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-stage(local_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` schema,`documents.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:`、`resolve_local_raw_file_id`、`local-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 已勾选**:扩展 `FileTreeOpenTarget`(`LocalFile`/`Directory` variant + `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` 全部通过。 - **归档原因**: 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 覆盖。 - **验收全部通过**:`task437`、`task464` smoke 通过,`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`、`task471` smoke 通过,`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` 全部通过。 - **归档原因**: 文档定义的 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` 通过,`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 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 侧变更已合入但 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 未勾选**: 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 的阻塞。 --- ## 交叉依赖分析 ```text 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 执行。 **验证命令**: ```bash # 确认报告文件存在 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 ```