Skip to main content
reticle_tools lists every Reticle tool and, on request, returns the full argument grammar for the ones you name. reticle_run then invokes any of them. Reach for the pair whenever you need a capability that is not in the default advertised surface, which is most of what Reticle can do. reticle_tools discovers. reticle_run invokes. Together they cost two tool definitions instead of the rest of the catalog.

Discovering what exists

Returns every tool with a one-line summary. A sample of what lives in the cold tail: The response also tells you which surface is active:
That capture is from a daemon started with RETICLE_ADVERTISE_ALL_TOOLS=1. On a default daemon, active reads default and names the environment variable as unset.
“Read once at daemon startup” is doing real work in that sentence. Setting the environment variable in a shell where a daemon is already running changes nothing, and the resulting “I set it and nothing happened” is very hard to debug from the outside.

Loading argument grammar

Summaries are enough to choose a tool, not to call one. Load the full parameters for the ones you want:
Each named tool comes back with its full description and a params array of { name, required, description }. This is the point of the design. Schemas arrive when they are needed, rather than on every turn forever.
Do this rather than guessing. reticle_run refuses an unknown parameter instead of running the call, and hands you the real parameter list so the retry is one turn rather than three:
The full error string continues: “NOT applied, so any result would be an answer to a different question.”

Invoking

Real response from an instrumented app, trimmed:
The full response on this fixture carries 49 testids and 16 signals. source: "live" means it was read from the running app; pass { "fromDisk": true } to read the git-checked .reticle/contract.json instead, which works with no browser attached at all.

Start here, not with a snapshot

That reticle_capabilities output is the single best first call on an unfamiliar app. It is the app telling you what it considers testable: the elements worth driving, the signals that mean success, and the flows somebody already thought were important. Compared with snapshotting the page and guessing from element names, it is both cheaper and more truthful. auth:granted is what the app means by “logged in”, and no amount of looking at the DOM will tell you that.
Then drive the flow and see whether your error state actually works. Most do not, which is the point. { "clear": true } turns it off and answers { "applied": true, "count": 0 }.
reticle_run returns whatever the invoked tool returns, unchanged. It is a transport, not a wrapper. So a tool that produces a verdict still produces one through run.
Last modified on September 18, 2026