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.