Cryptographic receipts for every AI decision
Every reasoner execution produces a signed, offline-verifiable W3C Verifiable Credential with SHA-256 hashes of input and output.
Turn every AI call into a tamper-evident record. The agent gets a did:key identity, every reasoner produces a signed Verifiable Credential, and anyone with the issuer's public key can verify it offline.
from agentfield import Agent
app = Agent(
node_id="claims-processor",
enable_did=True, # did:key + Ed25519 keystore
vc_enabled=True, # signed VC per execution
)
@app.reasoner()
async def process_claim(claim: dict) -> dict:
return await app.ai(
system="Assess this insurance claim.",
user=str(claim),
)
# Behind the scenes the control plane writes a VC with:
# - issuer DID (the agent)
# - input_hash (SHA-256 of claim)
# - output_hash (SHA-256 of result)
# - Ed25519 signature
app.run()import { Agent } from '@agentfield/sdk';
const agent = new Agent({
nodeId: 'claims-processor',
didEnabled: true, // did:key + Ed25519 — VCs require DID
});
agent.reasoner('processClaim', async (ctx) => {
return await ctx.ai(
`Assess this insurance claim: ${JSON.stringify(ctx.input.claim)}`,
{ system: 'You are an insurance claim assessor.' },
);
// Behind the scenes the control plane writes a VC with:
// - issuer DID (the agent)
// - input_hash (SHA-256 of claim)
// - output_hash (SHA-256 of result)
// - Ed25519 signature
});
agent.serve();package main
import (
"context"
"fmt"
"log"
"github.com/Agent-Field/agentfield/sdk/go/agent"
"github.com/Agent-Field/agentfield/sdk/go/ai"
)
func main() {
a, err := agent.New(agent.Config{
NodeID: "claims-processor",
Version: "1.0.0",
EnableDID: true, // did:key + Ed25519 keystore
VCEnabled: true, // signed VC per execution
})
if err != nil {
log.Fatal(err)
}
a.RegisterReasoner("process_claim", func(ctx context.Context, input map[string]any) (any, error) {
// The control plane writes a VC with issuer DID, input_hash,
// output_hash (both SHA-256), and an Ed25519 signature.
result, err := a.AI(ctx, fmt.Sprintf("Assess this insurance claim: %v", input["claim"]),
ai.WithSystem("Assess this insurance claim."),
)
if err != nil {
return nil, err
}
return result, nil
})
a.Serve(context.Background())
}Pull the receipt back when you need it — from the API or by clicking Export provenance on any run page:
# Get the signed VC for one execution
curl http://localhost:8080/api/ui/v1/executions/<execution_id>/vc
# Verify offline — no network needed
af vc verify audit.json
The control plane ships a Provenance page where you can drag any exported VC (or VC chain) and verify it offline against the issuer's bundled DID data:
What this gives you
- Every reasoner action is signed by the agent that ran it. Logs can lie; signatures cannot.
- The VC contains hashes of input and output, so you can prove a result without exposing the data.
- Verification works offline with just the issuer's public key.
Next
Replace API keys with agent identity
Sign outbound HTTP requests with the agent's DID. Partners verify the signature against a public key — no shared secrets, no key rotation.
Signed audit chain for any workflow
Every step of a multi-agent workflow becomes a signed Verifiable Credential. Pull the whole chain in topological order with one request.