reticle_act_and_wait performs one action on an element and waits for a named consequence, returning a verdict in the same call. Reach for it whenever an action is supposed to cause something: it produces a verdict. Verdicts come from reticle_act_and_wait, reticle_assert, reticle_act { steps } when a step declares expect, and reticle_verify (change/flows). Everything else moves or reads the app and proves nothing. Only verified: "yes" is a pass: unknown means Reticle could not tell, and no-fault means nothing was declared to prove.
This is the tool Reticle exists for. It does the act, observe and assert steps in one round trip, and it makes you name the expected consequence before the action runs.
That ordering is not a convenience. An agent that acts first and then decides what counts as success will always find something that counts. Naming the consequence up front is the difference between a check and a rationalisation.
Example
initiatorStack, storageDiffs and per-event trace detail are trimmed out for length; nothing else is changed:
trace is a digest of what the app did in the window. When the counts are not enough, pass the top-level since cursor to reticle_observe for the per-event timeline.
engineBlindSpots lists what Reticle could not see in this session: pixels-unobserved once an action ran with a <canvas> on screen, and claim-arithmetic-unchecked while a claim states an amount and no compare ran. Do not call a run clean while it holds an entry.
The predicate grammar
until takes { kind, ...fields }. The kinds:
Predicates that catch real bugs
Reading verified
yes
The named consequence happened, with evidence attached.
no
It did not. A finding, with a source pointer.
unknown
Reticle could not tell. Not a pass. Report it as unknown.
no-fault
The page settled with nothing wrong, but nothing was declared to prove. Not a pass. Add an
until the action changes.The honesty block
grade is how strong the evidence was. A fired signal outranks an element appearing. coverage.partial: true means Reticle did not observe the whole window. integrity.clean: false means something interfered with the capture and the verdict deserves less trust.
A verification tool that cannot describe the quality of its own evidence is asking you to take its word for it, which is precisely the problem we started with.
Arguments
Omitting
until waits for network and DOM idle, which is the deterministic replacement for a fixed sleep. To assert a consequence and settle, combine them: