Repository navigation
Releases
dsh-qa 0.1.0-rc.2
English
Verdict integrity release. An independent review of rc.1 (Codex gpt-6 astra, 2026-09-18) reproduced three paths where Replay reported a green verdict without proving the claimed assertion. Each was re-reproduced here before being touched, and each is pinned by a test that fails on rc.1.
🐛 Fixed — false greens
- A scoped scroll step passed on the action target being in the viewport, never reading its own assertion's result. The declared assertion must now hold; on a proven container with verified coverage a refuted assertion is a definite
fail, not "unproven". - A final assertion inherited a scroll step's verdict even when later steps had invalidated it. Inheritance now requires that step to have been the last one; otherwise the final view decides.
- Export could bind a fill's value proof to an unrelated field that already held the typed text. A node that held the expected value before the action proves nothing about the action, on the name branch as well as the role branch.
- A failed explicit assertion vanished from the export with no trace. It is now disclosed as
ASSERTION_FAILED_AT_RECORD_TIME, identified by kind and role/name only.
✨ Added — the contract is now frozen
QaScenario.schemaVersion(currently 1). Export always writes it; a file without one is read as version 1 because such files are already committed in repositories; a higher version is refused with both numbers named rather than replayed under rules it was not written for.- Driver contracts are checked at load, not at compile time: browser must report 9, computer 5; older, newer, and unversioned drivers are all refused.
- Report sinks are opened
O_NOFOLLOW|O_NONBLOCK, created0600, and fstat-checked to be regular files — the disciplinedocs/REDACTION_SPEC.mdhad promised but the writers did not implement. - Real-browser acceptance against a deliberately broken app (
fixtures/web/broken-app.html): a working scenario must go non-green when the app regresses, and a broken app must not export a scenario at all.
🔁 Changed — owner decision
- Every "could not prove" now aggregates to
inconclusive;failis reserved for a defect the run actually observed. Previously an unprovable absence wasfailwhile a provisional scope wasinconclusive.inconclusiveis still notpass, so gates keyed onpassare unaffected. A node that IS present still failsnode-absent.
📦 Install
npm install @zseven-w/dsh-qa @zseven-w/dsh-browser
node node_modules/@zseven-w/dsh-qa/scripts/run-example.mjsNeeds @zseven-w/dsh-computer@0.1.0-rc.2 (contract 5) and @zseven-w/dsh-browser@0.1.0-rc.1 (contract 9); other versions are refused at load.
⚠️ Still true
The Computer helper is built by you, by design (no notarization planned). The live vision path has never been run against a real vision model. Mobile drivers export no contract version. Deep targets beyond the 100-node window stay INCONCLUSIVE_SCOPE. This is a developer prerelease, not a production claim.
简体中文
判定完整性版本。对 rc.1 的独立审查(Codex gpt-6 astra,2026-09-18)复现了三条「Replay 未证明断言却给出绿色判定」的路径。每条都先在本仓复现再修,并各有一条在 rc.1 上会失败的测试钉住。
🐛 修复——假绿
- 限定范围的滚动步骤只看动作目标是否在视口,从不读取自己断言的结果。现在断言必须成立;在已证明的容器和已验证的覆盖下,被推翻的断言是确定的
fail,不是「未证明」。 - 最终断言会继承滚动步骤的判定,即使后续步骤已经让它失效。现在只有该步骤是最后一步时才继承,否则以最终视图为准。
- 导出可能把 fill 的值证据绑到一个无关的、本来就含有该文本的字段上。动作发生前就已持有期望值的节点,证明不了这个动作——同名分支和同角色分支都适用。
- 失败的显式断言会从导出中无痕消失。现在以
ASSERTION_FAILED_AT_RECORD_TIME披露,仅以类型和 role/name 标识。
✨ 新增——合同已冻结
QaScenario.schemaVersion(当前为 1)。导出总是写出;无版本的文件按版本 1 读取,因为这些文件已在各家仓库里;更高版本会被拒绝并同时点名两个版本号,而不是按不适用的规则回放。- 驱动契约在加载时校验,而非编译时:browser 必须报 9、computer 必须报 5;更旧、更新、无版本的驱动一律拒绝。
- 报告 sink 以
O_NOFOLLOW|O_NONBLOCK打开、以0600创建、并 fstat 确认是常规文件——这是docs/REDACTION_SPEC.md承诺过但写入端从未实现的纪律。 - 对故意做坏的应用的真实浏览器验收(
fixtures/web/broken-app.html):正常场景在应用退化后必须变非绿,坏应用必须根本导不出场景。
🔁 变更——owner 决定
- 所有「没能证明」统一聚合为
inconclusive;fail只留给运行中实际观察到的缺陷。此前无法证明的「不存在」是fail,而 scope 暂定解析是inconclusive。inconclusive仍不是pass,以pass为门禁的 CI 不受影响。确实存在的节点仍会让node-absent判 fail。
📦 安装
npm install @zseven-w/dsh-qa @zseven-w/dsh-browser
node node_modules/@zseven-w/dsh-qa/scripts/run-example.mjs需要 @zseven-w/dsh-computer@0.1.0-rc.2(契约 5)与 @zseven-w/dsh-browser@0.1.0-rc.1(契约 9);其他版本在加载时会被拒绝。
⚠️ 仍然成立
Computer Helper 按设计由你自行构建(不做公证)。实时视觉链路从未对真实视觉模型跑通。移动端驱动不导出契约版本。超出 100 节点窗口的深层目标仍是 INCONCLUSIVE_SCOPE。这是开发者预发布,不是生产级主张。
Full Changelog: v0.1.0-rc.1...v0.1.0-rc.2
dsh-qa 0.1.0-rc.1
English
First public prerelease. An agent explores your app like a real user and leaves evidence; the explored path is then exported as a deterministic Replay scenario. Orchestrates the browser, macOS desktop, iOS and Android drivers — it does not replace them or widen their authority.
Install the orchestrator plus the drivers you need; @zseven-w/dsh-qa alone loads no drivers:
npm install @zseven-w/dsh-qa @zseven-w/dsh-browser
node node_modules/@zseven-w/dsh-qa/scripts/run-example.mjsSuperseded by v0.1.0-rc.2 (2026-09-20). An independent review (Codex gpt-6 astra) of this release reproduced three paths that returned a green verdict without proving the claimed assertion — against the product's headline claim. rc.2 closes them, versions the scenario file, pins driver contracts at run time, and adds a real-browser acceptance against a deliberately broken app. Do not rely on rc.1's Replay verdicts.
Corrections to these notes. (1) They originally said closed shadow roots could make a scoped
node-absentPASS on a container that contains the node — wrong, copied from a stale backlog row; the contract v9 coverage probe prevents exactly that. (2) They said the Computer helper "is not notarized" as if pending; notarization is not planned — you build the helper yourself, by design.
简体中文
首个公开预发布版本。Agent 像真实用户一样探索你的 App 并留下证据,随后把探索出的路径导出为确定性的 Replay 场景。它编排浏览器、macOS 桌面、iOS 与 Android 四个驱动,不替代它们,也不扩大任何权限。
npm install @zseven-w/dsh-qa @zseven-w/dsh-browser
node node_modules/@zseven-w/dsh-qa/scripts/run-example.mjs已被 v0.1.0-rc.2 取代(2026-09-20)。 对本版本的独立审查(Codex gpt-6 astra)复现了三条「未证明断言却给出绿色判定」的路径——直接违反产品的核心主张。rc.2 堵上了它们、给场景文件加了版本、在运行时钉住驱动契约,并新增了对故意做坏的应用的真实浏览器验收。不要依赖 rc.1 的 Replay 判定。
对本正文的更正。(1)最初称 closed shadow root 会让限定范围的
node-absent误判通过——错,来自一行过期的 backlog;契约 v9 的覆盖探测正是防止这种情况的。(2)称 Computer Helper「没有公证」像是待办;准确说法是不做公证——按设计由你自行构建。
Full Changelog: https://github.com/ZSeven-W/dsh-qa/commits/v0.1.0-rc.1