Each agent's limit is a mandate on chain; payments per query over x402.
86 payments on chain1 refused by Metal at the cap1 refused by Metal: mandate just replaced2 mandates replaced
86 on Metal = the 87 inside the limits less the 1 card buy.
Show the live proof
Refused by Metal: Stockline at 0.04, over the 0.03 cap (mandate_cap_exceeded); nothing moved. tx 0x2e92…1871 ↗Defense in depth: Purser normally refuses before signing. To prove the rail itself enforces the limit, one purchase was let through to Metal — Metal refused it; nothing moved.
Refused by Metal: Stockline, the old mandate was revoked by its replacement; nothing moved
New mandate on chain after two signatures: Treasury agent, cap 2.00, budget 2.00 tx 0x789a…ebbc ↗
New mandate on chain after two signatures: Sourcing agent, cap 0.04, budget 14.00 tx 0x2a91…e790 ↗
A mandate per agent, on chain: Sourcing agent: 0.04 a payment, 14.00 in total, one payee; Support agent: 0.10 a payment, 4.00 in total, one payee; Treasury agent: 2.00 a payment, 2.00 in total, one payee 0xb7ef08bb…44ad ↗
Paid per request (x402), with a signed order: 41 stock checks sold, each paid under the customer's mandate and settled by Metal's facilitator 0x2cc5a16e…2fc7 ↗
The agent buys from its supplier: 41 purchases, each under the Sourcing agent's mandate 0x64d22177…4c7d ↗
Refunds as mandate pulls: 3 refunds, 0.15 test USD, back to the paying account only, each under its own payment id 0xe4bf7962…c89d ↗
Sweep, after finality: earnings moved once their block (14153316) was finalized (14153325); booked at Airwallex exactly once 0x86936a5b…ccb4 ↗
Earnings booked once final, the euro licence by SWIFT, cards with limits the bank enforces.
4 movements at Airwallex1 card decline at the limit (TAP run)
Show the live proof
A company card per agent (Issuing): 3 virtual Visa cards; each card's limits, merchant categories and currency sit on the card at Airwallex •••• 1423 · •••• 6203 · •••• 6279
Approved by Airwallex: 1 charge, €45.00 in all, inside the card's limits Airwallex id 01a1a12f-4…0007
FX conversion on a locked quote: USD 124.29 → EUR 110.00, only the shortfall, SETTLED Airwallex id 3ca88196-0…4636
SWIFT payout of an invoice: EUR 240.00 to the allowlisted supplier, PAID in the sandbox, where the settlement is simulated, fee EUR 13.42; the approval hash is in the transfer's metadata Airwallex id 03360bfa-a…3985
Metal earnings booked at Airwallex: USD 0.69 booked once as a simulated sandbox deposit that names the sweep's testnet transaction (no test USD reached Airwallex) Airwallex id b3812e05-2…e0a0
The limit, enforced by Airwallex (TAP run · 2 Nov · test money): EUR 45.00 declined, over the card's limit Airwallex 01a19bfa… · read back with GET: FAILED
In this run: the Sourcing agent (Haiku) bought the packwise-pro plan at Packwise, EUR 45.00; our layer verified both TAP signatures (verified, verified); the agent's Airwallex card ····1423 was approved by Airwallex Airwallex 01a1a12f…
TAP run · 2 Nov · test money: the Sourcing agent (Haiku) picked the card rail: Visa's reference proxy answered 200, our layer verified both signatures (verified, verified); the Airwallex card (brand as Airwallex returns it: VISA) was approved, EUR 19.99 Airwallex 01a19bfa… · read back with GET: PENDING
TAP run · 2 Nov · test money: code tried one purchase over the card's limit: Visa's reference proxy answered 200, our layer verified both signatures (verified, verified); the Airwallex card (brand as Airwallex returns it: VISA) was declined by Airwallex (over the card's limit), EUR 45.00 Airwallex 01a19bfa… · read back with GET: FAILED
The agents decide with Claude: Sourcing on Haiku, Support on Sonnet, Treasury on Opus.
24/24 decisions by Claude50 calls, each with a request id
Show the live proof
Sourcing agent on Haiku: 11 of 11 decisions by Claude, 0 fallback, 26 calls, USD 0.0088
Support agent on Sonnet: 4 of 4 decisions by Claude, 0 fallback, 7 calls, USD 0.0500
Treasury agent on Opus: 9 of 9 decisions by Claude, 0 fallback, 17 calls, USD 0.2582
Checks
16 stopsnothing paid over a limit
16 stops, nothing paid over a limit: Claude skipped 12 overpriced checks, Metal refused 2 purchases, the CFO rejected 1 proposal, and 1 planted instruction changed nothing. Metal's 2: 1 over the mandate's cap, 1 on a mandate that had just been replaced.
Airwallex declined EUR 45.00 over the card limit (LIMIT_EXCEEDED), separate TAP run, 2 November; not counted in the figures above.
Show each one
By Claude (the Sourcing agent): 12 overpriced stock checks skipped under its own buy policy (#25–#36); nothing signed, the customer not charged
By Metal: Stockline at 0.04, over the 0.03 cap (mandate_cap_exceeded); nothing moved. tx 0x2e92…1871 ↗Defense in depth: Purser normally refuses before signing. To prove the rail itself enforces the limit, one purchase was let through to Metal — Metal refused it; nothing moved.
By Metal: Stockline, refused on chain because its mandate had just been replaced
By the CFO with Face ID: proposal 4 · Refund batch rejected
Planted instruction ignored: An incoming document (dispute) contains 1 line aimed at the AI; they were treated as data and changed nothing
5Face ID decisions
Proposals the CFO decided on his phone; the mandate change needed a second signature too. Second approver: a labelled test passkey in this demo. In production this is a second person.
Show the 6 signatures: 5 decisions + 1 co-signature
proposal 1 · Policy change: approved by Max
proposal 2 · Mandate change: 1 of 2 signatures, by Max
proposal 2 · Mandate change: approved by Max and Test-controller (2 of 2 signatures)Second approver: a labelled test passkey in this demo. In production this is a second person.
2 more detected afterwards, not prevented (rewrite a line of the audit log; hide a card payment from the ledger). 30 October, a test world on simulated rails.
Later runs
1 November, against the agent loop: 12 of 12 runs held (4 attacks, 3 runs each; the Sourcing agent on Haiku, simulated rails).