# DSH Visual Acceptance 技术 Spike 报告 > 日期:2026-08-26 > 结论:Spike 通过;首个可用切片已在真实 DSH Web 中完成安装验收。仍不代表完整 V0.1 可交付。 ## 1. 执行结论 五个核心机制均获得了最低可行证据: | Spike | 结果 | 证据等级 | 能支持的结论 | |---|---|---:|---| | DSH Host 生命周期 | 通过 | E3 | 当前 DSH 能通过临时 Patch 加载并释放 Host | | DSH Client Slot | 契约通过 | E2 | `conversation.view` 注册与撤销机制可行 | | 浏览器事实与状态复现 | 通过 | E3 | Chrome 能稳定重放状态并采集事实与截图 | | Provider Adapter | 通过 | E3 探测 / E2 契约 | Provider 可发现、缺失、超时和降级 | | Issue 身份与复验 | 通过 | E2 | 同问题可跨运行保持身份和人工决定 | 首切片补充获得的强证据: - 插件以本地链接加入 `web` Profile,并真实加载 Client 与 Host; - 非空会话出现“视觉验收”Tab; - 从 UI 创建 `default/light` 与 `empty/dark` Run,2/2 Checkpoint 到达且状态观测一致; - Run 清单和截图写入当前会话工作区,目录 `0700`、manifest/PNG `0600`; - UI 取消落为 `cancelled`; - 同会话活动 Run 期间第二次创建返回 `409 Conflict`; - 1440px/390px 无页面横向溢出,390px 提交后结果区接管视图; - DSH 退出时 Host `disposed`,取消后无验收 Chrome 残留。 仍未获得强证据: - DeepSeek Harness Desktop 壳层深浅色、关闭和重开自动化; - ModLens 或其他 Provider 的真实图片推理质量; - AI 对信息层级、自然度和产品状态完整性的准确率; - 任意真实用户项目上的误报率和节省时间。 ## 2. 运行环境 | 项目 | 实测值 | |---|---| | DeepSeek Harness | `0.1.1-rc.2` | | Node.js | `v26.5.0` | | Chrome | `151.0.7922.174` | | ModLens CLI | `3.23.1` | | Agent Vision Toolkit CLI | 未安装,正确降级 | ## 3. S1:DSH 生命周期 ### 方法 使用 `dsh --profile web --patch ` 启动现有 DSH,不安装插件、不修改 Profile `package.json`。Host 插件在 `ctx.effect` 中分别输出加载和释放标记。 ### 结果 - Patch 解析:通过; - Host `apply`:通过; - Host `dispose`:通过; - 进程由测试脚本发送 `SIGINT` 正常结束; - Client 使用当前正式 `conversation.view` Slot 的契约测试通过; - 实际 Web Client 和 Desktop 尚未挂载,因此只记 E2。 ### 证据 - 公开仓库提供可重跑的 `npm run spike:dsh-host` 与 `npm run spike:dsh-contract`;运行输出只保存在本地 `artifacts/`,避免公开 DSH Profile 与工作区信息。 - [首切片安装验收](first-slice-acceptance.md) ## 4. S2/S3:浏览器事实与状态复现 ### 方法 使用真实 Google Chrome DevTools Protocol,启动本地 Fixture,连续运行两轮四个检查点: - `default-desktop`:1280×800、Light; - `empty-mobile-dark`:390×844、Dark; - `error-mobile`:390×844、Light; - `unreachable-state`:故意提供不存在的 Ready 条件。 ### 结果 - 两轮期望差异:0; - 两轮稳定性差异:0; - 不存在的状态被标记为 `unreached`; - 错误状态捕获到: - 1 条 `console.error`; - 图片和字体两个 `404`; - 主动中断请求与字体终止两条 `Network.loadingFailed`; - 图片 `naturalWidth = 0`; - `MissingFixtureFont` 加载结果为 `false`; - 390px 请求视口下 207px 横向溢出; - 经人工打开确认的有效截图。 ### Spike 中发现并修正的问题 1. 浏览器自动请求 `favicon.ico`,首轮曾污染失败资源统计;Fixture 后改为显式返回 `204`。 2. `mobile: true` 会触发移动布局缩放,使超宽内容看起来被塞进视口。V0.1 改为固定 CSS 视口、`mobile: false`;移动设备档案后置。 3. 后台 Target 的截图可能是空白 PNG。现在截图前执行 `Page.bringToFront` 并等待两帧绘制;截图存在不再等于截图有效。 4. 只使用 `innerWidth` 会漏报被内容撑大的 Layout Viewport。结果同时记录请求视口、Layout Viewport、Visual Viewport 和 Scroll Width。 5. 非默认状态只声明 `state` 并等待 `body`,只能证明页面打开。当前强制使用专用 Ready Selector/Text,并保存 `reproduction` 证据。 6. 截图文件存在不等于证据有效。当前在写入前校验 PNG 签名和非零尺寸,损坏证据直接使 Run 失败;内容级空白检测仍待实现。 这些修正证明浏览器事实层不是一份静态检查清单,而是一套需要校准证据语义的执行机制。 ### 证据 公开仓库提供可重跑的 `npm run spike:browser` 与 Fixture;运行截图和原始事实只写入本地 `artifacts/`。 ## 5. S4:Provider Adapter ### 结果 - 本机 ModLens CLI 探测成功,版本 `3.23.1`; - Agent Vision Toolkit CLI 不存在时返回 `available: false`; - Mock Provider 验证有效 JSON、无效 JSON和超时; - Provider 不可用不影响浏览器事实运行; - 未读取凭据、未调用网络模型、未产生推理费用。 声明边界:ModLens 的 OCR、布局、语义等能力目前只是“Provider 声明能力”,本轮没有验证真实输出质量。 ### 证据 公开仓库提供可重跑的 `npm run spike:provider`;环境探测结果不随仓库发布。 ## 6. S5:Issue 身份与复验 > 历史说明:本节记录首轮受控 Spike。`0.1.1-closed-loop-beta` 已按 [闭环迭代方案](iteration-plan-v0.1.md) 修正:Core 只产出 `still-detected / possibly-resolved / regressed / not-verifiable / needs-human-review / new-candidate` 候选关系,不再自动写 `resolved`。当前 `npm run spike:issues` 验证修正后的安全语义。 ### 结果 同一个横向溢出问题使用规范化指纹获得稳定 ID `UI-9387B448`,连续经历: ```text active → unresolved → resolved → regressed ``` 人工 `approved-fix` 决定在复验中被保留,新问题获得独立 ID。 ### 局限 当前指纹只在受控 Fixture 上验证。真实页面中的 DOM 重构、文案变化和跨页面迁移可能导致错误合并或错误拆分,V0.1 必须允许人工“合并/拆分 Issue”。 ### 证据 公开仓库提供可重跑的 `npm run spike:issues`;Issue 试验输出只保存在本地 `artifacts/`。 ## 7. 是否进入 V0.1 结论:**Go with gates**。 进入开发前必须接受以下约束: 1. 首版是会话级 DSH 工作台,不承诺全局导航; 2. 浏览器事实与 AI 判断使用不同数据类型和 UI 样式; 3. 用户手工声明状态,系统只报告是否真正到达; 4. Provider 是可选能力,不是核心可运行性的前置条件; 5. 实际 DSH Web/Desktop 挂载和主观判断 Eval 是发布 Gate,而不是本轮已验证事实。