Security

How to Write the Approval Request a Human Can Actually Decide On

Antonio Evans9 min read

A split-screen illustration: on the left, a dated paper approval form with checkboxes, fields, and a clear 'Approve/Deny' section; on the right.
Key points

Key points

  1. 1An approval request is a product with one user, and it succeeds only if that reviewer can make an informed yes, no, edit or escalate in seconds.
  2. 2Show the resolved action, the exact target and payload, the expected effect, the reversibility, and the evidence behind it; hide raw logs, internal reasoning and anything that does not change the decision.
  3. 3Bind every approval to one action digest, one authenticated approver and a short expiry so a yes cannot be replayed, reused or stretched.
  4. 4Phrase the ask as a specific question with a clear default (usually reject on timeout), so silence never executes a write.

Start from the paper form, not the chatbot

Paper forms earned their conventions the hard way. A security exception form at a university asks for the requester, the specific policy being waived, the business justification, the data at risk, the compensating controls, and three signatures including the CISO, and it caps validity at one year (the Miami Dade exception form). A federal accessibility exception process requires an evaluation report, an alternative access plan, and a statement that the product is the most accessible option available (the University of Illinois exception request). Neither form includes the author's thinking process. Both include everything a signature depends on.

That is the whole discipline: the form is a decision instrument, and every field exists because a signature would be uninformed without it. An approval card shown by an agent at runtime is the same instrument under time pressure. When an agent can email customers, change records, rotate credentials or push code, a vague "Proceed?" prompt transfers responsibility to a person who has no basis for accepting it (Pomerium's approval design guide).

Three rules carry over directly:

  1. Every field must map to a decision. If a reviewer cannot act differently because of a field, delete it.
  2. The artifact the reviewer signs must be the artifact that executes. Not a summary of it.
  3. The signature must name a person, a scope and an end. A checkbox with no expiry is a permanent carve-out.

Decide which actions deserve a card at all

Approving everything is the fastest way to destroy the control. Reviewers who see a prompt for every benign read learn to click through, and the approval becomes a formality rather than a safeguard (NHI Mgmt Group on human approval workflows). Research on agent approval workflows is blunt about the tradeoff: frequent prompts reduce automation value and cause habituation, while rare prompts can miss high-impact combinations (Pomerium).

The practical rule: gate on irreversibility, external effect, money, privilege, and data disclosure. Read-only retrieval, classification and internal drafts can usually run under policy. External messages, deletions, permission changes, payments and credential operations get a hard, synchronous pause (Pomerium).

Action classExampleReversible?Gate
Read and summarizeSearch tickets, draft a replyYes, no side effectNone, audit only
Internal, editable writeCreate a draft ticket, add an internal noteYes, with rollbackSoft gate or sampled review
External communicationSend email to a customer segmentNo, once sentHard gate, single approver
Production data changeUpdate billing recordsSometimes, depends on backupsHard gate with diff and rollback plan
Privilege or credential changeGrant admin role, rotate keyExposure may already occurHard gate, often two-person

A worked example makes the sizing concrete. If an agent drafts 400 internal notes a day and 6 customer emails, putting all 406 behind one queue guarantees rubber-stamping. Put the 400 on sampled review (say 5 percent) and the 6 on a hard gate with full context. Reviewer attention is the scarce resource; spend it where a mistake is expensive.

What the card must show

The reviewer needs a resolved payload, not a plan. Pomerium's guidance is to render security facts from normalized tool data and trusted resource lookups, because the model can explain the action but the approval view must not depend on the model's prose (Pomerium). The same point appears in reviewer-facing guidance: a generic "the assistant wants to update records" forces operators to guess and turns oversight into a rubber-stamp liability (Exemplary's approval guide).

A complete card carries six things:

  • The operation. The canonical tool or API call, not a description of it. crm.billing.issue_credit_memo tells the reviewer more than "issue a refund" (Exemplary).
  • The target. Explicit account, tenant, resource URI or recipient list, resolved from the trusted system of record.
  • The payload and the diff. Exact parameters, and what changes from the current state. For a refund: amount, currency, reason code, and the prior state.
  • The acting identity. Which service principal executes, and on whose behalf. The reviewer must be able to see that the execution credential cannot exceed their own authority.
  • The evidence. Document identifiers, clause and page offsets, the source records the agent relied on, and which fields came from untrusted content (Pomerium).
  • The undo. The reversal or compensating operation, if one exists, stated plainly. crm.billing.void_credit_memo or "no reversal, email cannot be recalled."

A compact render of that payload looks like this:

ACTION    send_email (campaign.bulk_send)
TARGET    segment: customers/us/trial-expiring-14d  -> 148 recipients
PAYLOAD   template: trial_expiry_v3, subject: "Your trial ends Friday"
EFFECT    irreversible after send; ~148 external recipients
EVIDENCE  segment built from billing.trials (snapshot 09:14 UTC),
          3 recipients excluded by consent filter
UNDO      none. Draft can be deleted before send.
ASK       Approve sending this email to 148 customers?

If a field would not change a reviewer's answer, cut it. If cutting it means the reviewer cannot tell what will happen, the card is broken, not the reviewer.

What to hide, and why hiding is a security control

Internal reasoning is not evidence. A chain of thought is narrative the model generated, and it can be fluent, plausible and wrong in the same paragraph. Showing it invites the reviewer to grade the story instead of checking the payload, which is precisely the failure mode where the UI shows an agent summary while hidden arguments target another account (Pomerium).

Hide:

  • Raw tool logs and stack traces, unless an error changes the decision.
  • Token counts, latency, model choice and routing decisions.
  • The agent's deliberation, confidence scores and self-critique.
  • Data that is irrelevant to this action, especially sensitive data the reviewer does not need, such as full customer records when a name and account ID suffice.

Show, in collapsible form, the normalized arguments and any material uncertainty. The tradeoff is real: previewing every field improves transparency and can overwhelm users, so the recommended pattern is a stable summary with expandable raw normalized data and clear differences from the prior state, and never hiding recipients, permissions or destructive scope (Pomerium). The paper form analogy holds: the exception form asks whether restricted data such as PHI, PII or PCI is involved, because that answer changes who must sign. It does not ask which font the request was typed in.

Phrase the ask so a yes means yes

The question on the card should be answerable without scrolling. "Proceed?" is not a question, because it names no object. "Approve sending this email to 148 customers?" names the verb, the object and the count. The count matters because it is the thing a reviewer can sanity-check against the segment they expect.

Four rules for phrasing:

  1. Verb first, object second, scale third. "Approve rotating the signing key for tenant eu-1?" beats "Key management action pending review."
  2. Offer the right decision set. Approve and reject is often too narrow. Add modify (fix one parameter, keep the rest) and escalate (route to someone with more authority), and make the buttons say what they do: "Approve exact," "Edit parameters," "Reject with note" (Exemplary).
  3. Default to reject on timeout. Silence must never execute a write. A timeout should abort and abstain, not approve (Exemplary).
  4. Say what the approval does not cover. One click that approves a bundle of unknown size or future actions is a known failure case (Pomerium).

This mirrors good practice in identity systems, where a policy triggers extra authentication only when it is needed rather than for everyone, and where risk policy authors trade friction against coverage deliberately (Okta on conditional MFA for Entra ID, Microsoft on configuring risk policies). Microsoft's guidance is explicit that choosing a higher risk threshold reduces how often a policy fires but excludes lower-risk events, and that blocking is often worse than letting users self-remediate (Microsoft Entra risk policies). The agent equivalent is: gate fewer, more consequential actions, and give the reviewer a way to fix rather than only to block.

Bind the yes to the exact action

An approval is worthless if it can drift. The reviewed action must be cryptographically or transactionally bound to the action digest, the approver identity, the policy version, the task and a short expiry, and the executor must compare the digest before executing. Single-use approvals should be consumed atomically. Keep authorization at the tool and target independent, so an approval never substitutes for permission (Pomerium).

This is where most homegrown review screens fail. Three scenarios to test:

  • Time of check to time of use. Change the recipient, raise the amount, or delete the target between display and execution. The system must revalidate or stop (Pomerium).
  • Replay. Present an old approval after resource state changed. The digest and expiry must reject it.
  • Fatigue. Train users on low-value prompts, then slip one high-value prompt into the stream. Risk-based gating is the defense.

There is a good precedent in identity governance: an exception to an authentication policy should name a business justification, an owner, a scope, compensating controls, an expiry and a review cadence, and without those it stops being a controlled risk decision and becomes an unaudited bypass (NHI Mgmt Group on MFA exceptions). Treat every "allow once" on an approval card the same way. If your system lets a reviewer approve indefinitely, with no expiry and no revalidation, you have built a bypass with a nice UI.

Design the flow around the pause

Approval is a workflow state, not a sentence in a prompt. Production-grade implementations pause the run, serialize the state, and resume the same run when a decision arrives, rather than starting an unrelated conversation (Promptessor's HITL guide). That has concrete design consequences:

  • Durable state. If approval may take hours, the run state must be stored and restored, with pending requests re-emitted after restoration (Promptessor).
  • Routing. Send the card to a role, not a person, and escalate after a defined window rather than leaving work stranded.
  • Evidence packs. The goal is a decision in seconds. A card that requires research is a card that gets rubber-stamped (StackAI's approval workflow guide).
  • Batching, carefully. Batch low-risk internal items into one screen; never batch external or irreversible ones.
  • Audit. Record the action digest, displayed facts, approver, decision, time, policy, expiry, execution identity and final effect, and keep the target system's own audit event as well (Pomerium).

Access request management literature makes the same distinction well: a ticket tracks a request, a governed workflow documents every grant from request to revocation (Zluri's access request guide). An agent approval card that logs only "approved at 14:02" is a ticket. One that logs what was shown, who signed, under which policy and what executed, is governance.

A short build and test checklist

Use this as the acceptance test for an approval card before an agent gets write access.

CheckPass condition
Payload is resolvedReviewer sees exact operation, target, arguments and diff, not a prose summary
Evidence is citedSource records and untrusted fields are flagged
Undo is statedReversal named, or "irreversible" said plainly
Ask is specificQuestion names the verb, object and scale
Decision set is adequateApprove, edit, reject, escalate available where useful
Approval is boundDigest, approver, policy version and short expiry attached
Replay and drift failChanged arguments, targets or expired approvals are rejected
Default is safeTimeout rejects and escalates, never executes
Someone is authorizedApprover role verified, and tool permission checked separately
Audit is completeDisplayed facts, decision and final effect recorded

If the card passes all ten, an approval means something. If it fails the payload or binding rows, a yes is a signature on a blank page.

When you are wiring this into real systems across several model providers, the plumbing is often the slow part. Quanta Inference puts text, image, video, audio and embedding models behind one OpenAI-compatible API key, which keeps the agent runtime and the approval service talking to one endpoint while you build the gates (Quanta Inference). And if the harder question is which of your workflows should be gated, automated or retired, a short working session with people who have shipped these systems is often faster than a design doc (Quanta Consulting).

FAQ

FAQ

How much detail is too much on an approval card?

Too much is anything that does not change the decision. Raw logs, model reasoning, token counts and unrelated sensitive data all add load without informing the yes. Previewing every field improves transparency but can overwhelm, so use a stable summary with expandable normalized data and clear differences from the prior state (Pomerium).

Should the card ever show the agent's reasoning?

No, not as evidence. The approval view must render security facts from normalized tool data and trusted lookups, because model prose can be fluent and wrong in the same sentence (Pomerium). Show the cited source documents and the payload instead, and let the model's explanation live in a collapsed, clearly labeled note.

What happens if nobody answers the approval?

The action must not run. A safe default is to abort and abstain on timeout or invalidation, and to escalate to a named role rather than silently approving (Exemplary). Persist the run state so the work can resume if a decision arrives later (Promptessor).

Why not just require approval for every agent action?

Because uniform approval trains reviewers to click through, which is worse than no gate at all. Frequent prompts reduce automation value and cause habituation, while risk-based gating concentrates attention on irreversible, costly, regulated or high-blast-radius actions (Pomerium, NHI Mgmt Group).

How is an agent approval different from a change ticket?

A ticket tracks a request; the approval gates a concrete action at the moment it executes. Approval should be bound to the action digest, approver, policy and a short expiry, and revalidated if anything material changes (Pomerium). A ticket that records only who clicked approve leaves the same gap that generic ticketing leaves in access management (Zluri).

Sources

Sources

  1. Security Policy and Risk Exception Request Form
  2. Exception Request Form - IT Accessibility - University of Illinois
  3. Design human approval for agent actions
  4. What Is Human Approval Workflow? Definition & Examples
  5. Human approval for AI agents: what reviewers need to see
  6. Use Okta MFA for Microsoft Entra ID (formerly Azure Active ...
  7. Microsoft Entra ID Protection - Risk policies
  8. What Is Mfa exception? Definition & Examples
  9. Human-in-the-Loop AI Agents: Approval Workflows & Best ...
  10. Human-in-the-Loop AI Agents: How to Design Approval ...
  11. Access Request Management: The Complete Guide for IT ...
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles