For AI agents: the complete documentation index is available at https://a3s-lab.github.io/Test/llms.txt, the full documentation bundle is available at https://a3s-lab.github.io/Test/llms-full.txt, and this page is available as Markdown at https://a3s-lab.github.io/Test/reference/cli.md.

CLI 命令与稳定契约

这页按任务整理 A3S Test 的稳定命令与返回约定。第一次使用先运行能力发现命令,再根据当前任务进入 Agent 会话、ACL 套件或分布式执行。

发现能力

这些命令直接输出已安装协议和调度边界,不根据文档猜测本机能力。

a3s-test capabilities --json
a3s-test agent schema
a3s-test provider schema contract-generation
a3s-test provider schema design-audit
a3s-test provider schema llm
a3s-test provider schema visual-grounding
a3s-test worker schema
a3s-test worker inventory
a3s-test worker remote schema
a3s-test worker artifacts schema
a3s-test distributed schema

Provider schema 描述请求、响应、来源和权限字段,不代表仓库捆绑了某个推理后端。

项目 Vibe Loop

这些命令已包含在已发布的 v1.0.2 二进制中。

命令作用
init发现前端工程并写入 .a3s-test/project.acl
doctor检查配置、可执行文件、包、Test Kit 与可选 URL 连通性。
dev打开一个有界页面评审会话,并持续转交用户明确发送的 finding。
a3s-test init --root . --json
a3s-test doctor --root . --json
a3s-test dev --root . --json

init 默认要求 Test Kit,只做发现与配置,不会安装依赖或启动进程。doctor --connect 会额外探测 URL;--strict 会把 warning 视为失败。

dev 先执行静态检查。配置 URL 已可访问时标记为 server: "existing",退出时不会终止它;否则直接启动配置中的命令并拥有其进程树。开发服务器日志只写入 stderr,stdout 保持为紧凑 JSONL:

{"protocol":"a3s.test.dev/1","event":"ready","project":"checkout","url":"http://127.0.0.1:5173/","server":"started","session":"dev","repair_bridge":{"protocol":"a3s.test.local-repair-bridge/1","state":"watching","event":"repair_batch"}}
{"protocol":"a3s.test.local-repair-bridge/1","event":"repair_batch","project":"checkout","protocol_revision":15,"session":"dev","repairs":["..."],"batches":["..."],"ledger_path":".../repairs.jsonl"}
{"protocol":"a3s.test.dev/1","event":"stopped","project":"checkout","url":"http://127.0.0.1:5173/","server":"started","session":"dev","reason":"interrupt","cleanup":"complete"}

实时 Test Kit 握手通过后,页面评审侧栏明确发送的 finding 会先写入权威 repairs.jsonl 并捕获 A3S Test 自有的修改前证据,再按 finding ID 与 ledger sequence 去重后发出 repair_batch。事件已经包含生成的 session ID,coding agent 不需要再手工协调一个 repair-watch --session ... 进程。Test Kit 可选且页面中完全不存在时,repair_bridgenull,不会启动轮询。

按 Ctrl+C 会在精确关闭浏览器和自有开发服务器后返回 130。自有服务器异常退出会返回 1。启动、配置或 bridge 失败会返回 2;bridge 失败的停止原因为 repair_bridge_error,同样先完成精确清理。

Agent 会话

命令作用
agent start创建持久 Web 会话,声明目标、成功条件和策略边界。
agent observe返回新观察、语义引用和 observation_id
agent clickfillpress执行绑定最新观察的紧凑动作。
agent act --action-json执行完整生成式动作 Schema。
agent screenshot在会话 artifact 根中保存受约束 PNG。
agent ground请求视觉定位候选,不执行点击。
agent audit请求建议式设计审计,不改变 verdict。
agent finish写入终态报告并关闭自有界面。
agent abort取消会话并执行有界清理。

agent openagent start 的别名,agent snapshotagent observe 的别名。

创建会话时的关键选项

a3s-test agent start http://127.0.0.1:3000/checkout \
  --session checkout \
  --goal "Complete checkout" \
  --success "The confirmation heading is visible" \
  --allow-origin http://127.0.0.1:3001 \
  --browser-driver standalone \
  --json
选项默认值或要求作用
--session必填工作区内稳定且唯一的会话标识
--goal必填编码 Agent 要完成的具体目标
--success至少一个可以重复声明的可观察成功条件
--allow-origin初始 origin增加可导航和可观察的精确 origin
--allow-domain增加浏览器网络 hostname,不扩大动作 origin
--browser-drivera3s选择 a3s 或兼容 standalone adapter
--browser-executable自动发现为选定 adapter 指定可执行文件
--command-timeout-ms25,000每条浏览器命令的 deadline
--idle-timeout-ms300,000Agent 两轮之间允许的浏览器 daemon 空闲时间
--browser-microphonedisabled可显式选择 deterministic synthetic microphone
--headed关闭显示浏览器窗口,只用于明确的本地调试
--auto-resolve-repairs关闭验证全部通过后自动从 review_ready 进入 resolved

自动解决是 session 级选择。验证失败、缺少新 ready 修订或证据不完整时不会自动进入 resolved

紧凑动作命令

紧凑命令适合常见的一步操作。

a3s-test agent click @e3 \
  --session checkout \
  --observation 7 \
  --json

a3s-test agent fill @e4 "tester@example.test" \
  --session checkout \
  --observation 8 \
  --json

a3s-test agent press Enter --session checkout --json
a3s-test agent viewport 390 844 --session checkout --json
a3s-test agent screenshot screenshots/confirmation.png \
  --session checkout \
  --json

可用紧凑命令包括 clickhoverfocusdouble-clickcontext-clickfilltypeinsert-textcheckuncheckselectdragpresswheelviewportscreenshot。动作需要 ref 时,必须同时传入生成该 ref 的最新 observation ID。

完整 Action JSON

标签页、frame、dialog、网络、等待、断言和高级证据使用 agent act

a3s-test agent act \
  --session checkout \
  --action-json '{"type":"wait","condition":{"type":"text","value":"Order confirmed"}}' \
  --json

先用 a3s-test agent schema 获取修订 15 的完整 JSON Schema。当前动作类型如下。

类别type
页面状态navigatesnapshotviewporttabframedialog
指针与表单clickhoverfocusdouble_clickcontext_clickfilltypecheckuncheckselectdrag
键盘与终端insert_textpresswheelterminal_pasteterminal_resizeterminal_recording
同步waitassert
文件与网络uploaddownloadnetwork_routenetwork_unroute
证据screenshothartracevideoaccessibilityconsolepage_errors

insert_text 复用已建立的编辑上下文,不接收新目标。terminal_* 只在 TUI surface 合法。未知字段和当前 surface 不支持的动作会在派发前拒绝。

Test Kit inspection

a3s-test agent inspect \
  --session checkout \
  --component checkout-form \
  --detail forensic \
  --limit 100 \
  --json

--detail 接受 summaryscopeddiffforensic。范围可以是 page、一个当前私有 node、component,或 viewport,x,y,width,heightdocument,x,y,width,height 形式的 region。响应带 cursor 时,下一次 inspection 必须保持相同 session、scope 与页面修订。

需要修订级差异时,提供正整数 baseline 和可选有界等待。

a3s-test agent inspect \
  --session checkout \
  --detail diff \
  --since-revision 42 \
  --wait-timeout-ms 5000 \
  --json

diff 必须带 --since-revision,其它 detail 会拒绝这个参数。--wait-timeout-ms 必须是 0 到 300,000 的整数。后续 cursor 还会绑定 detail、scope、baseline、UI 选择、标准化 limit 与当前修订,任一变化都会失败,不会重新从第一页开始。

Repair Ledger 命令

阶段命令关键参数和结果
发现repair-inbox可选 session、1 到 100 条结果上限和可选终态历史
提取repair-watch--limit 默认 20,--timeout-ms 默认 30,000,批次窗口默认 250 ms
检查repair-inspectfinding ID 和 session;无需连接浏览器即可读取活动或关闭的状态
领取repair-claimfinding ID、幂等 request ID、attempt ID 与默认五分钟 lease
开始编辑repair-progressattempt ID 必须匹配,状态进入 repairing
请求澄清repair-reply保存消息并进入 needs_input
完成编辑repair-complete记录 changed files,进入 A3S Test 拥有的 verifying,不做 resolved
运行验证repair-verify新页面条件、changed files、可信项目切片与可选 ACL candidate
失败或取消repair-failrepair-cancel追加终止事件并保留 attempt 历史

每次状态变化都需要新的幂等 request ID。claim 返回的 attempt ID 要沿用到 progress、reply、complete 和 fail。repair-complete 会保存精确且有顺序的 --changed-file 列表,包括空报告。repair-verify 必须重复同一列表并针对更新后的 ready 页面修订;列表不同会在连接浏览器前失败。

忘记 session 或 finding ID 时,先在当前工作区发现可恢复任务:

a3s-test agent repair-inbox --json

a3s.test.repair-inbox/1 无需连接浏览器即可扫描活动和已关闭会话,并依次排列过期 lease、正在修改的任务、最早 queued finding、等待人工处理的任务和只能检查的记录。终态历史默认不返回。需要时可以添加 --session dev--limit 20--include-terminaltotal 是应用 limit 前的有效匹配数,truncated 表示返回前缀是否不完整。

选定任务后再检查完整循环,会话浏览器已经关闭也可以读取:

a3s-test agent repair-inspect finding-checkout \
  --session dev \
  --json

版本化的 a3s.test.repair-loop-record/1 结果包含有界意图、经过校验的源码映射、完成修改时的变更、紧凑证据摘要、验证、ACL 证明、attempt 历史和类型化下一步。它从 repairs.jsonl 派生,不连接浏览器,也不会把不可信 Page Context 变成恢复命令。

claimedrepairingverifying 的 lease 过期时,只返回类型化对账动作,不会返回旧编辑或验证命令。继续该 attempt 或领取下一项前,先执行投影给出的有界 repair-watch

省略 --checks-json 即可从 .a3s-test/project.acl 规划并运行最小配置切片:

a3s-test agent repair-verify finding-checkout \
  --session dev \
  --request-id verify-checkout-1 \
  --success-criteria-passed true \
  --changed-file src/Checkout.tsx \
  --summary "已在新页面上验证 checkout 修复" \
  --json

--config 可以更换项目 ACL 路径,默认值为 .a3s-test/project.acl。Focused 检查声明工程内相对 file_prefixes,regression 检查不声明前缀。结果会在 verification.verificationSlice 中保存协议、focusedexpanded 范围、映射源码、定位器与既有证明状态、选中检查 ID 和扩大原因。选中的命令会在自有进程树中直接运行,执行与清理都有明确上限。

只有外部 orchestrator 已经运行检查时,才传入 --checks-json '[{"command":"npm test","status":"passed","summary":"检查通过"}]'。传入后,本次调用不会自动执行项目检查,但浏览器证明和 ACL 证明门槛仍然保留。

repair-watch 仍用于直接启动的 Agent session 做一次提取。dev --json session 已经运行本地 repair bridge,并会发出带修改前证据的 repair_batch, 不要再为它附加第二个 watch loop。

会话终态与文件

a3s-test agent finish \
  --session checkout \
  --status passed \
  --summary "Checkout completed and confirmation was observed" \
  --json

持久会话默认保存在当前工作区的 .a3s-test/agent-sessions/<session>/events.jsonl 是追加式事件记录,report.json 是终态结果,artifacts/ 只允许相对证据路径。finish 用于已经得到 passed 或 failed 结论的会话;无法安全继续时使用精确 abort

契约与 provider

a3s-test contract generate \
  --config tests/contracts/checkout.generate.acl \
  --output tests/contracts/checkout.draft.json

a3s-test contract review \
  --draft tests/contracts/checkout.draft.json \
  --review tests/contracts/checkout.review.acl \
  --output tests/contracts/checkout.acl \
  --audit tests/contracts/checkout.reviewed.json

contract generate 只写 candidate draft。contract review 重新校验来源、评审动作和冲突后才发布规范 ACL。视觉定位与设计审查分别通过 agent groundagent audit 调用部署方 provider,返回建议而不执行页面动作。

ACL 与分布式运行

a3s-test check <suite.acl> --json
a3s-test run <suite.acl> --json
a3s-test distributed plan <distributed.acl> --compact
a3s-test distributed run <distributed.acl> --json

远程 worker 使用独立的 a3s.test.remote-worker/3 执行协议和 a3s.test.remote-artifacts/1 artifact 协议。请求不能选择 executable、应用、后端、凭据或网络策略,这些必须由部署启动参数固定。

check 只做准入,不启动界面。run 在准入后执行 suite,并把产品失败、测试规范错误、基础设施错误和清理错误分开写入机器结果。distributed plan 先匹配 worker 能力,distributed run 才发送鉴权 shard。

ACL 控件状态断言

Action 协议修订 8 新增以下 expect 条件。

expect "name" {
    target = label("Display name")
    value = "Ada"
}

expect "submit" { disabled = role("button", "Submit") }
expect "terms" { checked = label("Accept terms") }
expect "review" { selected = role("option", "Review") }

expect "status" {
    target = role("listbox", "Publication status")
    selected_values = ["review", "published"]
}

valueselected_values 需要单独配置 target。布尔状态包括 enabled/disabledchecked/uncheckedselected/unselected 三组。预期选项不得重复;期望值与实际值都会排序后按精确集合比较。[] 可以通过准入,含义是观察到真实的空选择。

布尔状态通过时会在 output.data 下返回以下结构。

{
  "target": { "type": "role", "role": "button", "name": "Submit" },
  "state": "enabled",
  "expected": false,
  "actual": false
}

值和已选值集合也会返回 targetexpectedactual,其中选项数组使用规范顺序。配置 stable_for_ms 后,Runner 会重复同一个类型化断言,并增加常规的 assertionstability 证据。

错误码含义
test.spec.condition_ambiguous同时配置了多个 expectation 条件
test.spec.attribute_requiredvalueselected_values 缺少 target
test.spec.selected_value_duplicate预期选项出现重复值
test.driver.web.target_not_found没有匹配目标,绝不能借此证明负向状态
test.driver.web.target_ambiguous匹配到多个目标
test.driver.web.state_unsupported目标或 standalone ref 协议没有暴露所需状态
test.driver.web.output_invalid浏览器输出类型错误,或实际选项包含重复值
test.assert.value观察到的精确值不同
test.assert.enabled.disabled.checked.unchecked.selected.unselected观察到的布尔状态不同
test.assert.selected_values观察到的精确选项集合不同

Web 读取实时 DOM 状态,原生 checkbox/radio 属性优先于 ARIA。GUI 只有在 CUA 确实返回 value 时支持精确值;布尔状态和多选状态会以 test.driver.gui.assertion_unsupported 拒绝。TUI 仍然只支持可见终端文本。Page Context ref 会在派发前解析;直接 standalone ref 还不能暴露原生 option 选择或多选数组。

焦点归属 ACL 断言

Action 协议修订 13 新增四种稳定目标条件。

expect "checkout-focused" { focused = role("button", "Checkout") }
expect "cancel-unfocused" { unfocused = testid("cancel") }
expect "dialog-owns-focus" { focus_within = role("dialog", "Checkout") }
expect "page-does-not-own-focus" { focus_outside = testid("page-shell") }

focused 把目标与当前 document 和嵌套开放 Shadow DOM 中可观察到的最深 active element 比较。focus_within 还会沿 assigned slot、DOM 父级与 Shadow host 检查渲染扁平树祖先。两种负向形式只在目标解析成功后比较同一份实时证据。元素缺失绝不能证明 unfocusedfocus_outside

错误码边界
test.spec.focus_target_unstableACL 目标是 browser ref 或 visual point
test.driver.web.target_not_found.target_ambiguous.target_invalid稳定目标解析失败,无法比较焦点
test.driver.web.state_unsupported程序化 standalone ref 请求实时焦点归属
test.assert.focused.unfocused已解析元素的精确焦点归属不同
test.assert.focus_within.focus_outside已解析扁平树范围的焦点归属不同
test.assert.unstable后续采样推翻了首次通过的焦点断言

语义定位器穿透开放 Shadow DOM,并排除可访问性隐藏的 composed ancestry,包括隐藏的 slot wrapper。CSS 保持当前 document 查询语义。GUI 与 TUI 没有等价归属证据时明确关闭失败。当前检入覆盖 600/600 个确定性 Web 分类、200/200 个持续窗口、200/200 个瞬态窗口,以及 standalone Chromium 中 17 个正向断言和 11 个负向或驱动错误分类。

实时语义状态 ACL 断言

Action 协议修订 14 新增五组彼此独立的正向与负向状态。

expect "filters-open" { expanded = testid("filters") }
expect "pin-off" { unpressed = role("button", "Pin") }
expect "name-locked" { readonly = label("Display name") }
expect "email-required" { required = placeholder("Email") }
expect "email-invalid" { invalid = css("#email") }

完整配对为 expanded/collapsedpressed/unpressedreadonly/writablerequired/optionalinvalid/valid。状态适用时以原生属性为准,包括 <details>.open、原生只读与必填属性,以及 willValidate 为 true 时的 Constraint Validation。ARIA 回退只接受精确布尔值;aria-invalid 还会把 grammarspelling 映射为 invalid。混合按压状态、未知 token 和缺失状态属于 unsupported,不会被当成 false。

错误码边界
test.spec.semantic_state_target_unstableACL 目标是 browser ref 或 visual point
test.driver.web.target_not_found.target_ambiguous.target_invalid稳定目标解析失败,绝不能借此证明负向状态
test.driver.web.state_unsupported目标、token、surface 或程序化 browser ref 无法提供权威状态
test.assert.expanded.collapsed.pressed.unpressed.readonly.writable.required.optional.invalid.valid唯一目标暴露了明确布尔值,但与请求条件不同
test.assert.unstable后续合法采样推翻了首次通过的语义状态断言

writable 不蕴含 enabled,产品要求真正可编辑时应组合两者。当前 Page Context ref 可以在派发前解析为稳定定位器。语义定位器穿透开放 Shadow DOM,并排除可访问性隐藏祖先;CSS 保持当前 document 语义。GUI 与 TUI 明确关闭失败。当前检入证据覆盖 1,000/1,000 个确定性 Web 分类、100/100 个持续窗口、100/100 个瞬态窗口,以及 standalone Chromium 中 27 个正向断言和 17 个负向或驱动错误分类。

渲染文本、有序序列与可见数量 ACL 断言

Action 协议修订 9 把预期文案绑定到唯一目标,并观察稳定定位器产生的完整可见数量。修订 10 新增精确的有序渲染文本向量。

expect "total-copy" {
    target = testid("total")
    rendered_text = "Total $42.00"
}

expect "visible-rows" {
    target = css("[data-row]")
    visible_count = 3
}

expect "line-items" {
    target = css("[data-line-item]")
    rendered_texts = ["Keyboard × 1", "Mouse × 2", "Shipping", "Shipping"]
}

expect "no-line-items" {
    target = css("[data-missing-line-item]")
    rendered_texts = []
}

expect "no-errors" {
    target = role("alert", "Checkout error")
    visible_count = 0
}

rendered_text 必须解析到唯一可见目标。比较前会去掉两端空白,并把连续空白折叠成一个空格。目标缺失或歧义仍是驱动错误;只有已经观察到的文案不同才返回 test.assert.rendered_text

visible_count 接受语义或 CSS 定位器,并把完整可见匹配集合与非负整数比较。空集合是有证据的零。ACL 会以 test.spec.visible_count_target_unstable 拒绝 ref()visual_point(),因为它们都不能表示可重复解析的集合。非法 CSS selector 仍是 test.driver.web.target_invalid;已观察数量不同才是 test.assert.visible_count

rendered_texts 接受稳定语义或 CSS 定位器,对每个可见匹配独立规范化,并在不排序、不去重的前提下比较完整向量。空匹配集合会被观察成 [],顺序与重复字符串都有意义。ACL 会以 test.spec.rendered_texts_target_unstable 拒绝 ref 与 visual point。预期和实际向量在 ACL 与 Web 驱动两端都限制为最多 256 项。非法 selector 与超限仍是驱动错误;已观察向量不同时才是 test.assert.rendered_texts

错误码边界
test.spec.rendered_texts_target_unstableACL 目标是 ref 或 visual point
test.spec.rendered_texts_limitACL 预期向量超过 256 项
test.driver.web.expectation_invalid类型化调用方绕过 ACL 传入超限预期
test.driver.web.collection_limit页面或不可信驱动响应产生超过 256 项
test.assert.rendered_texts有界观察向量的内容、重复项或顺序不同
定位平面匹配与可见性语义
CSS只查询当前 document。目标必须有正几何与 client rect,且组合祖先不能 hidden、display-none、visibility-hidden/collapsed 或完全透明。单独的 aria-hidden 不会移除视觉像素,所以仍计数。
语义role、text、test ID、label 与 placeholder 会穿透开放 Shadow DOM;除同样的渲染检查外,还排除可访问性隐藏祖先。

两种平面都排除零几何元素,但都不声称目标处于 viewport 内或没有被其他像素遮挡。当前浏览器 ref 可以标识唯一 rendered_text 元素,却不能表示 visible_countrendered_texts 集合。GUI 支持单目标 rendered_text(优先 CUA value,否则 label)。GUI 与 TUI 对 rendered_textsvisible_count 明确关闭失败。

三种条件都支持 stable_for_ms。后续标量文案、有序向量或数量不匹配变为 test.assert.unstable;驱动失败保留原错误码。修订 9 覆盖 600/600 个确定性标量文案与数量分类,修订 10 新增 600/600 个有序向量分类。组合稳定性证据覆盖 300/300 个持续一致窗口与 300/300 个瞬态窗口,以及真实 Chromium CLI 中 12 个正向观察、12 个负向分类、三个通过与三个被拒绝的 100 ms 窗口和零私有 runtime 泄漏。

渲染布局 ACL 断言

Action 协议修订 11 比较两个稳定目标的渲染几何。

expect "checkout-below-summary" {
    target = testid("checkout")
    relative_to = role("region", "Order summary")
    layout = "below"
    tolerance_px = 1
    stable_for_ms = 300
    sample_interval_ms = 25
}

targetrelative_tolayout 都是必填项。两个目标都接受 role、text、test ID、label、placeholder 或 CSS 定位器。ACL 会以 test.spec.layout_target_unstable 拒绝 ref()visual_point();两者绑定一次观察,不能在稳定窗口中重新解析。当前 Page Context ref 在两个目标都解析为稳定定位器后仍可使用。tolerance_px 默认为零,只接受不超过 1,024 的整数。

分组关系比较规则
方向abovebelowleft_ofright_of边界侵入不能超过容差
包含containsinside每条包含边界最多允许容差范围的偏差
相交overlapsnot_overlapping相交时两个轴都必须大于容差;不相交只需一个轴不超过容差
对齐aligned_leftaligned_rightaligned_topaligned_bottomaligned_center_xaligned_center_y边缘或中心绝对差不超过容差
尺寸same_widthsame_heightsame_size宽或高的绝对差不超过容差

Web 在一次页面求值中解析两个目标并采集两个矩形。CSS 使用视觉渲染可见性,因此仅设置 aria-hidden 但仍有像素的元素仍可测量;语义定位器还会排除可访问性隐藏祖先,并穿透开放 Shadow DOM。通过载荷返回两个目标、两个矩形、关系、容差与 matched = true

错误码边界
test.spec.layout_target_unstable任一 ACL 目标是 ref 或 visual point
test.spec.layout_relation_unknownlayout 不属于封闭的 17 种关系词表
test.spec.layout_tolerance_limitACL 容差超过 1,024 像素
test.driver.web.target_not_found任一稳定目标没有合格匹配
test.driver.web.target_ambiguous任一稳定目标存在多个合格匹配
test.driver.web.target_invalid任一 CSS selector 非法
test.driver.web.output_invalid任一矩形或不可信结果信封畸形或超出几何边界
test.assert.layout两个合法矩形违反指定关系
test.assert.unstable初次匹配后,后续稳定性样本违反关系

GUI 要求两个 frame 来自同一份新鲜 CUA snapshot。TUI 返回明确的不支持错误。稳定性输出保留首次与末次完整双矩形载荷;后续解析或几何失败仍由驱动负责。当前检入证据覆盖 3,400/3,400 个确定性案例、100/100 个持续窗口通过、100/100 个瞬态窗口拒绝、全部 17 种关系,以及 standalone Chromium 中 25 个正向断言和 15 个负向或错误分类,同时完成精确清理。

visual viewport 覆盖率与指针命中 ACL 断言

Action 协议修订 12 区分目标与 visual viewport 相交,以及指针命中测试能否到达目标。修订 15 新增有界覆盖率阈值。

expect "checkout-in-view" {
    in_viewport = testid("checkout")
}

expect "checkout-mostly-visible" {
    target = testid("checkout")
    viewport_coverage_at_least = 80
}

expect "drawer-mostly-outside" {
    target = css("#drawer")
    viewport_coverage_at_most = 10
}

expect "checkout-pointer-hit" {
    pointer_reachable = role("button", "Checkout")
    stable_for_ms = 300
    sample_interval_ms = 25
}

in_viewport 要求正面积相交。部分进入视口的目标会通过,并返回零到一之间的 intersection_ratio;完全离屏或只有边界接触会失败。覆盖率等于相交面积除以完整目标面积。viewport_coverage_at_least 接受 1 到 100,viewport_coverage_at_most 接受 0 到 99,两个被排除的端点会导致恒真断言。pointer_reachable 在裁剪后的目标矩形上使用确定性 3×3 网格,至少一个深层命中到达目标或其 composed-tree 后代时通过。覆盖率不证明无遮挡,所有写法都不证明 enabled 状态、键盘可达性、事件处理或产品意图。

所有写法都接受稳定的 role、text、test ID、label、placeholder 或 CSS 定位器。ACL 拒绝 ref 和 visual point;当前 Page Context ref 可以在派发前解析为稳定定位器。语义目标穿透开放 Shadow DOM,并排除可访问性隐藏祖先。CSS 保留仍有视觉像素的 aria-hidden 目标。原生命中测试会让接收指针事件的透明覆盖层形成阻挡,也会让 pointer-events: none 覆盖层穿透。

错误码边界
test.spec.in_viewport_target_unstableACL 目标是浏览器 ref 或 visual point
test.spec.viewport_coverage_target_unstableACL 覆盖率目标是浏览器 ref 或 visual point
test.spec.viewport_coverage_threshold_trivialACL 阈值会让覆盖率断言恒真
test.spec.viewport_coverage_percent_limitACL 覆盖率百分比大于 100
test.spec.pointer_reachable_target_unstableACL 目标是浏览器 ref 或 visual point
test.driver.web.target_not_found稳定目标没有合格匹配
test.driver.web.target_ambiguous稳定目标存在多个合格匹配
test.driver.web.target_invalidCSS selector 非法
test.driver.web.output_invalid矩形、样本数量、顺序、坐标、类型或响应信封畸形
test.driver.web.interactability_unsupported浏览器没有提供必需的命中测试能力
test.assert.in_viewport合法目标矩形与 visual viewport 没有正面积相交
test.assert.viewport_coverage_at_least独立重算的合法覆盖率低于最低阈值
test.assert.viewport_coverage_at_most独立重算的合法覆盖率高于最高阈值
test.assert.pointer_reachable没有合格样本命中目标或 composed-tree 后代
test.assert.unstable初次通过后,后续稳定性样本违反断言

通过的 viewport 载荷包含两个矩形和独立重算的比例。覆盖率载荷还包含 actual_percentcomparisonthreshold_percentmatched。通过的 pointer 载荷还包含全部九个有序样本坐标与布尔值,以及 sample_countreachable_samples。GUI 与 TUI 的当前协议没有等价证据,因此明确关闭失败。当前检入证据覆盖 1,000/1,000 个基础 Core 几何案例与 2,000/2,000 个阈值案例、4,000/4,000 个 Web 协议分类、300/300 个持续窗口与 300/300 个瞬态窗口,以及 standalone Chromium 中 37 个通过断言和 25 个负向或驱动错误分类,并完成精确清理。

ACL 隐藏断言

hidden 断言稳定目标定位器在当前观察中没有可见匹配。目标不存在,或匹配元素没有渲染出的可见边界,都满足条件。

expect "dialog-closed" {
    hidden = role("dialog", "Checkout")
}

ACL 编译器保存现有的 Action::Assert(Expectation::Visible(target)),并增加由 Runner 负责的隐藏模式。这个策略不会增加 Action 变体;当前协议已推进到修订 15,是因为上面的类型化 expectation。Runner 派发正向可见性探测,再按以下契约分类。

探测结果步骤结果
返回可见输出test.assert.hidden,记录 visible = true,正向输出位于 probe
返回 test.assert.visible通过,记录 visible = false,错误码与消息位于 probe_error
其他 test.driver.* 或错误保留原始错误,定位或基础设施失败不能证明界面隐藏

通过步骤会在 output.data 下给出以下稳定结构。

{
  "expected": "hidden",
  "visible": false,
  "target": {
    "type": "role",
    "role": "dialog",
    "name": "Checkout"
  },
  "probe_error": {
    "code": "test.assert.visible",
    "message": "target is not visible"
  }
}

请使用所选 surface 支持的语义或 CSS 定位器。ref()visual_point() 会在准入时失败,因为两者绑定某次观察,解析失败可能只是数据过期,不能证明界面隐藏。Web 支持其语义与 CSS 可见性目标。GUI 支持已准入的语义目标,并把过期或歧义匹配保留为驱动错误。TUI 当前不支持目标可见性断言。

错误码含义
test.spec.hidden_target_unstableACL 使用了绑定观察的 ref 或 visual point
test.assert.hidden正向探测发现可见目标
test.run.assertion_mode_invalid程序化 suite 把隐藏模式附在非法动作或目标上

expect hidden 是立即断言。产品要求持续隐藏时,可组合 stable_for_ms。后续采样又发现目标可见时返回 test.assert.unstable,同时保留第一次隐藏观察和可见反例。目标消失本身就是同步条件时,使用下面的等待形式。

ACL 隐藏等待

wait "dialog-closed" {
    hidden = role("dialog", "Checkout")
}

编译器保存现有的可见目标等待条件,并增加 wait_mode = hidden;在当前修订 15 下,它仍然复用早先的可见性 Action 变体。只要正向探测仍返回可见证据,Runner 就先立即执行一次只读可见性断言,再每 50 ms 探测一次。

边界结果
目标已经隐藏或不存在一次探测后通过,不等待间隔
目标随后隐藏第一次收到 test.assert.visible 不匹配时通过
到场景 deadline 仍然可见timed_outtest.run.timeout、退出码 124,并保留最近可见反证
运行被取消cancelledtest.run.cancelled、退出码 130,执行有界清理并保留反证
达到 1,201 次探测test.run.hidden_wait_probe_limit 失败
驱动、过期或歧义错误保留原始错误并记录 wait.outcome = inconclusive,绝不转换为目标已消失
程序化策略或目标不匹配派发前返回 test.run.wait_mode_invalid

延迟后匹配的等待会在 output.data 中给出以下稳定结构:

{
  "expected": "hidden",
  "visible": false,
  "first_visible": { "visible": true },
  "last_visible": { "visible": true },
  "probe_error": {
    "code": "test.assert.visible",
    "message": "target is not visible"
  },
  "wait": {
    "condition": "hidden",
    "outcome": "matched",
    "poll_interval_ms": 50,
    "max_probes": 1201,
    "probes": 3,
    "observed_ms": 101
  }
}

probes 统计逻辑观察次数。步骤 attempts 统计驱动派发次数,只有已准入的可重试基础设施故障才可能让后者更大。普通 suite 与 agent run 的确定性验证使用同一套 Runner 策略。

ACL 稳定窗口断言

stable_for_ms 为 ACL 的 expect 增加有界采样策略。文本、精确 URL、目标可见性和目标隐藏断言都能使用;前提是所选 surface 驱动支持底层 expectation。它不会增加新的动作类型,也不会改变驱动契约。

expect "settled-total" {
    visible = testid("order-total")
    stable_for_ms = 300
    sample_interval_ms = 25
}
字段是否必需准入范围默认值
stable_for_ms启用时必需10 至 60,000 ms 的整数不启用稳定采样
sample_interval_ms正整数,且不得大于稳定窗口50 ms;窗口更短时等于窗口

计划工作量按 ceil(stable_for_ms / sample_interval_ms) + 1 计算,包含第一次观察。超过 1,001 个计划样本会在准入时被拒绝。Runner 只在第一次采样通过后启动计时,并在请求窗口的末端一定执行一次采样。

稳定步骤保留常规步骤字段,并在 output.data 下增加以下数据。

JSON 路径含义
assertion.first第一次成功采样的驱动数据
assertion.last最后一次或失败采样的驱动数据;驱动只返回错误时可以是 null
stability.outcomepassedunstableinconclusive
stability.required_ms请求的稳定窗口
stability.sample_interval_ms准入后的采样间隔
stability.samples已完成的观察点数量,包含第一次采样
stability.observed_ms第一次成功采样后的实际耗时;受调度和驱动耗时影响,可以大于请求值
步骤 attempts全部驱动调用次数;启用基础设施重试时可以大于 samples

第一次采样为假时保留原始断言错误码。后续采样为假时使用 test.assert.unstable。超时和取消仍是终止性的 test.run.* 结果;采样没有完成时可以不带 stability payload。

错误码含义
test.spec.typetest.spec.number_range时长或间隔不是正整数
test.spec.stability_duration_required只配置了间隔,没有配置窗口
test.spec.stability_range窗口不在 10 至 60,000 ms 内
test.spec.stability_interval间隔大于窗口
test.spec.stability_sample_limit计划样本超过 1,001
test.assert.unstable第一次采样通过,但之后的采样为假
test.run.stability_action_invalid程序化 suite 把稳定策略附在非断言动作上
test.run.stability_invalid程序化 suite 绕过了准入边界
test.run.stability_output_invalid程序化驱动为采样断言返回了不应出现的 advisory report

JSON 与错误契约

自动化调用应统一传入 --json,读取稳定错误码、状态和结构化字段,避免解析面向人的帮助文本。常见错误范围如下。

范围归属
test.spec.*ACL、配置、target 或路径准入
test.driver.*surface adapter、协议和生命周期
test.assert.*产品实际状态与期望不符
test.run.*deadline、取消、调度和清理
test.session.*持久会话、Repair Ledger 和 lease

完整处理方法见故障排查。全部功能与权限边界见能力参考

退出码

退出码含义
0通过
1测试或动作失败
2调用或配置无效,或分布式基础设施失败
124超时
130已取消

第一次 Ctrl+C 请求取消并清理自有界面。第二次只终止当前进程拥有的浏览器、CUA 进程边界和 TUI 进程树。

Web 能力摘要

Web 驱动支持导航、语义快照、点击、悬停、聚焦、填写与输入、选择范围文本插入、勾选、选择、双击、右键、拖动、按键、修饰键滚轮与视口设置。同步操作包括 load、文本、URL、正向可见性、有界消失等待、精确或范围焦点归属、实时展开/按压/只读/必填/有效性状态,以及正向或隐藏断言。证据包括截图、可访问树、console、页面错误、HAR、Chrome trace、WebM 视频和受约束下载。

浏览器默认 headless,--headed 是明确的调试选项。网络和导航范围分别受初始 origin、--allow-origin 与显式 hostname 例外约束。