Skip to content

Commit cc1add6

Browse files
committed
docs(wait): name the polling timeout paths that carry the poll timeline
Review follow-up: wait --stable uses its own error builder and a never-readable strict absence preserves its predicate failure, so the timeline is documented for the polling timeout paths that emit it.
1 parent 96e1a80 commit cc1add6

2 files changed

Lines changed: 6 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
## Unreleased
44

5-
- Added: `wait` timeout errors carry a per-poll timeline in `error.details` (`captures`,
6-
`polls[]` with `startedMs`, `durationMs`, and a typed `outcome`: readable, unreadable, deadline,
5+
- Added: polling `wait` timeouts (`wait <selector>`, `wait text`, `wait @ref`, and `wait absent`
6+
after a readable capture) carry a per-poll timeline in `error.details` (`captures`, `polls[]`
7+
with `startedMs`, `durationMs`, and a typed `outcome`: readable, unreadable, deadline,
78
runner-restart) next to the unchanged `reason`, so a failure says where its budget went without
8-
opening the request log. Long waits keep the first five and last twenty-five polls.
9+
opening the request log. Long waits keep the first five and last twenty-five polls. `wait
10+
--stable` timeouts and a never-readable strict absence keep their existing diagnostics.
911
- Fixed: iOS snapshots no longer report `truncated: true` merely because a later backend produced
1012
them. The runner stamped every recovered capture as truncated — including a complete private-AX
1113
tree taken while the XCTest channel was penalized as slow — so a strict `is absent` / `wait absent`

website/docs/docs/commands.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ agent-device alert dismiss
419419
- Because `wait @ref` is text-based after resolution, duplicate labels can match a different element than the original ref target.
420420
- `wait` shares the selector/snapshot resolution flow used by `click`, `fill`, `get`, and `is`.
421421
- Wait failures carry a structured `error.details.reason` in `--json` output: `wait_target_absent` proves a positive wait never found a match; `wait_target_present` means strict `wait absent` reached its deadline with valid captures that still contained matches; `predicate_failed` means strict `wait absent` could not prove absence because no valid capture arrived, with the final observation/diagnostic preserved; `wait_capture_stalled` means no readable capture arrived and is retriable; `wait_deadline_exceeded` means a later capture consumed the remaining budget after an earlier readable capture; `wait_landmark_identity_mismatch` is a replay destination-guard refusal; and `wait_stable_timeout` means the UI did not settle. Use `readableCaptures`, `waitedMs`, `matches`, and `firstMatch` instead of parsing error text. `firstMatch` carries identity/text evidence only; absence failures do not claim visibility or rect evidence.
422-
- Wait failures also carry `captures` (every poll attempted), `readableCaptures`, and `polls`, one entry per poll with `startedMs` on the wait's own clock, `durationMs`, and `outcome` (`readable`, `unreadable`, `deadline`, or `runner-restart`), so a timeout says where its budget went; long waits keep the first five and last twenty-five polls. `logPath` links the full request log.
422+
- Polling wait timeouts (`wait <selector>`, `wait text`, `wait @ref`, and `wait absent` once a readable capture has been seen) also carry `captures` (every poll attempted), `readableCaptures`, and `polls`, one entry per poll with `startedMs` on the wait's own clock, `durationMs`, and `outcome` (`readable`, `unreadable`, `deadline`, or `runner-restart`), so a timeout says where its budget went; long waits keep the first five and last twenty-five polls. `wait --stable` timeouts and a never-readable strict absence keep their own diagnostics. `logPath` links the full request log.
423423
- `alert` inspects or handles system alerts on iOS simulator, macOS desktop, and Android native/runtime permission dialogs.
424424
- `alert` without an action is equivalent to `alert get`.
425425
- `accept` and `dismiss` are sent once on every platform. A lost or unconfirmed response is reported as an error and never replayed; run `alert get` before acting again.

0 commit comments

Comments
 (0)