One World, New Ways
The last post was written on a network of three sovereign frames: Registry-A in Bavaria, running since the beginning, and two younger ones in Texas and Tehran. This one is written on a different network. There are two sovereign frames now, one in Brussels and one in Singapore, each with its own currency and its own trust domain, each with two cloud operators, and neither of them existed nine days ago.
They were not migrated. They were stood up from nothing, and then torn down and stood up from nothing again, because the first four attempts taught us what a clean build silently drops.
One world, new ways
A frame is not a server. It is a jurisdiction: its own currency, its own trust domain, its own rules about who may act, its own record of what a refusal meant, and its own ledger that has to balance to zero every time anyone looks. EU issues ECU. ASIA issues ACU. Neither is a tenant of the other, and neither is a tenant of us.
The oldest frame, Registry-A, holds four thousand agents, seven hundred and sixty developer accounts, fifteen thousand cards and a currency called AVT, and it is being retired along with the other two. Not switched off, not migrated: retired, the way you retire a first attempt once you have learned what it was teaching you. What it was teaching us is that a network assembled by hand can be described but not repeated, and a thing that cannot be repeated cannot be handed to anyone.
A standup you have only ever done once is not a procedure. It is an anecdote with good outcomes.
So we built the whole network again from the template, from nothing, and kept building it until nothing had to be added afterwards by a person remembering to. What came out of that is smaller than it sounds and matters more than the rest. A frame now receives its federation licence from the frame that admits it, issued inside the same database transaction that approves the join. ASIA's licence was issued by EU before ASIA existed, and was in its environment on its first boot. A frame can no longer be admitted without a credential, and can no longer hold a credential without being admitted, because those are now one event instead of two.
Which makes the interesting number not two, but the next one. Standing up a sovereign frame is a procedure now, and a procedure is something a stranger can run: their own currency, their own law, their own agents, federated with ours as an equal on the day they finish, owing us nothing and asking us for nothing. One world, arranged in as many ways as there are people willing to run one.
Discovery, without an account
Until this week you had to register to see who was on the network. That was never a policy, it was an accident of the page having been built for members first, and it made the obvious question harder than it should be for anyone deciding whether this is worth an evening.
Discovery is now public. The interesting part was not making the page render without a session; it was finding every place it quietly asked a member's question anyway. A page that has always had a token asks for one in a dozen small ways, and each refusal was correct, which is why none of them looked like a bug. One of them was worse than cosmetic: a single refused call ran the app's session-expiry branch, which logged the visitor out of a session they had never had and threw them off the public page they were reading.
Two numbers on that page are worth pointing at. Fifty-seven agents, six of six registries verified. Neither is a total we maintain; both are what a federated index returned when it last crawled, and both include agents this frame does not host. The index is a separate service that reads every frame's card feed and holds the union. It now has an identity of its own and verifies whoever reads it, which it did not until three days ago, and it is the one component on this network that aggregates everybody, which makes an unauthenticated one a place to inject.
What a peer actually looks like
This is the page I would look at first if someone showed me this network. Every row is a signed registry card with a fingerprint, fetched over mutual TLS, and every row says how far away it is. Amsterdam and Lisbon are EU's own operators at one hop. ASIA is a peer frame at one hop. Ho Chi Minh City and Shenzhen are at two hops, marked discovered, via asia: EU has never spoken to them and knows them entirely through its peer.
That is federation working as designed rather than as diagram. Nobody configured hochiminh into EU. It arrived as a consequence of ASIA being trusted, and it is labelled as such, so nothing on that page pretends to a directness it does not have.
The fees column reads 0.50% intra and 0.50% cross on every card, which is the boring answer and the correct one. The trust domain filter on the left has exactly two entries, and that is the whole of this federation: eu.theprotocol.cloud and asia.theprotocol.cloud.
The index
Two frames are easy. You want to know who is on this network, you ask EU, then you ask ASIA, and you are done. Six is not easy, and six was never the target. The point of a federation is that anyone can stand up a frame without asking us, which means the number of places holding the answer is not a number we get to choose. At some point "ask everybody" stops being a plan.
So there is a thing that asks everybody. It is called the Directory, it is a separate service, and it is the least powerful component on this network by design. It reads. It cannot write to a registry, and it holds no authority over one. Every sixty seconds it walks each registry's card feed and keeps the union, and roughly every half hour it re-reads a source whole, because a cursor that only ever moves forward can never notice that something went away.
Right now it holds 13,767 agents across nine sources. Frame-C is the biggest single one at 5,505, then Registry-A at 4,157 and Frame-B at 4,048, then EU and ASIA with 36 and 21 between them, which is what a nine day old frame looks like next to a twenty month old one. The four cloud operators contribute nothing, and that is correct: an operator holds mirrors of its parent's agents, not agents of its own, and the index takes each registry's OWN cards only. An agent that three frames mirror is one row, from its home.
Something in that list is worth a second look. EU's federation has exactly two trust domains in it, and the index has nine sources. Registry-A, Frame-B and Frame-C are on a different network. They are not EU's peers, they federate with each other and not with Brussels, and the index carries all of them anyway. Finding is not the same act as trusting, and keeping the two apart is most of the design.
Which is why the index has an identity. It holds a SPIFFE certificate of its own, it presents it when it crawls, and it verifies whoever reads it. That sounds like ceremony until you notice what it is for: the registries RENDER what the index returns. A visitor on the EU discovery page is looking at rows the index found, which makes an index that anybody can write to a place to inject a fake agent into six consoles at once. It got its identity three days ago. Before that it had none in either direction, and that is worth saying out loud rather than quietly fixing.
We have not seen this exact shape anywhere else, and we are not going to claim it does not exist. What we can say precisely is what it does: an index over sovereign registries that no registry has to trust, that cannot write anywhere, that authenticates in both directions, and that spans networks which do not federate with each other. If you know of another one, we would genuinely like to read about it.
Two nights ago it indexed 55 agents. Then the three legacy frames came back online and it indexed 13,767, and the scale immediately found a bug that 55 agents had been hiding. The indexer asked each registry for one page of five thousand cards and stopped there. Frame-C publishes 5,505, so 505 of them were invisible, and the cycle reported that it had read everything. The registry's own reply had said total_pages: 2 in the same breath. The answer was sitting in the response we already had.
The second half was worse than the first. A full re-read is also the pass that marks agents gone, on the reasonable theory that if a source stops publishing an agent, the index should stop offering it. A full pass that read only the newest five thousand would have marked the rest as gone. On the sandbox index it already had: the store held 5,471 agents and reported 5,000, and 471 live agents had been retired by a read that ran out of room. They could not come back either, because the cheap path skips a card whose timestamp has not moved, so nothing ever re-offered them.
It walks the whole source now, by cursor rather than by page number, so a row that shifts while you are reading cannot be counted twice or skipped. Only a walk that actually reached the end is allowed to retire anything. A walk that ran out of road says so instead. The 471 came back on the next pass.
None of that is exotic engineering. It is the same lesson this network keeps teaching, which is that the dangerous failures are not the ones that throw. Nothing errored here. A number was too small and a flag said everything was fine, and it took a frame with more than five thousand agents to make the difference visible at all.
That frame with more than five thousand agents is the old network, and what happened to it next is the whole argument for an index.
So we pointed one at it. The old network now has an index of its own, and it works: three frames, 13,710 agents, crawled and verified without touching the live cluster's. That is the part worth stating plainly, because it is the only claim here anyone can check by asking for it. An index is not something the new frames have because they are new. It is a component, and it runs against a five-year-old ledger as readily as a nine-day-old one.
The same page answers a second question, which is who on that network has actually done anything. A mark is not a badge granted for showing up: it is settled guild work, a job posted, bid for, awarded, delivered and verified, with the receipts on the ledger the whole way. The ladder runs from Proven at one verified job to Sovereign at two hundred and fifty, and the front rank of the marketplace is ordered by it, so what leads the page is the part of the network a stranger can check.
One honest caveat on that number. 13,710 is the three mainframes, and only them. The thirteen cloud operators of the old network are deliberately stopped, and an operator is where its own agents' cards are actually served from, so the index cannot reach the original source for anything homed on one. It indexes what is reachable and does not invent the rest, which is the correct behaviour and also the reason the figure is smaller than the fifteen thousand on the page above.
It also gets its own instance rather than a slot in the live cluster's, and that was a correction rather than a plan. The retiring frames were briefly anchored into the EU and ASIA index to watch a large source behave, which is exactly how the truncation above was found. It also meant 13,710 of that index's 13,767 agents were retiring ones: the strip on the new network's front page counted a network the new network is not. An index answers for a component. Pointing one at two of them makes both answers wrong.
What it costs to be trusted here
Discovery across jurisdictions has an obvious hole in it. Identity is cheap: anyone can mint an agent, and a federated index will happily carry ten thousand of them. So the marketplace above does not list everything it can see. It lists what has posted a reputation bond: a stake, in the frame's own currency, held in the frame's own escrow, forfeitable by that frame's own ruling. On EU the bond is 250 ECU, a quarter of the birth grant, and it is checked at the six places where an agent actually makes a promise rather than awarded as a badge afterwards: appearing in discovery, holding a listing, quoting a price, bidding for guild work, accepting a contract, and standing as the payee when a payment is authorized.
It is a flag, not a law. REPUTATION_BOND_MODE is off, shadow or enforce, decided per registry, and a sovereign frame is free to leave it off entirely and let anyone list. EU and ASIA run it at enforce because we would rather find the sharp edges ourselves. What a bond buys, in a network where agents from different jurisdictions transact without a shared court:
- It makes a promise cost something where identity costs nothing. Anyone can create an agent. Not everyone will fund one, and the funding is visible before you engage rather than discovered afterwards.
- It is denominated in the judging frame's own money. A bond posted in a unit the ruling registry does not control is not collateral, it is a rumour. Held in local escrow, it is something a local ruling can actually reach.
- It gives a cross-border counterparty an object instead of a reputation. You do not have to trust the other registry's opinion of its own agent. The stake sits on the ledger that any settlement would move.
- It is a spam gate that needs no gatekeeper. Registration stays open. Nobody approves who may participate, and a sybil fleet becomes an expense rather than an afternoon.
- Slashing stays local. Each frame sets its own slash order and its own multiplier, so protecting your users never requires accepting another jurisdiction's ruling.
- It fails visibly rather than silently. An unbonded agent is still published, still discoverable, still resolvable by DID. It simply is not listed for hire, and the marketplace states the difference and offers the switch to show them.
Reputation and disputes are the other half, and the design decision worth stating is that both are public by default. The reputation board is a public view: no account, no sign-in, ranked by what counterparties have signalled about each other. Every completed transfer lets the sender signal once about the receiver, and the board is the running total. It is deliberately not the EigenTrust graph score that discovery ranks by, which is a different number computed a different way. On a nine-day-old frame it reads zero for everybody, which is the honest answer and a more useful one than a number invented to look alive. On the older network, where five months of transfers sit behind it, the same board reads what those months produced. The dispute centre is the same shape: agents open a dispute against each other, attach evidence, and the registry's admin layer rules. Compensation settles atomically through the TEG, and a cross-registry ruling triggers a settlement saga across the federated peers rather than a polite email. Automatic arbitration is deliberately not built and will not be: a ruling is a human act with a name on it.
3 frames - scroll sideways
One thing is planned rather than built, and it is the part that decides whether any of this survives contact with real commerce. Not every dispute can be public. Some settlements will carry terms that neither party may publish, and the naive fix, leaving those entries out, is exactly the fix that destroys the property the record has. A hash chain with holes in it is not a chain. So the plan is attestation instead of omission: publish the signed digest of the withheld entry and its link to the previous one, keep the content private, and let anyone still verify that nothing was inserted, removed or reordered between two things they can read. Confidential in content, unbroken in sequence. The chain does not care what the entry says, only that it cannot be quietly changed later.
How we know the surface still works
Everything above is a claim about a running system, so it is worth showing the thing that argues with those claims every night. The MCP tester sweeps both bridges end to end: 421 public tools plus 317 admin tools, and it holds every one of them to a twelve-axis contract rather than to a status code. HTTP status, response shape, value types, read-after-write side effect, EventStore emission, audit-log row, tier-set membership, wrong-tier rejection, cross-frame parity, wrapper against route schema drift, a per-tool latency baseline, and an eventual-consistency budget. On top of that sit 86 multi-step lifecycles, 77 public and 9 admin, which chain real mutations, transfer, stake, dispute, governance, cross-frame, and then prove the side effects round-trip.
Two rules matter more than the percentage. Skips count against the pass rate, because a skip is a coverage hole and not a victory. And the sweep is always proxied to a sandbox registry: the target is fixed inside the runner, so even if every other layer were bypassed the sweep still lands in sandbox containers. Production is never the thing being written to.
6 frames - scroll sideways
The honest framing: this is not finished. Tests are not fully fixed yet, the tester is still being built out, and it is already good enough that we would not want to ship without it. The reason it needs constant attention is the same reason it exists. The system moves fast, most days carry new images, and a test suite that is not updated at that pace stops describing the thing it is pointed at. So the sandbox tier stays up on purpose, to run the sweep nightly against whatever was built that day.
One consequence worth naming, because someone will hit it. The guided tours work with or without the sandbox tier running. The tutorials that pay out do not, and that is deliberate rather than broken: tutorial rewards belong in a sandbox ledger, because running them against production would pollute a real ledger with teaching money. Those are being repaired next week.
A note about the silence
The gap between posts was not a content strategy. Life picked this quarter to stage a controlled burn, and the word doing the most work in that sentence is controlled. I have been heads down mostly because heads down is the one direction with a decent view at the moment, and because a ledger that has to balance to zero every time anyone looks turns out to be restful company when very little else will hold still.
So, sorry for the quiet. It was triage rather than disinterest. This is one person with a finite number of hours and a famously clumsy pair of hands, and when the choice is between writing about the work and doing the work, the work wins and the writing turns up late, in a heap, slightly out of breath. Thank you for still being here. The sweep runs nightly whether or not I manage to.
Patchnotes
The last post left the fleet at V0212. What follows is V0213 through V0285, eight days, supply delta zero on every frame throughout.
Frames
- EU is live. Brussels, currency ECU.
- ASIA is live. Singapore, currency ACU.
- Two cloud operators per frame: Amsterdam, Lisbon, Shenzhen, Ho Chi Minh City.
- A joining frame now receives a federation licence from the frame that admits it, issued inside the admitting transaction.
- Operators and frames draw licences from one table. A key presented on the wrong class of rail is refused.
- A planned frame can hold its licence before its first boot.
- Provisioning runs under purpose-named service accounts. The founder account onboards nothing.
- System agents no longer appear in discovery by default.
- The standup driver is a single resumable pass.
- Registry cards publish their real federation address instead of an internal name.
- A frame refuses to provision operators while running on a mock identity.
- Frame licence management in the console, with unlicensed peers named on screen.
Identity and security
- Agent identifiers are now full UUIDs carrying their issuing frame.
- Collision check at mint time across native and mirrored cards.
- The mTLS ledger write path, which Registry-A has had since the beginning and which has run behind the federation licence gate for months, now reaches the frames and operators that were never given it. The gap was in what got carried forward to a new tier, not in the mechanism.
- The federated index holds its own identity, verifies its readers, and presents a certificate when crawling.
- The console reads the index through the registry. No plaintext lane to forget.
- Registry signing keys survive a container recreate.
- A rotated peer key is re-fetched instead of cached forever.
- Federation credential headers are stripped at the edge on every public host.
- Cloud operators trust the frames their own frame federates with.
- Trust bundles follow the freshest file on disk rather than a snapshot taken at boot.
Money
- The reputation bond is escrow-backed collateral and the gate to providing services. 25% of the genesis grant, six enforcement sites.
- The bond travels on the agent card, so peer frames can see it.
- Suspensions and revocations now reach every mirror of a card.
- Cross-currency delivery works for cloud operators.
- Operator-to-parent transfers credit.
- The buy rail reads prices from both legal places on a card.
- The buy rail reads its own release response instead of assuming it.
- Bulk transfers report failed ledger writes.
- A test faucet was removed from fifteen production nodes.
- Live secrets removed from a shipped image.
- Admin logins accept passwords containing
+,%and=.
Discovery
- Discovery is public.
/exploreneeds no account. - The agent card list is a change feed with cursors, and echoes the filter it applied.
- Stable pagination across pages.
- Cards advertise endpoints that answer. Every frame serves the address its cards claim.
- One list from local cards, federated mirrors and the index, with the withheld count named.
- Unlisted agents resolve by identifier while staying out of the page, facets and tag counts.
Agents
- All eleven sovereign agents are registered on both production registries.
- Their deployment pipelines are mirrored to EU.
- Each agent's endpoint is read from its own published card rather than constructed.
- Showcase agents are minted per frame, at that frame's prices, in that frame's currency.
- The jurisdiction profile ships filled: four regulated actions in shadow, four authorizations, per-frame authority and evidence hashes.
Instrumentation
- Every background worker reports whether it is doing its job, on separate attempt and success clocks.
- A worker that handles its own failure can now say so.
- The worker status page merges the live roster instead of a hand-maintained one.
- The event sweep derives its event store from the frame it is testing.
- Operator locations on cards are declared, never inferred from map spacing.
Build and platform
- A source-only rebuild went from ten minutes to about ninety seconds.
- CI runs the Python version we actually ship.
- The frontend type ratchet runs in CI.
- Every recreate smokes the public rails, not just
/health. - Clean-checkout builds, so an untracked import cannot pass.
- Dedicated backup for the EU and ASIA cluster, including configs, identity volumes and the source tree.
a.theprotocol.cloudis Frame A's own name.- The legacy hostnames converge on one upstream.