Don't give your agent a wallet. Give it a mandate.
SBO3L is the cryptographically verifiable trust layer for autonomous AI agents. Every action your agent takes — pay, swap, store, compute, coordinate — passes through SBO3L's policy boundary first. Output: a self-contained Passport capsule anyone can verify offline.
Three ways to interact
sbo3l-server. Real Ed25519-signed capsules, audit chain anchored to Sepolia. Live sponsor integrations
Each track has a working production-shape integration with signed receipts. Click through for the per-track submission narrative + live URLs.
What SBO3L is
A Rust workspace implementing a local
policy + budget + receipt + audit firewall for AI
agents. Every POST /v1/payment-requests goes through:
- Schema validation (
serde(deny_unknown_fields)) - JCS-canonical request hashing
- APRP nonce-replay gate (HTTP 409 on reuse)
- Deterministic policy decision
- Multi-scope budget commit
- Hash-chained audit append
- Ed25519-signed PolicyReceipt back to agent
Allow → routes to sponsor executor (KeeperHub, Uniswap). Deny → executor never called. Every decision can be wrapped in a Passport capsule that anyone can verify offline against the agent's published Ed25519 pubkey alone.
What SBO3L blocks
Every input below is rejected fail-closed by the daemon, with the exact error code SBO3L returns:
- Empty body →
HTTP 400+schema.missing_field - Unknown field →
HTTP 400+schema.unknown_field - Reused APRP nonce →
HTTP 409+protocol.nonce_replay - Prompt-injection request →
HTTP 200 + decision=deny+policy.deny_unknown_provider - Oversized payload (~100 KB) →
HTTP 400+rejected before pipeline - Same Idempotency-Key, different body →
HTTP 409+protocol.idempotency_conflict - Audit-chain byte-flip →
rc=1+strict-hash verifier rejects - Capsule with mismatched request_hash →
rc=2+capsule.request_hash_mismatch - Capsule claiming live mode without evidence →
rc=2+capsule.live_mode_empty_evidence - Capsule claiming deny but carrying execution_ref →
rc=2+capsule.deny_with_execution_ref - 9 tampered passport fixtures →
rc=2+all reject byte-exactly
Live integration evidence (2026-04-30)
Real outputs from running the corresponding live smoke against real infrastructure during the submission window. Independently re-verifiable by anyone with public RPC access.
ENS mainnet — sbo3lagent.eth
agent_id: research-agent-01
endpoint: http://127.0.0.1:8730/v1
policy_hash: e044f13c5acb792dd3109f1be3a98536168b0990e25595b3cedc131d02e666cf ← matches offline fixture exactly
audit_root: 0x0000000000000000000000000000000000000000000000000000000000000000 ← canonical genesis
proof_uri: https://b2jk-industry.github.io/SBO3L-ethglobal-openagents-2026/capsule.json Uniswap Sepolia QuoterV2 — 0xEd1f6473345F45b75F8179591dd5bA1888cf2FB3
quote_source: uniswap-v3-quoter-sepolia-0xed1f6473345f45b75f8179591dd5ba1888cf2fb3
route_tokens: [WETH 0xfff9…, USDC 0x1c7D4B19…]
quote_timestamp_unix: 1777572056
sqrt_price_x96_after: 863470429016487749123863152837655
quote_freshness_seconds: 30 KeeperHub workflow — m4t4cnpmhv8qquce3bv3c
sponsor: keeperhub
mock: false
execution_ref: kh-172o77rxov7mhwvpssc3x ← KH-issued executionId, not a ULID Architecture
The agent never holds a key. SBO3L decides, signs, audits, and routes — in that order. Deny blocks every downstream sponsor call.
Reproduce yourself
Every claim above is reproducible from a fresh clone. Public RPCs work — no API keys required for read paths.
git clone https://github.com/B2JK-Industry/SBO3L-ethglobal-openagents-2026
cd SBO3L-ethglobal-openagents-2026
# Full vertical demo (13 gates, ~10 seconds)
bash demo-scripts/run-openagents-final.sh
# Production-shaped runner (26 real / 0 mock / 1 skipped)
bash demo-scripts/run-production-shaped-mock.sh
# Live ENS smoke (mainnet)
SBO3L_ENS_RPC_URL=https://ethereum-rpc.publicnode.com \
cargo run -p sbo3l-identity --example ens_live_smoke
# Live Uniswap Sepolia smoke
SBO3L_UNISWAP_RPC_URL=https://ethereum-sepolia-rpc.publicnode.com \
SBO3L_UNISWAP_TOKEN_OUT=0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238 \
cargo run -p sbo3l-execution --example uniswap_live_smoke