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
- Agent Card -- check
capabilities.extensions[]for the PEAC traceability extension URI - Well-known -- fetch
/.well-known/peac-issuer.jsonfrom the agent's host for issuer configuration and JWKS URI - Header probe -- check for
PEAC-Receiptheader in HTTP responses from the agent
Transport limits
| Constraint | Value |
|---|---|
| Maximum embed size | 64 KB |
| Carrier format | PeacEvidenceCarrier |
| Integrity check | sha256(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
| Object | Carrier placement |
|---|---|
TaskStatus | status.metadata[extensionURI].carriers[] |
Message | message.metadata[extensionURI].carriers[] |
Artifact | artifact.metadata[extensionURI].carriers[] |