# DSH Visual Acceptance 首个可用切片验收 > English public companion: [first-slice-acceptance.en.md](first-slice-acceptance.en.md). 两个版本都不公开本地证据文件。 > 日期:2026-08-26 > 版本:`0.1.0-alpha.1` > 结论:通过,可继续实现 V0.1;不等于完整 V0.1 已交付。 > > 本文第 1–7 节保留首切片的历史验收事实;闭环 Beta 的追加实测见第 8 节。 ## 1. 验收对象 - DeepSeek Harness:`0.1.1-rc.2`; - 插件安装:`web` Profile 本地链接 + Bundle 启用; - 会话:当前项目工作区内的非空专用会话; - 测试目标:`http://127.0.0.1:4173` Fixture; - Chrome:`151.0.7922.174`; - UI 双检查点 Run:`run-20260826030848-7af35929`; - UI 取消 Run:`run-20260826030917-6a1cf5c1`; - 最终代码完成 Run:`run-20260826031640-d19ebc91`; - 最终并发围栏 Run:`run-20260826031606-2a5a916a`; - 快速模式 Run:`run-20260826040500-f9533987`; - DeepSeek 生成页面 Run:`run-20260826043533-285fc6b0`。 ## 2. 已验证事实 | 范围 | 操作 | 结果 | |---|---|---| | Client 生命周期 | 打开非空会话并切换“视觉验收”Tab | 工作台真实挂载 | | Host 上下文 | 由 `sessionId` 反查工作区 | 返回当前项目绝对路径 | | Target 围栏 | 单元测试远程 URL、协议相对 URL、反斜线路径、工作区外 HTML | 均被拒绝 | | Matrix | UI 添加桌面与窄屏检查点 | 1–8 个手工检查点契约有效 | | 浏览器事实 | 1280×800、390×844 | 2/2 `reached` | | 状态复现 | `default/light` 与 `empty/dark`,专用 Ready | 声明值、页面观测值和 Ready 均一致 | | 证据 | 两检查点截图 | PNG 格式与非零尺寸校验生效,本地文件存在 | | 信号语义 | Fixture 缺失字体 | 2 个字体信号,可展开到 `MissingFixtureFont`,未自动创建 Issue | | 溢出 | 目标页面两视口 | 均为 `0px` | | Run 存储 | 检查目录、manifest 与 PNG | Run/截图目录 `0700`;manifest/PNG `0600` | | 取消 | Ready Selector 设为不存在并取消 | 最终状态 `cancelled`,错误原因落盘 | | 并发围栏 | 同会话活动 Run 期间再次创建 | Host 返回 `409 Conflict`,未启动第二个 Chrome | | Client 布局 | 1440×1000 与 390×844 | 页面无横向溢出;390px 提交后结果区接管视图 | | Host 关闭 | 向独立 DSH 进程发送 `SIGINT` | 输出 `host disposed` | | Chrome 释放 | 取消后检查临时 profile 进程 | 无验收 Chrome 残留 | | 快速模式 | Target + 桌面/窄屏 + 浅色,系统生成 Matrix | `desktop-light`、`narrow-light` 2/2 完成并各保存一张截图 | | 覆盖摘要 | 切换尺寸与主题 | 1、2、4 个组合实时更新;每组至少保留一个选项 | | 自定义入口 | 从快速模式进入“检查其他页面或业务状态” | 当前选择转换为 2 个可编辑 Checkpoint,Ready 条件仍可见;往返快速模式后,已编辑路径 `/first` 保留,覆盖摘要同步更新 | | 治理型首用路径 | Target 留空进入工作台 | 左侧按“对象 → 覆盖 → 验收指令”排列;右侧空态解释“对象 → 覆盖 → 证据”;Fixture 地址不再冒充默认用户对象 | | 常驻主操作 | 填入 `examples/acceptance-demo/index.html` | 顶栏“检查 2”从禁用变为可用,运行时保持可见,不需要滚到底部寻找下一步 | | DeepSeek 生成页面 | 工作区 HTML + 桌面/窄屏 + 浅色 | `desktop-light`、`narrow-light` 2/2 `reached`,0 个异常信号,目标页横向溢出均为 `0px` | | 390px 主路径 | 390×844 打开治理型工作台并检查顶栏主按钮 | 工作台无横向溢出;按钮完整可见,中心命中自身,不被 DSH 输入区遮挡 | ## 3. 首轮发现与修正 真实 DSH 的 `conversation.view` 位于一个会保留滚动位置的宿主滚动容器中。首轮工作台按内容自然高度展开,导致从“对话”切换后顶部可能被旧滚动位置卷走。 修正后,工作台使用 DSH 会话可视高度,自身分别管理配置区和结果区滚动,并为底部输入框预留空间。复验结果:外层滚动回到顶部,工作台从标题开始显示;390px 切换为单列。 这项发现说明不能把“Slot 注册成功”当成真实 UI 生命周期通过,必须在宿主滚动和输入框同时存在时验收。 对抗式复核还发现并修正了四类证据风险:检查点路径可覆盖本地 Target、加载阶段取消可能悬挂、截图默认权限过宽、非默认状态仅用 `body` 会被误报为已复现。最终实现增加站内路径围栏、可中断 CDP 等待、异步释放、私有文件权限,并强制非默认状态使用专用 Ready 条件。 本轮交互复验还发现宿主级测试约束:当一个 DSH Profile 正在写入会话时,不应并行启动第二个 DSH 进程读取同一活动会话。并行期间会话检查器先后报告 torn JSONL 与 committed-region sequence gap;停止并行实例后,该专用会话仍无法被 Host Inspector 解析。此次正式 Run 改在同工作区另一条稳定非空会话完成。尚未执行任何会话日志修复,避免未经确认覆盖历史记录。 ## 4. 证据文件 - [Generated acceptance page](../examples/acceptance-demo/index.html) 真实 DSH 会话截图、Run manifest、目标页截图和技术 Spike 输出保存在本机的 `.dsh-visual-acceptance/` 和 `artifacts/`,可能包含工作区名称、页面内容或 Issue 文本,刻意不随公开仓库发布。公开仓库保留可重新运行的 Fixture、脚本与自动测试。 ## 5. 第一性原理检查 ### 用户是否得到一个完整任务结果? 当前能完成“声明范围 → 运行 → 查看浏览器事实和截图 → 保存历史 → 取消”的最小任务。尚不能完成“确认 Issue → 交给 Agent 修改 → 同 Issue 复验”,所以它是可用切片,不是完整验收闭环。 ### 确定性与判断是否分开? 是。界面只显示 `reached/unreached`、原始浏览器计数和“异常信号”;明确说明信号不等于 Issue。当前没有 AI 判断,因此不存在把候选包装成事实的问题。 ### 状态是否由系统伪造? 否。页面/状态/视口/主题由用户声明;系统追加查询参数。非默认状态必须提供专用 Ready Selector/Text,Run 同时保存声明值、页面观测值和复现方式,不能把“页面已打开”当成“状态已复现”。 ## 6. 对抗式审查 ### 这是否只是检查清单? 当前 UI 本身仍可能被复制;价值来自可重放 Matrix、工作区证据、Host 围栏和 Run 生命周期。只有 Issue 决策与复验接入后,产品差异化才完整成立。 ### 是否过度依赖 DSH? Client 与 Host Adapter 依赖 DSH,但 Runner、验证、存储和 Issue Core 不依赖 DSH。当前仍硬编码了 DSH 会话头部高度,这是兼容风险,应在后续版本改为宿主提供尺寸或容器测量。 ### 当前最危险的误导是什么? 把 2 个“字体信号”描述成 2 个正式问题,或把 2/2 `reached` 描述成“视觉通过”。当前 UI 已避免这两种说法;后续 Issue 层必须继续保持边界。 ### 更简单的替代是否足够? 若真实用户只看一次报告,CLI + JSON 更简单。会话级工作台只有在用户持续做人工决定和第二轮复验时才值得保留。下一阶段必须验证第二次 Run 使用率,而不是继续堆视觉工具。 ## 7. 尚待确认 - Desktop 壳层深色、浅色、关闭重开; - `视觉验收正式安装` 专用会话日志的只读诊断与可恢复性;正式测试不得再并行启动同一 Profile; - 参考图与实现图的基线身份; - Provider 图片推理质量和证据最小化; - DSH Web Console 的可导出验收记录; - 截图内容级空白检测(当前只校验 PNG 格式与尺寸); - Issue 决策、合并/拆分和 Agent Handoff; - 同一 Matrix 的 Retest UI; - 将固定 `76px` 宿主头部适配改为可测量布局契约。 ## 8. `0.1.1-closed-loop-beta` 追加验收 ### 8.1 验收对象 - DSH Web:`0.1.1-rc.2`,单进程 `127.0.0.1:3085`; - 稳定非空会话:`评估视觉验收插件价值及竞品分析`;未使用已知日志异常的 `视觉验收正式安装` 会话; - 基线 Run:`run-20260826050226-a4520678`; - Retest Run:`run-20260826050300-c5a18f81`; - 正式 Issue:`UI-1EA111C7`; - Fixture:`http://127.0.0.1:4173`,桌面与窄屏各有一个缺失字体信号。 ### 8.2 已验证事实 | 范围 | 实测结果 | |---|---| | Candidate 边界 | 2 个字体信号分别形成 Finding Candidate,未自动创建 Issue | | 正式 Issue | 用户将窄屏 Candidate 明确立为 `UI-1EA111C7`,补充 Impact 与 Suggestion | | Decision 历史 | `approved-fix` 以人工事件追加保存;重启 DSH 后仍存在 | | 修改包 | 生成私有 Markdown/JSON,并复制 Markdown;界面明确写明“尚未发送给 Agent” | | 原 Matrix Retest | Retest 的 `matrixFingerprint` 与基线一致;Client 未提供编辑入口 | | 复验候选 | 桌面信号显示 `new-candidate`;窄屏正式 Issue 显示 `still-detected` | | 人工确认 | 点击“确认仍存在”后 lifecycle 写为 `unresolved`,原 `approved-fix` Decision 保留 | | 项目级存储 | `schema.json / project.json / issues.json / change-packages/` 使用 `0700/0600` 权限 | | 关闭释放 | 修正竞态后重启单一 DSH 进程,旧进程输出 `host disposed` | | 390px | Document 与插件横向溢出均为 `0`;复验操作按钮完整可达 | | Console | 插件自身无 warning/error;重启期间宿主连接警告与本插件无关 | 关闭最终测试进程后,`3085` 与 `4173` 均无监听。本轮 13:02/13:03 Run 没有留下新 Chrome Profile;临时目录中仍有一个创建于 12:30:57、当前无端口和文件占用的旧 `dsh-va-chrome-RkOYsT`,本轮未删除,需作为既有残留单独追踪,不能把它算作本轮释放通过的反证或冒充本轮已清理。 实测中发现并修正了一个完成态竞态:Runner 先写 `completed`,Client 停止轮询,Host 随后才写复验关系,导致 UI 错显“没有可比较项”。当前 Host 在读取完成的 Retest 时会先确保候选关系已经写入,再返回给 Client。 ### 8.3 自动测试 闭环核心先前的 26 项自动测试已通过;两个真实项目部分试点发现“根 Checkpoint 静默切换 Target 页面”的 P0 后,补充路径契约测试,当前共 27 项通过。覆盖 Candidate、稳定 identity、私有 Issue 存储、同进程并发追加 Decision、修改包权限与脱敏、不可变 Matrix、六类复验关系、`unreached / failed / cancelled / Matrix changed / rule missing / manual issue / uncertain relation` 安全边界。跨 DSH 进程并发写入尚未支持。真实项目 5 项试点不属于本轮完成事实。 ### 8.4 仍未验证 - `possibly-resolved` 的真实修改项目流程;当前只在自动测试验证不会自动写 `resolved`; - 手工视觉 Issue、合并、拆分的真实 DSH 人工操作;当前已实现 UI/API 并由自动测试覆盖存储行为; - DSH Desktop 壳层深浅色、关闭重开和下一个 DSH 版本兼容; - 12:30:57 既有 Chrome 临时 Profile 的来源与安全清理; - Provider、OCR、Pixel Diff、参考图比较和自动 Agent 会话注入; - 5 个真实项目中至少 3 个完成实际修改与同 Matrix Retest 的试点 Gate。 ## 9. 两个本地真实项目部分试点 > 本节是 `0.1.1-closed-loop-beta` 的增量实测,不替代 5 项真实项目 Gate。 ### 9.1 范围与计数规则 用户指定的只读对象为: - `AI_AIGC/00_AIGC_PRD/.../v1_7_static/index.html`; - `AI_Marketing/04_UI原型/branches/impeccable-v1.3/overview.html`。 通过本地 localhost 提供页面后,分别运行桌面 `1280×800` 与窄屏 `390×844`、`default/light`。未修改两个项目的任何源文件,也未将 Candidate 自动立为 Issue。 首次试跑发现根 Checkpoint 会误跳到站点根页;相关 Run 不计入本节结果。修复 Target 路径契约并通过自动测试后,才重跑并计入下列证据。 ### 9.2 有效结果 | 项目 | 有效 Run | 实际页面 | Matrix | 结果 | |---|---|---|---|---| | 本地项目 A | 本地保留 | `index.html` | 桌面 + 窄屏,default/light | 2/2 `reached`;0 控制台异常、0 请求/HTTP 异常、0 横向溢出 | | 本地项目 B | 本地保留 | `overview.html` | 桌面 + 窄屏,default/light | 2/2 `reached`;0 控制台异常、0 请求/HTTP 异常、0 横向溢出 | | 本地项目 B 的 empty 声明 | 本地保留 | `overview.html?mode=qa` | 窄屏,empty/light | `unreached`;生成 Candidate,未创建 Issue | 截图人工浏览未发现足以在本轮立为手工视觉 Issue 的明确证据。此结论仅限已覆盖的默认态、两种视口和本机环境;不等于视觉通过、业务完整或所有状态已验收。 ### 9.3 对 Gate 的影响 当前完成的是 2 个项目的首次基线验收,以及 1 个“不能安全复现状态”的负向案例。正式 Gate 仍未达成:还需要至少 3 个独立真实项目,并至少 3 个经过人工批准的实际修改后按原 Matrix Retest;全程假性 `resolved` 必须为 0。 ## 10. `0.1.2-responsive-acceptance` 专项验收 > 日期:2026-08-27 > 证据等级:自动测试 E2;本地 Chrome 专项 Spike E3;DSH Web 源码链接安装与会话级 UI 实测 E3。 | 能力 | 实测结果 | 声明边界 | |---|---|---| | 覆盖计划 | Quick 固定 2 项;Standard 固定 8 项;Custom 仍为 1–8 项 | CSS 视口,不是真实设备 | | 页面断点 | Fixture 的 `640px / 900px` 被发现,完整性为 `complete` | 跨域不可读样式表会返回 `partial` | | 基础质量事实 | Viewport Meta 与 `html[lang]` 正确观测 | 规则信号,不是 WCAG 审计 | | 截图内容 | 非空截图通过;疑似空白时最多重试一次 | 不能证明审美或业务正确 | | Retest Diff | 同尺寸基线/当前产生 7,881 个变化像素及 Diff PNG | 只生成 Candidate,不自动创建 Issue/解决 | | 状态复现 | `fill → click → assert-ready` 完成,状态方法为 `action-assert-ready` | 不执行任意 JavaScript;不应录入凭据 | | 动作证据 | 记录 `valueProvided: true`,不回显填写值 | Matrix 本地存储仍可能含值,因此 UI 明示禁止凭据 | | 生命周期释放 | 断点发现与 Run Chrome 均纳入 Host 关闭清理;重启时观察到 Host `disposed → ready` | DSH Desktop 与后续 DSH 版本仍未验证 | 验证命令:`npm test` 共 33 项通过;`npm run spike:browser` 通过;`npm run spike:responsive` 七项检查全部通过,其中包含“极端坐标停放的键盘跳转链接不应被误报为横向越界”。Chrome 为 `151.0.7922.174`。专项证据保存于本地 `artifacts/spikes/responsive/evidence.json`,不作为公开用户项目案例。 ### 10.1 DSH Web 会话级实测 - Standard Run `run-20260827050918-e27c8a3b`:六个布局视口与两个主题锚点共 8/8 `reached`,异常信号 0;Contact Sheet 完整展示。 - 原 Matrix Retest `run-20260827050947-3528fc99`:8/8 `reached`,八组 Baseline / Current / Diff 均可见,变化为 `0 px / 0.000%`;没有新增 Issue、复验关系或自动 `resolved`。 - Custom 状态 Run `run-20260827051217-0614358f`:在 localhost 执行 `fill → click → assert-ready`,1/1 `reached`;公开动作证据只保存 `valueProvided: true`,不回显填写值。夹具故意缺失的字体只生成 Candidate。 - Page-breakpoint 模式完整读取 Fixture 的 `640px / 900px`,生成断点两侧四个 Checkpoint;Quick 与 Custom 配置路径也已核对。 - 390×844 下 DSH 页面 `scrollWidth = 390`;四个覆盖计划以 2×2 排列且均在可视区。 - 首次 Standard Run 曾将 `left: -9999px` 的键盘跳转链接误报为越界。规则修正后重跑为 0 信号,并新增专项回归检查;该首次 Run 不计作通过证据。 - 控制台历史只观察到 DSH 服务重启连接重试、其他侧边栏插件与浏览器扩展消息;未观察到本插件自身前端错误。 以上是本机 DSH Web `0.1.1-rc.2` 的源码链接安装证据。GitHub `v0.1.2-beta.1` 仅作为 Pre-release 获取安装与使用反馈,不代表插件市场或稳定版验收完成。 对抗式结论:新增多尺寸本身不是竞争力;可解释的覆盖计划、范围完整性、同 Matrix Diff、受控状态复现和人工裁决合在一起,才形成可复验资产。允许先发 GitHub Pre-release 学习真实使用,但稳定版 / 插件市场 Gate 保持不变:5 个真实项目,至少 3 个完成实际修改与原 Matrix Retest,假性 `resolved` 必须为 0。