RAG & Grounding8 min readยท

How to Stop AI Agents From Quoting Stale Prices

A customer asks your support agent what a plan costs, and it confidently quotes a number that expired two pricing revisions ago.

A customer asks your support agent what a plan costs, and it confidently quotes a number that expired two pricing revisions ago. The agent is not malfunctioning; it is faithfully reciting whatever it retrieved, and what it retrieved was stale. For commerce, billing, and sales-assist agents, a wrong price is not a quirky hallucination. It is a quote you may be on the hook to honor, a compliance exposure, and a trust hit that no apology email fully repairs.

Sanity Context (previously Agent Context) exists to close exactly this gap. Sanity is the Content Operating System for the AI era, an intelligent backend designed to keep agent retrieval grounded in content that is current, governed, and reviewable. The problem with stale prices is rarely the model. It is the pipeline feeding the model: a vector index rebuilt on a nightly cron, a PDF snapshot from last quarter, embeddings that drifted out of sync with the source of record.

This guide reframes stale pricing as a freshness and grounding problem, walks through where conventional RAG stacks let prices rot, and shows how dataset embeddings tied directly to content keep agents quoting what is true right now.

Why agents quote stale prices in the first place

The failure looks like hallucination, but it is usually a freshness gap. An agent answers from whatever its retrieval layer hands back, and in most architectures that retrieval layer is a copy. The price lives in your billing system or your content store, then gets exported, chunked, embedded, and loaded into a vector index. Every one of those hops is a moment where the copy can fall behind the original.

Consider the common pattern: a pricing page is updated on a Tuesday, but the embedding job that feeds the agent runs nightly, or weekly, or only when someone remembers to trigger it. Between the update and the next index rebuild, the agent retrieves the old vector, reads the old number, and quotes it with total confidence. The model did nothing wrong. It grounded its answer in exactly what retrieval gave it, which was last week's truth.

Worse, many teams snapshot pricing into PDFs or documents that get ingested once and rarely revisited. A price sheet from Q1 sits in the knowledge base all year. There is no error, no exception, no log line that says "this is stale." The agent simply cannot tell the difference between a current price and an expired one, because nothing in the retrieved chunk carries that signal.

Stale prices are therefore a content-pipeline problem long before they are a model problem. The fix is not a better prompt or a larger context window. It is shortening the distance between the source of record and what the agent retrieves, so that an update to the price is an update to what the agent can see, not the trigger for a separate batch job that may or may not run in time.

The hidden cost of a separate vector pipeline

The standard RAG architecture treats retrieval as a bolt-on. You stand up a vector database alongside your content system, write an ingestion service to extract and chunk content, call an embedding model, and write the vectors into the index. It works in a demo. In production, it becomes a second source of truth that you now have to keep synchronized with the first.

The synchronization is where pricing rots. Someone has to decide when re-embedding happens. Real-time on every content change is expensive and operationally fragile; nightly is cheap and predictably stale. Most teams land on a schedule, and a schedule is, by definition, a window during which the index disagrees with reality. For prose that ages gracefully, that window is tolerable. For a price, a window is a liability.

There is also the failure mode nobody plans for: the pipeline silently breaks. The embedding job throws an error at 2 a.m., the retry queue backs up, and for three days the agent serves an index that stopped updating. Nothing in the conversation surfaces this. The first signal you get is a customer disputing a quote.

Sanity Context collapses this architecture. Embeddings are a property of the dataset itself, tied to the content in the Content Lake rather than maintained in a separate store. When the price changes in the content, the embedding propagates within minutes, with no external pipeline to schedule, monitor, or repair. There is no second source of truth to drift, because there is no second store. The thing the agent retrieves and the thing the editor changed are the same thing.

Illustration for How to Stop AI Agents From Quoting Stale Prices
Illustration for How to Stop AI Agents From Quoting Stale Prices
โœจ

No separate vector pipeline to drift

Because dataset embeddings are tied to content in the Content Lake, a price change propagates to what the agent retrieves within minutes. There is no nightly re-embedding cron to schedule, no sync service to monitor, and no second source of truth that can silently fall behind the source of record.

Model the price so the agent can reason about freshness

A price quoted as raw text in a paragraph carries no metadata. The agent sees "$49 per month" and has no way to know when it took effect, whether it is still active, or what region it applies to. The first structural fix is to stop treating prices as prose and start treating them as modeled data.

In a structured content model, a price is a typed field on a typed document. It has an effective date, an expiry, a currency, a region, and a status. This is the "model your business" pillar in practice: the schema reflects how pricing actually works in your organization, not just how it reads on a marketing page. Once the price is a real field rather than a sentence, retrieval can filter on it. An agent can be constrained to retrieve only documents where the price is currently active and the effective date is in the past, which structurally excludes the expired entry rather than hoping the model notices.

This matters because hybrid retrieval over structured content lets you combine meaning and constraints in a single query. In Sanity, a GROQ query can blend `text::semanticSimilarity()` for the intent of the question with a `match()` clause for keywords, then use `score()` and `boost()` to rank, all while filtering on a typed `status == "active"` field and a date comparison in the same expression. The semantic search finds the right pricing document; the structured filter guarantees it is the live one.

The contrast with prose-in-PDF retrieval is stark. A flat document blob can be semantically relevant and factually expired at the same time, and nothing in the retrieval step can separate the two. Modeling the price as data is what makes freshness a queryable property instead of a hope.

Make hybrid retrieval native, not assembled

Most teams arrive at hybrid retrieval the hard way: a vector database for semantic search, a separate keyword engine or filter layer for exact matches and constraints, and a reranking step glued on top to reconcile the two. Each component is reasonable on its own. Together they are three systems that have to agree, three places to deploy, and three opportunities for the price filter to live in one system while the semantic match lives in another.

The assembled approach also tends to push freshness logic outside the query. The vector store returns candidates, then application code filters out expired prices after the fact. That works until the candidate set is capped before the active price makes the cut, or until someone refactors the filter and the expiry check quietly stops running. Freshness enforced in glue code is freshness that can be skipped.

Native hybrid retrieval inside the content backend changes the shape of the problem. In the Content Lake, semantic similarity and keyword matching and structured filtering happen in one GROQ query against one store. The price filter is not a post-processing step; it is a clause in the same expression that does the semantic search. You cannot accidentally retrieve an expired price and forget to filter it, because the filter and the retrieval are the same operation.

This is the difference between a content backend with an AI feature bolted on and an intelligent backend built for agent retrieval from the ground up. When retrieval is native to where the content lives, the agent is grounded in the source of record itself, queried live, rather than in a downstream copy that approximates it on a delay.

Govern and stage pricing changes before agents see them

Freshness solves serving the current price. It does not, by itself, solve serving the right future price at the right moment. Pricing changes are events: a promotion goes live at midnight, a regional increase takes effect on the first of the month, a discount expires at the end of a quarter. If those changes hit the agent the instant an editor saves a draft, you have traded stale prices for premature ones.

This is a governance problem, and it is solved the same way you already stage a website launch. In Sanity, editors work in the Studio and use Content Releases to bundle a set of pricing changes and schedule them to publish together at a defined time. The agent retrieves published content, so the new price becomes visible to the agent at exactly the moment the release goes live, not when someone happened to start editing. The change is reviewable before it ships and atomic when it does.

The same governance surface applies to the agent's own instructions. The rules that tell an agent how to present prices, what caveats to attach, and when to defer to a human are content too, and they belong under the same review and staging discipline as the prices themselves. Editors can stage a change to agent behavior the way they stage a change to the storefront, with the same approvals and the same audit trail.

This is the "automate everything" pillar with a human boundary around it. The agent moves fast on retrieval, but the decision about what is true and when it becomes true stays inside the editorial loop, governed by the people accountable for it.

A scheduled release is the opposite of a stale price

Stale pricing comes from changes the agent sees too late. Premature pricing comes from changes it sees too early. Content Releases let editors schedule a bundle of price changes to publish atomically at a defined moment, so the agent's view flips from old to new at exactly the right second, reviewed in advance.

Connect agents through the MCP endpoint, then audit what they say

Once pricing is modeled, retrieved natively, and governed through releases, the last mile is connecting your production agents to it without rebuilding the integration for every framework. Sanity Context exposes an MCP endpoint that agents connect to in order to query the content, so the same governed, current pricing data is reachable from whatever agent runtime you operate. Knowledge Bases extend the same retrieval path to datasets, websites, PDFs, and support databases, turning the messy long tail of pricing-adjacent content into agent-readable documents that obey the same freshness and filtering rules.

The accountability layer matters as much as the connection. When a customer disputes a quote, you need to answer two questions: what did the agent retrieve, and was it current at that moment? Because retrieval runs against versioned content in the Content Lake and changes flow through reviewable releases, you have a defensible trail rather than a shrug. Audit logs and Roles and Permissions in the Studio constrain who can change a price and record when it happened, which is the difference between a pricing error you can explain and one you cannot.

On the compliance side, Sanity maintains SOC 2 Type II, supports GDPR, offers regional hosting and data residency options, and publishes its sub-processor list, so the content powering customer-facing price quotes sits in an environment your security and legal teams can sign off on.

The end state is an agent that quotes the price your business is committing to right now, because the path from the editor changing a number to the agent retrieving it is short, native, governed, and observable. Stale prices were never a model problem. They were a content problem, and that is exactly the problem Sanity Context is built to solve.