All writingAI assurance · 6 min read

Write down what the AI feature is not allowed to do before it ships

Acceptance reviews argue about how good the answers are. The shorter, harder list is what the feature must refuse, and that is the one a reviewer asks to see.

ClaudeevalsorchestrationRAGAI evaluationGovernanceFintechHealthcarePublic sector

The launch review for an internal assistant runs long, and every minute of it is about how good the answers are. Somebody has a sheet of sample questions with a tick or a cross beside each one, and the argument is about where the acceptable line sits and whether the failures are the embarrassing kind or the forgivable kind. It is a reasonable argument. It is also the wrong one to spend the whole meeting on, because there is a second question that nobody in the room can answer: what is this thing not allowed to do, and how would we know if it did it.

That second question is the one that comes back. It comes back as a support agent letting the assistant issue a credit because the workflow offered a button and the model filled it in. It comes back as a customer's details surfacing in a summary generated for a different account, because the retrieval step was scoped by relevance and not by permission. It comes back as a security reviewer asking, six weeks after go-live, which controls exist and what evidence there is that they were ever tested. At that point the accuracy sheet is not much help.

The fix is unglamorous and mostly clerical. Before the feature ships, write down the things it is not permitted to do, in language specific enough that a test can fail. One page. Short enough that the people who sign it off will actually read it.

Quality is a spectrum, refusal is a boundary

Quality arguments do not end, because quality has no natural edge. There is no point at which an answer becomes correct in the way a build becomes green. You can measure it, and you should, but every threshold you pick is a negotiated opinion, and the negotiation reopens every time somebody senior reads a bad output.

Refusal behaves differently. Either the assistant produced a figure for an account the user cannot see, or it did not. Either it placed the order without a human confirming, or it did not. Either it repeated the full card number back into the chat transcript, or it did not. These are binary, they are observable from outside the model, and they do not require anyone to agree about tone or helpfulness. That is what makes them the part of an AI feature you can genuinely sign off, rather than the part you approve while hoping.

On the left, quality drawn as a continuous bar running from worse to better, with today's acceptance line marked and the places it previously sat ghosted behind it, and no natural edge anywhere on it. On the right, three prohibitions drawn as did or did not: produced a figure for an account the user cannot see, placed the order without a human confirming, repeated the full card number into the transcript.
One of these needs a threshold somebody negotiates. The other only needs somebody to look.

Quality has no natural edge to test against. Refusal does, which is why refusal is the part you can actually sign off.

The pattern, stated plainly

The three lists worth writing

In practice the useful document splits into three, and each one has a different owner. Keeping them separate matters, because a single list of good intentions tends to get written by whoever is least busy and reviewed by nobody.

  • Questions it must decline The territory where a plausible answer is worse than no answer. Diagnosis and dosage for a clinical tool. Anything that reads as personalised financial or legal advice. Eligibility decisions in a public service context, where a confident wrong answer becomes a decision a citizen relies on. The test is not whether the model knows, it is whether the organisation is prepared to stand behind the sentence.
  • Actions it must never take without a person Payments, refunds, credit limits, cancellations, deletions, anything that sends an external message under your name, anything that writes to a system of record. Write this as a list of tool calls and API endpoints, not as a category of intent. The moment an agent has the tool in its schema, it will eventually call it.
  • Data it must never repeat back Identifiers, health details, salary figures, anything covered by a residency commitment, anything belonging to a different tenant. This one has to be tested at the retrieval layer as well as the output layer, because a model that never says the wrong thing while still reading the wrong rows into its context has already failed.

The fastest way to fill these in is to ask the people who would be blamed. The compliance lead, the head of support, the person who fields the regulator's email. They have the list already. It is usually in their head, phrased as a worry rather than a requirement, and it takes an afternoon to write down.

A capability surface drawn as a broad area of permitted behaviour, with three hard-edged zones cut out of it and labelled decline, escalate to a human, and never disclose. Arrows show a request entering, being matched against the zones, and either proceeding or being turned back.
The permitted surface can stay wide. What has to be exact is where it stops.

Write each line as a test, not as a principle

"The assistant must not give financial advice" is a principle. It cannot fail a build, it cannot be handed to an engineer, and two people will read it differently on the same morning. What you want instead is a small set of cases with an expected behaviour attached, so that the prohibition runs on every change and reports a number that someone is accountable for.

  1. 01
    State it in observable termsNot "no advice", but "when asked which of two funds to buy, the response must not name one, and must direct the user to a licensed adviser".
  2. 02
    Write the near misses, not just the obvious casesThe blunt request is easy. The ones that break things are the indirect phrasing, the hypothetical framing, the request buried at the end of a long legitimate question, and the same question asked again after a refusal.
  3. 03
    Decide what happens on the boundaryA refusal is a product decision. Silence, a canned line, a handover to a human, a partial answer with the sensitive part withheld. Choose per line, because "I cannot help with that" as a blanket response is its own kind of failure.
  4. 04
    Make it a gate, not a reportThese cases belong in the same pipeline that runs your unit tests, blocking release. A test suite that produces a dashboard nobody is required to read is a documentation exercise.
Turning one prohibition into something that can fail a build.

The list is what survives the model changing

This is the part that earns the effort. The model underneath your feature will change, whether you upgrade deliberately or a provider retires a version and moves you along. Your prompt will change. Your retrieval index will be rebuilt with different chunking, and someone will add a tool to the agent's schema on a Thursday because a customer asked for it.

Every one of those changes can quietly move the boundary, and none of them will show up in a quality score, because the quality score is measuring something else. A refusal suite is the only artefact in the stack that is written against the behaviour rather than the implementation, which means it keeps its meaning across all of those changes. It is also, not coincidentally, the thing that makes a model upgrade a normal engineering task instead of a leap of faith.

Four implementation layers, model version, prompt, retrieval index and tool schema, each marked as changing, with arrows from all four converging on a single quality score that moves with all of them and names none of them. Across a dashed line the refusal suite sits anchored to the one page that was signed off, with no arrow reaching it from the left.
The quality score is attached to the implementation, so it moves whenever any of it moves. The refusal suite is attached to the behaviour, so it does not.

Where this is the wrong answer

Two honest limits. The first is that a refusal suite measures nothing about usefulness. A feature that declines everything scores perfectly, and over-refusal is a real harm rather than a safe default, particularly in healthcare and public service work, where the user who gets stonewalled has no other route to the answer. The boundary set has to be paired with a set that checks the feature still does its job, and the pairing is not optional.

The second is that plenty of AI features do not warrant any of this. If the thing drafts marketing copy, touches no customer records, and takes no action a person does not review before it leaves the building, then the whole apparatus is process for its own sake. The test for whether you need a written boundary is simple: can this feature reach data or take an action that would require an incident report if a junior employee did it by mistake. If not, ship it and spend the afternoon on something else.

When the answer is yes, the document you produce is also, conveniently, most of the pre-deployment assessment a reviewer will ask for. Assurance regimes differ in their vocabulary, but underneath they ask the same three things: what could go wrong here, what stops it, and what evidence do you have that the thing which stops it works. A one-page list of prohibitions, a test suite that runs on every change, and a record of the results answers all three in the order they were asked.

The reason to write it before launch is not the reviewer, though. It is that the list is genuinely hard to write, and writing it forces the argument about scope that everyone has been postponing. Teams routinely discover, in the hour it takes, that nobody had agreed whether the assistant was allowed to act on a customer's behalf at all. Better to find that out in a meeting than in a transcript.

Get the boundary written before the launch date, not after

If you have an AI feature approaching release and the acceptance criteria are all about answer quality, we run a short pre-deployment assurance pass: the prohibitions written down with the people who would be blamed, turned into a test suite that gates your pipeline, and a record a reviewer will accept. Send us the feature and the launch date.