Human-in-the-loop Authorization Patterns for Agents Solo.io's research on human-in-the-loop authorization for AI agents identifies two types of approval flows—harness checks and enterprise policy-driven approvals—and evaluates five protocols (CHEQ, TAC, AAuth, MCP MRTR, MCP Tasks) against criteria including accountable authority, exact binding, revalidation, bounded execution, and durable evidence. The analysis emphasizes that enterprise HitL requires enforcement-point-mandated approvals, not agent self-policing, to support compliance with regulations like Sarbanes-Oxley. Human-in-the-loop Authorization Patterns for Agents In my work with customers adopting and securing AI agents at scale in enterprise environments, we are running into “human in the loop” usecases. For example, usecases where a sensitive operation MUST be approved by a human; sometimes even a different human than the one on who’s behalf the agent is acting. As part of my work on Agent Identity and Access Management here at Solo.io, I research various patterns and options. I want to distill some of the patterns/spec drafts that exist to address these types of usecases. Two kinds of human in the loop There are two types of “Human in the Loop HitL we’ll call out. The first is a harness check based HitL. The harness classifies some action as “looks risky” and asks its user, “Is this okay?” This is useful because it gives the user to review risky behavior as determined by the agent/harness. In the organizations we’ve been working with, this is not the only type of HitL needed. If the model, prompt, or tool description decides when to ask, the agent is largely policing itself. Another execution path may call an API directly. A plugin or sub-agent may bypass the harness. Prompt injection may convince the agent that approval is unnecessary or already happened. Even after the click, the agent may execute something different from what it displayed. Enterprise HitL has a stronger meaning: Policy requires an authorized principal to approve this exact action before an enforcement point will permit it to execute. Here, asking is not optional. The agent does not decide when a human decision is required, the authorization boundary does that. In this blog we’ll look at the following options to solve this problem: - Confirmation with Human Exchange of Qutoations CHEQ - Transaction Authorization Challenge tokens TAC - Agent Auth AAuth - MCP Multi Round-Trip Requests MRTR - MCP Tasks What Enterprise HitL must provide Before comparing protocols, we need criteria. A serious HitL authorization system should provide: Accountable authority. Identify the agent, requester, approver, workload, and any delegation chain. Policy determines who may approve and whether duties must be separated. Exact binding. Bind the decision to the operation, parameters, destination, requester, policy, expiry, and the semantic display reviewed by the approver. Revalidation at enforcement. Before execution, re-check identity, policy, schema, credentials, destination, and the exact operation. Drift requires a new decision. Stale credentials require re-acquisition. Bounded execution. Define whether approval covers one invocation, a reusable scope, a session, or a mission. Durable evidence. Record what was requested, what the approver saw, who decided, which policy applied, what executed, and what happened. These properties are what make HitL critical for compliance. No protocol is inherently “SOX compliant” for example, and the Sarbanes-Oxley Act https://www.govinfo.gov/content/pkg/COMPS-1883/pdf/COMPS-1883.pdf does not prescribe an agent approval flow. But when agents can affect systems involved in financial reporting, HitL can support internal controls. With those requirements in hand, we can evaluate the leading patterns. CHEQ: memorialize what the human confirmed CHEQ https://datatracker.ietf.org/doc/draft-rosenberg-aiproto-cheq/ was an early draft which brough the idea of a “confirmation server” to familiar entities like clients and resource servers. When an operation needs confirmation, the resource returns a set of URIs. The confirmation service obtains a signed CHEQ object describing the operation, renders it to an authenticated human, adds the confirmation, and returns it to the resource. The agent polls a result URI. The flow looks roughly like this: The agent calls the resource. For example, booking a flight with some of its details: 1 2 3 4 5 POST /api/v1/book-flight Authorization: Bearer