Refusals & Capability Gating

B23
Concepts · Core Building Blocks

Refusals & capability gating.

"The model can't do that" is almost always false, and building on it is how safety programmes end up with a control that a rephrase can remove. A refusal is a policy applied at generation time on top of a capability that is still there — which means refusal rate is the most volatile property of a deployed model, it can change without a version number changing, and any control you actually need to hold must live somewhere the model cannot talk itself out of.

STEP 1

Three different things all look like "no".

When a model declines, one of three mechanisms fired, and they have completely different reliability properties.

  • Absence of capability. The model genuinely cannot do it — the ability was never learned. This is the only durable one, and it is rare for anything expressible in text. A model that has read the public internet has read vulnerability write-ups, synthesis routes and phishing templates.
  • Post-training policy. The model can, and has been trained to decline. This is what almost every refusal you see actually is. It is a behaviour installed by post-training and alignment, sitting on capability that remains intact underneath.
  • An external filter. A separate classifier on the input or the output blocks the exchange, often with different wording. This one is inspectable and separately versioned, which makes it the most honest of the three — see guardrails.

Only the first is a property of the model. The other two are configuration, and configuration changes. The same prompt can be refused on Monday and answered on Thursday without any announcement, because a system prompt was edited or a safety classifier's threshold moved.

STEP 2

Gating access is not gating capability.

Vendors increasingly ship two models with the same underlying weights and different refusal policies, putting the permissive one behind identity verification and legal attestations. It is worth being precise about what that buys, because the marketing and the mechanism point in different directions.

  • What it buys: attribution. Verified identity, signed attestations, monitoring and a revocable account make legitimate use traceable and misuse punishable. That is a real control and it is the honest description of the product.
  • What it does not buy: containment. The capability is in the base model. Someone who is refused can rephrase, decompose the task into innocuous steps, spend more turns, or switch to an open-weights model that has no refusal layer at all. A gate on the permissive variant removes a shortcut, not a possibility.
  • The tell is the turn budget. When a vendor reports that a permissive model's advantage shrinks once the general model is given more attempts, that is direct evidence the delta was compliance rather than skill. Refusals cost turns; they do not cost the ability.

The practical version: never let a threat model rest on the sentence "the model won't help with that." Write down what happens when it does.

STEP 3

Over-refusal is a cost, and almost nobody measures it.

Refusal tuning has two failure directions and product teams instrument only one. False compliance — answering something it should have declined — gets caught in red-teaming. False refusal — declining a legitimate request — usually shows up as a support ticket, if it shows up at all.

  • The damage is quiet and compounding. A medical agent that refuses drug-interaction questions, a security tool that refuses to explain the exploit it just flagged, a support agent that refuses to discuss a chargeback — each teaches the user that this class of question is not worth asking here.
  • The user's next move is the real cost. They paste the same question into a consumer chatbot with no logging, no data agreement and no retention policy. You did not prevent the exchange; you relocated it outside your observability.
  • It is measurable. Build a set of legitimate in-domain requests near the policy boundary and score refusal rate on it exactly as you score accuracy elsewhere. Track it per release; it moves when the vendor changes something you were not told about.

A refusal also costs less when it explains itself. An enumerated reason and a pointer to the allowed path turn a dead end into a redirect — the argument developed in structured refusal & why-trails.

STEP 4

Put the controls you need to hold somewhere else.

Refusal is a good first filter and a bad last one. It is fast, it is free, and it catches the honest mistakes — but it is enforced by the same component being asked to break it, which is exactly the property you do not want in a control you are relying on.

  • Gate the action, not the sentence. An agent that has no credential for the payments API cannot pay anyone, regardless of what it was persuaded to want. Scope tools and credentials narrowly; see agent identity & permissions.
  • Decide outside the model. A policy engine evaluating every tool call against written rules produces the same answer whether or not the request was phrased sympathetically — the point of policy-as-code for agents.
  • Assume the refusal can be removed. Design the blast radius for a model that says yes to everything, because prompt injection is precisely the technique for producing one.

Run two evaluation sets against every model change, including the ones you did not initiate: legitimate requests near your policy boundary, and requests that must be declined. If either number moves and your prompt did not, the vendor changed a policy — treat that as a production incident, not a curiosity. Then check that every control you would be unhappy to lose is enforced by something other than the model's willingness.

Related: agent evaluation for the harness this fits into, guardrails in production for the enforcement layer, and third-party model & vendor risk for writing down a dependency that can change under you.