Skip to main content
Version: v0.11.2

A2A (Agent-to-Agent)

The @peac/mappings-a2a package carries verifiable evidence through Google's Agent-to-Agent (A2A) protocol. It uses the Evidence Carrier Contract to attach receipt references and JWS signatures to TaskStatus, Message, and Artifact objects.


Install

Terminal
pnpm add @peac/mappings-a2a

Quick start

a2a-evidence.ts
import { attachA2aCarrier, extractA2aCarrier } from '@peac/mappings-a2a';

// Attach evidence to an A2A artifact
const artifact = attachA2aCarrier(originalArtifact, {
receipt_ref: 'sha256:abc123...',
receipt_jws: 'eyJhbGciOiJFZERTQSIs...',
});

// Extract evidence from an A2A message
const carrier = extractA2aCarrier(incomingMessage);
if (carrier) {
console.log(carrier.receipt_ref); // 'sha256:abc123...'
console.log(carrier.receipt_jws); // 'eyJhbGciOiJFZERTQSIs...'
}

Carrier placement

A2A evidence is placed in the metadata object using a reverse-DNS extension URI:

A2A metadata with PEAC carrier
{
"metadata": {
"https://www.peacprotocol.org/ext/traceability/v1": {
"carriers": [
{
"receipt_ref": "sha256:abc123...",
"receipt_jws": "eyJhbGciOiJFZERTQSIs..."
}
]
}
}
}

The carrier array supports multiple receipts per A2A object. Each carrier includes at minimum receipt_ref (SHA-256 integrity anchor) and receipt_jws (signed compact JWS).


Agent Card discovery

A2A agents advertise PEAC support via the Agent Card capabilities.extensions array:

Agent Card (excerpt)
{
"name": "Evidence Agent",
"capabilities": {
"extensions": [
"https://www.peacprotocol.org/ext/traceability/v1"
]
}
}

3-step discovery flow

  1. Agent Card -- check capabilities.extensions[] for the PEAC traceability extension URI
  2. Well-known -- fetch /.well-known/peac-issuer.json from the agent's host for issuer configuration and JWKS URI
  3. Header probe -- check for PEAC-Receipt header in HTTP responses from the agent

Transport limits

ConstraintValue
Maximum embed size64 KB
Carrier formatPeacEvidenceCarrier
Integrity checksha256(receipt_jws) === receipt_ref
Integrity verification

When extracting a carrier from A2A metadata, always verify that sha256(receipt_jws) matches receipt_ref. This prevents tampering during transport.


Supported A2A objects

ObjectCarrier placement
TaskStatusstatus.metadata[extensionURI].carriers[]
Messagemessage.metadata[extensionURI].carriers[]
Artifactartifact.metadata[extensionURI].carriers[]

Next steps