The Citation Problem and the Hallucinated-Field Problem
In April 2026, a Series B SaaS company's customer service agent updated a customer's billing address in Stripe. The customer had said "we're at Suite 400 now." The agent confidently wrote: street_2 = "Suite 400", postal_code = "02118". The customer had never said 02118. They lived in Cleveland. The ZIP code 02118 is Boston. The agent had invented a plausible-looking field value that fit the data type, validated the Stripe API schema, and successfully wrote it to production. Three months of mailed invoices went to a stranger's apartment in the South End. The CFO learned about it from a chargeback. This lesson is about the two most expensive ops-side hallucinations in 2026 โ made-up record IDs and made-up policy clauses โ and the verification patterns that catch them before the write reaches the source system. It is the lesson where you learn why "the agent had high confidence" is not a defense.
The Two Most Expensive Hallucinations in Agent Ops
Hallucination is the standard talking point. Every vendor mentions it. Most of them describe it as a generic concern โ "AI sometimes makes things up" โ without specifying which kinds of made-up content actually destroy production deployments. After three years of watching real incidents, two categories tower above the rest in cost and frequency.
Hallucination #1: the made-up record ID
The agent needs a customer ID, an account number, a contract reference, a Jira ticket key, a Stripe customer object. It produces something that looks correct โ cus_QH7m9Xq2Lpa, ACCT-48291, JIRA-1138 โ and uses it in a tool call. The ID doesn't exist. Or worse, it does exist, but belongs to a different customer. The tool call fails (good) or, in the bad case, succeeds against the wrong record. Stripe just charged the wrong customer. Zendesk just updated the wrong ticket. Salesforce just attached a contract amendment to the wrong account.
Why it happens: LLMs are pattern matchers. Customer IDs in the training data follow patterns (cus_ prefix for Stripe, alphanumeric strings of a specific length, etc.). When an agent doesn't know the actual ID but needs to produce one to complete a tool call, the path of least resistance is to generate a plausible-looking one. The pattern fits. The format validates. The string just happens to be a fabrication.
Hallucination #2: the made-up policy clause
The agent answers a customer question with confident specificity: "Our return policy allows returns within 60 days as long as the item is in original packaging." The actual policy says 30 days, and says nothing about packaging. The agent didn't retrieve the policy; it generated one. Or it retrieved a partial chunk and confabulated the rest. The customer screenshots the answer. The chargeback follows. Legal gets involved.
Why it happens: when retrieval is uncertain โ wrong chunk, missing chunk, low confidence โ the model falls back on training-data priors. Most companies' policies sound roughly like other companies' policies. The model writes a plausible policy. It is wrong, but it sounds right, which is the worst possible combination.
The two most expensive hallucinations both share a pattern: the agent produces output that looks correct, validates against any structural check, and is therefore trusted. Hallucination's danger isn't randomness โ it's plausibility.
The April 2026 "Suite 400" Incident
Let me walk through the incident from the lead more carefully because it captures both failure modes at once and the lessons map directly to your future deployments.
The agent in question was a customer self-service bot built on a popular no-code platform. It was wired to Stripe's API via MCP and authorized to update customer.address objects. A customer wrote in saying "we moved offices, we're at Suite 400 now." The agent recognized the intent (update address), looked up the customer (correctly), and prepared a tool call to update the address.
The Stripe address schema has fields: line1, line2, city, state, postal_code, country. The customer had given the agent only "Suite 400." That is enough to update line2. It is not enough to update postal_code. But the agent's prompt template instructed it to "fill all required fields when updating an address" (the schema marked postal_code as required for US addresses), and the model dutifully filled all fields. It pulled the existing city ("Boston" โ also wrong, the customer was in Cleveland; the original record had a typo that had never been corrected), then generated a postal code that matched a Boston address: 02118.
The Stripe write succeeded. The MCP server confirmed. The agent told the customer "I've updated your address to Suite 400. Is there anything else?" The customer said no. Three months of mail went to a real residential address in Boston's South End, where a confused tenant accumulated invoices for a Cleveland software company.
Three things failed simultaneously:
- The agent hallucinated a field โ postal_code, fabricated to fit Boston because the existing record (incorrectly) said Boston.
- No diff confirmation โ the agent never showed the customer "here's what I'm about to write" before writing.
- No verification against ground truth โ after writing, the agent didn't compare its write against any external source (the customer's actual location) to flag inconsistency.
All three failures are addressable with patterns we'll cover in the rest of this lesson. None of them required smarter models.
The "No Source, No Answer" Pattern
The first defensive pattern operators need to internalize is what I call "no source, no answer." For any claim of fact โ policy details, account state, historical events, technical specifications โ the agent must produce a citation pointing to a real, verifiable source. If no source is available, the agent must say "I don't have that information" rather than generate from training-data priors.
This is implemented at three layers:
Layer 1: the prompt
The system prompt must explicitly forbid unsourced answers on policy and account questions. Something like:
"For any question about company policies, account state, or contract details, answer ONLY using the sources provided in <sources> tags below. If the answer is not in the sources, respond with: 'I don't have access to that specific information โ let me connect you with a teammate who does.' Do not use general knowledge or training-data knowledge to answer policy or account questions."
This wording matters. "Be careful" doesn't work. "Don't hallucinate" doesn't work. The model needs an explicit fallback behavior and explicit scope ("policy and account questions") so it doesn't refuse to answer benign questions like "what's the weather."
Layer 2: the structured output
Force the agent to produce its citation as a structured field, not as prose. JSON schema:
{
"answer": "string",
"source_id": "string",
"source_quote": "string",
"confidence": "high | medium | low"
}
This forces the model to commit to a specific source ID โ which can then be validated downstream. Prose citations like "according to our Customer Operations Handbook" are not validatable. Structured ones are.
Layer 3: the validator
After the agent generates its answer, a deterministic validator (not the LLM) checks: does source_id exist in the actually-retrieved chunk set for this turn? Does source_quote appear (as a substring or close fuzzy match) in the cited source's text? If either check fails, the response is rejected and either regenerated or escalated. This is the layer that catches the model inventing citations to sources it didn't actually receive.
The full pattern โ prompt instruction + structured output + downstream validator โ is what makes "no source, no answer" actually enforceable. Any single layer alone is leakable.
Forcing Grounded Citations: The Implementation Patterns
Beyond the basic pattern, there are several implementations operators should know in 2026. They differ in cost, latency, and the kinds of failures they catch.
Pattern A: Inline quote citations
The agent must include an exact quote from the source, and the validator checks that the quote appears verbatim (or near-verbatim) in a retrieved chunk. Strong defense against fabrication because the agent literally has to copy text from a real source. Cost: response is wordier; the model sometimes mangles long quotes.
Pattern B: Source-ID-only citations with permalink expansion
The agent cites a source ID; the application layer expands it into a clickable link to the source (Notion page, Confluence page, Salesforce record, etc.) shown to the user. Forces verifiable provenance without requiring the model to quote precisely. Best when the audience can be expected to click and check.
Pattern C: Verify-with-second-call
After the agent generates an answer, a second LLM call (often a cheaper model) checks: "Does the following answer faithfully reflect the following sources? Reply YES or NO with explanation." Catches subtle confabulations the structured validator misses. Cost: double the inference; useful for high-stakes outputs.
Pattern D: Citation-required tool wrapping
The tool's input schema includes a justification_source_id field. The tool refuses to execute if no source ID is supplied or if the supplied ID isn't in the recently-retrieved set. This pushes the enforcement into the tool layer, where it can't be bypassed by clever prompting.
The 2026 hybrid
High-stakes production agents typically combine: structured output with source_id (Layer 2 above), deterministic downstream validation (Layer 3), and tool-side citation enforcement (Pattern D). For very high stakes โ financial, medical, legal โ add Pattern C (verify-with-second-call). The cost goes up; the trust gained justifies it.
Verifying Against the Actual Record Before Write
The "Suite 400" incident wouldn't have happened if the agent had been required to verify its proposed write before committing. This pattern is the single most important defense against the hallucinated-field problem, and most operators ship without it. Here's the architecture.
Step 1: Read before write
Before any update, the agent must read the current state of the record. This sounds obvious. It is, shockingly, often skipped because the agent "knows" the customer's state from earlier in the conversation. That earlier knowledge is stale and uncertain. Read fresh.
Step 2: Compute the diff
The agent (or a deterministic layer between agent and tool) computes the difference between current state and proposed state. The diff is structured: "field X was Y, will become Z." This is what gets shown to the user for confirmation and logged for audit.
Step 3: User confirmation on consequential changes
For any change above a defined consequentiality threshold, show the user the diff and ask for explicit confirmation. "I'm about to change your address to: Suite 400, Cleveland OH 44113. Should I proceed?" This is the moment where the hallucinated 02118 would have been caught โ the customer would have read "Boston" and corrected the agent.
The consequentiality threshold is operator-defined. Updating a "preferred contact time" field is fine to do silently. Updating a billing address or a payment method is not. The rule of thumb: any field that affects money, identity, or external communication requires confirmation.
Step 4: Field-level validation against ground truth
Where possible, validate proposed field values against external ground truth before writing. For an address change: pass the address through a postal validation API (SmartyStreets, Loqate, Google Address Validation). If the API can't validate the address, the write doesn't go through. Costs $0.001-$0.005 per validation. Stops the postal_code fabrication category cold.
Step 5: Post-write reconciliation
After the write succeeds, log the diff with full context (conversation turn, source quote, validator results) and run periodic reconciliation jobs that look for impossible combinations โ addresses where the postal code doesn't match the city, contract amounts that exceed account credit limits, etc. The cheap nightly job that flags these is the difference between catching an issue in 24 hours and learning about it from a chargeback in 90 days.
The Record ID Defense Patterns
The made-up record ID is the other half of the hallucination problem. The defense patterns:
Pattern 1: Never let the model generate IDs
The agent should never be the one producing a record ID from scratch. It should always look IDs up via a tool call ("find customer where email = ...") and use the ID the tool returns. The model's job is to construct queries; the tool's job is to return IDs. This is the single most effective defense.
Pattern 2: Validate IDs against existence
Before any tool call that uses an ID, validate the ID exists. If the agent proposes cus_QH7m9Xq2Lpa, the wrapper calls stripe.customers.retrieve(cus_QH7m9Xq2Lpa) first and fails the operation if the ID doesn't resolve. Adds latency; catches fabrications instantly.
Pattern 3: Cross-reference IDs to user identity
Even if an ID exists, validate it belongs to the right user. If the agent has authenticated the user as customer A but proposes a tool call on customer B's ID, fail the operation. Sounds obvious; is missed in most no-code deployments because the platform doesn't enforce per-call identity binding.
Pattern 4: Structured tool inputs with strict types
Use strongly typed tool input schemas (Pydantic, JSON Schema with format constraints, etc.) that reject IDs which don't match the expected pattern. A Stripe customer ID must start with cus_ and be 24-26 characters. Any ID that doesn't match fails validation before the tool is called.
The Confidence Calibration Myth
Operators sometimes try to address hallucination by asking the model for a confidence score and only acting on high-confidence outputs. This does not work as well as people hope. LLMs are systematically miscalibrated. The 2024-2025 literature on this is unambiguous: a model that says "I'm 90% confident" is usually more wrong about that confidence than its raw answer accuracy would suggest.
What does work:
- Source-grounded confidence โ confidence derived from "did I find a clear source for this claim?" rather than the model's introspective opinion.
- Multi-sample consistency โ generate the answer 3 times at low temperature; if all three agree, confidence is high. If they diverge, confidence is low. Costs 3x inference; useful for high-stakes single answers.
- External validators โ the postal-validation API, the ID-existence check, the schema validation โ provide deterministic confidence signals that don't depend on the model's self-assessment.
The general principle: don't trust the model to know what it doesn't know. Build deterministic checks that don't ask the model's opinion. The model is the suspect, not the witness.
The Blast Radius Rule, Applied to Hallucinations
One more lens before we close. The cost of a hallucination is proportional to the consequence of acting on it. A hallucinated answer to "what's our refund policy?" in a chat is recoverable โ the customer might be annoyed, but a follow-up correction usually fixes it. A hallucinated postal code written to Stripe is much harder to recover from โ months of mail goes to the wrong address before anyone notices.
The implication for operators: the verification patterns described in this lesson should be deployed proportionally to the blast radius of the action. Read-only chat answers can tolerate Layer 1-2 defenses. Writes to financial or identity systems require Layer 3 validators, user confirmation, and external ground-truth validation. Multi-step automations that chain writes need all of the above plus reconciliation.
The 2026 ops principle: the more consequential the action, the less the agent should be trusted to act unilaterally. The agent proposes; the verification system disposes. The user (or a defined approval policy) confirms. Only then does the write happen. This is not a lack of automation โ it is automation done correctly.
The April 2026 Aftermath
The Series B SaaS that mailed three months of invoices to a stranger in Boston rebuilt their address-update flow in a week. The new flow: agent collects partial address info, calls Smarty Streets for validation against a real postal address, shows the customer "here is exactly what I'm about to write," requires explicit confirmation, and only then writes to Stripe. Cost: under $100/month in postal validation. Time to rebuild: 6 days. Time to prevent the incident in the first place: would have been the same 6 days, deployed before launch instead of after.
The CFO didn't ask whether the agent had "high confidence." The agent had been confident. The CFO asked whether the system had architectural defenses against confident wrong answers. It hadn't. That is the question every operator deploying an agent that writes to production systems should be able to answer in advance.
Confidence is not correctness. Plausibility is not truth. The patterns in this lesson exist because LLMs are systematically good at producing outputs that look right and are not. The defense is not a better model. It is verification.
Key Takeaways
- The two most expensive ops-side hallucinations are made-up record IDs and made-up policy clauses. Both fail through plausibility, not randomness.
- The April 2026 "Suite 400" incident illustrates the failure pattern: agent fabricates a postal code (02118 for Boston instead of Cleveland), validates against API schema, and writes to Stripe. Three months of mail to the wrong address.
- "No source, no answer" is a three-layer pattern: prompt instruction, structured output with source_id, and a deterministic downstream validator.
- Force grounded citations via inline quotes, permalink expansion, verify-with-second-call, or tool-side citation enforcement. High-stakes production combines several.
- Verify against the actual record before write: read fresh state, compute a diff, require user confirmation on consequential changes, validate fields against external ground truth, run post-write reconciliation.
- Never let the model generate record IDs. It should always look them up via a tool call. Validate IDs exist and belong to the right user.
- LLM self-reported confidence is systematically miscalibrated. Use source-grounded confidence, multi-sample consistency, and external validators instead.
- The blast radius rule: the more consequential the action, the more verification it requires. Read-only chat can tolerate light defense; writes to financial or identity systems need full Layer 3 verification.
- "The agent had high confidence" is not a defense. Confidence is not correctness; plausibility is not truth. The defense is verification, not a better model.
Skill.re