Rightshold™ Sign up

Answers · agent safety

How do I require two independent human approvals (four-eyes / maker-checker) before an AI agent takes a high-impact action?

Last updated

TL;DR: For high-impact agent actions — spend above a threshold, permission or role changes, production writes, issuing credentials — do not let a single yes release the call. Require two different humans to approve the same action hash (tool + canonical args + target + amount if any + policy version). The requester (or the person who asked the agent to act) cannot be one of the two; the second approver sees the first decision and the same preview; both receipts bind to that hash; and a pending request expires so a stale yes cannot be reused. Record both decisions outside the agent's editable session on an append-only ledger the agent cannot rewrite. That is maker-checker / four-eyes applied to agents: one compromised account, one coerced person, or one honest mistake is not enough to move money or open a gate. request_human_approval hashes the action object you send; call it twice with distinct approver slots (or gate on two receipts), then verify_human_approval against the same action before execution; ledger_verify and record_ai_run keep the trail checkable.

What should I check, step by step?

1. List the action classes that need four-eyes: spend over a threshold, permission or scope changes, production writes, credential or key issuance, irreversible deletes. Everything else can stay single-approver or auto.

  1. Build one action object the agent cannot edit after the request: tool name, RFC 8785 (JCS) canonical args (then sha256), target or environment, amount and currency if any, policy_id and policy_version, and a requester_id that is not eligible to approve.
  2. Open two approval requests bound to that same action hash (or one request that requires n-of-m with n=2). Reject any decision where approver_id equals requester_id or equals the other approver.
  3. Show the second approver the first decision (who, when, note) and the same preview the first person saw. Independent eyes means a second look at the same facts, not a rubber stamp on a different summary.
  4. Expire the pending request (for example 15–60 minutes). After expiry, deny execution and require a fresh dual approval; never let an old first-yes pair with a new second-yes on a changed action.
  5. At execution, recompute the action hash and verify both receipts with verify_human_approval against that hash. Fail closed if either receipt is missing, expired, for a different hash, or from the same person.
  6. Write both decisions (approve or deny), plus expiries, to an append-only ledger outside the agent's credentials. Denials and abandoned requests matter as much as approvals.
  7. Drill it: attempt self-approval, attempt two approvals from one person with two accounts, change args between the two yeses, and confirm the gate blocks every case.

Why is one human approval not enough for high-impact AI agent actions?

A single approver is a single point of failure: stolen session, rushed click, social engineering, or the same person who asked the agent to act approving their own request. Banks and payment firms already treat that as unacceptable for money movement; agents that can spend, change access or write production deserve the same bar.

How do I bind two independent approvals to the same agent action hash?

Independence is worthless if the two people approved different things. Canonicalize the tool arguments (RFC 8785 JCS), hash them, and put tool, args_sha256, target, amount and policy_version into the action object both receipts must match.

How do I record dual control for an AI agent outside the agent?

Keep both receipts, the requester_id, the policy version and the final execution decision in a store the agent's API key cannot UPDATE or DELETE. An agent that can edit its own approval history can invent a second yes.

How do I ask Rightshold about this (free, no key)?

Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “Before my agent runs this high-impact tool call, require two independent human approvals bound to the same action hash (tool, args_sha256, target, amount, policy version). The requester must not be either approver; expire the pending request in 30 minutes.”

One-click setup

{
  "tool": "request_human_approval",
  "arguments": {
    "summary": "four-eyes: production deploy of release sha256:8f3a… under change-mgmt policy v7 (rule dual-control-prod)",
    "action": {
      "type": "tool_call",
      "tool": "deploy_release",
      "args_sha256": "sha256:8f3a…",
      "target": "env:production",
      "amount": null,
      "policy_id": "change-mgmt",
      "policy_version": "v7",
      "rule": "dual-control-prod",
      "requester_id": "idp:alex@example.com",
      "approval_mode": "two_independent",
      "required_approvals": 2
    },
    "expires_in_minutes": 30
  }
}

Rightshold records approval requests and owner decisions on a signed, hash-chained ledger and verifies that a receipt still matches the action. Enforcing two distinct humans, rejecting the requester as an approver, and sequencing the second look are policy and workflow you configure around those receipts. Rightshold does not run your identity provider or decide which action classes need four-eyes. Not legal advice.

What are the sources?

Related

Not legal advice. JSON · Markdown · All answers

Get a free API key in one call

No card and no email needed. 100 free credits; the license and policy checks stay free without a key.

curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_...   # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
  -H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'