Numbers from math, words from AI
A language model in a finance app will eventually state a confident, wrong rupee figure. The architecture answers by never handing it one to state, and checking the sentence afterwards anyway.
Compiled from the repository’s decision records and changelog rather than written as a first-person account. The reasoning is the project’s; the summarising is editorial. The record itself is linked at the end.
A language model asked about money will produce a figure. It will be formatted correctly, phrased confidently, and sometimes wrong, and nothing about the sentence will say which. The architecture record answers this by removing the opportunity rather than by trying to detect the mistake.
LLMs never compute amounts, scores, or forecasts. They only verbalise deterministic-engine results.
The AI is six layers, not one model, and determinism increases as you go down. The encrypted database is the bottom. Above it sit aggregation and classification, then the rules engine, then the prediction models, then the decision engine that ranks what to do next. The language model is the top layer and the only one that writes English. It consumes structured results and may depend only on layers below it.
The guardrail does not ask the model anything
Every piece of model output passes a numeric check before display — chat replies and any generated explanation alike. It extracts every numeric claim in the candidate text: currency amounts in either minor units or Indian digit grouping, percentages, counts, scores, dates. Each one is resolved against the values the engines and tools actually produced this turn. What cannot be resolved does not ship.
It is a deterministic L3 check — it never uses the LLM to judge the LLM.
That sentence is the whole design. A model asked to check its own arithmetic is a second opportunity to be confidently wrong, and the check has to be cheaper and more certain than the thing it is checking.
What the record admits it does not do
The useful part of the file is its changelog. It states plainly that regeneration is not implemented: the engine can say "ask again", and until the chat layer existed nothing was asking. It records that the refusal wording and its audit entry belong to a layer that had not been built. And it names a bound the prose above it does not — rounding stops at the rupee, so lakh and crore wording verifies only when the figure is exact.
A design document that lists what it has not done yet is worth more than one that reads as though everything shipped. It is also the reason this entry can cite it: the claim and its limits are both on the public record, and a reader can check either.