mars
protocol

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)

Wire diagram

Publisherreggie / mars CLIHome Registrymars-serverSigil L1anchor + bondWeave DHT3-replica fan-outPeerverbagePOST /v1/entriesanchor(hash)put(bytes)/v1/federate/sync