Purser

Proof

Replay of the main run, 3 Nov 11:16–11:33 UTC · test money · real Claude decisions

Claude decides the exceptions; routine buying and selling per query is code.

Airwallex declined EUR 45.00 over the card limit (LIMIT_EXCEEDED), separate TAP run, 2 November; not counted in the figures above.

The partners

Metal

More

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 ↗

Airwallex

More

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

Visa Trusted Agent Protocol

More

The agent signs its card checkout at a TAP merchant before its Airwallex card pays.

1 signed checkout in this run2 signed checkouts (TAP run)16d59bd reference commit

The Visa Award entry and what TAP is, on /visa

Show the live proof
  • 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

Claude

More

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.
  • proposal 4 · Refund batch: rejected by Max
  • proposal 5 · Invoice payment: approved by Max
  • proposal 6 · Policy change: approved by Max

12orders disputed

9 proven valid · 3 wrong data, refunded.

Watch the dispute

37/39attacks stopped

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

412audit rows

Hash chain intact (the main run).

Open the CFO dashboard