fix: 修复本地文件夹垃圾箱恢复聚焦
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
# Reasonix Batch A2 Worker A:04-tree 已完成文档归档审查
|
||||
|
||||
Project root: `/mnt/Data1T/mnote`
|
||||
|
||||
## 目标
|
||||
|
||||
审查 Batch A 当前 04-tree 文档,判断哪些已经有真实 smoke / 测试证据,可以从 `process/` 移到 `done/`。你只做文档状态与归档,不改 Rust / JS 业务代码。
|
||||
|
||||
## Ownership
|
||||
|
||||
允许修改:
|
||||
|
||||
- `design/04-tree-domain/process/4-44-filetree-action-layer-paste-drop-delete-v1.md`
|
||||
- `design/04-tree-domain/process/4-45-filetree-open-editors-lifecycle-link-checklist-v1.md`
|
||||
- 如确认完成,可移动到 `design/04-tree-domain/done/`
|
||||
- `.codex/reasonix-tasks/results/batch-a2-worker-a-doc-archive.md`
|
||||
|
||||
只读参考:
|
||||
|
||||
- `design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md`
|
||||
- `design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
||||
- `tmp/task430-vscode-explorer-stage7-smoke/result.json`
|
||||
- `tmp/task471-local-folder-bulk-resource-trash-smoke/result.json`
|
||||
- `tmp/reasonix-batch-a-browser-task430-2026-05-21/result.json`
|
||||
- `tmp/reasonix-batch-a-browser-task471-2026-05-21/result.json`
|
||||
|
||||
## 要求
|
||||
|
||||
1. 核对 `4-44` / `4-45` 的 checklist 是否都已有可复核证据。
|
||||
2. 对仍是已知缺口但不属于该文档完成条件的项,写入“后续边界”,不要把它们当成未完成 blocker。
|
||||
3. 如果确认完成,移动到 `done/`,并把顶部状态改为 `done`。
|
||||
4. 不移动 `4-28`、`4-34`、`4-46`。
|
||||
5. 不提交 git,不回滚任何文件。
|
||||
|
||||
## 验收命令
|
||||
|
||||
```bash
|
||||
git diff --name-status
|
||||
```
|
||||
|
||||
## 最终输出
|
||||
|
||||
写入 `.codex/reasonix-tasks/results/batch-a2-worker-a-doc-archive.md`,包含:
|
||||
|
||||
- 修改/移动的文件
|
||||
- 归档依据
|
||||
- 未归档文档及原因
|
||||
- 风险或需要 Codex 复核的点
|
||||
@@ -0,0 +1,58 @@
|
||||
# Reasonix Batch A2 Worker B:local folder restore 后 FileTree focus/reveal
|
||||
|
||||
Project root: `/mnt/Data1T/mnote`
|
||||
|
||||
## 目标
|
||||
|
||||
修复 `task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js` 记录的缺口:local folder 非 md 资源从 trash workbench restore 后,FileTree 恢复行应有 `data-selected="true"` 或 `data-active="true"` 或 `data-focused="true"`,且不触发页面 reload。
|
||||
|
||||
## Ownership
|
||||
|
||||
允许修改:
|
||||
|
||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
||||
- `rust/crates/mnote-web/src/routes/gateway.rs`
|
||||
- `scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js`
|
||||
- `design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md`
|
||||
- `design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
||||
- `.codex/reasonix-tasks/results/batch-a2-worker-b-restore-focus.md`
|
||||
|
||||
禁止:
|
||||
|
||||
- 不改 delete 默认进入 trash 的语义。
|
||||
- 不把 browser reload 当成 no-refresh。
|
||||
- 不引入跨窗口 postMessage 或复杂新服务。
|
||||
- 不提交 git。
|
||||
|
||||
## 推荐实现方向
|
||||
|
||||
短路径即可:
|
||||
|
||||
1. trash workbench local restore 成功后,把恢复对象的 filetree row-id 写入 `sessionStorage`。
|
||||
- 对非 md local resource,row-id 是 `local:asset:${original_relative_path}`。
|
||||
- 当前 row HTML 有 `data-trash-entry-id`,通常是 `local-file:${relative_path}`;可在 HTML 中新增 `data-filetree-row-id`,避免前端猜。
|
||||
2. `refreshLocalFolderSidebarSnapshot()` 渲染后消费这个 pending row-id,选择/聚焦对应 filetree row。
|
||||
3. 复用现有 `selectSidebarFileTreeRow(row, {})` 或新增小 helper,不要只改 DOM 属性导致 selection store 不一致。
|
||||
|
||||
## 验收命令
|
||||
|
||||
```bash
|
||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web layout -- --test-threads=1
|
||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web gateway -- --test-threads=1
|
||||
node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
||||
```
|
||||
|
||||
如本机 3000 可用,运行:
|
||||
|
||||
```bash
|
||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
||||
```
|
||||
|
||||
## 最终输出
|
||||
|
||||
写入 `.codex/reasonix-tasks/results/batch-a2-worker-b-restore-focus.md`,包含:
|
||||
|
||||
- 修改文件
|
||||
- 实现策略
|
||||
- 验证命令和结果
|
||||
- 未完成项/风险
|
||||
@@ -0,0 +1,48 @@
|
||||
# Reasonix Batch A2 Worker C:task473 语义与 4-34/4-46 文档收口
|
||||
|
||||
Project root: `/mnt/Data1T/mnote`
|
||||
|
||||
## 目标
|
||||
|
||||
配合 Batch A2 收口,审查 `task473` 当前 smoke 语义是否能在 restore focus 修复后作为正向回归测试,并更新 `4-34` / `4-46` 中 local folder no-refresh 与 restore focus 的执行记录。
|
||||
|
||||
## Ownership
|
||||
|
||||
允许修改:
|
||||
|
||||
- `scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js`
|
||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
||||
- `design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
||||
- `.codex/reasonix-tasks/results/batch-a2-worker-c-smoke-docs.md`
|
||||
|
||||
只读参考:
|
||||
|
||||
- `design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md`
|
||||
- `tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json`
|
||||
- `tmp/task435-local-folder-watch-no-reload-smoke/result.json`
|
||||
- `tmp/task437-local-folder-asset-trash-lifecycle-smoke/result.json`
|
||||
- `tmp/task464-local-folder-resource-trash-ui-smoke/result.json`
|
||||
|
||||
## 要求
|
||||
|
||||
1. 不改 Rust。
|
||||
2. 如果 `task473` 仍把“无 focus”当作 `ok:true` 的已知缺口,请改为:脚本整体仍允许记录诊断,但完成条件必须要求 `hasFocusEvidence === true`。
|
||||
3. `4-34` 应写实:Convex 双浏览器矩阵已经有 `task432/433/434`;local folder 非 md create/rename/delete、resource trash lifecycle、trash UI、restore no-refresh/focus 分别由 task435/437/464/473 覆盖。仍未覆盖的项要明确保留。
|
||||
4. `4-46` 应追加 Batch A2 执行记录占位,说明本轮目标是关闭 `task473` 的 focus gap。
|
||||
5. 不提交 git,不回滚任何文件。
|
||||
|
||||
## 验收命令
|
||||
|
||||
```bash
|
||||
node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
||||
git diff --name-status
|
||||
```
|
||||
|
||||
## 最终输出
|
||||
|
||||
写入 `.codex/reasonix-tasks/results/batch-a2-worker-c-smoke-docs.md`,包含:
|
||||
|
||||
- 修改文件
|
||||
- smoke 语义变化
|
||||
- 文档状态变化
|
||||
- 仍未覆盖项
|
||||
@@ -0,0 +1,62 @@
|
||||
# Reasonix Browser Test: Batch A2 task473 Local Folder Restore Focus Closed
|
||||
|
||||
项目根目录:`/mnt/Data1T/mnote`
|
||||
|
||||
请先阅读并遵守:`/home/lix/.codex/skills/reasonix-browser-tester/SKILL.md`
|
||||
|
||||
## 角色
|
||||
|
||||
你是浏览器测试员,不是代码修改员。
|
||||
|
||||
禁止修改源码、禁止 git commit、禁止回滚文件。只允许创建测试输出目录、临时测试数据、截图和测试结果文件。
|
||||
|
||||
## 测试目标
|
||||
|
||||
验证 `task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js` 在当前最新 `mnote-web` 上已经关闭 local folder trash restore focus gap:
|
||||
|
||||
- restore 不触发浏览器 reload / navigation。
|
||||
- restore 后文件恢复到原路径。
|
||||
- 回到 filetree 后恢复行重新出现。
|
||||
- 恢复行最终出现 focus 证据:`data-active="true"` 或 `data-selected="true"` 或 `data-focused="true"`。
|
||||
|
||||
## 前置
|
||||
|
||||
- 被测入口:`http://127.0.0.1:3012`
|
||||
- 3012 是 Codex 为本轮验证启动的最新 mnote-web 临时进程。
|
||||
- 使用真实浏览器或 Playwright。
|
||||
- 使用全新的 isolated browser context / userDataDir;测试开始前清空 cookies、localStorage、sessionStorage、IndexedDB、Cache Storage。
|
||||
|
||||
## 操作
|
||||
|
||||
1. 运行:
|
||||
|
||||
```bash
|
||||
cd /mnt/Data1T/mnote
|
||||
node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
||||
MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3012 PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
||||
```
|
||||
|
||||
2. 读取 `tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json`。
|
||||
3. 截图恢复后 filetree 状态,截图中应能看到恢复行或至少 filetree 区域。
|
||||
4. 记录:
|
||||
- `ok`
|
||||
- `restoreNavFree.delta`
|
||||
- `fileReappearsInFiletree`
|
||||
- `focusAfterRestore`
|
||||
- `restoreFocusDebug.focusStatusAfterFiletreeLoad`
|
||||
|
||||
## 输出目录
|
||||
|
||||
`/mnt/Data1T/mnote/tmp/reasonix-batch-a2-browser-task473-focus-closed-2026-05-21/`
|
||||
|
||||
必须输出:
|
||||
|
||||
- `result.json`
|
||||
- `final.md`
|
||||
- 至少 1 张截图;失败时必须截图。
|
||||
|
||||
## 判定
|
||||
|
||||
- `PASS`:语法检查和 smoke 实跑 exit 0,`result.json.ok=true`,`restoreNavFree.delta=0`,文件行恢复,且 `focusAfterRestore` 显示至少一个 active/selected/focused 证据为 true。
|
||||
- `FAIL`:脚本退出非 0,或 no-refresh / 文件恢复 / focus 断言失败。
|
||||
- `BLOCKED`:3012 不可达或浏览器无法启动。
|
||||
@@ -0,0 +1,112 @@
|
||||
# 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`)
|
||||
@@ -0,0 +1,41 @@
|
||||
# Batch A2 Worker B:local folder restore 后 FileTree focus/reveal — 最终结果
|
||||
|
||||
## 结论
|
||||
|
||||
Worker B 目标已完成。local folder 非 md 资源从 trash workbench restore 后,FileTree 恢复行最终可稳定出现 `data-active="true"`,`task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js` 已由 `ok:false` 变为 `ok:true`。
|
||||
|
||||
## 修改文件
|
||||
|
||||
- `rust/crates/mnote-web/src/routes/gateway.rs`
|
||||
- `rust/crates/mnote-web/src/routes/mindmap_shell.rs`
|
||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
||||
- `scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js`
|
||||
|
||||
## 实现策略
|
||||
|
||||
1. trash workbench restore 后写入 `mnote.pendingLocalFolderRestoreFiletreeRowId`。
|
||||
2. filetree 初始渲染与 `refreshLocalFolderSidebarSnapshot()` 轮询刷新时消费 pending row-id。
|
||||
3. 为避免 local folder polling 覆盖 focus,采用短时间重放聚焦的方式,稳定后再清理 pending。
|
||||
4. `task473` 同步改为真实回归 smoke:只有出现 focus 证据才算通过。
|
||||
|
||||
## 验证命令和结果
|
||||
|
||||
```bash
|
||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web layout -- --test-threads=1
|
||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web gateway -- --test-threads=1
|
||||
node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
||||
MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3012 PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
- `layout` / `gateway` targeted tests 通过。
|
||||
- `task473` 最终结果:`ok:true`
|
||||
- `focusAfterRestore.attrs.data-active="true"`
|
||||
|
||||
## 未完成项 / 风险
|
||||
|
||||
- local folder empty-trash smoke 仍未补齐。
|
||||
- local folder Markdown 自身 trash lifecycle 仍未单独编写独立 smoke。
|
||||
- 3000 常驻进程若仍旧,后续 smoke 需确认已重启到最新代码。
|
||||
@@ -0,0 +1,100 @@
|
||||
# Batch A2 Worker C:task473 语义与 4-34/4-46 文档收口 — 执行结果
|
||||
|
||||
## 执行人
|
||||
|
||||
Reasonix Worker C (Batch A2)
|
||||
|
||||
## 环境
|
||||
|
||||
| 检查项 | 状态 |
|
||||
|--------|------|
|
||||
| 项目根 | `/mnt/Data1T/mnote` |
|
||||
| Node.js | 可用 |
|
||||
| `node --check` | 通过,无语法错误 |
|
||||
| 修改文件数 | 3(见下) |
|
||||
| 未触及 Rust | ✅ |
|
||||
| 未提交 git | ✅ |
|
||||
| 未撤销/覆盖已有改动 | ✅ |
|
||||
|
||||
## 修改文件
|
||||
|
||||
| 文件 | 改动说明 |
|
||||
|------|----------|
|
||||
| `scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js` | `evidence.ok = true` → `evidence.ok = hasFocusEvidence` |
|
||||
| `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md` | 5 处更新:验收矩阵非 md 行写实、3.5 审计结论更新、5 边界更新、6 完成标准更新 |
|
||||
| `design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md` | 追加 Batch A2 执行记录 |
|
||||
|
||||
## Smoke 语义变化
|
||||
|
||||
**改动前**:task473 步骤 9 正确记录 `ok: false` 和 focus 缺口,但末尾无条件设置 `evidence.ok = true`,整体结果为 `ok: true`。脚本作为回归测试时无法区分"所有功能正常"和"已知缺口但其他正常"。
|
||||
|
||||
**改动后**:`evidence.ok = hasFocusEvidence`。当 focus 缺口存在时 `evidence.ok = false`;如果后续实现了 restore focus(`selectSidebarFileTreeDocument` 被调用、`data-selected="true"` 出现),`hasFocusEvidence` 变为 `true`,整体通过。各步骤诊断数据照常记录到 `result.json`。
|
||||
|
||||
这一改变意味着:
|
||||
|
||||
- **Batch A2 目标达成**:task473 现在是一个**可检测的回归测试** — restore focus 修复后 smoke 自动变绿;回归时自动变红。
|
||||
- **false-positive 消除**:不再把"已知缺口但其他功能正常"混淆为 `ok: true`。
|
||||
- **诊断不丢**:所有 `steps`、`focusAfterRestore`、`navEventsAfterRestore`、`fileReappearsInFiletree` 仍写入 `result.json`。
|
||||
|
||||
## 文档状态变化
|
||||
|
||||
### 4-34 `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
||||
|
||||
| 位置 | 旧内容 → 新内容 |
|
||||
|------|----------------|
|
||||
| §2 验收矩阵(local folder 非 md 行) | `待定/待定/待定/待定` → `✅ task435/✅ task437+464/✅ task437+473/✅ task437+464`,empty-trash 标记 ❌ 未覆盖 |
|
||||
| §3.5 审计结论(task163 行) | `尚未覆盖 Markdown 重命名/删除、非 md rename、非 md trash/restore/purge` → `task435 覆盖 Markdown+非 md create/rename/delete;非 md trash/restore/purge 由 task437+464 覆盖;local folder Markdown 自身 trash lifecycle 仍未编写` |
|
||||
| §5 边界(非 md bullet) | `非 md 本地资源文件 watcher/trash/restore/purge 仍单列为待补` → `已由 task435/437/464/473 分项覆盖;local folder Markdown trash lifecycle 仍未编写` |
|
||||
| §6 完成标准 | `task436 或等价 smoke 证据` → `task435/437/464/473 或等价 smoke 证据`;追加 restore focus 缺口不视为完成的约束 |
|
||||
|
||||
### 4-46 `design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
||||
|
||||
| 位置 | 旧内容 → 新内容 |
|
||||
|------|----------------|
|
||||
| §8 执行记录尾 | 追加 Batch A2 Worker C 执行记录,说明本轮目标是关闭 task473 的 focus gap 作为可检测回归测试 |
|
||||
|
||||
## 验收命令结果
|
||||
|
||||
```bash
|
||||
$ node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
||||
SYNTAX_OK
|
||||
|
||||
$ git -C /mnt/Data1T/mnote diff --name-status design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md \
|
||||
design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md \
|
||||
scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
||||
M design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md
|
||||
M design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md
|
||||
M scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
||||
```
|
||||
|
||||
注:`git diff` 中出现的 `D design/04-tree-domain/process/4-44-*.md` 和 `D design/04-tree-domain/process/4-45-*.md` 是先前已有更改,非本 worker 引入。
|
||||
|
||||
## 仍未覆盖项
|
||||
|
||||
### 仍在 open 状态、不视为完成
|
||||
|
||||
1. **Restore focus / reveal 完全未实现**(task473 step 9 `hasFocusEvidence===false`)。`selectSidebarFileTreeDocument` 从未在 restore 路径调用,且不支持 `local-file:` 行 ID。`4-28` §5.3 已给出短/中/长三条实现路径。
|
||||
2. **local folder empty-trash smoke 未编写** — 验收矩阵中标记 ❌。
|
||||
3. **local folder Markdown 自身的 trash lifecycle**(通过 tree command archive/restore/purge `.md` 文件)**未编写独立 smoke**。
|
||||
|
||||
### local folder 非 md 资源覆盖率(本轮已写实的覆盖)
|
||||
|
||||
| 子项 | 覆盖 Smoke | 状态 |
|
||||
|------|-----------|------|
|
||||
| 外部 create/rename/delete(no-reload) | task435 | ✅ |
|
||||
| API archive(delete → trash) | task437 | ✅ |
|
||||
| API restore(trash → 原路径) | task437 | ✅ |
|
||||
| API purge(从 trash 彻底删除) | task437 | ✅ |
|
||||
| Trash UI delete → 可见 | task464 | ✅ |
|
||||
| Trash UI restore → 文件恢复 | task464 | ✅ |
|
||||
| Trash UI purge → 文件消失 | task464 | ✅ |
|
||||
| Trash workbench restore no-refresh(fetch 型,无导航) | task473 | ✅ |
|
||||
| Restore 后 filetree 行重现(轮询 1200ms) | task473 | ✅ |
|
||||
| Restore 后 filetree focus/reveal | task473 | ❌ **open** |
|
||||
| empty-trash smoke | — | ❌ **open** |
|
||||
|
||||
## 风险评估
|
||||
|
||||
- 无 Rust 修改,回归风险低。
|
||||
- `task473` smoke 语义从"永远 ok:true"变为"有 focus 才 ok:true",可能影响依赖其 `ok` 字段的外部脚本。但 task473 的消费者只有 Codex 复核流程(`4-46` §5),该流程应优先查看 `result.json` 全量字段而非仅 `ok`。
|
||||
- 4-44 / 4-45 文件缺失(非本 worker 引入)可能导致 Codex 复核时误判为越权删除;已在结果中说明。
|
||||
Reference in New Issue
Block a user