# 验证报告 验证日期:2026-08-27(Asia/Shanghai) ## 已通过 | 检查 | 结果 | 说明 | |---|---:|---| | TypeScript strict | PASS | `strict`、`noUncheckedIndexedAccess`、`exactOptionalPropertyTypes` | | DSH 插件构建 | PASS | 生成宿主端 `lib/index.mjs`、浏览器端 `lib/client.js` 与 `lib/types/**/*.d.ts` | | Package exports import | PASS | 普通 Node 按包名自引用,`name/apply/Config` 可用且不存在错误的 default export | | MV3 扩展构建 | PASS | background、content、popup 与 manifest 静态文件完整 | | 自动测试 | PASS | 52 个测试文件、426 个用例 | | 逐文件覆盖率 | PASS | 宿主侧 1715 statements、1292 branches、397 functions、1528 lines,四项逐文件均为 100%;包含 `src/browser-worker/**`、artifact/locator store 与 `src/settings/**` | | 无密钥 Snapshot | PASS | 真实 ToolRuntime:主 Agent 5 个浏览器工具、Browser Worker 20 个工具(status + 19 个低层能力),双目录 schema 与已评审基线一致 | | 真实 WebSocket 模拟通信 | PASS | 独立 ExtensionSimulator 与生产 BridgeClient 均通过真实 TCP/WS 与 bridge 通信 | | 双向认证 | PASS | server proof、client proof、错误 token、伪造 client proof | | 并发/取消 | PASS | 乱序响应、Abort、timeout→cancel、断线、预取消不派发、背压不派发 | | DSH tool 契约 | PASS | 24 个真实 `defineTool` 定义、参数验证、canonical output、render、signal;执行时按 Agent 隔离可见性 | | Browser Worker 组合 | PASS | 真实 AgentLoop、SubagentRuntime、spawn provider、TokenMeter 与 WebSocket:父只见 compact result,60K 页面数据只进 child | | Browser Worker 换代 | PASS | 100K 页面在测试配置下触发 8K hard gate(生产默认 128K),fresh generation 只继承 content-free checkpoint,旧 ref/源码不跨代 | | Browser Worker 熔断 | PASS | 同错 3 次、无进展 8 次、32 steps、40 calls 与 180 秒墙钟上限均有确定性状态/Manager 回归,触发后返回有界结构化结果 | | Worker 工具/提示一致性 | PASS | 不可用 tool guidance 被过滤;未知工具立即 `invalid-tool` 停止;同一进展版本重复截图进入无进展预算 | | 动态 DOM 交互 | PASS | 无关 DOM 更新后目标 ref 仍可用;目标名称/role/href/节点替换后安全 stale;原子精确名称点击与正文重复 token 去噪均有回归 | | 可验证定位器 | PASS | JSDOM 真实 Document/XPath:稳定属性优先、动态 ID/敏感值降级、CSS/XPath 唯一性;开放 Shadow Root host chain、子 frame-local 元数据、旧扩展能力拦截与伪造/跨 Worker locator claim 丢弃 | | 工具权限隔离 | PASS | 父、普通子代理、Worker 的 scoped catalog 与根级 monotonic guard 均验证,伪造低层调用 fail closed | | 安装审批 | PASS | 真实 Cordis Context、ToolRuntime 与 ApprovalService:无 Agent fail closed、拒绝不落盘、allowed-once 才部署,并记录成对 approval audit events | | Chrome 检测/部署 | PASS | macOS/Windows/Linux 候选矩阵、可执行探测、MV3 校验、hash receipt、未知/篡改目录阻断、原子更新与回滚 | | 设置页 Web 客户端 | PASS | 按 `settings.plugins.tab` 注册“Chrome 浏览器”页;真实 DSH Web profile 中完成状态刷新、参数复制、令牌遮罩和扩展下载交互;浅色/深色实心控件均使用 Harness 成对填充与前景令牌 | | 设置页本地接口 | PASS | `status.json` 与 `extension.zip` 均限制为 loopback 同源访问;状态、禁用态令牌隐藏、GET/HEAD、错误方法与跨站阻断均有测试 | | 扩展下载包 | PASS | 从已发布的 `extension/dist` 延迟生成 ZIP,包含单一顶层目录及 9 个 MV3 文件,可直接解压后“加载已解压的扩展程序” | | 插件生命周期 | PASS | 真实 Cordis plugin fiber:注册 24 tools 与专用 provider,dispose 后取消 Worker、注销工具并释放端口 | | Artifact 策略 | PASS | Worker 仅见 opaque 元数据;所有权/父 Session grant、TTL、总配额、active-task pin、只清理自有文件 | | Artifact 安全交付 | PASS | session-cwd containment、绝对/穿越/非法名/symlink/non-directory 阻断、默认不覆盖、原子发布、rename、partial 与 delivery-only retry | | 确定性状态机 | PASS | 启动/运行失败、认证顺序、握手超时、ping/pong、stale session、send/cancel 竞态 | | 发布清单 | PASS | `npm pack --ignore-scripts` 生成 `0.4.0`、约 463 kB 标准 tarball(unpacked 约 2.0 MB)并审核全部 185 个条目;`fflate` 与 `ws` 作为 bundled dependencies 随包交付,测试、coverage、源码与开发依赖不进入 tarball | | 离线安装包共存 | PASS | 在全空 DSH Home、npm cache 与 pnpm store 中,通过桌面内置安装器的真实上传路由依次安装 `0.4.0` 与 `dsh-auto-schedule 0.3.1`;Host 重启后两项 Host/Web contribution 均被发现 | | 真实本机扩展链路 | PASS(既有基线) | Chrome for Testing 149、MV3 扩展 `0.3.1`、生产 WebSocket bridge 与真实 Chrome API 已完整执行标签页、DOM、截图和网络命令;新增 `page.locator` 等待用户重载 `0.4.0` 后复测 | ## 模拟通信覆盖 - 非扩展 Origin 在 hello 前拒绝。 - v2 hello 不传 token;服务端和扩展用两个 256-bit nonce 做 HMAC-SHA-256 双向证明。 - command/result 使用 UUID 关联,支持并发乱序。 - AbortSignal 和本地 timeout 均发送协议 cancel。 - 已取消或超过 pending 上限的 click/type/navigate 不会被发送。 - 扩展断开会拒绝该会话全部 pending 请求。 ## 真实本机全链路 1. 从 `dsh-auto-chrome-tool-0.3.1.tgz` 和 `dsh-auto-schedule-0.1.0.tgz` 安装到全新的隔离 DSH profile,启动真实 DSH Web Host;Chrome bridge 在 `127.0.0.1:17321` 监听。 2. 对安装包内的 `extension/dist` 运行生产 `ExtensionBundleInstaller`,状态从 `missing` 变为 `prepared`,版本 `0.3.1` 与 SHA-256 bundle receipt 在二次检查中一致。 3. Chrome for Testing 149 加载该稳定目录,扩展使用双向 HMAC 与实际 DSH Host 完成认证;Host 重启后扩展自动恢复为“已连接”。 4. 生产 bridge 探针实际执行 `tabs.list/open/close`、`page.observe/find/type/select/click/wait/extract/scroll`,页面最终文本为 `修复链路|green|network-ok`。 5. 在 `network.start` 已持有标签页调试会话时执行 PNG 截图,成功复用会话并写入 51,346 字节 artifact;随后读取 Fetch 响应,`api_key` 正文值被替换为 `[REDACTED]`。 6. 完整结构化结果见 `output/playwright/full-chain-20260824/real-extension-result.json`;连接、重连和页面 artifact 截图位于同目录。 ## 真实设置页链路 1. 把本次生成的 `dsh-auto-chrome-tool-0.3.1.tgz` 安装到全新隔离 DSH Web profile,宿主正常注册“Chrome 浏览器”设置标签及两个本地路由。 2. `status.json` 在本机识别到 stable Chrome,返回扩展 `install-required`、bridge `listening` 和当前配对参数;ZIP 下载后经 `unzip -l` 验证为 9 个文件及一个版本化顶层目录。 3. 使用真实浏览器打开 DSH 设置,完成“插件 → Chrome 浏览器”、重新检测、复制主机和点击下载;Playwright 收到 `dsh-auto-chrome-extension-0.3.1.zip` 下载事件,控制台为 0 errors、0 warnings。 4. 最终页面截图见 `output/playwright/chrome-settings-dialog.png`;已按真实设置栏宽度修复复制按钮换行问题。 5. 深色主题下,下载按钮与步骤圆标计算样式均为浅底 `rgb(249, 250, 251)`、深色前景 `rgb(15, 17, 21)`,截图见 `output/playwright/chrome-settings-dark.png`;控制台为 0 errors、0 warnings。 ## 验证边界 - PASS:本机真实 MV3 扩展、真实 Chrome API、真实 loopback WebSocket、实际 DSH Web Host、标准 tarball 安装、设置页交互与重启重连均已运行。 - NOT RUN:未修改用户的日常 Chrome profile。正式版 Chrome 首次“开发者模式 → 加载已解压”仍由 Chrome 自己确认,这是产品刻意保留的安全边界。 - NOT RUN:隔离 profile 未配置付费模型 API Key,因此没有把 `browser_delegate_task` 描述为一次真实付费 LLM 对话;真实 AgentLoop/Worker 隔离由组合测试覆盖,底层浏览器动作已完成真实 E2E。 - NOT RUN:新增 `page.locator` 尚未在用户日常 Chrome 中执行;当前已加载扩展仍为 `0.3.1`,Host 会以 `EXTENSION_UPDATE_REQUIRED` 快速失败,必须从 `0.4.0` 设置页下载并重新加载后才能做真实 Selenium 用例复测。 - NOT RUN:`browser_extension_install` 的 DSH Web Agent 审批界面未在无模型凭据的隔离 profile 中点击;生产安装器已真实运行,ApprovalService 的允许、拒绝、取消和审计事件由集成测试覆盖。 日常 Chrome 的一次性安装步骤见 README,复现命令见 `docs/DEVELOPMENT.md`。