Interactive walkthrough · 5-min read

From intent to verifiable capsule, in 8 steps

Scroll to walk through the full SBO3L pipeline — every step shows the code that runs at that point. By the end, you'll know what ends up in a Passport capsule and why every byte is necessary.

{
  "schema_version": 1,
  "agent_id": "research-01",
  "intent": {
    "kind": "erc20.transfer",
    "to": "0xabc...",
    "token": "USDC",
    "amount": 50000
  },
  "nonce": "01HZRG-7e8dC1...",
  "timestamp_ms": 1714565000000
}

APRP — Agent Policy Request Protocol

request_hash = sha256(jcs(aprp_envelope))
                = 0xe044f1a7b9c2d385f602e1...

Same hash on every implementation — Rust, TypeScript, Python.

if nonce_seen(envelope.nonce) {
  return Decision::deny("protocol.nonce_replay");
}
nonce_store.commit(envelope.nonce, request_hash)?;
[[intents]]
kind = "erc20.transfer"
where.to = { allowlist = ["acme-treasury", "payroll"] }
where.token = { allowlist = ["USDC", "USDT", "DAI"] }
where.amount = { lte_per_24h = 50000 }
require = [{ human_2fa = true, when = { amount = { gt = 10000 } } }]

Policy override surface — inherits sbo3l.root@1

let mut tx = budget_store.begin()?;
let day = tx.spent_today(intent.token)?;
if day + intent.amount > policy.lte_per_24h {
  return Decision::deny("policy.budget_exceeded");
}
tx.commit_spend(intent.token, intent.amount)?;
let prev = audit_store.tip()?;
let event_canonical = jcs(audit_event)?;
let hash = sha256_concat(prev.hash, event_canonical);
audit_store.append(audit_event, hash)?;
{
  "schema": "sbo3l.passport_capsule.v1",
  "receipt": {
    "request_hash": "0xe044f1...",
    "outcome": "deny",
    "deny_code": "policy.budget_exceeded",
    "policy_hash": "0x9bc7de...",
    "audit_event_id": "01HZRG-D3F4...",
    "signature": "ed25519:5f8A2B..."
  },
  "evidence": { ... },
  "verifier_pubkey": "ed25519:5f8A2B..."
}

capsule.json — drop into /proof to verify

import { verifyCapsule } from "@sbo3l/wasm-verifier";

const ok = verifyCapsule(JSON.parse(capsuleJson));
//  → ✓ APRP signature
//  → ✓ Policy hash matches signed_policy_store
//  → ✓ Decision deterministic-replay matches
//  → ✓ Audit chain link valid (prev_hash, sha256)
//  → ✓ Public key is the registered ENS verifier
//  → ✓ Strict-mode (no missing fields, no unknown fields)

Bonus · Step 9 in practice

Pin the capsule to 0G Storage

Capsules are self-contained but a 30 KB JSON blob is awkward to share. 0G Storage gives you a 32-byte content-addressed rootHash you can paste into a tweet, a Discord message, or an audit trail. Drop the capsule below and we'll push it through the 0G testnet (or fall back to the manual upload tool if the testnet's having a moment, which it often is).

Upload a Passport capsule to 0G Storage

Drop a capsule JSON below. We'll attempt to push it to 0G's Galileo testnet and return a content-addressed rootHash. If the testnet's flaky (it has been all week), we fall back to the manual web tool — same outcome, two extra clicks.

Drag a capsule JSON here Tap to pick a capsule JSON or click to pick a file (max 1 MB) max 1 MB
idle