# 0.2.x 验证记录

日期：2026-10-03。0.1.0 的记录见 [verification-v0.1.md](verification-v0.1.md)。

## 自动检查

| 项目 | 结果 |
|---|---|
| `pnpm typecheck` | 通过 |
| `pnpm test`（vitest，4 个文件 36 项） | 通过 |
| `pnpm build`、`npm pack --dry-run`、`scripts/check-package.mjs` | 通过 |

单元测试覆盖：配对与撤销、网关准入与转发、模式切换与取消、偏好保存失败回滚，以及本版新增的局域网地址变化、设备数上限淘汰、网关转发标记、公网自检失败不拆连接、偏好文件损坏回退。

## 真实宿主回归（Playwright，隔离 profile，本地确定性测试模型）

脚本 `scripts/remote-qa.mjs`，25 项。三种组合各跑一遍，全部通过：

| 宿主 | 连接方式 | 结果 |
|---|---|---|
| `dsh web` 0.2.0-rc.2 | 局域网 | 25 / 25 |
| Electron 桌面 0.2.0-rc.2 | 局域网 | 25 / 25 |
| `dsh web` 0.2.0-rc.2 | 临时公网（电脑端经本机 HTTP 代理） | 25 / 25 |

25 项内容：模式选择不影响现有连接；未授权拦截、等待页、本机批准、界面启动；新建会话、发送、流式回复；模型选择；工具审批只执行一次；二进制附件上传；多选问题回答；重命名、归档、恢复；断网恢复且不重放；长代码块不撑破页面；输入法组合期间不提交、触屏 Enter 换行；文件列表、文本预览、二进制下载；设置表单按版本号写入；凭据写入后不留在浏览器存储；插件清单；computer-use 与 proxy 的自定义设置页；自动化任务创建、读取、修改、记录、删除；360 / 390 / 430 / 844px 无横向溢出；刷新后草稿保留且不重发；深色主题；撤销后无法继续读取。

隔离宿主加载了 computer-use、proxy 和官方实验性自动化插件。日常使用的 DSH 配置、会话和插件没有被读取或修改。

## Android 模拟器（Android 15，Chrome 124，经 adb reverse 访问）

实际操作并截图确认：扫码链接配对与电脑端弹窗、聊天页、模型选择面板（按供应商分组）、返回键关闭面板、附件选择器进入系统文件浏览、抽屉、设置页的外观卡片、从外部应用再次打开链接仍保持已配对。

## 发布前的最后一轮

全部改动完成后，三种组合各重跑一遍，均为 25 / 25：`dsh web` 局域网、Electron 桌面局域网、`dsh web` 任意网络（电脑端经本机代理）。

任意网络那一组前两次没有跑起来：一次是到 Cloudflare 的 TLS 连接被断开，两次是新地址 60 秒内没有连通；第三次通过。当时代理和直连访问 Cloudflare 都正常，原因没有查明，怀疑是短时间内反复创建临时通道。

另外在隔离宿主里单独确认并截图：配对请求弹窗、电脑面板的连接方式选择、侧栏入口的位置、手机端断开连接后的提示（关闭连接后约 12 秒出现）、折叠步骤、表格、文件列表与文本预览。

没有走完整流程的：已连接时更换连接方式的确认条；图片文件预览（隔离工作区里没有图片）；“任意网络”配对时上报手机型号。

## 0.2.1

- 单元测试 38 项通过。三种组合的 25 项回归全部重跑通过：`dsh web` 同一 Wi‑Fi、Electron 桌面、`dsh web` 任意网络（Cloudflare，经代理）。
- localhost.run 线路：在隔离宿主上真实开启、配对并进入聊天页，首次打开用了约 3 分 24 秒；没有在这条线路上跑完整的 25 项回归。
- 文件路径图片：在 web 与桌面两种隔离宿主上，把一张 PNG 放进会话工作目录，经网关请求宿主文件路由返回 200 并能被 `<img>` 解码。没有让模型真实输出一条带图片的回复来看最终渲染。
- 长按菜单、工作区面板：截图确认（用右键事件触发）。真机长按没有测。
- 新会话复用：已有未使用会话时连点两次“新会话”，会话数不变。

## 0.2.2

单元测试 39 项通过；`dsh web` 同一 Wi‑Fi 回归 25 / 25。桌面和任意网络两组这次没有重跑。在隔离宿主上另外确认：关闭再开启后端口不变；已配对的浏览器打开新二维码的链接后直接进入、没有新的配对请求、设备数仍为 1；系统代理能检测到（该环境里来自环境变量，Windows 注册表那一路只有单元测试）；面板截图确认二维码悬停提示。“用检测到的系统代理真实开启任意网络”没有单独验证。

## 0.2.3

单元测试 39 项通过；`dsh web` 任意网络（不使用代理，新的默认）25 / 25，同一 Wi‑Fi 25 / 25。桌面一组没有重跑。“自检在代理失败后改走直连”没有复现用户那种代理被拒的环境来验证。

## 0.2.4

- 改动：`ws`、`undici`、`qrcode` 改为用到时加载；强调色与其他插件共用并与宿主端双向同步；README 重写。
- `pnpm typecheck`、`pnpm test`（5 个文件 39 项）、`pnpm build`、`scripts/check-package.mjs` 通过。
- `dsh web` 0.2.0-rc.2 局域网回归 25 / 25（同时加载 computer-use、proxy 的新构建）。
- 强调色：隔离宿主里六个插件一起加载，在远程控制面板选蓝色、在网络代理页选黑色，电脑控制、网络代理、远程控制、网页搜索卡片和绘画页都随之变色，宿主端保存的值同步为黑色；浅色与深色主题各看了一遍。
- 本版没有重跑：Electron 桌面回归、“任意网络”回归（默认不走代理时不加载 undici，走代理的路径只有单元测试）、手机端改色后电脑端跟随（逻辑见 `src/client/accent-sync.ts`，未实测）。

## 0.2.5

- 手机界面的“+”菜单：在隔离宿主（`dsh web` 0.2.0-rc.2，本地测试模型，Pixel 7 视口）里实测。菜单列出文件、目标、计划、反馈、压缩、权限、模型、导出；点“目标”把 `/goal ` 写进输入框，发送 `/goal …` 后会话里出现“Goal created …”；“计划”执行后出现“Entering plan mode …”；`/feedback …` 出现“Feedback recorded …”；“压缩”当时因 Agent 正在运行被宿主拒绝，拒绝的原因同样显示在会话里。页面没有脚本错误。
- 这次测试往隔离宿主提交了一条内容为“远程菜单的反馈测试”的反馈。
- 没有实测：电脑面板的“已复制”浮层和设置页导航的手机图标（都是桌面界面里的，只过了类型检查和构建）；“导出”“权限”“模型”三行的点击；带附件时输入指令。

## 已知情况

- 临时公网不带电脑端代理时，本机到 `trycloudflare.com` 的自检被重置（`ECONNRESET`），启动验证 60 秒后判定失败并关闭入口。配置电脑端代理后通过。手机是否需要代理取决于手机所在网络。
- 连接建立后的巡检失败不再断开连接，只在面板显示提示；隧道进程退出才判定失败。

## 没有实测的部分

- Android Chrome、iPhone Safari 真机：只有自动化浏览器的视口与触屏模拟结果。包拥有者在 0.1.0 上反馈过公网与局域网均可连接；0.2.0 的新界面尚未在真机确认。
- 手机软键盘、安全区、切后台恢复的真机表现。
- 插件安装 / 卸载用例（`DSH_QA_INSTALL=1`）本轮未重跑，上一轮结果见 git 历史中的记录。
- 第三方自定义设置页只验证了 computer-use 与 proxy。
