Tutorial: End-to-End Trace
This tutorial traces one complete tool call through the full DRS lifecycle — from the human granting authority to the auditor reading the evidence. It covers every actor and every component.
The scenario
- Amara (End User): grants a research agent permission to use
web_search, spend up to £50 - Research Agent: delegates to a sub-agent with tighter constraints (£5,
web_searchonly) - Sub-Agent: calls
web_searchon the tool server - Tool Server: runs
verify_chainbefore executing - Auditor: reconstructs the chain afterwards
Step 1: Amara grants authority
Amara sees a consent UI on the developer's application:
Research Agent wants permission to:
✓ Search the web
✗ Cannot access personal data
✗ Cannot spend more than £50.00
This permission lasts 30 days. [Allow] [Deny]
Amara clicks Allow. The SDK issues the root DR:
Root DR JWT payload (keys sorted by JCS):
{
"aud": "did:key:z6MkAgent1...",
"cmd": "/mcp/tools/call",
"drs_consent": {
"locale": "en-GB",
"method": "explicit-ui-click",
"policy_hash": "sha256:a1b2c3...", ← SHA-256 of the text Amara saw
"session_id": "sess:abc-123",
"timestamp": "2026-03-28T10:30:00Z"
},
"drs_root_type": "human",
"drs_type": "delegation-receipt",
"drs_v": "4.0",
"exp": 1748437800,
"iat": 1743000000,
"iss": "did:key:z6MkAmara...",
"jti": "dr:8f3a2b1c-4d5e-4abc-8b9c-0d1e2f3a4b5c",
"nbf": 1743000000,
"policy": { "allowed_tools": ["web_search"], "max_cost_usd": 50 },
"prev_dr_hash": null,
"sub": "did:key:z6MkAmara..."
}
The JWT is signed with Amara's Ed25519 private key.
Step 2: Research Agent evaluates and sub-delegates
Before acting, the Research Agent evaluates the proposed web_search call against its current policy:
web_search∈allowed_tools✓estimated_cost: 0.02≤max_cost_usd: 50✓
The Research Agent decides to delegate to the Sub-Agent with tighter constraints (POLA):
Sub-DR JWT payload:
{
"aud": "did:key:z6MkAgent2...",
"cmd": "/mcp/tools/call",
"drs_type": "delegation-receipt",
"drs_v": "4.0",
"exp": 1743003600, ← 1 hour (shorter than Amara's 30 days)
"iat": 1743000010,
"iss": "did:key:z6MkAgent1...",
"jti": "dr:1a2b3c4d-5e6f-4xyz-9abc-def012345678",
"nbf": 1743000000,
"policy": { "allowed_tools": ["web_search"], "max_cost_usd": 5 },
"prev_dr_hash": "sha256:abc123...", ← SHA-256 of rootDR JWT bytes
"sub": "did:key:z6MkAmara..." ← unchanged
}
Step 3: Sub-Agent creates the invocation receipt
The Sub-Agent records the actual tool call:
Invocation Receipt JWT payload:
{
"args": {
"estimated_cost_usd": 0.02,
"query": "Monad TPS benchmarks",
"tool": "web_search"
},
"cmd": "/mcp/tools/call",
"dr_chain": [
"sha256:abc123...", ← SHA-256 of rootDR
"sha256:def456..." ← SHA-256 of subDR
],
"drs_type": "invocation-receipt",
"drs_v": "4.0",
"iat": 1743000300,
"iss": "did:key:z6MkAgent2...",
"jti": "inv:7h5c4d3e-2a3b-4c5d-6e7f-8a9b0c1d2e3f",
"sub": "did:key:z6MkAmara...",
"tool_server": "did:key:z6MkToolServer..."
}
Step 4: Tool server receives and verifies
The Sub-Agent sends:
POST /mcp/tools/call HTTP/1.1
Authorization: Bearer <oauth-token>
X-DRS-Bundle: eyJidW5kbGVfdmVyc2lvbiI6IjQuMCIsImludm9jYXRpb24i...
Content-Type: application/json
{"tool": "web_search", "query": "Monad TPS benchmarks"}
The MCP middleware runs verify_chain:
Block A: receipts=[rootDR, subDR], invocation present → PASS ✓
Block B: rootDR.aud == subDR.iss (z6MkAgent1) → PASS ✓
subDR.prev_dr_hash == sha256(rootDR) → PASS ✓
inv.dr_chain matches [sha256(rootDR), sha256(subDR)] → PASS ✓
Block C: Ed25519 verify rootDR (Amara's key) → PASS ✓
Ed25519 verify subDR (Agent1's key) → PASS ✓
Ed25519 verify invocation (Agent2's key) → PASS ✓
Block D: web_search ∈ allowed_tools at both DR levels → PASS ✓
0.02 ≤ 5 (subDR) ≤ 50 (rootDR) → PASS ✓
subDR policy ⊆ rootDR policy (attenuation check) → PASS ✓
Block E: now=1743000300 ∈ [1743000000, 1743003600] (subDR window) → PASS ✓
now=1743000300 ∈ [1743000000, 1748437800] (rootDR window) → PASS ✓
Block F: rootDR jti "dr:8f3a..." not in status list → PASS ✓
subDR jti "dr:1a2b..." not in status list → PASS ✓
RESULT: VALID — executing tool call
Step 5: Tool executes and emits event
The tool server runs web_search and emits:
{
"event": "drs:tool-call",
"root_principal": "did:key:z6MkAmara...",
"chain_depth": 2,
"command": "/mcp/tools/call",
"tool": "web_search",
"policy_result": "pass",
"cost_usd": 0.02,
"inv_jti": "inv:7h5c4d3e-..."
}
Amara's activity feed updates: "Research agent used web_search — £0.02 of £50.00 budget used."
Step 6: Auditor reconstructs the chain (later)
Three months later, a compliance officer wants evidence:
pnpm exec drs audit retrieve --inv-jti "inv:7h5c4d3e-..." --output evidence.json
pnpm exec drs verify evidence.json
pnpm exec drs audit evidence.json
Output:
DRS Chain Audit
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Receipt 0 (root — human)
Issued by: did:key:z6MkAmara...
Granted to: did:key:z6MkAgent1...
Policy: max_cost_usd=50, allowed_tools=[web_search]
Valid: 2026-03-28 → 2026-05-28
Consent: explicit-ui-click at 2026-03-28T10:30:00Z (en-GB)
Receipt 1 (sub-delegation)
Issued by: did:key:z6MkAgent1...
Granted to: did:key:z6MkAgent2...
Policy: max_cost_usd=5, allowed_tools=[web_search]
Chain hash: sha256:def456... ✓
Invocation
Called by: did:key:z6MkAgent2...
Tool: web_search("Monad TPS benchmarks")
Cost: $0.02 of $5.00 (sub-delegation limit)
Chain hash: sha256:ghi789... ✓
All 3 signatures valid. Chain intact. No revocations.
The compliance officer does not need to contact the operator. The evidence is in the receipts.