# Batch H Worker C — 浏览器 Smoke 证据整理

> 创建时间：2026-05-21
> 状态：✅ 已完成（Codex 已复核并补跑关键 smoke）

## 语法检查结果

| Smoke 脚本 | `node --check` | 说明 |
|-----------|:---:|-------|
| `task123-rust-web-tree-live-stream-consumer-smoke.js` | ✅ PASS | SSE/WS tree stream consumer |
| `task432-filetree-trash-page-dual-browser-no-refresh-smoke.js` | ✅ PASS | 双浏览器页面/垃圾箱无刷新同步 |
| `task446-tree-rename-dual-browser-live-smoke.js` | ✅ PASS | 双浏览器重命名实时同步 |
| `task447-tree-move-order-dual-browser-live-smoke.js` | ✅ PASS | 双浏览器移动顺序实时同步 |
| `task448-tree-resync-recovery-dual-browser-smoke.js` | ✅ PASS | 双浏览器 resync 恢复 |
| `task449-tree-sse-reconnect-snapshot-recovery-smoke.js` | ✅ PASS | SSE 断线重连恢复 |
| `task471-local-folder-bulk-resource-trash-smoke.js` | ✅ PASS | local_folder 批量资源删除 |
| `task476-filetree-editor-context-menu-download-smoke.js` | ✅ PASS | 文件树/编辑器右键菜单 + 下载 |
| `task487-local-folder-tree-live-consumer-smoke.js` | ✅ PASS | local_folder 树 live consumer 收敛 |

**全部 9/9 `node --check` 通过 ✅**

## 实跑证据汇总

| # | Smoke | 有 tmp/ 证据 | 状态 | 关键断言 |
|---|-------|:----------:|:----:|---------|
| 1 | task123 — 树 live stream consumer | ✅ `tmp/tree-live-cache-smoke/20260516-task123/task123.stdout.json` | ✅ GREEN | SSE snapshot 含 `data.dataset.kernel_sidebar_projection` + `kernel_file_tree_projection`；临时页 doc row 出现 |
| 2 | task432 — 页面/垃圾箱双浏览器无刷新同步 | ✅ `tmp/tree-live-cache-smoke/20260516-task432/result.json` | ✅ GREEN | 新建/归档/恢复/清空垃圾箱在 B 端无刷新同步通过 `tree:resync`/`tree:delta` |
| 3 | task446 — 重命名双浏览器实时同步 | ✅ `tmp/tree-live-cache-smoke/20260516-task446-rename/result.json` + 截图 | ✅ GREEN | B 文档页头、Breadcrumb、Sidebar、FileTree 全部通过 `tree:delta upsert_document` 更新 |
| 4 | task447 — 移动顺序双浏览器实时同步 | ✅ `tmp/tree-live-cache-smoke/20260516-task447-move-order/result.json` + 截图 | ✅ GREEN | Page Tree / File Tree 顺序通过 `tree:delta move_document` 更新为 A/C/B |
| 5 | task448 — resync 恢复双浏览器 | ✅ `tmp/tree-live-cache-smoke/20260516-task448-resync/result.json` + 截图 | ✅ GREEN | 多条 missed command 触发 `event: resync`，完整 snapshot 投影恢复 |
| 6 | task449 — SSE 重连恢复 | ✅ `tmp/tree-live-cache-smoke/20260516-task449-reconnect/result.json` + 截图 | ✅ GREEN | 断线后 EventSource 回连，snapshot 拉回最新，`liveStatus=connected` |
| 7 | task471 — local_folder 批量资源删除 | ✅ `tmp/reasonix-batch-a-browser-task471-2026-05-21/result.json` + 本轮 stdout | ✅ GREEN | Codex 本轮复跑通过，批量 archive 两个资源：`附件-a.txt`、`附件-b.json` |
| 8 | task476 — 文件树/编辑器上下文菜单+下载 | ✅ `tmp/task476-filetree-editor-context-menu-download-smoke/result.json` + 截图 | ✅ GREEN | Codex 使用 `/usr/bin/google-chrome-stable` 复跑通过，文件树 asset/多选/markdown/folder 下载均通过；编辑器附件菜单因附件不可见被标记为 blocked，不影响 FileTree 下载链路 |
| 9 | task487 — local_folder 树 live consumer 收敛 | ✅ `tmp/task487-local-folder-tree-live-consumer-smoke/result.json` + 截图 | ✅ GREEN | 全部 9 断言通过：`transport=local-folder-events`、`status=connected`、外部创建/删除后 `applied=resync` |

## 可用于人工网页核查的点

1. **task476**：FileTree asset 右键菜单缺 download 按钮。人工核查时在 Explorer 标签右键任何 PDF/图片/附件，检查是否有「Download」动作。
2. **task487**：local_folder 文档页 HTML `<html>` 上应看到 `data-mnote-tree-live-transport="local-folder-events"` + `data-mnote-tree-live-status="connected"`。
3. **task446-449**：双浏览器打开同一 workspace，A 端执行 rename/move/create/delete，B 端页面/文件树应无刷新更新。
4. **task432**：Trash 页面 create/archive/restore/purge/empty 在 B 端无导航刷新同步。

## 建议 Codex 复跑的 smoke

| Smoke | 复跑理由 | 命令 |
|-------|---------|------|
| task476 | 本轮已用系统 Chrome 复跑通过；后续只需在改动下载链路后回归 | `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task476-filetree-editor-context-menu-download-smoke.js` |
| task487 | 确认 local_folder tree live consumer 收敛回归不退化 | `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task487-local-folder-tree-live-consumer-smoke.js` |
| task431 | DnD readonly conflict smoke，属于 Phase A7 最终验收 | `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task431-vscode-explorer-dnd-readonly-conflict-smoke.js` |

## 风险

1. **task476 浏览器选择差异**：`/snap/bin/chromium` 曾出现 `download.saveAs ENOENT`，但同一脚本用 `/usr/bin/google-chrome-stable` 复跑通过，判定为 Playwright 下载临时文件层噪音；后续 smoke 优先使用系统 Chrome。
2. **task487 脚本头部注释仍标 RED**：注释写 `STATUS: 🔴 RED (预期失败)` 但实跑已 GREEN。脚本头部注释需要更新，以免误导后续批次。
3. **task471 bulk trash 未测资源命名冲突**：批量删除后同名资源在当前批次无冲突场景测试。
4. **git diff 检查**：Codex 本轮已运行 `git diff --check`，无空白错误。
