Tools · browser checklist

Agent design check

19 questions about a system that acts. Answer the ones you can, leave the rest, and get back what is still open and what to do about it — in the order the decisions are worth making.

Worked out in this page. No sign-in, no score, and nothing you type is sent anywhere.

Before you start

What this does, and what it will not do

  1. 01 Every next step below is written in the rubric, next to the question it belongs to. Nothing is generated, ranked or summarised by a model, and you can read the whole rubric before answering anything.
  2. 02 Steps are ordered by two things only. First, whether the question is about an action that leaves the system — one you cannot take back. Then the order the questions appear in, which is the order these decisions are worth making.
  3. 03 A reported gap and a not-yet-defined answer are not ranked against each other. They are different kinds of work: a gap already has a decision behind it and needs a design change, while an undefined answer means nobody has decided and the first step is to find out.
  4. 04 Answering yes closes nothing. It asks for the artefact that would show it.
  5. 05 There is no score, no percentage and no grade, and no set of answers produces a readiness verdict. Nineteen yeses produce nineteen requests for evidence.

Your answers are held in this page and nowhere else. They are not saved to your browser, not sent to a server, and not recoverable by anybody — including us — once you close the tab. That is also why there is nothing to sign in to.

The example throughout

A returns assistant that can pay

Imagine a returns assistant. A customer writes in about a return. The assistant finds the relevant policy, looks up the order, and recommends a refund. The conversation reads well. You can follow the reasoning, and you can see how it would save somebody a lot of repetitive work.

Then someone asks a perfectly reasonable question: can it issue the refund as well?

On a diagram that is one more connection. In the world, the system can now move money — and that changes which questions are worth asking about it.

Every question below continues this one example, so you can answer for your own system without having to describe it to anybody, and without a new scenario to learn each time.

An illustrative example. It is not an account of a real customer system, and no incident is being described.

The three answers

“No” and “not yet defined” are different facts

Addressed
You are saying the design has an answer here. That is a claim, and the result asks what would show it.
Reported gap
You know the answer and the answer is no. Somebody looked; there is a hole you can already name, so the next step is a design change.
Not yet defined
Nobody has decided. What the system does here today is unknown to the people who own it, so the next step is finding out, not building.
Not answered here
You did not answer this one. Nothing has been assumed about it, and it is reported as still open rather than as a gap.

The 7 areas

  1. 01 Purpose and boundary 3 questions
  2. 02 Evidence 3 questions
  3. 03 Tool permissions 3 questions
  4. 04 External actions 3 questions
  5. 05 Evaluation 2 questions
  6. 06 Uncertainty and recovery 3 questions
  7. 07 Ownership 2 questions

01 Area

Purpose and boundary

What the system is for, where it stops, and whether it needed to be an agent at all.

The open part and the closed part

You can say which part of this work genuinely needs a decision made at run time, and which part is a fixed sequence.

Why it matters An agent is a decision about control flow, not about capability. If the steps are knowable before the request arrives, a workflow does the same job and can be reviewed before it runs. Reaching for an agent because there is a model in the design moves decisions from review time to run time and gets nothing back for it.

In the example Reading an unstructured message and working out which policy applies is open — the next step depends on what the assistant finds. Issuing a refund against an identified order, a policy version and an amount is closed: a fixed sequence, and calling it from a model does not make it anything else.

A purpose somebody can check

The purpose is written as a task and a boundary, in one sentence somebody outside the team could check.

Why it matters "Handle returns" cannot be checked by anyone. A purpose written as a task with a boundary can be held against the behaviour, and it is what a reviewer measures scope creep against a year later. A goal is only worth writing if it is testable: "safer" is not a goal, "no order is refunded twice" is, because you can go and look.

In the example "Reads a customer’s return request, identifies the order, applies the published returns policy, and recommends or issues a refund within the window that policy defines."

Non-goals, written down

The non-goals are written down, and each one is something somebody could plausibly have asked for.

Why it matters Goals tell a reviewer what you were trying to build, which they can usually infer. Non-goals tell them what you decided against, which they cannot — and a non-goal nobody can quite justify is very often the seam where the design is unresolved.

In the example It does not amend an order. It does not cancel a subscription. It does not contact a bank. It does not act on an order it could not identify.

02 Area

Evidence

What must be established before it acts, and whether that can be checked afterwards.

An evidence list per action

For each action the system can take, the facts that must be established first are named, with where each one comes from.

Why it matters An action with no evidence list is an action whose preconditions live in a prompt and in somebody’s memory. Naming them is also what makes it possible for the tool to refuse: a tool cannot check a precondition nobody wrote down.

In the example Before a refund: an identified order; the state of that order; the policy clause that permits it and which version that clause came from; the amount that clause allows; and the absence of a prior refund against the same order.

Evidence as a reference, not a recollection

Evidence is held as a reference that can be checked afterwards — an identifier and a version — rather than a paraphrase carried in the context.

Why it matters "The policy says returns are accepted within the window" is a recollection sitting in a context window. It cannot be checked after the fact, and it cannot be checked by the tool at the moment of the call. A clause identifier and a version can be both. This is also what makes the system explainable: an answer built out of references is an answer, and an answer built out of the model’s summary of its own reasoning is a story about an answer.

In the example The refund carries clause 4.2 of the returns policy at the version in force that day — not a sentence summarising what the policy seemed to say.

The tool re-checks what it was handed

The tool re-checks the evidence it was handed rather than trusting the arguments it was called with.

Why it matters Evidence gathered a few steps earlier may have been superseded, and may never have been what the caller says it was. The check that matters is the one at the point where the effect happens, because that is the only check an unusual input cannot route around.

In the example The refund tool re-reads the cited clause at the cited version and re-reads the order state, and refuses if either has moved — rather than accepting the amount it was passed.

03 Area

Tool permissions

What each tool may do, and where that limit is actually enforced.

One job, narrowest scope

Each tool has one job and the narrowest scope that lets it do that job.

Why it matters A broad tool is a permission granted to every path that can reach it, including the paths nobody designed. Narrowness is one of the few properties of a tool that holds regardless of what the model was persuaded to ask for.

In the example "Issue a refund against this order for this amount" rather than "call the payments API".

Limits enforced at the tool

Each tool’s limits are enforced by the tool itself, not stated in the prompt.

Why it matters An instruction in a system prompt is a message inside the system. The tool is where the effect happens. Whatever is enforced at the tool holds regardless of what the model was asked to do — and the distinction is structural rather than a claim about how obedient a model is.

In the example The refund tool refuses an amount above what the cited clause permits. The prompt telling the assistant not to exceed the policy is guidance; the refusal is the control.

Its own identity, and a record of every call

Each tool acts under an identity of its own rather than a shared administrative one, and every call is recorded with its arguments and its result.

Why it matters A shared identity gives every tool the union of every tool’s rights and leaves the log unable to answer who did this. The record is also the only thing that can settle a dispute afterwards — "the system decided to" is not evidence.

In the example The refund tool holds refund rights and nothing else. It cannot amend an order, because that is a different tool acting as somebody else.

04 Area

External actions

What happens when the system does something the world can see and you cannot take back.

Recommending and acting are separate

Recommending an action and taking it are separate steps, with separate permission.

Why it matters A recommendation is reviewable text. An action moves money, sends a message or changes somebody’s record. Folding them together means one design decision governs both, and the safe version of the first is not the safe version of the second.

In the example The assistant gathers the policy evidence and prepares a recommendation. Issuing the refund is a separate call, with its own controls over what it will allow.

A repeat cannot pay twice

A repeated request cannot produce the effect twice — the action is idempotent against a key that comes from the request.

Why it matters A retry, a refresh, and a customer writing in twice all look the same to a system that identifies an action only by the fact that it was asked for. The key has to be derived from the request rather than from the attempt, or the second attempt simply carries a second key.

In the example The same customer sends the same request twice. The refund is keyed to the order and the clause, so the second call returns the first refund rather than paying again.

An unknown outcome can be established

When a tool times out or returns an ambiguous result, there is a way to establish what actually happened before deciding whether to repeat it.

Why it matters An unknown outcome is not a failure, and treating it as one is how a single action becomes two. Treating it as a success is how somebody is told nothing happened when it did. The design has to be able to go and look.

In the example The refund call times out. Before anything else, the system reads the payment back by its key and finds out whether the money moved.

05 Area

Evaluation

What you can see after a run, and what the system is checked against.

A record of what it used and did

Each run keeps what the system used and what it did — the evidence with its references, every tool call with its arguments and result, the outcome — and not only the transcript.

Why it matters The transcript is what the system said. A review holding only the final answer can tell you the answer was wrong, but not whether the cause was missing evidence, an over-broad permission or a tool returning something unexpected — and those are three different changes. This is the decision that makes the other five improvable.

In the example Why was this refund issued? An answer built from the clause, the version and the tool’s response is an answer. An answer built from the model’s account of its own reasoning is not.

Cases, and failures that become cases

There is a set of cases the system is checked against, and a real failure becomes one of them.

Why it matters Without cases, a change is judged by whether the demo still looks right — which it usually does, because that is the path the demo takes. A failure that does not become a case is a failure you have agreed to have again.

In the example The partially shipped order that was refunded in full is now a case, carrying the evidence the system should have required before acting.

06 Area

Uncertainty and recovery

What it does when it cannot establish what it needs, and how a person takes over.

A third outcome besides act and fail

There is a third outcome besides acting and failing: handing over with the specific gap named.

Why it matters The honest output when evidence is missing is not a lower-confidence version of the normal output. It is a different output, and it has to be designed as one — otherwise the system’s only way of expressing doubt is to do the usual thing slightly less well.

In the example The request falls outside any policy the assistant holds. It stops short of the refund and says which fact it could not establish, rather than recommending its best guess.

Kinds of uncertainty routed differently

Different kinds of uncertainty are routed differently, rather than collapsed into one confidence number.

Why it matters A missing policy, an ambiguous order state and two policy versions that disagree are three situations calling for three different next steps. One threshold throws away exactly the information that would have said which — and a number below a threshold tells the person who receives it nothing about what to do.

In the example "No clause covers this" goes to whoever can decide policy. "Two clauses disagree" goes to whoever owns the policy. "The order state is unclear" is a lookup, not a judgement.

A person can take over, and is handed something

A person can take over a run in progress, and what they are handed is defined.

Why it matters "A human is in the loop" is not a design until you can say who, how they are reached, what they see, and what happens to the run while they decide. An intervention path that exists in principle is a queue nobody is watching.

In the example The assistant hands over the request, the order, the clauses it found and the reason it stopped — rather than a conversation for somebody to read from the top.

07 Area

Ownership

Who is answerable for the behaviour, and what happens when it changes.

A named owner, and one per tool

A named person or team owns the system’s behaviour, and each tool it calls has a named owner too.

Why it matters Most of the permission work happens on the far side of the tool boundary, which often means a different team, a different repository and a different review. A permission model that lives only in the agent’s codebase is one integration away from being bypassed, and the first sign of that is nobody being able to name who owns the tool.

In the example The assistant has an owner. So does the refund tool, and it is not the same team.

Prompt, model and scope changes get reviewed

A change to the prompt, the model or a tool’s scope goes through a review that records what changed and why.

Why it matters Those three change behaviour without changing anything a test was written against. A prompt edit that widens what the system will attempt is a change to the design, and it should leave the same trace a code change does — otherwise the record of why the system behaves as it does has a hole in it exactly where the behaviour was decided.

In the example Widening the refund tool from "within the policy window" to "within the window, or where a manager has approved" is a design change with a record, not a configuration tweak.

Work out what to do next

Leaving questions alone is fine. They come back as still open, never as a gap.

Answered 0 of 19 questions.

If a question here landed

Nothing you answered was sent anywhere, and no record of you exists. The page view itself is counted, as it is on every page here, and that count cannot be joined to a person or to anything above. If you want to take one of these questions further, these are the routes that exist.