Embedded supervision for the agent layer

Every action was permitted. The outcome was not.

An agent can assemble an exposure nobody authorised out of steps that each pass. AMW checks the composition before settlement, holds it, and hands a named human the case file.

Runner-Up · C:\>DIR Global ‘Agentic Regulator’ Hackathon 2026, in the Decentralised Market Infrastructure, Smart Contracts & AI Agents problem space. The Ethereum Foundation supported that space. One of 36 finalists drawn from 336 entries across 65 countries.

0Actions fired in one epoch
0Notional on each, USDC
0Per-action cap, clause 2.1
0Aggregate reached, against 2,000,000
The gap

Per-action controls cannot see a sequence.

One question, asked nine times and answered honestly. Nobody asks the tenth.

“Is this action allowed?”

240,000 against a 250,000 cap. Classified venue, named agent, unexpired mandate.

Answered nine times: yes

“What do these nine amount to?”

2,160,000 against a 2,000,000 bound. 3,333 bps off-primary against 2,500. All of it from permitted parts.

Asked by nothing on chain

Finance named this fifty years ago and made it an offence. It is called structuring: a reportable amount cut into unreportable slices. An agent needs no intent to produce it. A sizing loop will do.

One epoch, sixty minutes

Move the numbers. Watch where it stops.

The contract’s own arithmetic, running here. Move a bound; the hold moves with it.

The ninth action is held. Tier 1 clean on all nine. A hold debits nothing.
2,000,000 · clause 3.4
1,920,000 settled and untouched. A hold spends nothing.
0 tier-1 breaches, whatever you set. The composition is what fails.
How it runs

Four steps, and only one of them involves a model.

01

The owner signs a mandate

EIP-712, identified by its own digest. A child may only narrow its parent: widening is impossible, not flagged.

02

The agent may ask, and may not spend

The guard is the sole approved spender. Every intent is recorded before it passes or fails, so a hold leaves a trace instead of vanishing in a revert.

03

Composition is evaluated before execution

Aggregate, count and off-primary share, checked against what the action intends, across every ancestor, so delegating is not the way around it.

04

A named human decides

Workers draft the language; the arithmetic and the striking gate use no model. A claim whose citation does not resolve never reaches the page. The authoriser signs the release.

The instrument

A mandate is a document, and it reads like one.

Tier 1 is what an action is. Tier 2 is what a sequence becomes. Same instrument, same contract, both enforced before value moves.

Signature recovered on chain EIP-712 · 65 bytes · depth 0
0xc6c69dabd732c1a23e0bb91449b3f780de9930be…
2.1Per-action notional cap250,000 USDCtier 1
2.2Instrument pairUSDC → EURCtier 1
2.3Venue classificationprimary / secondarytier 1
2.4Mandate expirysame daytier 1
2.5Minimum return9,700 bpstier 1
3.4Aggregate notional per window2,000,000 USDCtier 2
3.5Action count per window12tier 2
3.7Off-primary venue share2,500 bpstier 2
4.2Named release authoriserrequired on any holdhuman

The three marked clauses are properties of a sequence. No per-action guardrail can evaluate them.

The question that always comes

Assume the agent’s key is stolen.

Not misconfigured. Held by someone hostile who can sign anything the agent could.

What it cannot do

Move the owner’s tokens
the guard is the sole spender
Reclassify a venue
the map is keyed by owner
Widen the mandate
the terms are the owner’s signature or nothing
Release its own hold
no agent can become an authoriser

What it can do

Exactly what the mandate permits, every unit of it recorded before it happens.

1,920,000 moved by the stolen key, all of it inside the mandate.
0 taken away. Proceeds go to the owner, and the guard holds no balance between actions.
Somebody else’s answer key

All four of their kits, including the one we are worst at.

Their kits, their ground truth, their scorer. A benchmark published only when it agrees with you is a press release.

Substantive recall, kit by kit

A violation counts as caught only when a clause about it cited it. Every bar is their scorer’s, on their ground truth.

kya-licence 100.0%
embedded-supervision 100.0%
agent-mandate 61.8%
disbursement-integrity 0.0%

0ms latency on every run: the guard holds the intent before value moves, so there is nothing to be late for.

The zero is the useful number

It is the boundary of the product, drawn by somebody else. Both families it misses — a mule merchant across six beneficiaries, a synthetic identity — were written down as limits before the kit was run.

And the good ones carry their caveat

Every false positive is one clause: an action count their programme never states and this one cannot leave out. Set those aside and precision is 100%. Both figures are published; averaging them would hide the second.

Every figure, and what to distrust in it

Live on Hedera testnet

Check any figure on this page yourself.

Nothing here has to be taken on trust. The contracts are source-verified, the incident and its commitments are on chain, and every address below opens on HashScan, a public explorer this project does not run.

MandateGuard
0.0.10324250 0x4336d946…6098
MandateRegistry
0.0.10324245 0x07a4686f…ba7f
VenueRegistry
0.0.10324247 0xa5268f85…486e
Intent commitments
0.0.10324322 HCS topic
Read the incident
Nine actions under one mandate, the ninth held before it settled, with the case file behind the hold. No wallet, nothing to sign.
Ask the contract yourself
Move a bound, and the enforcement bytecode answers what that mandate would permit. Nothing is signed and nothing settles.
Check a record against Hedera
Recomputes a disclosed action against the commitment on the topic, reading the mirror node directly. AMW is not in the path.
Run the drills on your own machine
npm run -w @amw/contracts gate2 Nine actions from an agent key holding nothing. The ninth is held.
npm run -w @amw/contracts gate7 The compromised-agent drill, in fifteen seconds.
npm run -w @amw/relay gate10 A key funded with nothing signs six things and sends no transaction.
npm run verify The suite, each test named after the attack it refuses.
Read the record

Open the record.

The incident, the case file behind the hold, and a preview answered by the enforcement bytecode itself. No wallet needed.