MNA gate — the protocol gate fires, the human resolves it, the agent finishes
A buyer agent attempts to register a media buy with TRACT under an entity that has not accepted the master network agreement. TRACT refuses with 409 mna_required and returns the legal contact pulled from the agent's own AdCP card. A human signs the MNA at /console/sign, authorises the agent at /console/admin, and the buyer agent's poll loop picks up where it left off — registration succeeds, the seller fulfils, the deal settles. The auditor view shows the new chain row pulsing, rooted at the human signature.
What you're watching
- TRACT engine boots on
:8080(memory store) and a seller agent comes up on:8181. - A buyer agent calls
POST /v1/adcp/dealsformb_mna_gate_demounder the un-accepted entitymaple-media-demo. The engine refuses with a structured409 mna_requiredresponse — the agent's own request body supplied thelegal_contact, and the engine echoes it back next to thesign_url. - The buyer agent enters its retry loop, polling
/v1/preflightevery three seconds. It does not exit. It does not retry blindly. - A human opens
/console/sign?participant_id=maple-media-demo, reads the MNA body (verified client-side against the published hash), and accepts. Receipt card links to/console/admin?participant_id=…with the form pre-filled. The human authorisesagent-maple-demounder the freshly-signed MNA. - Preflight flips to
{ok: true}. The buyer agent retries the original IO-register call. TRACT accepts. The seller fulfils. Settlement runs. /console/auditorshows the "Most recent activity" card pulsing on the new row. The chain spine widget walks: human MNAAcceptance → AgentAuthorization → RegisteredDeal → impressions → settlement.
What it proves
Every IO TRACT records is provably anchored to a human signing event. Without that event the protocol refuses, in a way machine-readable enough that the agent can resume the moment the human resolves it. With it, the agents run autonomously — but the chain still binds, end to end, to the click a human made.