A dispute agent sits in a workflow where invented data is expensive. If it asserts that a package was delivered on a date, or that 3D Secure authentication passed when it did not, the output becomes evidence in a representment case, and evidence that contradicts the record damages the merchant more than an empty field would. Visa reports that authenticated e-commerce transactions show fraud of 11 basis points against 20 bps for non-authenticated transactions, a roughly 45% reduction, which is exactly the kind of number an agent should cite from a source and never from memory (Visa on 3D Secure).
The problem is that a field list handed to an engineer is a specification, while the same list pasted into a system prompt reads as context. A line like "fields: transaction_id, amount, reason_code, delivery_date, auth_result" tells a human what to collect. It tells a model what topics exist, and models are trained to be helpful about topics. Under pressure to complete a response, the cheapest way to be helpful is to produce a plausible value. That is a hallucination, and it is invisible because the output looks complete.
Dispute records make this worse than in many other domains because so many named fields have a small, standard set of legal values. A reason code is a short alphanumeric token, a delivery date is a date, an authorization result is a yes or no. Each of these has a high-probability guessable form, so a model has no difficulty producing something that looks right. Card networks classify disputes by reason code: Visa organizes codes into four categories (fraud, authorization, processing errors, consumer disputes), Mastercard uses a parallel four-category structure, and most codes carry a deadline measured from the transaction date (Rivero on reason codes). Codes like 10.4 (Visa) or 4837 (Mastercard) are so frequently discussed that a model will happily supply one that has nothing to do with the case.
The fix is prose, not schema. Before any prompt work, write each never-invent field as a sentence that states three things: the field name, why the agent must never supply it, and what the agent must do when the value is absent. Then structure the prompt around those sentences, and add examples of reasoning that stay inside the bound and reasoning that breaks it.



