Our AI claims adjuster tried to settle a claim at $58,000. His authority stops at $50,000. The claims system refused him, raised an approval to a supervisor who could sign it, and wrote down all three facts. That refusal is the most valuable record we keep.
It is also the one almost no agent platform stores, because almost no agent platform is built on the assumption that the agent might be wrong in a way that matters.
We run a specialty property and casualty carrier called Vsure whose staff are AI agents. They handle submissions, quotes, binds, endorsements, premium audits, renewals, first notice of loss, reserves, settlements, closures and reinsurance cessions. They work through the same APIs a human employee uses. It is a real book: 240 insureds, $243M of written premium, 775 claims.
We did not build it to show that agents can do insurance work. We built it to find out what happens when they try to do something they should not be allowed to do.
Autonomy without a refusal path is just an unguarded write
There is a comfortable story about agent safety that goes: put the rules in the system prompt, give the model good tools, and evaluate the outputs. It works right up until the agent can change something that costs money.
The problem is that a prompt is a suggestion. It is text, in the same channel as every other piece of text the model is weighing, competing with a user instruction, a retrieved document, a tool result and the model's own sense of what a helpful assistant would do. Models are good at following prompts. They are not guaranteed to follow prompts, and a guarantee is exactly what you need before you let something post a payment.
A prompt is a suggestion an agent can talk itself out of. A permission check is one it cannot.
So the rule we settled on is simple to state and surprisingly invasive to implement:
Authority belongs to the product, not to the agent. The agent does not decide what it may do. It asks, and the system of record decides — using the same permission model it would apply to a human being with that job title.
Concretely: when our adjuster wants to settle, he does not evaluate his own limit and proceed. He calls the settlement tool. The claims product looks up the actor, looks up the capability, finds the authority level required for a $58,000 settlement, compares it to the level this actor holds, and returns a refusal with a specific shape.
# What the tool call returns when authority is insufficient.
# Note that it is not an exception -- it is a result.
{
"allowed": false,
"reason": "settlement_amount_exceeds_actor_authority",
"authority_held": "L2",
"authority_required": "L3",
"amount": 58000.00,
"limit": 50000.00,
"downgrade_to": "escalate",
"escalated_to": "CL-SUPERVISOR-02"
}That downgrade_to field is the whole design in one line. The system does not just say
no. It tells the agent what it may do instead, so the agent has a legitimate next move that
is not "try again with different phrasing".
What actually happens in a run
Here is the sequence for the $58,000 settlement, exactly as it appears in the trace.
sequenceDiagram
autonumber
participant A as AI adjuster
CL-DOKAFOR (L2)
participant H as Agent harness
participant CW as Claims product
participant P as Authority policy
participant S as Supervisor (L3)
participant L as InsightLense
A->>H: Reviewed file. Settle at $58,000.
H->>CW: settle_claim(claim, 58000)
CW->>P: check_tool(actor, "settle_claim", 58000)
P-->>CW: denied, required L3, held L2,
downgrade_to = escalate
CW-->>H: refusal + escalation route
H->>L: authority decision recorded
H->>CW: raise_approval(claim, 58000, to=L3)
CW->>S: approval queued
S-->>CW: approved with note
CW->>CW: settlement posted, reserve released
CW->>L: business event: claim_settled
old 0 -> new 58000, by supervisor
Note over L: Three records, one correlation id:
the run, the refusal, the money moving
Note what does not happen. The agent is not terminated. The run is not marked failed. No alert fires. Being refused is a normal outcome of doing the job, in exactly the way it is normal for a junior adjuster to need a signature.
He escalated on 11 of his 17 runs
That is the number that surprises people, and it is the number we are most pleased with.
An escalation rate of 65% would look like a failing agent on a conventional dashboard. Six in ten runs did not complete autonomously. If you were optimising for autonomy, you would tune the prompt, raise the limit, and celebrate the number coming down.
That would be exactly the wrong move, because the escalation rate is not measuring the agent. It is measuring the fit between the work and the authority. A high rate on a book of large commercial claims is correct — those claims genuinely need a supervisor. A high rate on small routine claims would tell you your limits are set too tight and you are wasting supervisor time. A rate of zero should worry you most of all, because it usually means the checks are not wired up.
Escalation rate is not a measure of how good your agent is. It is a measure of whether your authority model matches the work.
Three things you can only see if you keep refusals
Once refusals are first-class records rather than discarded errors, some questions become trivial that are otherwise unanswerable.
| Question | What the record gives you | Who asks |
|---|---|---|
| Are our guardrails actually firing? | Count of refusals by capability. A control with zero refusals in 90 days is either unnecessary or broken, and you cannot tell which without looking. | Risk, engineering |
| Is an agent repeatedly probing a limit? | Refusals grouped by actor and capability. A cluster of near-limit attempts is a prompt problem, a data problem, or a limit set at the wrong place. | AI ops |
| Who approved the exceptions? | Every escalation carries the approver, the level they held, and the note they wrote, in the same thread as the action. | Internal audit |
Where teams usually get this wrong
Three failure modes we have hit ourselves, in rough order of how often we see them elsewhere.
1. The limit lives in the prompt
"You are a claims adjuster with a settlement authority of $50,000. Never settle above this amount." This reads like a control and behaves like a preference. Worse, it is invisible to the audit trail: when the agent complies you have no record that a limit existed, and when it does not comply you have no record either.
2. The check exists but returns an exception
Better — the product does enforce. But raising PermissionError and letting it bubble
into a generic error handler means the refusal is logged as a failure, buried in a stack trace,
counted in your error rate, and thrown away at the next log rotation. We did this first. The fix was
to make refusal a value the tool returns, not an exception the harness catches.
3. The check is computed and then ignored
The nastiest one, because everything looks correct. The code calculates the required authority, logs it, puts it on a dashboard, and then proceeds with the write regardless. We found one of these in our own underwriting product — a renewal control that produced exactly the right number and enforced nothing. It has its own post: the control that was computed but never enforced.
A checklist you can run this week
If you have agents in production that write to a system of record, these five questions are worth answering honestly.
- Can your agent be refused? Not "will the prompt stop it" — is there a code path in the product that returns a denial the agent cannot bypass?
- Is the refusal a record? Can you list every refusal from last month, with the actor, the capability, the authority held and the authority required?
- Does a refusal have a next move? An agent that is denied with no route forward will retry, rephrase, or pick a worse tool. Give it an escalation path.
- Is the approver in the same thread? If the escalation lands in a separate ticketing system, you have two half-records and no story.
- What is your escalation rate, per capability? If you cannot answer, you do not yet know whether your limits match your work.
Every figure here comes from the Vsure ledger and is checkable in the product. To be precise about what that means: every carrier function has been run end to end by agents. The carrier does not run itself on a schedule — there is no cron behind it. We are careful about that distinction because one overstated claim would put the other numbers in doubt.
What this looks like in InsightLense
Refusals are only valuable if they are queryable. In InsightLense every authority decision is a row — allowed, refused, escalated or downgraded — carrying the level held, the level required, and who the decision was raised to.
| Time | Capability | Amount | Held | Required | Outcome | Decided by |
|---|---|---|---|---|---|---|
| 11:04:22 | settle_claim | $58,000 | L2 | L3 | escalated | CL-SUPERVISOR-02 |
| 11:09:47 | settle_claim | $58,000 | L3 | L3 | allowed | human |
| 13:31:08 | post_reserve | $240,000 | L2 | L2 | allowed | — |
| 15:52:30 | settle_claim | $74,500 | L2 | L3 | escalated | CL-SUPERVISOR-02 |
The escalation rate in the header is not decoration. It is the metric that tells you whether your authority model fits the work, and InsightLense computes it per actor and per capability so a rate that is too high on routine work is visible as a specific capability rather than as a vague sense that the agent asks too often.
The line we keep coming back to
Agentic AI gets sold on what an agent can do unsupervised. We have come to think that is the least interesting property of the system. Anything can act without supervision; a shell script acts without supervision.
What makes an agent trustworthy enough to put in front of a book of business is the opposite capability — that when it reaches for something beyond its authority, something outside of it says no, routes the decision to a person who can say yes, and writes down that the whole exchange happened.
Agentic AI is only trustworthy when it can be told no. And it is only auditable when that refusal was written down.
Where do your agents already act on real records?
Tell us that, and what you would need to prove about those actions to an auditor. We will set up a hands-on walkthrough within two weeks.
Request a demo →