ADR 0003 — The parser owns the number, the model owns the prose
2026-08-29 · Status: accepted**
Context
Ori negotiates freight rates in Hindi over the phone. The failure modes are not symmetric: a rate she fails to hear costs one more question, while a rate she states wrongly books a truck at a price nobody agreed and is discovered at invoicing. Ordinal's annual freight spend is ~₹80 Cr, so the second error is a commercial incident, not a bug report.
LLMs are good at Hinglish prose and unreliable at arithmetic in it. They are also persuadable: a vendor who can walk the agent upward learns the ceiling in about seventeen turns.
Decision
Money is never generated. sourcing/ceiling.py computes the ladder before the
call; the model writes a {rate} token; SlotFill substitutes the authorised
figure; FigureGate refuses to speak any figure the ladder did not authorise
and says a written fallback instead. The model never sees a rupee figure —
Scenario.load_brief() is the only scenario text that reaches a prompt, and it
is a method, not a field, so adding a money column cannot leak it.
Consequences
- She sounds slightly stiffer on money turns than on load turns. Accepted.
- Every guard must be a mechanism. Prompt instructions do not count: we have on-record evidence of the model ignoring an emphatic "NEVER write {rate}" six times across the corpus.
- The gate has produced false blocks (a truck model number read as ₹407) and a fix for one of those introduced a real leak. Both directions need tests.
Revisit when
A model can be shown, on our own recorded corpus, to reproduce authorised figures with zero wrong values across a full negotiation. Not before.