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.
| 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.
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.
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.
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.