e605 are session-specific: take your own from reticle_query before copying a call.
”Did the login actually work?”
One call, three conditions. The signal fired, exactly one request went out, and nothing was logged.count: 1 is the part that catches double-submit, and it costs nothing to ask for.
”Did navigating actually change the view?”
”Did the modal open?” and the lesson in getting it wrong
Here is a real failure, kept because it teaches more than another pass.summary. The modal did open. newDeployOpen went false to true and the app fired modal:opened. capsule.blastRadius says the same thing as a list: the click moved the app store and fired modal:opened, and nothing else.
The assertion was wrong, not the app. That modal is a div with no role="dialog", so a role query could never match it. (Which is also an accessibility bug worth fixing, found for free.)
The right predicate was sitting in the response the whole time:
”Nothing matched, and I do not know why”
An emptyreticle_query result tells you what is there:
hint.route says where you actually are and presentTestids says what is here instead, for 101 tokens and no snapshot. presentRegions is the other half: a list with childCount: 0 is an empty state, which is a different bug from a list that failed to render at all.
”Is this button destructive?”
Reticle refuses controls that look destructive, before acting:The matcher is conservative and will occasionally stop something harmless. A button labelled “New
deploy” trips it. That is the trade: a false stop costs you one argument, and a false start costs
you a deleted record.
”Did my change break anything else?”
”What is even testable in this app?”
The best first call on an unfamiliar codebase:”The error state has never been tested”
Most error states have never run. Force one:clear: true to turn mocking off.
”I want this to run on every PR”
Record it once, replay it forever:names to replay every saved flow. Either way you get one consolidated verdict, and only the failures carry detail:
flaky, the flows it has seen both pass and fail on unchanged code. Treat that list as a bug in the flow, not in the app.
The predicate grammar
Every kind, every field, and which ones actually prove something.
Best practices
The habits behind these recipes, and the mistakes that produce a confident wrong pass.