# Dry-run and Routing (/docs/dashboard/dry-run-and-routing)



Two tabs about rules that aren't (yet) stopping anything, and rules that change a call instead of
refusing it.

## Dry-run [#dry-run]

*"Rules running in Dry-run — see projected impact before promoting to Enforce."* Every new Block
or Reroute rule starts here.

| Panel                       | Columns                                                                                                                                                             |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Dry-run rules inventory** | Rule (with a Dry-run badge and its detector, or *Budget*) · Action · Days in dry-run · Matches, and how many unique entities · **Projected saved** · **Confidence** |
| **Dry-run decision feed**   | Time · Effect · Rule · Entity · Model · Threshold · Mode — the would-have actions themselves, 50 to a page                                                          |

### Confidence [#confidence]

A rating on how much you should trust the projection, using two thresholds only:

| Rating                | Means                                                  |
| --------------------- | ------------------------------------------------------ |
| **Ready**             | 7 or more days in dry-run **and** 100 or more matches. |
| **Some data**         | 3 or more days **and** 30 or more matches.             |
| **Insufficient data** | Anything less.                                         |

The page's own explanation: &#x2A;"Dry-run runs a rule against your live traffic but never acts on it —
nothing is blocked or rerouted. It just records what the rule would have done, so you can judge
its impact safely before turning it on."*

## Routing [#routing]

*"REROUTE rules and the calls they swap to cheaper models — enforced and shadow."*

| Panel                 | Content                                                                                                 |
| --------------------- | ------------------------------------------------------------------------------------------------------- |
| **KPI pair**          | **Calls rerouted** (sent to a cheaper model) and **Would have rerouted** (dry-run rules, no swap made). |
| **Routing rules**     | Rule · Mode · Target model and provider · Firings, with the shadow count · Last fired.                  |
| **Routing decisions** | Time · Mode · Rule · User · Swap (original to target) · Action, filterable by All / Enforce / Dry-run.  |

<Callout type="warn">
  **Reroute does not switch the model on some frameworks — including LangChain, LangGraph,
  LlamaIndex, Pydantic AI, and the Vercel AI SDK. Those calls still run on the original model.
  Confirm a swap actually happens in your app before you enforce this in production.**
</Callout>

When a call matched a reroute rule but ran on the original model, the trace and workflow views
explain why — an unsupported framework, a target on a different provider (swaps are same-provider
only), or a custom base URL that couldn't be verified.

## What to look for [#what-to-look-for]

* **A rule sitting at *Ready* with real projected savings** — promote it. That's what the tab is
  for.
* **A rule at *Insufficient data* after weeks** — its filter is too narrow, or its traffic doesn't
  exist. Check the match on [Filter vs apply-to](/docs/rules/match-vs-groupby).
* **Would have rerouted is high and Calls rerouted is zero** — the rule is still in Dry-run, or
  your SDK is.
* **Firings recorded but no swap in Routing decisions** — a rejected reroute. Check the framework
  caveat above first.

## Next [#next]

<Cards>
  <Card title="Actions" href="/docs/rules/actions" description="Reroute in full, including the same-provider rule." />

  <Card title="Downgrade the model" href="/docs/recipes/downgrade-model" description="A reroute rule end to end." />

  <Card title="Audit log" href="/docs/dashboard/audit-log" description="Which switch was open on each would-be action." />
</Cards>
