# 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
- ✅ 未撤销/覆盖/格式化他人改动
