# Batch A Worker C: Local Folder No-refresh / Restore Focus Gap — 执行结果 ## 执行人 Reasonix Worker C ## 环境状态 | 检查项 | 状态 | |--------|------| | 项目根 | `/mnt/Data1T/mnote` | | Node.js | 可用 | | Playwright | 已安装 | | `node --check task473` | 通过,无语法错误 | | 3000 实跑 | 未运行(本次为审计 + 脚本创建,未实跑) | ## 审计结果 ### 1. Local folder 非 md 资源 trash / restore / purge UI 支持状态 | 子项 | 状态 | 证据 | 脚本/结果 | |------|------|------|-----------| | 外部创建/重命名/删除非 md(`.txt`, `.png`)→ filetree no-refresh | ✅ 完成 | `task435` 全程无 `framenavigated` | `tmp/task435-local-folder-watch-no-reload-smoke/result.json` | | API delete → `.mnote/trash` + `tree.resource.archive` | ✅ 完成 | `task437` API-only 验证 | `tmp/task437-local-folder-asset-trash-lifecycle-smoke/result.json` | | API restore → 文件系统恢复 | ✅ 完成 | `task437` API-only 验证 | 同上 | | API purge → 文件 + index 清理 | ✅ 完成 | `task437` API-only 验证 | 同上 | | Trash 页 UI delete → visible → restore → file restored | ✅ 完成 | `task464` browser UI | `tmp/task464-local-folder-resource-trash-ui-smoke/result.json` | | Trash 页 UI delete → purge → file gone | ✅ 完成 | `task464` browser UI | 同上 | | Trash workbench restore 不触发浏览器导航(no-refresh) | ✅ 完成 | `task473` gap smoke | `tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json` | | Restore 后 filetree 行重现(轮询 1200ms) | ✅ 完成 | `task473` gap smoke | 同上 | | Restore 后 filetree 行 focus/reveal | ❌ **未实现** | `task473` gap smoke 记录无 `data-active/selected` | 同上 | | 双浏览器 no-refresh | 🔄 不适用 | local folder 使用 revision polling,非 SSE/实时推 | — | ### 2. Restore 后 DOM reveal / focus 证据缺口 确认 `selectSidebarFileTreeDocument` 从未在 restore 路径调用: | 调用路径 | 行号 | 是否包含 restore | |----------|------|-----------------| | 文档打开导航后 | `layout.rs:1274,1296` | ❌ | | local folder create page 后 | `layout.rs:1333` | ❌ | | `mnote:primary-document-activated` 事件 | `layout.rs:9278` | ❌ | | restore 路径 | — | ❌ 不调用 | `selectSidebarFileTreeDocument` 的 row 选择器 `data-row-id="doc:{id}"` 也不匹配 `local-file:{path}` 格式(`layout.rs:4138`)。 trash workbench 的 restore handler(`gateway.rs:1055-1071`)在 `POST /api/tree/commands` 后只调用 `refresh()`(fetch 替换自身 workbench),不调用 `refreshLocalFolderSidebarSnapshot()`,不设置任何 focus。 ### 3. `task473` smoke 设计 新增 `scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js`: - 全流程:创建临时 local folder → 非 md 文件 → 登录 → 打开 filetree → API delete → 验证 trash 页 → 点击 restore → 验证无导航 → 验证文件恢复 → 回到 filetree → 验证行重现 → 检查 focus 证据 - 检查点 9 明确记录 focusAfterRestore,区分 `found` / `attrs` / `inViewport` - 结果写入 `tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json` ## 修改文件 | 文件 | 改动 | |------|------| | `scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js` | 新增:local folder trash restore no-refresh + focus gap smoke | | `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md` | 追加 Worker C 审计 smoke 记录、修正审计结论 table、更新 `startLocalFolderSidebarWatch` 与 `refresh()` 描述 | | `design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md` | 标题改为"待补(Worker C 追加)";拆分为 5.1 Convex / 5.2 Local folder / 5.3 步骤建议;追加审计证据表和源码对照 | ## 运行过的命令 ```bash node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js sed -i '81d' design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md # 消除 smart quote 导致的重复行 ``` ## 未完成项 / 风险 ### 未完成功能(需后续阶段实现) 1. **Restore focus 完全未实现** — `selectSidebarFileTreeDocument` 从未在 restore 路径调用,且不支持 `local-file:` 行 ID。最低成本实现方案已在 4-28 `5.3` 给出短/中/长三条路径。 2. **filetree 内右键 delete → trash** 未独立 smokes — `task464` 通过 API + trash 页 UI 覆盖,但 filetree 内置右键 delete 路径未单独验证。 3. **empty-trash(local folder)** 未 smoke — 有空但是按钮 HTML 存在;未进行端到端 browser smoke。 4. **B 浏览器 no-refresh(local folder)** 不适用的现有架构 — local folder 使用 revision polling,非 EventSource 推模式;如需实时双浏览器,架构需要升级。 ### 风险 - `task473` 尚未实跑,仅通过 `node --check` 语法验证。3000 未运行时 status bar 检查等步骤可能因网络错误改变行为。建议 Codex 复核前先启动 3000 并实跑。 - `4-28` 第 81 行用 `sed` 删除可能造成 line ending 不一致;已在后续读取中确认段落结构正确。 - `4-34` 和 `4-28` 的`"`smart quote 字符在后续编辑中可能继续匹配困难,建议用 ASCII 引号统一。 ## Codex 复核要点 - [ ] 独立复跑 `node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js` - [ ] 启动 3000 后实跑 `node scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js` 并检查结果 - [ ] 检查 `git diff` 确认只修改了以上列出的 3 个文件,未触碰 `rust/crates/mnote-web/src/**` - [ ] 更新 `4-46` execution checklist 记录 ## 禁止事项遵守 - ✅ 未修改 Rust 核心业务文件(`rust/crates/mnote-web/src/**`) - ✅ 未把 reload 型刷新标为 no-refresh 完成(trash workbench `refresh()` 经源码验证为 fetch 非导航) - ✅ 未移动 design 文件到 done - ✅ 未提交 git - ✅ 未撤销/覆盖/格式化他人改动