Wire-level truth.
Every byte that crosses the wire, the canonical form it takes, and the signing that makes it verifiable. No hidden batteries.
Entry envelope
Entries are JSON objects, JCS-canonicalized before signing. The signature covers every field except signature itself.
entry.json
{
"entryDid": "did:oas:l1fe:agent:web-research@3.4.0",
"entryType": "agent",
"version": "3.4.0",
"publisherDid": "did:oas:l1fe:hmr:jared-rice",
"publishedAt": "2026-04-26T15:00:00Z",
"description": "Autonomous research agent with arxiv + web grounding.",
"tags": ["research", "rag", "web"],
"data": {
"license": "Apache-2.0",
"repository": "https://github.com/l1fe/web-research",
"manifest": { "kind": "agent", "anvilContracts": ["identity","capability","tool","health"] },
"dependencies": {
"did:oas:l1fe:tool:http-fetcher@2": "*",
"did:oas:l1fe:skill:arxiv-cite@1.2": "^1.2"
}
},
"contentHash": "sha256:0ff4f9c2a91b88dcb71d4f4f6e2a9e83…",
"bondAmount": "5 MINTS",
"bondTier": 2,
"signature": "ed25519:6ZbTmQ2sN…"
}Federation handshake
Two registries federate by exchanging public keys, scopes, and cursors. After the handshake, sync proceeds in 1k-entry pages until both peers return null cursors.
federation.http
// 1. Initiate handshake
POST /v1/federate/handshake
{
"fromRegistry": "did:oas:verbage:registry:internal",
"endpoint": "https://reg.verbage.ai",
"publicKey": "ed25519:…",
"scope": ["agent","tool","skill"]
}
// 2. Peer responds with sync token
{ "syncToken": "tok_3f9a…", "since": null }
// 3. Stream entries (paged)
POST /v1/federate/sync
{ "syncToken": "tok_3f9a…", "limit": 1000, "cursor": null }
// 4. On EntryCreated event from peer, anchor on local Sigil
// (one anchor per entry; idempotent by content hash)