Wherever a language model touches a number in finance, the same rule holds: the engine computes it, the model may narrate it, a deterministic gate recomputes it from source — and a figure that can't be reproduced never reaches a human. Here is that rule, proved five different ways on one AWS lab.
The trust-ladder report pipeline. A model drafts model-portfolio commentary under a strict quoted_figures contract; a deterministic gate recomputes every number from the source JSON; the run sleeps in Step Functions until the owner clicks approve in Telegram; then it publishes to S3. The kind of content asset managers still assemble by hand.
A figure the gate can't reproduce loops the draft back with concrete feedback. Three strikes and nothing ships. No unverifiable number is ever one click from a reader.
Verified narration over a volatility chart. The engine computes eleven risk figures — rounded once, at the source — and the model writes the story around them. Every number in the prose is equality-checked against the engine before the page renders.
Hit Regenerate and the model eventually states a number the engine didn't produce. The UI refuses to display the commentary at all — the demo's whole point, live on screen.
An agent you can question about the portfolios, running on Bedrock AgentCore. The model never computes — it calls tools, and every figure in its answer is checked against what the tools returned this session. One tool, aws_spend, reads the real billed dollars from Cost Explorer — no rate card anywhere.
Across sessions the gate kept catching the model doing arithmetic — sums, invented ranges, a derived figure. Each one fails like any other unverifiable number. The agent is allowed to reason; it is not allowed to calculate unchecked.
Ask a question in plain English; get verified evidence back. The allowed intents are the Bedrock tool specs — a tool call is the query plan. It compiles to a plan and a contract (nothing executes yet), runs it, then narrates three sentences under the gate, with four checks: completeness, and three more in the same whitelist.
After three failed narration attempts the prose is dropped entirely — and the verified figures still stand on their own. The words are optional. The evidence is not.
One FastAPI app drives all four from a single interface — CloudFront in front of a Lambda Function URL. /press runs and approves reports, /risk narrates the chart, /agent and /nlq answer questions. Same discipline, one pane of glass.
Not four demos bolted together — one verification layer, shown wearing four different jobs. That reusability is the thesis, not the trick.
Read the cockpit and every published report freely. Running a fresh one calls a model, so that step asks for an email — a one-time link, a short session, a small cap.