How Zoro uses World ID
Before something risky happens, a real person proves “it’s me, and I approve this exact action”, without revealing who they are. A bot can’t fake it and the proof can’t be reused.
Technically: For actions that can’t be undone or that weaken protection, Zoro asks for a Human Seal: a fresh World ID proof that a unique real person approved that exact action, usable once.
Think of it as a bank’s “are you really you?” check, without showing your ID
For a big transfer, your bank asks you to confirm in person. World ID does that for your AI: a real human confirms, and the confirmation only works for that one action.
Without World ID
A “Confirm” button. The AI, a script or malware can click it just as easily as you.
With World ID
Only a unique real person can approve, only this action, only once, and nobody learns who you are.
From first principles
Why Zoro needs World ID at all.
Five short steps, from the problem to the answer. Each card has a plain version; open “technical version” for the details.
The problem
Some actions can’t be undone, and the one asking for permission is the AI, which is exactly what attackers try to trick.
Show the technical version
Why the obvious fix fails
Buttons can be clicked by bots, and passwords or codes can be stolen and reused for something else.
Show the technical version
What is actually needed
Proof that a real person approved this one action, which can’t be copied to another action and doesn’t reveal who they are.
Show the technical version
Why World ID provides exactly that
World ID proves “a unique human did this” for one named action, and spots any second use, while keeping the person anonymous.
Show the technical version
So Zoro uses World ID as
The Human Seal: a one-time human signature for one exact risky action, using World ID Proof of Human.
Show the technical version
Inside Zoro
What happens, step by step.
Digest the exact action
Zoro writes down exactly what is about to happen and turns it into a short fingerprint.
How exactly?
Bind the proof to it
The human’s proof is tied to this one approval and its fingerprint, so it can only ever approve this one thing.
How exactly?
zoro-human-seal:<approval id> and the signal zoro-action:<digest>. One action per approval means the same person can approve the same command again next week. Zoro signs the request with its relying-party key, with a time limit no longer than the approval window.Verify, then check the binding
World checks the person is real; Zoro double-checks the proof is for the right action.
How exactly?
/api/v4/verify). Zoro then checks that the action, the signal hash and the environment match what it asked for, and that the credential is Proof of Human. A mismatch or a weaker credential is rejected even if World accepted the proof, because the browser, not World’s signature, chose the credential.Record the nullifier once
Zoro remembers the proof was used, so trying it again is refused. If World ID is down, nothing risky happens.
How exactly?
For developers
What a Human Seal request carries
You don’t need this to use Zoro. It is the exact data Zoro writes, so anyone can check it independently.
| Field | Value |
|---|---|
| action | zoro-human-seal:<approval id> (organization joins: one per organization) |
| signal | zoro-action:<action digest> (hashed with World’s own hash_to_field) |
| ttl | Up to the approval window; at least 30 seconds |
| credential | World ID Proof of Human (IDKit proofOfHuman, World ID 4.0; the 3.0 Orb proof is accepted as fallback) |
| environment | production (World App), sandbox (World ID Sandbox app) or staging (World ID Simulator); test identities are labelled in the UI |
| nullifier | Stored once per approval, locally; never published |
| status | awaiting_verification → verified, or cancelled / credential_unavailable / insufficient_credential / mismatched / invalid / expired / replay / service_unavailable |
Where you see it in Zoro
- Overriding a block on an unsealed tool version
- Risky data flows, such as forwarding a private file to an outside address (the Lab’s exfiltration scenario)
- Loosening policy on the Strict profile, switching a server to observe mode, and danger-zone actions
What it does not do
- It proves a unique human approved the action, not that the human made a good decision.
- Staging uses World’s test identities; the Console labels this clearly.
- Zoro stores no identity: only the nullifier for that one approval, on your machine.
Read the code
- Backend/daemon/src/humanseal.tsAction and signal binding, verify call, nullifier
- Backend/daemon/src/approvals.tsApprovals that require a Human Seal
- Backend/daemon/src/actions.tsPolicy, mode and danger-zone actions and their digests
- Frontend/src/components/human-seal.tsxThe World ID widget in the Console and Lab
Try it
See World ID doing its job inside Zoro.
The other tracks