reticle_act_sequence runs several actions in order in a single round trip. Reach for it whenever a journey needs more than one step, such as fill, fill, submit. A step that carries an expect (the same predicate shape as until) proves its consequence: the result then carries verified, and stopped_at plus the un-run tail if a step’s expect did not hold. With onDeviation: "continue" it drives every step and reports every miss instead of stopping. A sequence with no expect anywhere proves nothing.
A login is three actions. Driving it one call at a time costs three round trips and three turns of context. reticle_act_sequence does it in one.
This tool exists because of a measured problem: agents were driving forms one call at a time, over and over. Those repeats were not retries. The calls succeeded and got repeated, because the batching tool was not advertised and so nobody knew it was there.
Example
target instead of a ref, the same locator reticle_act takes. The sequence resolves each one when that step runs (waiting up to timeout_ms for it to appear), so a login does not need a query round trip per field, and a control an earlier step opens is still addressable:
steps[] entry also carries settled, settleReason, component, role and name, and window, digest and contradictions for that step:
Read that response again
Every step dispatched. In this run the password was wrong, and the login failed. No step declared anexpect, so the sequence cannot know that. It does not claim a pass: it answers verified: "unknown", and because says that the app was driven but not verified.
The honest pattern is: batch the setup, prove the outcome.
"expect": { "kind": "signal", "name": "auth:granted" } on the click step inside the sequence gets the same verdict in one call:
keep, which is the call that saves it as a regression flow.
What each step reports
Each step comes back with itstestid, component and source, its digest (what the app did, as counts) and any contradictions. A step with an expect also carries held, and observed when it missed. When a sequence goes wrong, this tells you which step, and which line of which file.
A step that cannot be performed stops the sequence:
stalled_at names it, and the step’s error
says why. A step whose expect does not hold stops it too (stopped_at), unless you pass
onDeviation: "continue". The steps that did not run come back unchanged in tail. Read
verified and because, not dispatched.