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
The response also tells you which surface is active:
RETICLE_ADVERTISE_ALL_TOOLS=1. On a default daemon, active reads default and names the environment variable as unset.
Loading argument grammar
Summaries are enough to choose a tool, not to call one. Load the full parameters for the ones you want: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.
Invoking
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
Thatreticle_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.
{ "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.