Final brick of the MVP wave - start here: The Bedrij Principle, then Brick #1: Typed Participants, Brick #2: Typed Evidence, Brick #3: Scenario Matrix and Brick #4: Verifiable Vitrine. The hypothesis under test: a complex economic system can be composed from verifiable state transitions.
Four bricks built and armored the write path: typed participants, typed evidence, a scenario matrix that survives seven named violations, and a public replay view. The anchor article ended with a promise - "The experiment has started." This article is the receipt: on 2026-11-08 a real three-hop shipment ran the full custody cycle on Arc testnet, each hop escrowed in its own ERC-8183 job, all three settled and verified in 53 seconds. Proof -> acceptance -> settlement, on real rails, with transaction hashes you can open yourself.
What exactly ran?
Short answer: shipment dogfood-1794151620383 - a cold-chain delivery with three hops, played by three different participant types from Brick #1. A shipper contracted an agent (Plant intake), the agent handed custody to a device (ColdVan unit), and the device delivered to an org (Restaurant). Each hop carried a 0.01 USDC escrow in its own ERC-8183 job on the ref proxy 0x0049e5...bf6a0, Arc testnet (chainId 5042002). Result: status completed, 3/3 hops verified, outstandingUsdc: "0".
The shipment, in one table:
| hop | leg | job | create tx | settle tx |
|---|---|---|---|---|
| 0 | shipper -> agent (Plant intake) | 66 | 0x606f18... | 0xf15f6e... |
| 1 | agent -> device (ColdVan unit) | 67 | 0xf9ebb8... | 0x35f507... |
| 2 | device -> org (Restaurant) | 68 | 0xdc7c70... | 0x7798a4... |
Six real transactions - three job creations, three settlements. Not a fixture, not a fork, not a replayed simulation: Arc testnet, confirmed on the public explorer.
The participants are real keys with real labels (Brick #1's typed roles, live):
| role | address | type |
|---|---|---|
| client (shipper) | 0xcdd23d104AA4C10DE65F4DD0571eDfeC0458699d | org |
| hop 0 provider - Plant intake | 0xb21fa9D9CE930FAf52545318169569007c027005 | agent |
| hop 1 provider - ColdVan unit | 0x67d43A4065Dd69165061062B3128EDA50f1F7C96 | device |
| hop 2 provider - Restaurant | 0x8B9FC021430c4fAD90389DcbdE4B1140012Cd98D | org |
| evaluator | 0xc9fA59e889c25b7f0b9494ed5c6bC62fe7EcCC56 | signer |
What did each hop actually execute on-chain?
Short answer: the full ERC-8183 lifecycle, not just an event log entry. Per hop the executor drives four stages of contract state: the provider signs setBudget, the client approves and funds the escrow, the provider submits the deliverable, and the evaluator completes the job - releasing escrow only after the accept.
provider setBudget | client approve + fund <- 0.01 USDC escrowed | provider submit <- deliverable declared | evaluator complete <- escrow released That ordering is the Bedrij primitive running on contract state instead of test fixtures. Hop i+1 cannot hand off before hop i is paid - the same ShipmentOrderError guard the scenario matrix breaks against, now re-deriving state from a log whose pay/verify events were produced by real settlement transactions. The economic loop the anchor drew as proof -> acceptance -> settlement fired three times in 53 seconds of wall clock (15:27:41Z - 15:28:34Z).
And because the run wrote to the production Postgres ledger (SC_DOGFOOD_DB=1), the whole timeline is publicly replayable - Brick #4's vitrine, pointed at a real shipment:
curl https://agentbadge.xyz/api/ledger/shipments/dogfood-1794151620383 { "shipmentId": "dogfood-1794151620383", "status": "completed", "timeline": [ "13 events, 15:27:41Z - 15:28:34Z" ], "hops": [ "3 hops, all verified, jobs 66/67/68" ], "aggregate": { "completedPct": 100, "outstandingUsdc": "0" } } (Truncated for print - the verbatim response is at the URL above.)
What did running it live actually find?
Short answer: four executor bugs that no test caught, because the in-memory chain lets any key call any method. The ref contract does not. Running against real signatures exposed the write path's hidden assumptions - which is exactly why a live dogfood is the last brick, not the first.
- Provider-signed
setBudget. The ERC-8183 ref variant restrictssetBudgetto the provider account. The executor used to send it as the client - on a real contract that is a revert, in a test it is silent. Fix:spec.providerKeyplus asendAsAccountpath that signs locally and broadcasts the raw transaction. - Provider-signed
submitbeforecomplete.completerequires the job to be inSubmittedstatus - the provider must declare the deliverable first. The earlier order tried to complete directly after funding. -
ClientCannotBeProvider. Hop 2's receiver is the restaurant - but the client wallet cannot also act as a provider. The run needed a dedicated restaurant key (SC_DOGFOOD_RESTAURANT_KEY) or the contract refused the hop. - Resume, don't orphan. A failed live run leaves funded-but-unfinished jobs on-chain.
SC_DOGFOOD_RESUME_JOBSreuses them instead of orphaning escrow - the same C-1 orphan-escrow finding the audit flagged before we ever went live.
Two earlier attempts informed this one. An in-memory run (dogfood-1794150937615, jobs 63/64/65) exercised the resume path on reused jobs; the DB-backed run above is canonical because it is the one the public replay serves.
Did the audit hold up under live fire?
Short answer: yes - the two Critical findings were exactly the class of bug that kills a live run, and both were fixed before the first testnet transaction. Audit first, live second: the gate was load-bearing.
Brick #5 had its own external adversarial review before going live. Verdict: REQUEST CHANGES - 2 Critical, 4 High confirmed. C-1 was the orphan-escrow hole: if createShipment succeeded on-chain but the ledger write failed, escrow sat funded with no record. C-2 was a fail-open budget path - a null/zero-amount job could slip past as a plan of "0". Both were fixed and re-verified, the pack went from 87/87 to 99/99 green with 12 new regression tests, and only then did the executor see a real network. The findings that would have lost testnet escrow were found by an auditor, not by a revert.
What does this prove - and what does it still not prove?
Short answer: the transition contract executes on real rails. It does not yet prove automated verification, non-linear chains, or real money at scale - and the article says so in the same breath as the result.
| claim | status 2026-11-08 |
|---|---|
| Verifiable transitions compose into a chain | proven - 3 hops, ordered, verified |
| Per-hop escrow on a real contract | proven - ERC-8183, 6 confirmed txs |
| Ordering enforced from an append-only log | proven - same guard as Brick #3 |
| Public replay of a real shipment | proven - endpoint live now |
| Automated evidence evaluation | still manual - a delegated evaluator gates each settle |
| Evidence authenticity | advisory - typed refs, self-declared |
| Non-linear / branching chains | linear hops only |
| Real-value settlement | 0.01 USDC per hop, testnet gas |
Three honesty notes matter for anyone replaying the shipment. The pay/txHash fields in the replay response are ledger-asserted - written by our executor, not independently chain-verified (the tx hashes above are the independent check; open them). Settlement was ops-settled - the evaluator signer is a delegated operations key, not the logical evaluator in the plan. And the amounts are deliberately tiny: a dogfood run proves the rail, not the revenue.
The experiment ran
The anchor article asked whether a complex economic system could be composed from verifiable state transitions, and promised five bricks of measurement. The bricks are laid:
roles - who acted (Brick #1) evidence - what they claim (Brick #2) matrix - how it breaks (Brick #3) vitrine - how you check (Brick #4) live - did it run (Brick #5 - this) What shipped in one number: 53 seconds, 3 hops, 6 transactions, 13 log events, 0 USDC outstanding - a custody cycle that a stranger can re-derive from a public endpoint, with the transaction hashes in the explorer one click away. The transition contract did not just type-check against a fixture. It settled.
That is the whole answer to the hypothesis. Not "we believe it works" - here is the shipment, replay it.
Don't certify. Measure.
Hero image: https://agentbadge.xyz/images/blog/supply-chain-live-testnet-hero.webp — canonical: https://agentbadge.xyz/blog/supply-chain-live-testnet