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

231 lines
14 KiB
Markdown
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.
# 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` 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:<relativePath>``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 preparation4-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 ──→ 核心 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 执行。
**验证命令**:
```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
```