A language model is good at reading a schedule and saying why a disclosed audit will be excluded. It is not allowed to say what the premium is, what the rate on line is, or what the audit will cost. Those numbers come from the record and the engines, or they do not appear.
Engines own the figures
- Market matching computes fit per market with the reasons: sector, deal size, capacity against the ask, retention as a share of EV.
- Quote comparison computes retention as a share of EV, rate on line, total cost with fees, the deal-specific exclusions and flags such as “limit below the ask”.
- Binder checking compares fields and grades each difference.
- Diligence checks find what each document says, with its page.
The model reasons over cited facts
citation, numbered F1..Fn"] --> M["Claude: summary, findings,
open questions, confidence"] M --> S{"Valid shape?"} S -->|no| INV["Invalid: discarded"] S -->|yes| N{"Every number in
the text is in a fact?"} N -->|no| REJ["Rejected: stray numbers
recorded in the trace"] N -->|yes| OK["Shown, each finding
with its fact chips"] INV --> RULES["Agent's own findings
stand, labelled rules only"] REJ --> RULES style REJ fill:#fdecec,stroke:#e57373 style OK fill:#e8f8f4,stroke:#22c1a4
The facts are numbered so the model can cite them, and the citations become chips on screen. The markers are stripped from the prose the broker reads; the chips stay. A finding that cites no fact is dropped. An answer with a number that is not among the facts is rejected whole, and the stray number is kept in the trace so a reviewer can see what was refused.
Why reject the whole answer, not just the sentence?
A model that invents one number has misread the facts; the rest of its reasoning is suspect too. Discarding the answer is cheap — the engine’s result is still there — and keeps a single rule that is easy to audit.
