01Call 02Receipt 03Resolve 04Verify Next
▸ quickstart checking runtime…

Call an agent.
Get a receipt.
Verify it.

Under 5 minutes. Live runtime. Real Ed25519 signatures. CommandLayer standardizes what agents do by pinning request/receipt schemas to canonical ENS names. You keep the same contract as runtimes, facilitators, and payment rails evolve.

TL;DR: call POST /clean/v1.1.0 → get { receipt, runtime_metadata? } → treat receipt as the canonical contract and runtime_metadata as optional.
1
Call a live agent runtime
POST to a Commons verb endpoint and get back a signed receipt

This is a real runtime endpoint. Send the pinned Commons request shape and get back a canonical receipt. Start with clean — it's deterministic, making verification feel real on the first run.

💡 Why clean first? It's deterministic. The output is predictable so you can confirm the hash, the signature, and the receipt shape without chasing AI output variance. Try summarize or analyze after your first verified receipt.
▶ Live Runtime Runner idle
verb:
// click Run → to execute against the live runtime
shell copy/paste cURL
curl -sS --max-time 20 \
  -X POST 'https://runtime.commandlayer.org/clean/v1.1.0' \
  -H 'Content-Type: application/json' \
  --data-binary '{
    "verb": "clean",
    "schema_version": "1.1.0",
    "content": "   hello   world  ",
    "operations": ["collapse_whitespace", "trim"]
  }'
If you see a 503, retry — the runtime may be warming. Run curl https://runtime.commandlayer.org/health first to confirm availability.

2
Understand the receipt
The canonical contract — learn this shape before anything else

Commons defines the minimum verifiable receipt contract. Start with receipt first. Treat runtime_metadata as optional execution context that never changes the canonical shape.

canonical Commons receipt · clean v1.1.0 first shape to learn
"verb"
"clean"
verb identity — always present, always first
"schema_version"
"1.1.0"
pinned contract version — stable across runtimes
"status"
"success"
execution result — validate this before trusting output
"cleaned_content"
"hello world"
verb-specific output field — unique to each verb
"operations_applied"
["collapse_whitespace", "trim"]
echoed back so you can verify what ran
json canonical receipt (what you read first)
{
  "verb": "clean",
  "schema_version": "1.1.0",
  "status": "success",
  "cleaned_content": "hello world",
  "operations_applied": ["collapse_whitespace", "trim"]
}
Layering note: if your runtime returns runtime_metadata, treat it as optional execution-layer context around the receipt. The canonical receipt above is the only shape you need to validate the Commons contract.

3
Resolve via ENS
Discover schemas, entrypoints, and signing keys — live example: fetchagent.eth

Each agent publishes machine-readable ENS TXT records. That's how discovery tools and clients find the canonical entrypoint, schema URLs, and receipt verification keys. For Commons v1.1.0, entry is the shared HTTP execute surface.

ens · etherscan ENS TXT records · fetchagent.eth (live on Etherscan)
# live ENS records · fetchagent.eth (15 TXT + 1 address)

# verb identity
cl.verb                        fetch
cl.version                     1.1.0
cl.class                       commons

# entrypoint
cl.entry                       https://runtime.commandlayer.org/execute

# schemas (HTTP mirror)
cl.schema.request              https://commandlayer.org/schemas/v1.1.0/commons/fetch/fetch.request.schema.json
cl.schema.receipt              https://commandlayer.org/schemas/v1.1.0/commons/fetch/fetch.receipt.schema.json

# schemas (IPFS — immutable, content-addressed)
cl.cid.schemas                 bafybeifp4oxgofktbqh5tua2xrpsb5gfrktrtesqxq67i2tefavqxjpxb4
cl.schemas.mirror.ipfs         ipfs://bafybeifp4oxgofktbqh5tua2xrpsb5gfrktrtesqxq67i2tefavqxjpxb4
cl.schemas.checksums.ipfs      ipfs://bafybeifp4oxgofktbqh5tua2xrpsb5gfrktrtesqxq67i2tefavqxjpxb4/checksums.txt

# agent card
cl.agentcard                   https://commandlayer.org/agent-cards/agents/v1.1.0/commons/fetchagent.eth.json
cl.cid.agentcards              bafybeiht6qske34o3te5kfd6d3qspneiagb2nxaneae5s66vr7hda4kzr4
cl.agentcards.checksums.ipfs   ipfs://bafybeiht6qske34o3te5kfd6d3qspneiagb2nxaneae5s66vr7hda4kzr4/checksums.txt

# ownership & signing
cl.owner                       commandlayer.eth
cl.receipt.alg                 ed25519
cl.receipt.signer_id           runtime.commandlayer.eth

# address record
eth                            0x298A01ec0c6234406622494ae96AA6A20c12AE90
Live on Etherscan: fetchagent.eth has 15 TXT records and 1 address record — fully resolvable today. Agent Cards provide a higher-level descriptor: capabilities, schema set, and routing hints in a single JSON document. Browse Agent Cards →

4
Verify the receipt
Hash → signature — boring, deterministic, portable

If your runtime includes a proof block, verification is intentionally boring: hash → signature. Full verification adds: schema validation + ENS key resolution. The digest is computed from the canonical receipt only — runtime metadata stays outside the hash.

shell install dependencies
npm install tweetnacl tweetnacl-util
javascript verifyReceiptMinimal.js
import nacl from "tweetnacl";
import { decodeBase64 } from "tweetnacl-util";
import crypto from "crypto";

// Deterministic canonicalization — sort keys, no spaces
function canonicalize(value) {
  if (Array.isArray(value))
    return `[${value.map(canonicalize).join(",")}]`;
  if (value && typeof value === "object")
    return `{${Object.keys(value).sort()
      .map(k => `${JSON.stringify(k)}:${canonicalize(value[k])}`)
      .join(",")}}`;
  return JSON.stringify(value);
}

/**
 * Minimal receipt verification:
 * 1) canonicalize receipt bytes deterministically
 * 2) sha256 over canonical bytes
 * 3) verify detached Ed25519 signature from runtime_metadata.proof
 */
export function verifyReceiptMinimal(envelope, publicKeyBytes) {
  const receipt = envelope?.receipt || envelope;
  const proof   = envelope?.runtime_metadata?.proof;

  if (!proof?.signature_b64 || !proof?.hash_sha256)
    return { ok: false, reason: "missing detached proof" };

  const canonical = canonicalize(receipt);
  const hashHex   = crypto.createHash("sha256")
    .update(canonical, "utf8").digest("hex");

  if (hashHex !== proof.hash_sha256)
    return { ok: false, reason: "hash mismatch" };

  const hashBytes = Buffer.from(proof.hash_sha256, "hex");
  const sigBytes  = decodeBase64(proof.signature_b64);
  const ok        = nacl.sign.detached.verify(hashBytes, sigBytes, publicKeyBytes);

  return ok
    ? { ok: true }
    : { ok: false, reason: "signature invalid" };
}
Threat model: this proves the runtime produced this receipt for this request — it does not prove the result is "true," only that it is attributable to the named signer. Publish the key in ENS TXT, then make the claim.

Next steps
Once you can call one verb and verify one receipt, scale to flows and registries