Refusal is a feature, and it is hard to build
Getting a language model to say "I do not know" is not a prompt. It is a set of structural constraints, and most of them have to be in place before the model is called at all.
Every AI product says it will admit uncertainty. Almost none of them can, and the reason is architectural rather than a matter of instruction.
Why asking nicely does not work
A language model's output is a function of its input. Told to decline when unsure, it produces text that reads like declining when the input resembles inputs where declining was appropriate — which is not the same thing as declining when it is unsure, because it has no reliable internal signal for that.
That is the whole difficulty. Refusal has to be enforced somewhere the input cannot reach.
Where the constraints have to live
Before retrieval: is this in scope at all?
A coverage check that fails closed. No profile for this jurisdiction, year and tax type, and the pipeline stops — before anything is retrieved and before a model is called. Nothing in the user's message can change the answer, because the check does not read the message.
Before composition: is there evidence?
A grounding guard in production code, not a prompt instruction. A high-risk answer with no citations to stand on is refused. The composer never gets the chance to write around the gap.
After composition: is each claim supported?
Claim-level verification against the retrieved text. Not "does this answer look grounded" but "does this specific number trace to a calculator output, and does this specific legal statement appear in this specific passage".
At the end: is this good enough to ship?
A certainty gate with a calibrated bar. Below it the answer does not ship — but it becomes a specific question or an escalation with a reason, never an empty response.
Each of those is a place the pipeline can stop, and none of them is a persuasion problem. A stage that could only pass work along would not be a control.
The part that is genuinely hard
It is not the refusing. It is refusing usefully.
"I cannot answer that" is worthless. What a user needs is which fact is missing, or which jurisdiction is out of scope, or which two authorities disagree — the specific thing, so they can supply it or go somewhere else. That requires the system to know why it stopped, which means each stage has to report a reason rather than a boolean.
It also requires accepting a smaller product. A system that refuses honestly covers less ground than one that does not, and every refusal is a conversion lost. That is a business decision made before any of the engineering, and it is why most products cannot do this: not because it is technically out of reach, but because the incentive runs the other way.
What it costs
Publishing where you stop means publishing your limits, which competitors read and prospects compare. Ours are on the coverage page, country by country, including the ones where the calculation is a documented approximation and the ones where there is no calculator at all.
The trade is that everything else becomes checkable. A product that says where it stops has told you something about where it works — and a product that never says is asking you to take the whole thing on faith.