# DSH Visual Acceptance 最小技术 Spike 方案 > 状态:执行前基线 > 日期:2026-08-26 > 原则:先证伪关键机制,再决定产品架构;没有运行证据的接口不得进入 PRD 的已实现范围。 ## 1. 目标 本轮不追求完整插件,而是回答五个决定项目能否成立的问题: 1. DSH 能否以正式生命周期挂载并撤销 Host 与会话级 Client 能力; 2. 浏览器能否稳定给出资源、控制台、溢出、截图和可达性事实; 3. 人工声明的页面状态能否被确定性重放,而不是由 AI 猜测; 4. 视觉 Provider 能否通过中立 Adapter 接入、缺失和降级; 5. 同一 Issue 能否在修改后被识别为已解决、未解决、新增或回归。 ## 2. 第一性原理 一个验收工具成立的最小条件不是“能看图”,而是: ```text 明确对象 + 可复现范围 + 可追溯证据 + 人工决定 + 同条件复验 ``` 任何一项缺失都会产生伪验收: - 对象不明:比较了错误页面或旧版本; - 范围不可复现:声称检查过空状态,但实际没有进入; - 证据不可追溯:AI 判断被误写成浏览器事实; - 决定人不明:候选问题直接触发修改; - 无同条件复验:无法区分修复、回归和环境噪声。 ## 3. Spike 与通过标准 ### S1 DSH 生命周期 验证范围: - 当前 `dsh 0.1.1-rc.2` 能解析 Bundle Patch; - Host 插件能够加载、执行、释放; - Client 使用正式 `conversation.view` Slot; - Client 注入和卸载不会留下重复注册; - Web 与 Desktop 壳的结论分开记录。 通过标准: - `dsh --patch ... --dump-config` 能解析 Spike Patch; - Host 在真实 DSH 进程中出现加载与释放证据; - Client 契约测试证明注册发生一次、dispose 后为零; - 若无法在不修改用户 Profile 的情况下实装 Client,结果标记为 `partial`,不得写成 Desktop 已验证。 ### S2 浏览器事实 验证范围: - localhost 页面打开; - 1280×800 与 390×844; - `default`、`empty`、`error` 三个显式状态; - console error、失败请求、图片加载、横向溢出和截图; - 重复运行稳定性。 通过标准: - 使用真实 Chrome DevTools Protocol,而不是 HTML 字符串扫描; - 预置错误在对应状态被发现,正常状态不被误报; - 两次相同运行的事实结果一致; - 输出包含浏览器版本、视口、URL、时间和证据来源。 ### S3 状态复现 状态描述最少包含: ```yaml id: empty-mobile url: /?state=empty viewport: 390x844 theme: dark ready: selector: '[data-state="empty"]' text: '暂无资产' ``` 通过标准: - 每个状态必须通过 URL、Fixture 或确定性动作到达; - Ready 条件不满足时结果为 `unreached`; - `unreached` 不得进入通过率分母,也不得伪装成 `passed`。 ### S4 Provider Adapter 验证范围: - 发现本机 CLI Provider; - 获取版本和能力; - 标准化输出; - 超时、非零退出、无效 JSON 和 Provider 缺失; - 不读取或输出凭据。 通过标准: - 核心只依赖 Adapter 契约,不导入竞品 DSH 插件内部模块; - Provider 缺失时运行事实仍可完成; - 本机 Provider 只做无副作用的 `--version` / `--help` 探测;真实图片推理留到凭据和成本边界确认后。 ### S5 Issue 复验 Issue 指纹输入: ```text rule + page + state + viewport + theme + normalized-anchor ``` 通过标准: - 同一问题在证据数值变化后仍保持 Issue ID; - 消失的问题只产生 `possibly-resolved` 复验候选,人工确认后才标记 `resolved`; - 再次出现的问题标记 `regressed`; - 新问题获得新 ID; - 人工 `accepted-risk` / `dismissed` 决定不被新运行覆盖。 ## 4. 证据等级 | 等级 | 含义 | 可支持的声明 | |---|---|---| | E3 | 真实 DSH/Chrome 运行证据 | 当前环境已运行验证 | | E2 | 使用当前接口的契约测试 | 机制可行,尚未证明真实宿主 UI | | E1 | 当前源码或配置静态核对 | 接口存在,不代表运行成功 | | E0 | 设计假设 | 只能进入待验证项 | ## 5. 停止条件 出现任一情况,应停止扩建并重新判断产品方向: - 状态无法通过确定性输入重放,只能依赖自然语言操作; - Issue 身份对轻微布局变化极度敏感,无法稳定复验; - DSH Client 必须依赖内部 DOM 或覆盖原生页面; - Provider 缺失时核心无法完成运行事实; - 结果无法明确区分事实、AI 判断与人工决定。 ## 6. 对抗式审查问题 每个 Spike 结束后必须反问: 1. 这是真实运行证据,还是 Mock 通过? 2. 是否只验证了默认页面,遗漏失败状态和窄屏? 3. 是否把 Provider 输出当成事实? 4. 是否把环境变化误判为产品回归? 5. 是否存在更简单、维护成本更低的方案? ## 7. 本轮明确不验证 - 完整视觉工作台 UI; - 自动修改用户项目; - 主观审美模型的正式准确率; - CI、团队协作和云端服务; - Codex Skill; - DSH Desktop 上的最终视觉验收,除非实际挂载并人工检查。