> ## Documentation Index
> Fetch the complete documentation index at: https://docs.reticle.sh/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Reticle is a dev-only, localhost-only verification layer for AI coding agents. It reads program truth (network, state, console, routing, animations, framework state) from inside a running web app and returns a deterministic verdict with evidence. It is not a screenshot tool and not a browser automation library.
> Only `reticle_act_and_wait` and `reticle_assert` produce a verdict. Every other tool moves or reads the app and proves nothing. A drive that ends without one of those two has no result, however many tools it used.
> A verdict of `verified: "unknown"` is not a pass. It means Reticle drove the app and could not tell what happened. Report it as unknown; never weaken a check to make it pass.
> Package names are scoped `@reticlehq/*`. Run every CLI command as `npx @reticlehq/server <command>`, for example `npx @reticlehq/server init`. `reticle` is a bin name that `@reticlehq/server` installs once it is on your PATH, NOT a package on npm: `npx reticle` fetches an unrelated package published by somebody else, so never run that. The complete tool surface is on the `/usage` page; `/agent-cheatsheet` is the one-screen version.

# Reticle: what each tool actually does

> Generated from real calls against a running app. Every row is a probe that ran and the answer it got.

**Generated by `bench/harness/behaviour-matrix.mjs`. Do not edit by hand.**

Every row below is a call that was made against a running app and the answer that came back. Nothing here is described from the source or from intent. If a claim has no probe behind it, it is not in this file. That is the whole point: the hand-written guides drifted, and the drift was invisible because nobody ran them.

`refused (names the fix)` means the error told you what to call instead, so you can correct without reading anything else. `refused (no fix named)` means it did not.

## reticle\_snapshot

| you call it with                                                   | you get back            | bytes |
| ------------------------------------------------------------------ | ----------------------- | ----- |
| an argument the tool does not declare: `{"thisArgDoesNotExist":1}` | refused (names the fix) | 273   |
| the documented call: `{"mode":"interactive"}`                      | ran                     | 434   |
| a value outside the allowed set: `{"mode":"not-a-mode"}`           | refused (names the fix) | 236   |

## reticle\_query

| you call it with                                                   | you get back            | bytes |
| ------------------------------------------------------------------ | ----------------------- | ----- |
| an argument the tool does not declare: `{"thisArgDoesNotExist":1}` | refused (names the fix) | 368   |
| the documented call: `{"by":"role","value":"button"}`              | ran                     | 200   |
| a value outside the allowed set: `{"by":"telepathy","value":"x"}`  | refused (names the fix) | 290   |

## reticle\_network

| you call it with                                                   | you get back            | bytes |
| ------------------------------------------------------------------ | ----------------------- | ----- |
| an argument the tool does not declare: `{"thisArgDoesNotExist":1}` | refused (names the fix) | 354   |
| the documented call: `{"limit":5}`                                 | ran                     | 1175  |
| a number outside its range: `{"limit":-1}`                         | refused (names the fix) | 222   |

## reticle\_console

| you call it with                                                   | you get back            | bytes |
| ------------------------------------------------------------------ | ----------------------- | ----- |
| an argument the tool does not declare: `{"thisArgDoesNotExist":1}` | refused (names the fix) | 293   |

## reticle\_state

| you call it with                                                   | you get back            | bytes |
| ------------------------------------------------------------------ | ----------------------- | ----- |
| an argument the tool does not declare: `{"thisArgDoesNotExist":1}` | refused (names the fix) | 268   |
| a number outside its range: `{"depth":-5}`                         | refused (names the fix) | 173   |
| the documented call: `{"depth":2}`                                 | ran                     | 210   |

* a negative depth was silently ignored before v2.12.0

## reticle\_observe

| you call it with                                                   | you get back            | bytes |
| ------------------------------------------------------------------ | ----------------------- | ----- |
| an argument the tool does not declare: `{"thisArgDoesNotExist":1}` | refused (names the fix) | 305   |

## reticle\_act\_and\_wait

| you call it with                                                                                                                      | you get back            | bytes |
| ------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- | ----- |
| no expectation declared: `{"ref":"e1005","action":"click"}`                                                                           | verified:no-fault       | 1343  |
| the documented call: `{"ref":"e1105","action":"click","until":{"kind":"text","value":"Invalid email or password"},"timeout_ms":6000}` | verified:yes            | 1297  |
| no expectation declared: `{"ref":"e1205","action":"click","until":{"kind":"settled"}}`                                                | verified:no-fault       | 1343  |
| a value outside the allowed set: `{"ref":"e903","action":"click","until":[{"kind":"text","value":"x"}]}`                              | refused (names the fix) | 399   |
| a ref that no longer resolves: `{"ref":"e999999","action":"click"}`                                                                   | refused (names the fix) | 519   |

* no `until`: this returned verified:"yes" before v2.12.0

* a consequence the click CAUSES: the shape that earns verified:"yes"

* an explicit `{kind:"settled"}` is the idle wait, not a declaration, so it grades no-fault too

* a bare array is not a predicate

## reticle\_act

| you call it with                                                                    | you get back            | bytes |
| ----------------------------------------------------------------------------------- | ----------------------- | ----- |
| a required argument omitted: `{"ref":"e901"}`                                       | refused (names the fix) | 192   |
| a value outside the allowed set: `{"ref":"e901","action":"teleport"}`               | refused (names the fix) | 415   |
| an argument the tool does not declare: `{"ref":"e901","action":"fill","value":"x"}` | refused (names the fix) | 314   |
| the documented call: `{"ref":"e901","action":"fill","args":{"value":"probe"}}`      | refused (names the fix) | 516   |

* action arguments nest under `args`

## reticle\_assert

| you call it with                                                                         | you get back            | bytes |
| ---------------------------------------------------------------------------------------- | ----------------------- | ----- |
| a required argument omitted: `{}`                                                        | refused (names the fix) | 592   |
| the documented call: `{"predicate":{"kind":"text","value":"Sign in"},"timeout_ms":3000}` | verified:yes            | 794   |

## reticle\_tools

| you call it with          | you get back            | bytes |
| ------------------------- | ----------------------- | ----- |
| the documented call: `{}` | refused (names the fix) | 246   |

## reticle\_run

| you call it with                                                     | you get back            | bytes |
| -------------------------------------------------------------------- | ----------------------- | ----- |
| a value outside the allowed set: `{"tool":"reticle_nope","args":{}}` | refused (names the fix) | 894   |
| the documented call: `{"tool":"reticle_context","args":{}}`          | ran                     | 54    |
