The difference between a chatbot and an agent is agency: an agent doesn’t stop at an answer, but at a state change — a sent email, an updated record, a processed lead. That’s a huge value, but also responsibility. Agency without boundaries is a risk, so we design boundaries alongside agency.
Three Pillars of Agent Security#
- Tool allow-list — the agent has a catalog of permitted tools (e.g., navigation, search, booking), not unrestricted system access. What’s not on the list, it won’t do.
- Human-gate — irreversible actions (sending, payment, data modification) require a server-side confirmation token, signed with HMAC. The model’s declaration alone isn’t enough — you need a human “yes” where undo isn’t possible.
- Full log — every step (thought → tool → result) is logged, so after the fact, you can replay what the agent did and why. No trace, no accountability.
How the Allow-List Works in Practice#
We describe the tool scope explicitly, distinguishing read-only operations from operations that change state (those go through the human-gate). An example list for a customer-service agent:
navigation— read-only (moving around the site, no writes),offer-search— read-only (checking availability and prices),book-appointment— write-gated (proposes, executes after confirmation),send-email— write-gated (content subject to human approval).
What is not on the list: access to the database with other customers’ data, deleting records, payment refunds, data export. A missing entry is a hard refusal on the server side, not a suggestion in the prompt — the model may “want” to call a tool outside the list, but the execution layer will reject it.
Human-Gate Step by Step#
The confirmation gate is a server-side mechanism, not a model promise. The flow for an irreversible action:
- the agent proposes an action (e.g., “send a booking confirmation to the customer’s address”),
- the server issues a short-lived token signed with HMAC, bound to the specific tool and arguments (changing the address or content invalidates the token),
- the human sees the proposed action and confirms or rejects it,
- the server verifies the token (signature, validity, argument match) and only then executes the tool,
- the result lands in the log together with who confirmed it and when.
The token is short-lived (on the order of minutes, not hours) and single-use — this limits the window in which a hijacked confirmation could be exploited.
What a Good Log Contains#
A “full log” only becomes useful when a single line lets you reconstruct the decision. The minimum set of fields for a single step:
- a timestamp and request identifier (
request-id, to tie steps within one run together), - the reasoning trace as thought → tool → result,
- the name of the called tool and a hash of its arguments, with personal data masked,
- the human-gate decision (confirmed / rejected, by whom),
- the result status (success, error, blocked by the allow-list).
Personal data does not enter the log in plain form — we log a hash and masked values, so the audit trail itself doesn’t become a source of leaks.
How Agent Risk Differs from Chatbot Risk#
| Criterion | Chatbot | Agent |
|---|---|---|
| What it does | returns text | changes state |
| Error impact | wrong answer | wrong action |
| Required barriers | output guardrails | + allow-list + human-gate |
| Trace | conversation | log of every step |
| Supervision | answer review | action confirmations |
That’s why agents aren’t deployed “wild.” We also describe the boundary between conversation and execution in the post agent vs chatbot.
Gradual Relaxation of Supervision#
We don’t start with full autonomy. The agent begins with a tight human-gate (you confirm almost everything), and as trust evidence grows — logs are clean, decisions accurate — we loosen gates on proven paths. The same approach as with prompt injection: security built-in, not bolted on.
These three pillars respond directly to the risks that the OWASP Top 10 for LLM applications catalogs at the agent level: excessive agency (when an agent can do more than it should) and insecure tool use (when a tool call bypasses controls). The allow-list limits the scope of agency, the human-gate takes away the model’s ability to execute an irreversible action on its own, and the log provides the trace needed to detect abuse. We loosen the trust boundary gradually precisely because these two classes of risk grow fastest with autonomy.
Try It Live#
We launch the agent in a secure sandbox with a transparent trail (playground: PII masked, zero retention). Ask the model to outline task steps:
FAQ#
Is an AI agent safe if it operates autonomously?#
It’s safe when it has clear boundaries: a tool allow-list, human-gate for irreversible actions, and a log of every step. Agency without these barriers is a risk, which is why we design them from the start. The agent operates autonomously within a narrow, well-defined scope — not “in general.”
What is a human-gate?#
It’s a point where an irreversible action (sending, payment, record modification) requires human confirmation — technically, a server-side token signed with HMAC, not just the model’s decision. So even if the agent “decides” something needs to be done, it won’t proceed without the green light.
Where do I start with agents?#
With one narrow, repeatable process under tight supervision — you confirm almost everything, logs are complete. As trust evidence grows, you relax gates on proven paths. That’s how you safely give AI agency, step by step.
How do I test the allow-list before deployment?#
With a negative test: before the agent reaches production, we verify that calling a tool outside the list ends in a server-side refusal, not an attempt to execute. It’s also worth running a short red-team — deliberately pushing the model (including via content in the input data) to reach for a forbidden tool and confirming that the execution layer blocks it and that the block lands in the log. The test passes when every disallowed tool is rejected and the allowed ones work within their scope.
How does a human-gate differ from a regular confirmation in the interface?#
A regular confirmation in the UI is a client-side signal — it can be bypassed, and the model may still try to perform the action. A human-gate is enforced on the server: an irreversible action won’t execute without a valid, short-lived token signed with HMAC and bound to the specific tool and arguments. The difference is practical — with a regular confirmation, trust rests on a declaration; with a human-gate, on a verifiable token that the model itself cannot forge.
