# How to stop an AI SDR quoting the wrong price

**Give the agent one place to read prices from, with an owner and a date
against each one, and make it refuse the prices nobody has confirmed.** The
fix is not a better prompt — it is a source the agent can tell the state of.

A price in a prompt, a deck or a knowledge base is a number with no date on
it. The agent cannot tell a figure somebody confirmed on Tuesday from one that
was true before the last pricing change, because nothing in the text says
which it is. Both read as fact.

## Why the usual answers do not hold

| what people try | why it stops working |
|---|---|
| put the price list in the system prompt | the prompt is where the stale number came from, and nobody revisits it when pricing changes |
| retrieve it from the knowledge base | retrieval returns the most similar passage, not the most recently confirmed one — and an old pricing page is extremely similar to a current one |
| a wording filter | the sentence is well formed. *£29 a month* is not a policy violation, it is a wrong number |
| tell the agent to be careful | *be careful* has no referent. There is nothing it can check against |

The common thread: each of them treats the price as **text** when the thing
that has gone wrong is its **state**.

## What works instead

**One line per claim, with an owner and a date it was last checked.** Not a
document — a document goes stale as a whole and nobody can tell which line
went wrong. A register goes stale one line at a time, visibly, with a name
against it.

**A claim with no owner is one no agent may repeat.** Unavailable rather than
blocked, which is the difference between an error somebody works around and an
empty field somebody wants filled.

**Overdue, unowned, or disputed all behave the same way**: the agent escalates
and tells the buyer it is checking. Answering anyway is not available as a
setting, because silence and a confident wrong number are the two failures the
whole thing exists to prevent.

**And the check is recorded.** When somebody asks in March what the agent
quoted in January, the answer is a record rather than a search through
threads.

## What it looks like in practice

The agent calls `check_action` before it sends, describing what it is about to
commit to and which claims it is relying on. What comes back says whether it
is allowed, **what state each of those claims is actually in** — our answer,
not the agent's recollection — and what the check could not evaluate.

A price whose owner last confirmed it four months ago on a ninety-day interval
comes back overdue. The agent does not send the number; it says it is
confirming the current price and comes back. That is a slower email and a
customer who was not told something wrong.

## The honest limit

**Today this records and does not block.** Every answer carries
`observation_only: true`, so an agent that honours it keeps working unchanged
the day that becomes false. What you get now is the register, the refusal on
unusable claims, and a complete record of what went out — which is what makes
*this would have stopped eleven things last month* a fact rather than a
simulation.

</docs.md> is the connection. </pricing.md> is what it costs.
