# Batch A2 Worker A：04-tree 文档归档审查报告

> 执行日期：2026-05-22
>
> Worker：Reasonix Batch A2 Worker A
>
> 任务：审查 4-44 / 4-45 checklist 完成状态，确认归档到 `done/`

---

## 修改/移动的文件

| 文件 | 操作 | 旧路径 → 新路径 |
|------|------|----------------|
| `4-44-filetree-action-layer-paste-drop-delete-v1.md` | 编辑状态 + 移动 | `design/04-tree-domain/process/` → `design/04-tree-domain/done/` |
| `4-45-filetree-open-editors-lifecycle-link-checklist-v1.md` | 编辑状态 + 移动 | `design/04-tree-domain/process/` → `design/04-tree-domain/done/` |

**状态变更**：两文件 `> 状态：process` → `> 状态：done`

---

## 归档依据

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

**Checklist 6 项全部完成（有可复核证据）：**

| # | 项 | 证据 |
|---|-----|------|
| 1 | 提炼前端 File Tree action helper | 文中 5.1 节：`recordFileTreeAction` / `recordFileTreeActionStatus` 已合入 |
| 2 | delete 对 local folder 资源统一走 archive tree command，暴露 undo/fallback 占位 | task471 result.json: `data-mnote-filetree-last-action-status: "archived"`，trash-index 含两条 |
| 3 | right-click paste 使用菜单目标而非仅 focused row | 文中 5.1 节：`paste-into` 使用菜单触发 row |
| 4 | paste/drop 对 readonly 目标一致阻断提示和 DOM 标记 | 文中 5.1 节：`blockReadonlyFileTreeAction`/`data-mnote-filetree-readonly-blocked` / `data-mnote-filetree-readonly-message` + `alert` 已合入 |
| 5 | external drop 二进制继续上传链路，失败不清空 selection | 文中确认 dnd preflight 复用 `/api/tree/filetree/drop-preflight`；task430 result 中 `dndPreflight` 含完整 copyDropPlan |
| 6 | smoke 增加语义断言 | task471 result.json 确认 action 名 `bulk-delete`、状态 `archived`、触发 row 均写入 DOM |

**验收条件 4/5 完成（第 5 项为可选）：**

| # | 验收 | 状态 | 证据 |
|---|------|------|------|
| 1 | `cargo test -p mnote-web layout` | ✅ 已通过 | 文中记录 |
| 2 | `cargo test -p mnote-web tree_command_local_folder` | ✅ 已通过 | 文中记录 |
| 3 | `node scripts/task430-vscode-explorer-stage7-smoke.js` | ✅ PASS_WITH_KNOWN_GAPS | `tmp/task430-vscode-explorer-stage7-smoke/result.json` + `tmp/reasonix-batch-a-browser-task430-2026-05-21/` |
| 4 | `node scripts/task471-local-folder-bulk-resource-trash-smoke.js` | ✅ PASS | `tmp/reasonix-batch-a-browser-task471-2026-05-21/result.json` + 截图 |
| 5 | `node scripts/task47*-filetree-action-layer-smoke.js` | ⬜ 可选（如新增） | 未创建，非必须 |

**后续边界（非 blocker，已记录在 4-44 5.1 节与 task430 skipped 中）：**
- task430 中 `context-menu-minimum` 的 `Paste Into` 菜单项未暴露（主 Sidebar Convex filetree 的 React 上下文菜单限制）
- task430 中 `dnd-readonly-conflict` 的端到端矩阵未覆盖（已有 bridge preflight 单测和 local-folder smoke）
- Open Editors section 未实现（4-45 已跟踪）
- FileTree row 未同步 `data-active="true"`（UI 尚未同步 active 状态）

### 4-45 — FileTree / Open Editors Lifecycle Link Checklist v1

**Checklist 4 项全部完成（有可复核证据）：**

| # | 项 | 证据 |
|---|-----|------|
| 1 | 跑或修复 task430/task471 的可复现前置条件 | 4-45 7.1 节：Worker A 给 task430 添加 workspace bootstrap fallback；task430 result.phases.workspace-bootstrap.ok: true |
| 2 | 明确哪些 smoke 已过、哪些因环境阻塞 | 4-45 7.1 节与 task430 result.json 的 `skipped` 项详细说明 |
| 3 | 补充 open editor / filetree active row / lifecycle 状态断言 | 4-45 7.1 节：`filetree-active-row`、`filetree-selected-row`、`open-editors-section` 均已注入；task430 result.json 含这些断言结果 |
| 4 | 更新 4-44 checklist 执行记录 | 4-44 5.1 节已包含 Codex 独立复跑、Browser Worker 验证等完整执行记录 |

**验收条件全部通过：**

| 验收 | 状态 | 证据 |
|------|------|------|
| `node --check scripts/task430-*` | ✅ | Codex 独立验证：系统退出码 0 |
| `node --check scripts/task471-*` | ✅ | Codex 独立验证：系统退出码 0 |
| `node scripts/task430-*` | ✅ | task430 result.json `ok:true` |
| `node scripts/task471-*` | ✅ | task471 result.json `smoke_ok:true`，所有断言通过 |

**后续边界（非 blocker，已记录在 4-45 7.1 节与 task430 result 中）：**
- Open Editors DOM section 尚未实现（MNote 当前已知缺口，不做强制断言，使用 `runOptional` 包装）
- FileTree row 无 `data-active="true"` 标记（UI 尚未同步 active 状态，已记录不报错）

---

## 未归档文档及原因

| 文档 | 保留在 process/ | 原因 |
|------|----------------|------|
| `4-28-trash-restore-location-reveal-focus-v1.md` | ✅ 未移动 | 任务要求：不移动 4-28 |
| `4-34-filetree-trash-dual-browser-no-refresh-v1.md` | ✅ 未移动 | 任务要求：不移动 4-34 |
| `4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md` | ✅ 未移动 | 任务要求：不移动 4-46 |
| `4-38-filetree-resource-lifecycle-open-target-checklist-v1.md` | ✅ 未移动 | 不在本次审查范围 |

---

## 风险或需要 Codex 复核的点

1. **task430 `PASS_WITH_KNOWN_GAPS` 的含义**：4-44 的归档条件（源自 `1-8-mvp-post-process-execution-order-v1.md` 第 3 节）原文为"browser smoke 全绿后归档"。当前 `task430` 结论为 `PASS_WITH_KNOWN_GAPS`——F2 rename、cut/paste move、dnd preflight guard 均通过，gap 属于该文档"非目标"范围与产品已知缺口。建议 Codex 确认这个 `PASS_WITH_KNOWN_GAPS` 满足归档条件。

2. **4-44 第 5 项可选 smoke 未创建**：`node scripts/task47*-filetree-action-layer-smoke.js` 以"如新增"标注，不是必要条件。现有 task430 和 task471 已覆盖 checklist 的语义断言要求。

3. **4-28 / 4-34 的 Batch A 依赖**：按 `1-8` 执行顺序，Batch A 的 P0 流程中 4-44/4-45 先归档，4-34/4-28 仍需后续 Worker 完成 local folder no-refresh / restore focus 证据后归档。当前保持不变正确。

4. **git 未提交**：本次未执行 `git commit`，所有变更在工作树上，待 Codex 复核后提交。

---

## 验收命令输出预期

```bash
$ git diff --name-status
A       design/04-tree-domain/done/4-44-filetree-action-layer-paste-drop-delete-v1.md
A       design/04-tree-domain/done/4-45-filetree-open-editors-lifecycle-link-checklist-v1.md
D       design/04-tree-domain/process/4-44-filetree-action-layer-paste-drop-delete-v1.md
D       design/04-tree-domain/process/4-45-filetree-open-editors-lifecycle-link-checklist-v1.md
```

（`A` = git 视为新文件因 move 后路径变更；实际内容无变更除了状态行从 `process` → `done`）
