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. Forty-eight 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.
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.
- Every ledger sits behind an mTLS gateway. Registries no longer write to their own event store over plain HTTP.
- 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.
Next posts take the reputation bond and the licence rail one at a time, with the walkthroughs.