Discussion topic for ERC-8354, ERCS/erc-8354.md
Confidential Agent Policy Verdicts proposes a pre-execution allow/deny interface for autonomous agent actions, where the decision is proven in zero knowledge against a policy that is never disclosed on chain.
Authors: Muhammad Zidan Fatonie (@mzf11125), Faisal Firdani (@zexoverz), Maulana Asykari Muhammad (@WeissCurry)
Reference implementation: GitHub - zexoverz/confidential-agent-policy-verdicts: Reference implementation of the draft ERC Confidential Agent Policy Verdicts — pre-execution ZK allow/deny for autonomous agent actions against a committed secret policy. · GitHub (CC0-1.0), spec at SPEC.md
Update Log
- 2026-07-24: Initial draft opened for discussion on this thread.
- 2026-07-29: Reference implementation published under CC0-1.0. Guard with
verify/consume/isConsumed, companionPolicyDomainRegistry, canonicalPolicyActioncommitment domain-separated bychainIdanddomainId, and an executor bound by EIP-712 signature throughSignatureCheckerso ERC-1271 accounts work as executors.interfaceIdassigned0x6c832e88, repo. - 2026-07-30:
VerdictAttestationhandoff to the ERC-8004 Validation Registry added, carryingartifactHash(the action commitment) and amechanismtag set tokeccak256("zk-secret-policy"). Kept RECOMMENDED rather than required so it stays off the coreconsumepath, post. - 2026-07-30: ERC PR opened, ethereum/ERCs#1919, commit c18bd72. Frontmatter corrected in cc1f7d8, CI fixed by linking EIP and ERC references and removing references to unpublished proposals in 38b6f76, editorial suggestions from @abcoathup applied in 4fcc6b8 and 57af8d1, renamed to ERC-8354 per editor assignment in f22856b.
- 2026-07-30: Working Noir allowlist circuit landed with a
bb-generated UltraHonk verifier and aHonkVerifierAdaptermapping aVerdictto the circuit’s 38 public inputs. A real proof verifies on chain throughconsume, with no MockVerifier in the path, post. - 2026-07-31: Marked ready for review. Labels
c-new,e-consensus,e-review,s-draft,t-erc. One further editor review is required before merge. - 2026-08-03: Security Considerations section added distinguishing action-level verdict integrity from interpreter-level fidelity assurance, and directing fidelity provenance to a content-addressed append-only companion registry rather than the normative core, post.
External Reviews
- 2026-07-29: @babyblueviper1 proposed confidential-correct and public-recomputable as orthogonal verdict properties rather than points on one spectrum, and recommended the ERC-8004 attestation carry a content-addressed reference to what was judged plus an explicit mechanism tag recording how the verdict was reached. Both adopted, post.
- 2026-07-30: @babyblueviper1 published a composed worked example built against the reference contracts rather than a mockup, binding one action to both a CAPV verdict and an independently signed public-recomputable verdict, post.
- 2026-07-30: @helmymekaoui-web argued that interpreter fidelity is the general shape of “the verifier itself has to be verified” and recurs across several agent standards, so fidelity attestation should be a separate reusable primitive rather than inline. Asked whether fidelity can ever be fully on-chain-checkable or bottoms out in a human reading the reference definition, post.
- 2026-07-31: @helmymekaoui-web argued that independence must be defined structurally, by the number of distinct failure modes rather than the number of recomputations, since shared lineage pulls N back toward 1. Citing Henrion and Fischhoff, “Assessing Uncertainty in Physical Constants”, American Journal of Physics 54(9), 1986, post.
- 2026-08-02: @helmymekaoui-web deployed a
ProvenanceRegistryproof of concept on Base Sepolia implementing content-addressed program keys with a declared parents DAG and a depth-boundedshareLineagewalk, and reported the sensitivity and specificity tradeoff between self-declared and openly contestable lineage. Citing Knight and Leveson, “An Experimental Evaluation of the Assumption of Independence in Multi-Version Programming”, IEEE TSE SE-12(1), 1986, post. - 2026-08-04:
ProvenanceRegistryV2interface frozen atregister/recordOf/shareLineage/sameHeritageCluster, withheritageClusterderived rather than stored. Deployed bytecode and all four selectors independently verified by @babyblueviper1 against the live chain rather than taken from the description, post.
Outstanding Issues
-
2026-07-24: Placement in the ERC-4337 validation phase. On-chain proof verification inside
validateUserOpmust respect ERC-7562 storage access and gas limits, or bundlers drop the operation. I believe verification can be made constant-cost and state-independent, but I have not checked it against the full ERC-7562 rule set and would value input from bundler implementers. -
2026-07-24: Asynchronous proving latency. Proof generation sits in the execution path, so an agent cannot act while the domain’s policy engine is unreachable. ERC-7412 looks like the right pattern for structured off-chain retrieval, but I have not decided whether the standard should reference it normatively or leave it to integrators.
-
2026-07-24: Interpreter fidelity is currently assumed, not proven. A runtime proof attests that the committed program executed, not that the program faithfully implements the policy language it claims to. An interpreter that ignores its ruleset and always returns ALLOW produces proofs that verify identically to a correct one. Open question was whether the fidelity attestation mechanism should become its own ERC or stay inline.
- 2026-08-03: Resolved as a companion, not inline. Security Considerations now names action-level verdict integrity and interpreter-level fidelity assurance as separate layers, and directs fidelity provenance (spec commit, implementation commit, review method, lineage) to a content-addressed append-only companion registry, on the same pattern by which the domain registry sits beside this standard, post.
-
2026-07-24: Interpreter confidentiality is a separate property from fidelity. A correct but leaky interpreter, whose public outputs or revert behaviour vary with which branch of the ruleset fired, satisfies every correctness check and still leaks policy structure. Proving time is the channel I am least confident about, since it sits outside the proof entirely.
-
2026-07-24: Whether the domain registry should be a separate ERC.
IPolicyDomainRegistryis specified as a recommended companion so independent implementations interoperate by default, while the core interface depends only on three semantic hooks. Splitting it would follow the ERC-7812 precedent but would couple this proposal’s path to Final to another Draft. -
2026-07-24: Root staleness as a revocation service level.
maxRootAgeexists because mirrored roots on spoke chains lag the hub. Set it to zero and verdicts break during any sync gap. Set it high and a removed rule keeps authorizing actions for that long on every spoke. There is no setting that avoids both, and I would like input on whether the standard should mandate a ceiling or leave it to domains to publish. -
2026-07-24: Cross-chain agent identity resolution is out of scope and deferred.
agentIdmust currently resolve on the chain where the verdict is consumed. Flagging in case anyone considers this a blocking gap rather than a deferral. -
2026-07-24:
interfaceIdis a placeholder and will be finalized before this leaves Draft.- 2026-07-29: Finalized as
0x6c832e88, reference implementation.
- 2026-07-29: Finalized as
-
2026-08-05: The reference implementation proves a compiled circuit, not an interpreter. The Rationale argues for proving a fixed policy interpreter so the program commitment survives rule changes. The working proving path is currently a Noir allowlist circuit with a generated UltraHonk verifier, which is a compiled policy and therefore does incur the verification key churn the Rationale objects to. The SP1 interpreter program is retained only as a sketch for obligations reference. The interpreter design is the intended one and not yet the demonstrated one, and I would rather say so than have it read as settled.
-
2026-08-05: Policy expressiveness in the reference implementation. The circuit proves allowlist membership against a policy root, which is the minimal viable policy. Richer predicates are future work, so nothing currently exercises the superset behaviour that makes interpreter proofs more expensive than bespoke circuits.
-
2026-08-05: Reference implementation completeness. 24 Foundry tests cover the spec’s Test Cases, keccak commitment parity against the Noir circuit, on-chain verification through
consume, and executor binding. The implementation is unaudited and the two-spoke cross-chain deployment remains outstanding. -
2026-08-05: Whether
programKeycan address an off-chain interpreter. The companion fidelity registry treatsprogramKeyaskeccakover deployed bytecode, which assumes the interpreter is an on-chain contract. A verifier whose runtime is a signing server has nothing to hash that way, so either the scheme admits another stranger-recomputable preimage or such verifiers need a thin on-chain proxy purely to have bytecode. Raised on this thread and unresolved, post.
Summary
Agent authorization on Ethereum today comes in two shapes. It is either retrospective, as with ERC-8004, which records identity, reputation, and validation attestations after an agent has acted, or it is mandate-based, as with ERC-8150 and ERC-8312, where authority derives from a principal who signed a specific grant in advance.
A large class of deployments fits neither. Consider a corporate expense card. The cardholder does not pre-sign each purchase, and the card network’s fraud rules are shown neither to the cardholder nor to merchants. Authority comes from a standing ruleset held by a third party, applied to every transaction, updated without anyone re-signing anything, and deliberately kept secret, because a published fraud rule is a published evasion guide.
Regulated agent deployments have the same shape. An operator maintains screening rules, agents are subject to them whether or not any counterparty signed them, the rules change frequently, and publishing them defeats them. Both obvious workarounds fail. Putting the policy on chain discloses it to the adversaries it exists to stop. Trusting an off-chain oracle to say “allowed” gives no evidence that any policy was applied, so the verdict is indistinguishable from an arbitrary signature.
Zero knowledge resolves the tension. The verifier learns that some committed policy was correctly evaluated and returned allow, and learns nothing about its contents.
How It Works
-
An agent proposes an action.
-
The Policy Domain’s off-chain engine, not the agent, evaluates that action against the secret ruleset. The agent never holds the rules.
-
If permitted, the engine produces a zero-knowledge proof that this action was checked against the committed policy and the result was ALLOW. The proof reveals nothing about the policy’s contents.
-
A Guard contract on chain verifies the proof.
-
If valid, the action executes. If not, it is refused.
The policy exists on chain only as a commitment, registered as a statement in the ERC-7812 Evidence Registry. What crosses chains is a single root, not the rules.
The standard defines only the verdict envelope and the verification interface. It does not define the policy language, the proving system, or the transport.
Two Choices Worth Surfacing Early
The program proven is a policy interpreter, not a compiled policy. If policies compile to circuits, every rule change produces a new verification key, which means a new verifier deployment on every chain for every update. For a ruleset that changes weekly this is disqualifying rather than inconvenient. By proving a fixed interpreter and passing the ruleset as private witness, the program commitment stays constant across policy updates and only the ERC-7812 root moves. The cost is that the interpreter proves a superset of any single policy, so proofs are more expensive than a bespoke circuit would be. That trade puts proving cost off chain with the domain and removes verification key churn from everyone else.
The policy commitment is deliberately unblinded, departing from ERC-7812’s blinding pattern. Blinding would make the commitment unverifiable even to a party holding the ruleset, which destroys the selective-disclosure path to auditors. Preimage resistance alone carries the confidentiality requirement, given adequate ruleset entropy.
Scope of the Privacy Claim
This standard hides the policy, not the action. A permitted action executes on a public chain and is public. The guarantee is that no observer, including the executing agent, learns the rules that permitted it.
It is an integrity property, not a safety property. A valid proof establishes that the committed ruleset was evaluated, and establishes nothing about whether that ruleset is correct or fair. A domain committing to a permit-everything ruleset produces proofs that verify perfectly well.
Relationship to Neighbouring Standards
| Standard | Role | Relationship |
|---|---|---|
| ERC-8004 | Identity | Supplies the agent identity the verdict binds to. |
| ERC-7812 | Evidence | Supplies the evidence registry. It was written abstractly so later proposals could build specific use cases on top of it, and nothing in the agent cluster has taken it up yet. This is that bridge. |
| ERC-8312 | Mandate | Complementary rather than overlapping. A verdict grants permission, a mandate grants capacity, and both must hold independently. |
| ERC-8150 | Closest neighbour | Also does pre-execution verification in zero knowledge. The difference is the authority source and the secret. There, the user signs off on the agent’s batch, so the authorizing party knows exactly what was authorized and there is nothing to hide from the principal. Here, authority comes from a standing third-party ruleset that no counterparty signs, and its confidentiality is the point rather than a side effect. |
| ERC-8226 | Adjacent motivation | Shares the regulated-deployment motivation, but its mandate stays legible to the parties it binds and it scopes to tokenized regulated assets. The envelope here is asset-agnostic and gates arbitrary calls. A domain could plausibly use both. |
| ERC-7579, ERC-6900 | Integration surface | The natural integration surface. The Guard operates as a pre-execution hook or validation module. |
| ERC-4337, ERC-7562 | Constraint | Constrain how this can work inside validateUserOp. See outstanding issues. |
Feedback I Am Specifically Looking For
-
Is the interpreter-as-proven-program approach the right call, or is there a compiled-circuit design that avoids verification key churn that I have missed?
-
Does the unblinded commitment departure from ERC-7812 create problems for that standard’s authors that I have not anticipated?
-
Is the executor binding sufficient against mempool front-running of a valid verdict, given that proof generation and submission are decoupled?
-
For anyone working on ERC-8004: does the Validation Registry attestation proposed after a successful consume fit the intended use of that registry, or is it a misuse?
-
For the ERC-8150 and ERC-8226 authors: is the boundary I have drawn the right one, or is there a merge that serves everyone better than three adjacent standards?