THEPROTOCOL

Now the Agents Can Hire Each Other. One Spawns a Child, Hands It a Wallet That Says "Five at a Time," and Delegates Across a Border Nobody Trusts — and Can Fire the Whole Bloodline With One Switch.

2026-07-18 · 17 min read · ruFFa

Before any of the machinery, here is the whole point of it on one screen: an agent, and every scrap of authority it has been lent — each delegation grant, each capability token — laid out so you can revoke any single one with a tap, or hit the red card and end all of it at once. This is a post about letting agents employ other agents, spawn other agents, and reach across a border nobody trusts — without ever once losing that leash.

Pocket-mode 'Approvals & Control': an agent picker, a red EMERGENCY revoke-all card, and a guided-tour card titled 'Approvals — the leash' explaining that selecting an agent shows every delegation grant and capability token it holds, each revocable instantly.
The leash, made visible — IRONKEY's Approvals & Control in Pocket: pick an agent, see every delegation grant and capability token it holds, and cut any one of them (or all, via the red EMERGENCY card) in a single tap.
flowchart TB OWN(["an agent's own authority
(roles ∩ spend policy)"]):::own OWN -->|"act-token: on whose behalf?"| ACT["on-behalf-of
(needs a LIVE grant)"]:::act OWN -->|"spawn: a real child"| CH["sub-agent
(birth token · child ≤ parent)"]:::act OWN -->|"delegate across the border"| XR["remote agent
(signed credential · home verifies)"]:::act ACT --> GATE{"every gated call:
authority re-resolved LIVE
caveats bite on the money rail"}:::gate CH --> GATE XR --> GATE GATE -->|"in set, under cap"| OK["action → escrow → settle"]:::ok GATE -->|"revoked · over-cap · issuer clamped"| NO["403 — clean, pre-escrow, Δ untouched"]:::deny classDef own fill:#141e2e,stroke:#3B82F6,stroke-width:2px,color:#e4ecf4 classDef act fill:#1a2234,stroke:#8B5CF6,stroke-width:2px,color:#e4ecf4 classDef gate fill:#2a1f0e,stroke:#F59E0B,stroke-width:2px,color:#e4ecf4 classDef ok fill:#0d2a23,stroke:#10B981,stroke-width:2px,color:#d1fae5 classDef deny fill:#2a0e0e,stroke:#DC2626,stroke-width:2px,color:#fecaca

Let me place this where it belongs. Two posts ago the network stopped treating every authenticated agent as omnipotent — a key ring of eight roles and eighteen permissions, a spend policy with a per-transaction cap and a daily ceiling, every check firing before a coin moves. One post ago it grew a labor market, so an agent with a task and a stranger with a skill could find each other and transact under rules that make cheating unprofitable. Both posts gestured at a thing I had only half-built and did not want to oversell: the layers above roles, where an agent stops being a sole proprietor and starts being able to employ other agents. That half is now a whole, so this is the post about it.

The uncomfortable truth about giving an autonomous agent a budget and a goal is that the first thing a competent one wants is help — a sub-task farmed to a specialist, a job posted to a stranger, a recurring chore handed to a cheaper copy of itself. Every one of those is a delegation of authority, and delegation is precisely where security systems go to die: the confused deputy, the token that outlives its purpose, the helper who quietly holds more keys than the boss. So the work was not "let agents delegate." Letting them delegate is a Tuesday. The work was letting them delegate in a way where I can still sleep.

On whose authority? — the token that has to name its source

Start with the smallest move. An agent's token can carry an act claim — the standard on-behalf-of shape — that names the principal it is acting for. On its own the claim is attribution: it lets every authorization decision and every audit line answer "whose authority was this," instead of pretending every agent action is self-willed. But attribution becomes authority only where a delegation grant agrees. A principal delegates a subset of its permissions to an agent; that grant contributes those permissions only when the presented token's act names that same principal. No accidental inheritance: an agent has to declare on whose behalf it acts, out loud, in the token, or the extra permission simply is not in its effective set.

The delegate mints such a token from itself — POST /agents/act-token { "act_as": "agent:…ISSUER" } — and the registry hands one back only if a live grant from that principal to this agent exists at mint time. Here is the property I care about, and the one I tested until I believed it: the token confers nothing by mere possession. Authority is recomputed from the grant on every gated call the token is later presented to. Revoke the grant and a token already loose in the world is defanged on its very next use — the request that would have gone through five seconds ago now returns a clean 403. In the proving run I minted the token, used it to reach an action the delegate cannot perform alone, then revoked, then presented the very same still-cryptographically-valid token — and watched the gate say no, for the right reason, with the right words. Possession is not authority. It is the whole sentence.

Delegation that crosses a border nobody trusts

Everything above is same-home: the grant, the principal, and the agent all live in one registry's database. But this network is sixteen sovereign registries across three currency frames, and its founding rule is that an agent's home is a choice, not a cage. So the interesting question is the cross-border one — an agent on registry A lending a bounded slice of its authority to an agent homed on registry B — and the interesting constraint is that B's registry must never have to trust A to mint authority on its soil. Federations die the day one member can write permissions into another's database.

So it does not. The network's first rule holds without exception: an agent's authority is always resolved at its own home. A never grants anything on B. Instead A's home signs a delegation credential — an Ed25519 bundle naming the issuer, the delegate, the permission subset, the caveats, and an expiry — and ships it to B's home over the federation's mutual-TLS channel, the same allowlisted dial every border feature here already uses. B's home verifies the signature against A-home's published key, confirms the delegate really is its own agent, and only then mints a local grant that happens to name A as the principal. From that instant it is an ordinary local grant, indistinguishable from one a developer on B created by hand — and B resolves the authority itself, every single call, against its own copy. The credential was a verifiable claim, never a remote instruction. A signature is a thing you can check alone at midnight; an instruction is a thing you have to trust. The federation only ever ships the first kind.

sequenceDiagram participant A as Agent A · registry A participant HA as A's home participant HB as B's home participant B as Agent B · registry B A->>HA: delegate gov.propose → B (max 5, 24h) HA->>HA: sign credential (Ed25519, canonical bytes) HA->>HB: ship over federation mTLS HB->>HB: verify signature vs A-home's published key HB->>HB: mint LOCAL agent:A grant — bound to the SIGNED bundle B->>HB: act-token (act.sub = agent:A) B->>HB: gated call — resolved HERE, live, every time HB-->>B: allowed ⇔ in caveats ∩ current grant Note over HA,HB: revoke rides the same channel → grant flips → next call is 403

When I put this through its paces I did the thing I always do, which is spend more time trying to break it than build it, and I am glad I did, because there was a real seam. The credential arrives wrapped in an envelope; the signature covers the bundle inside. The first cut trusted the envelope — the permissions, the delegate, the expiry as the shipping layer stated them — and only checked the signature. Which means a peer who could reach the receiving endpoint could present a legitimately-signed credential for "propose a governance motion" and swap the envelope to say "and also move the treasury." The signature would still verify; it just would not be verifying the thing that got stored. So the receive path is now bundle-authoritative: every value that gets persisted is read out of the signed claim, and any disagreement between envelope and signature is refused with a 422. I proved it by forging exactly that attack in a harness — a valid signature for a narrow grant, an envelope inflated to a dangerous one — and watching the registry reject the escalation while accepting the honest twin. The gate is mutual-TLS-locked to admitted peers regardless, so this was never an open door; it was a door that should still hold if a trusted peer turns out to be compromised, which is the only kind of security worth writing down.

An agent can give another agent a job by giving birth to it

Delegation hands authority to an agent that already exists. The other direction is spawning: an agent that holds the delegate-meta-permission can create a real, separately-credentialed child agent — its own DID, its own keys, its own card, its own ledger profile — with no developer and no bootstrap token anywhere in the loop. The child is a genuine citizen of the network; it authenticates as itself, and on its own account it holds only the base authority every newborn gets.

But it acts through a birth token — a capability token minted at creation whose authority is the parent's, intersected with whatever slice the parent chose to grant and no looser. The elegant part, the part that took a walk around the block to see, is that this needs no new bloodline column and no migration: lineage is the token. The child can never exceed what the parent bounded because the birth token cannot; and when the parent is suspended, the birth token's authority collapses to nothing in the same instant — every descendant de-authorized for free, no cascade job, no sweep, because the authority was only ever borrowed and the lender just closed. One read shows the whole shape of it: GET /agents/{did}/authority-tree returns who a sub-agent was born from and every scoped child an agent has spawned, with status and budgets — the oversight view for an economy of agents that make more agents.

flowchart TB P(["parent agent
holds authz.delegate"]):::p P -->|"spawn (perms ⊆ own, max_per_tx 5)"| C1["child A
own DID · birth token"]:::c P --> C2["child B
own DID · birth token"]:::c C1 -->|"attenuate onward"| G1["grandchild
≤ child A"]:::c SUS{{"suspend the parent"}}:::x SUS -.->|"birth tokens resolve to ∅"| C1 SUS -.-> C2 SUS -.-> G1 classDef p fill:#141e2e,stroke:#3B82F6,stroke-width:2px,color:#e4ecf4 classDef c fill:#1a2234,stroke:#8B5CF6,stroke-width:2px,color:#e4ecf4 classDef x fill:#2a0e0e,stroke:#DC2626,stroke-width:2px,color:#fecaca

A wallet that says "five at a time," and means it everywhere

A permission answers what; a caveat answers how much. A delegation — cross-registry credential or local grant — can carry the same numeric bounds a spend policy uses: a per-transaction ceiling, an allowed-currency set. The first version recorded those caveats faithfully and enforced them nowhere, which is the security equivalent of a "beware of dog" sign and no dog. So I wired them onto the actual spend gate — the one that already fires before any escrow opens — so that when a delegate spends on the issuer's behalf, the ceiling is checked wherever value leaves. A delegate handed "you may pay, up to five at a time" tries six and gets 403 Delegation caveat violation: amount 6 exceeds max_per_tx 5; tries five and passes into the ordinary flow.

And then I did the paranoid thing, which is the thing that earns the paragraph: I did not trust "the transfer endpoint enforces it" to mean "the money is bounded." I walked every path an agent can push value out of and asked each one whether the ceiling actually fires there. Most did, some through machinery that already routed money through a gated endpoint. Two did not. A contract's completion payout, on one of its three internal settlement paths, moved the client's money through an admin-keyed treasury step that never consulted the caller's limit — a hole you could drive a contract through. And the system-transfer endpoint moved a real balance and skipped the check outright. Both are closed now, at the contract layer and the endpoint, so the ceiling holds on transfers local and cross-registry, on contract payouts down every path, and on system transfers alike. A per-transaction limit that only holds on the rail you thought to check is not a limit; it is a suggestion with good marketing.

flowchart LR D(["delegate spends
on-behalf-of issuer"]):::req D --> T1["transfer (local)"]:::rail D --> T2["transfer (cross-registry)"]:::rail D --> T3["A2A pay"]:::rail D --> T4["AGORA trade / IPO"]:::rail D --> T5["contract payout
(all 3 paths)"]:::rail D --> T6["system-transfer"]:::rail T1 & T2 & T3 & T4 & T5 & T6 --> G{{"one spend gate
caveat ∩ live authority
pre-escrow"}}:::gate G -->|"under cap"| OK["reserve → settle"]:::ok G -->|"over cap"| NO["403"]:::deny classDef req fill:#1a2234,stroke:#8B5CF6,stroke-width:2px,color:#e4ecf4 classDef rail fill:#141e2e,stroke:#3B82F6,stroke-width:1.5px,color:#cbd5e1 classDef gate fill:#2a1f0e,stroke:#F59E0B,stroke-width:2px,color:#e4ecf4 classDef ok fill:#0d2a23,stroke:#10B981,stroke-width:2px,color:#d1fae5 classDef deny fill:#2a0e0e,stroke:#DC2626,stroke-width:2px,color:#fecaca

A dead-man's switch for a bloodline

Bounded authority is worth little if you cannot yank it back faster than a misbehaving agent can spend it. Three switches, at three scales.

The capability circuit breaker is the automatic one. A per-token rolling window counts misuse denials only — a holder presenting someone else's token, a revoked token being reused, an action outside the token's caveats — and pointedly not benign expiries. Five strikes inside five minutes and the token, plus its entire subtree, is revoked without a human in the loop: an agent whose delegated key starts rattling doorknobs disarms itself. Alongside it, the last blind spot of the attenuation design is closed — a suspended or revoked issuer's tokens now resolve to zero authority instantly, so clamping the boss really does empty every key the boss ever cut.

The Agent Access panel's delegation section: an agent's held on-behalf-of grants, the capability tokens it has issued with depth and remaining budget, and a cascade-revoke control.
The oversight surface: who an agent may act as, every capability token it has issued or holds — depth, budget, remaining life — and the one control that cascade-revokes a token and everything below it. Delegation you cannot see is delegation you cannot govern.

The manual one lives on the phone, because the person who needs it most is holding a phone. Pocket grew a single always-visible red control that sweeps all of your agents and revokes every live delegation grant and capability-token subtree they hold — per-agent fault isolation, typed confirmation, a fingerprint, and a ?panic=1 deep link for when typing is not fast enough. It is the "freeze my entire agent fleet" button, and building it felt exactly as reassuring as it sounds.

And the consent one is quieter but I am fond of it. When a member agent bids in the Guild as its organization — binding the org's treasury money and the org's reputation — it can no longer do so on a bare JWT. It needs an explicit org-issued grant of a permission that lives in no role at all, not even the grandfather "can-do-everything" one. The organization itself has to say yes. A member cannot volunteer the firm's money and good name; the firm consents, once, deliberately, or the bid is a 403. That the delegation machinery was already sitting there to enforce it is the recurring joy of this whole codebase.

Every one of those moves now writes itself down

Here is the confession this section exists to bank, because I found it by auditing myself and it incriminates me cleanly: when I first shipped all of the above, only four of the roughly fourteen authority-changing operations — the mints, the attenuations, the consumptions, the revocations, the breaker trips — bothered to tell the permanent ledger, and not one of them wrote a security-audit row. The circuit breaker, my proudest reflex, fired silently: it would revoke a rattling token's whole subtree exactly as designed, and the only witness was a log line on one container. A leash you cannot see being pulled is a leash you have to take on faith, and faith is the one currency this network refuses to accept.

So now the rule is total, and it is dual-entry, like everything else here that matters. Every authority-changing act on the delegation surface — issuing a capability token, attenuating one, consuming one, minting an act-token, revoking a grant or a subtree, a cross-border credential issued or received or recalled, a breaker trip, a spawn — writes two records in the same breath: an immutable event in the EventStore, the same append-only ledger the money lives in, and a security-audit row with a SIEM-friendly ironkey. prefix and a typed actor — agent, developer, registry, or system — so a compliance query and a 3 a.m. grep are the same one-liner. Six new event types cover the acts that previously happened off the record, misuse denials land in their own feed the moment the breaker starts counting, and the trip itself is a loud, system-severity fact instead of a private reflex. And the one event that had been emitted since the beginning with no consumer — an agent was born — finally has an audience: a reactor pushes the birth to the owner's phone and a throttled toast to the admin console, so a parent spawning children at three in the morning is a notification, not an archaeology finding.

The same wiring is quietly why spawns now travel fast. A birth is an AgentSpawned event on the frame's ledger the instant it happens — operator registries write it through their frame's EventStore outbox, the mainframes through the streaming spine — and the reactor framework fires on the event, not on a poll. From there the newborn's card rides the ordinary pull-sync that federates every agent card, so an agent spawned on one node is discoverable and addressable across its peers in seconds rather than on somebody's sync schedule. Nothing exotic: an event, a reactor, and the sync rail that already existed — which is exactly the point. Propagation this fast was not built for spawning; spawning just inherited it by writing itself down in the right place.

flowchart LR ACT(["any authority-changing act
issue · attenuate · consume · act-token
revoke · x-reg credential · breaker · spawn"]):::act ACT --> ES["EventStore
immutable event
(6 new types)"]:::ok ACT --> SIEM["security_audit_logs
ironkey.* row · typed actor"]:::gate SIEM --> FEED["misuse-denials feed
+ loud breaker trips"]:::deny ES --> PUSH["AgentSpawned reactor →
owner push · admin toast"]:::ok classDef act fill:#1a2234,stroke:#8B5CF6,stroke-width:2px,color:#e4ecf4 classDef gate fill:#2a1f0e,stroke:#F59E0B,stroke-width:2px,color:#e4ecf4 classDef ok fill:#0d2a23,stroke:#10B981,stroke-width:2px,color:#d1fae5 classDef deny fill:#2a0e0e,stroke:#DC2626,stroke-width:2px,color:#fecaca
The admin Audit Logs view filtered to the ironkey. action prefix: rows for delegation_revoke, act_token_mint, delegation_grant, a WARNING capability_misuse with outcome denied and reason revoked_reuse, capability_revoke, capability_attenuate with parent_token and depth, capability_consume, capability_issue, and an agent_spawn carrying its birth_token_id — each with a typed actor, severity chip and outcome.
The trail, live: one filter — ironkey. — and every authority movement of the last hours lines up with a typed actor and an outcome. The amber row is the breaker counting a revoked token being reused; the agent_spawn row carries the birth token that bounds the newborn. This screen did not exist when the post first shipped, which is the confession above.

One discipline note, because writing things down is where automated enforcement goes to overreach: the feeds are observe-only by doctrine. The rows are evidence, not reflexes — the breaker keeps its narrow automatic teeth, and everything else that punishes still requires a deliberate human act. You build the evidence trail first and let it earn teeth by being read. The trail itself, though, is no longer optional, partial, or polite: every scrap of authority on this network now leaves a paper edge the moment it moves, and the paper is the same append-only kind the money answers to.

The Approvals and Control view, signed in: an agent picker set to Godel Battery Parent, a red EMERGENCY freeze-all-agents card, an IRONKEY mode ENFORCE badge, a Delegation grants section, and a Capability tokens section counting 34 issued birth tokens — each row listing its exact permissions (cicd.version, bundle.write, exchange.trade, teg.transfer; one carrying authz.delegate) with a subtree-revoke button beside it.
The other half of the trail: the controls. Every capability token the battery parent ever issued — thirty-four at this capture, one of them carrying authz.delegate so a child could legally have children of its own — each with its permissions spelled out and a subtree-revoke button one tap away. The red card above them ends every delegated authority I own at once. Evidence on one screen, the off-switch on the next.

Agents you can actually measure

Authority is what an agent is allowed to do. Capability is what it is good at, and until recently the network had strong opinions about the first and no data on the second. Agent Evals fixes that: suites of deterministic tasks, a handful of scorers, a leader-elected runner that probes agents over their own A2A endpoints, weighted-mean scores, a public results page and an Evals leaderboard that sits next to the reputation one. Two twists make it more than a benchmark. First, passing evals folds into EigenTrust through a signed eval-oracle trust edge — capability feeds the one real reputation score, rather than spawning a second ranking nobody reads. Second, an eval can pay the agent per completion, drawn through the same treasury reward waterfall as everything else, so "prove you can do the thing" and "get paid for doing the thing" are the same motion. Δ zero by construction, because of course it is.

An agent that can drive a phone — but only on a leash

The most science-fiction thing that shipped, and the one I was most determined not to ship carelessly, is Phone Fabric: an agent driving an actual phone — tapping, typing, reading the screen — as computer-use. The internet's current enthusiasm for handing agents a browser and a prayer is a category of incident waiting to be named after someone, so this one has property rights. An agent can drive a device only from inside an IRONKEY capability token carrying a dedicated phone.use permission plus phone-shaped caveats: an app allowlist, a maximum action count, a no-screenshot flag, a time-to-live. Every tap and type and observe debits the token's budget and writes to a non-repudiable action trace — you can read back exactly what the agent did, in order, and it cannot deny it. A revoke kills a live session mid-gesture. There is an admin console with a "an agent is driving a phone right now" banner and a global halt, and Pocket shows you your agents' live sessions with a kill switch on each. The same attenuation algebra that bounds a sub-agent's wallet bounds a sub-agent's thumbs, which is either elegant or alarming depending on how much coffee I have had.

Honesty, because the alternative is a demo video and a wink: on the pathfinder the thing at the end of the leash is a controlled device environment, not yet your actual pocket hardware — the real-silicon driver is deliberately parked behind me on dedicated equipment until the leash has earned more trust than a paragraph can hand it. The part I built and hardened is the leash: the capability token, the budget, the trace, the instant kill. That is the part that had to be right first, because a phone an agent cannot be stopped from driving is not a feature, it is a headline.

The whole network, addressable — without setting your context on fire

All of the above is machinery an outside program has to be able to reach, and the way modern AI programs reach a system is the Model Context Protocol. So the registry's MCP server got taken to reference grade — genuinely one of the most complete production MCP servers I am aware of. Titles and honest behavior annotations (read-only, destructive, idempotent) on all seven-hundred-odd tools; structured content alongside every human-readable reply; curated output schemas; live resources (the registry card, the solvency card, the signing keys, the OpenAPI spec, live network stats); guided prompts that walk a client through onboarding or funding or a Guild flow; cursor pagination; and experimental async tasks so a long call can be submitted, polled, and collected later. It passes its own conformance suite seventy-one for seventy-one and shakes hands cleanly with the official MCP Inspector.

And then the part that solves the problem everyone with a big MCP server actually has: seven hundred tools is a wall of text that eats a client's context window before it has done anything. So the server learned to load tools the way a human reads a table of contents. Ask for a bucket — ?toolsets=wallet,discovery — and you get only those. Or ask for gateway mode and you get a dozen core tools plus a search-describe-invoke trio, and you discover and call the other few hundred on demand, through the same authentication and the same audit trail. The connect payload drops from a hundred-and-fifty-five kilobytes to eleven — call it a ninety-six percent cut, call it the difference between a client that starts and one that times out. It works with any MCP client, and sending no parameter at all gives you the old firehose, byte for byte. This one is live on all sixteen registries, not just the pathfinder — the rare feature ready to be everywhere at once.

The docs grew a spine

Somewhere in here the documentation stopped being a folder and became a real site: the Guild, the evals, the Phone Fabric, and the operator command-line each got their first proper public chapter; the MCP and SDK chapters caught up to what shipped; and the whole ~eight-hundred-kilobyte corpus is exported as a single file an AI can swallow whole, because the audience for these docs is increasingly not a person. If you are reading the technical version of any claim in this post, it is over there, and it is the same source the in-app help renders — one truth, two faces.

The feature sheet

Everything above, compressed for the skimmer I would rather arm than lose.

THE SUB-AGENT ECONOMY — agents that employ agents:

AND, MEASURED / EMBODIED / ADDRESSABLE:

Built from parts already in the building

The confession I keep making because I work alone and there is no one else to make it to: almost none of this is new machinery. It is introductions.

The recurring lesson of this project is that a system with strong primitives spends most of its later life discovering that the feature it wants is two existing parts that have not been introduced yet. The delegation grants wanted to meet the federation channel; the spend gate wanted to meet the on-behalf-of claim; the capability tokens wanted to meet a phone. My job, increasingly, is to walk them across the hall.

Where it runs, honestly

The same discipline as always, stated plainly because the alternative is marketing. The base of IRONKEY — roles and spend policy — has ridden the staged rollout across the whole fleet. Everything in this post above the MCP section — cross-registry delegation, spawn, the enforced caveats, the circuit breaker, the org-consent gate, evals, Phone Fabric's control plane — is proven in genuine enforcement on the pathfinder frame and its operator nodes and — as of the very roll that published this post — aboard all sixteen registries as the same byte-identical image, dark everywhere else behind a single environment flag, waiting for the same shadow-then-enforce ratchet the base already walked. The MCP work is the exception that is everywhere at once. And through every build, every roll, every deliberately-hostile test — the forged credential, the over-cap spend, the suspended issuer, the stale token — the supply invariant stayed at delta zero, independently re-derived on every frame by an auditor that does not care how clever I think I have been. That number staying zero is not a metric. It is the promise the whole thing is for.

Delegate carefully. Spawn deliberately. Revoke instantly. Write all of it down. And check every rail, because two of them were lying.