ava/compare
Compared on properties you can check, not on claims
Every row below is a yes or no question about a product, not a judgment of one: either a spending cap is signed before the agent has authority or it is not, either the execute call refuses without a preview hash or it does not. The columns are categories rather than named products, because the point is the shape of the design and naming a competitor would date the page the week it ships a changelog.
A cell reads yes only where the behaviour is reachable from something a stranger can open: a documented config file, a published endpoint, or a refusal a caller can trigger on purpose. Where the docs are silent the answer is no rather than a guess, so the table understates anything a product ships without writing down, and a single link to the contrary is enough to change a row.
Ava’s own column is the one you should trust least on this page and can check hardest. /receipts shows the artifact behind four of the six rows, and /matrix.json names every route that cannot run and why.
Wallets for agents exist. Accountability for agents did not.
Three real products, not straw men. Each is good at the thing it was built for, and none of them was built to prove afterwards that an agent stayed inside what you authorised.
| Avaexecution layer | Coinbase Agentic Walletwallet CLI + skills | Circle for Agentspayment rail + marketplace | HeyElsaconsumer chat copilot | |
|---|---|---|---|---|
| Reachable from Claude Code, Cursor and Codex | yes | yes | yes | no |
| Moves money into a DeFi position, not only send and swap | yes | no | no | yes |
| A spending cap the human signs before the agent has authority | yes | partial | no | no |
| Two-phase execute: a preview hash is required to broadcast | yes | unstated | unstated | unstated |
| Typed refusal codes instead of a silent failure | yes | unstated | unstated | unstated |
| Receipt re-read from a public RPC, checkable by a third party | yes | unstated | unstated | unstated |
| The agent process never holds the signing key | yes | yes | yes | unstated |
Read from each product’s own documentation on 2026-09-19: docs.cdp.coinbase.com · agents.circle.com · docs.heyelsa.ai.
unstated means those docs do not describe the property either way. It is not a claim that the product lacks it, and a reader who finds otherwise should tell us and this table will change. partial on the signed-cap row is precise: Coinbase documents configurable per-session and per-transaction limits, which is a setting the wallet enforces, not a mandate a human signs before the agent is given authority.
The row that decides it is the last one you can test yourself
Connect an agent, sign a cap smaller than the amount you then ask it to move, and watch which of the two happens. That is the whole comparison, run against your own wallet in about two minutes.