# 4-26 FileTree 批量删除与选择矩阵 Smoke

> 状态：done
> 创建时间：2026-05-15
> 所属主线：04-tree-domain / VSCode Explorer 文件树与垃圾箱闭环
> 来源：`design/10-review/07-vscode-explorer-filetree-trash-gap-review.md` 阶段 4

## 1. 目标

补齐 Convex filetree 下的真实浏览器验收，避免只用 reducer、local-folder smoke 或 API seed 证明“文件树多选删除已完成”。

本设计只覆盖阶段 4 的最小闭环：

- 隔离用户 / 隔离 workspace seed 3 个页面、2 个普通附件、1 个 mindmap、1 个 table。
- 在 3000 主入口打开 filetree UI。
- 验证 Ctrl/Cmd 多选、Shift 范围、右键已选项保持 selection、右键未选项切换 action target。
- 验证 Delete / Backspace 触发混合 doc + asset 批量删除。
- 验证确认文案按页面、附件、mindmap、table 计数。
- 验证删除后无需浏览器刷新，filetree 中目标行立即消失，并能在 trash dataset 或 `/trash` 中看到。

## 2. 安全边界

- 不在默认测试账号既有 workspace 上执行批量删除。
- 不对默认 workspace 执行 `emptyTrashByWorkspace`。
- 使用一次性 SQLite control-plane Auth 用户注册后自动获得的默认 workspace；旧 Convex Auth 只作为历史 compat 对照。
- 清理仅针对本轮创建对象；如清理失败，只记录对象 ID，不扩大删除范围。

## 3. 建议脚本

新增：

- `scripts/task428-filetree-bulk-delete-selection-smoke.js`

脚本输入：

- `MNOTE_UI_BASE_URL`：默认 `http://127.0.0.1:3001`，便于复用 `FRONTEND_PORT=3001 npm run desktop:hot`。
- `NEXT_PUBLIC_CONVEX_URL` / `CONVEX_SELF_HOSTED_URL`：默认 `http://127.0.0.1:3210`。

脚本输出：

- `tmp/task428-filetree-bulk-delete-selection-smoke/result.json`
- 包含本轮 email、workspaceId、docIds、assetIds、captured confirm 文案、tree command / resource request 摘要、trash 验证结果。

## 4. 验收矩阵

### 4.1 Seed

- 创建父页面 `root`。
- 创建子页面 `child`。
- 创建兄弟页面 `sibling`。
- 创建资源页面 `resources`，用于挂载：
  - 普通附件 2 个。
  - mindmap 1 个。
  - table 1 个。

### 4.2 Selection

- Ctrl/Cmd 点击：选中 `root` 与一个外部普通附件。
- Shift 点击：在可见行上形成范围选区，至少包含 2 行。
- 右键已选项：selection 数量保持不变。
- 右键未选项：selection 切换为该项。

### 4.3 Delete / Backspace

第一轮 Delete：

- 选择 `root`、`child`、外部普通附件、mindmap、table。
- 预期 preflight plan 去重：`root` 保留，`child` 被父页面覆盖，外部资源保留。
- 确认文案应包含：
  - `1 个页面`
  - `1 个附件`
  - `1 个思维导图`
  - `1 个在线表格`
- 确认后：
  - `root`、`child`、外部普通附件、mindmap、table 对应行无需刷新消失。
  - Convex trash / sidebar dataset 可查询到对应 deleted / archived 状态。

第二轮 Backspace：

- 选择 `sibling` 与第二个普通附件。
- 触发 Backspace，确认后无需刷新消失。
- 作为 Delete 入口的键盘等价验证。

## 5. 执行结果

`scripts/task428-filetree-bulk-delete-selection-smoke.js` 已落地并通过真实浏览器验证：

- 创建一次性用户和隔离 workspace。
- seed 页面、附件、mindmap、table。
- 验证 Ctrl/Cmd 多选、Shift 范围、右键已选保持、右键未选切换。
- 验证 Delete 混合删除页面 + 附件 + mindmap + table。
- 验证 Backspace 混合删除页面 + 附件。
- 验证确认文案计数、filetree 行无需刷新消失、Convex 垃圾箱状态。
- 通过 route interception 强制 `/api/media/batch` 失败，验证页面成功进垃圾箱、失败附件仍保留，并出现“部分对象删除失败”摘要。
