Skip to main content

a2a-proof

CI Coverage Release PyPI Python

Black-box contract tests for A2A agents.

a2a-proof discovers a deployed agent, sends real A2A requests, and checks its observable behavior. It needs no access to the agent's source code, framework, prompts, or model provider.

The official A2A TCK checks protocol conformance, A2A ITK checks interoperability between SDKs, and the A2A Inspector supports interactive debugging. a2a-proof adds repeatable contracts for the behavior of your deployed agent.

It targets A2A 1.0 over JSON-RPC, HTTP+JSON, and gRPC. The SDK compatibility layer also supports AP2 v0.2.0 agents that expose A2A 0.3 JSON-RPC, including signed mandate-to-receipt payment flows.

What you can prove

Risk Contract
A prompt, model, or backend change alters an answer Text, structured data, JSON Schema, and file integrity assertions
An LLM succeeds only some of the time or gets slower Repeated trials, statistically bounded pass rates, parallel runs, and p50/p95 latency
A long-running task breaks after acceptance State trajectories, stream resumption, cancellation, persistence, and push delivery
Staging no longer behaves like production Agent Card preflight and deployment diff
Agent text leaks a secret or system prompt Global invariants and bounded failure evidence
An orchestrator stops calling its specialist, or forwards credentials to it Delegation contracts against a recording downstream agent
An agent produces an invalid payment proof Signed AP2 mandate-chain and receipt verification

Quick start

With uv installed, try a real loopback A2A exchange without an API key or external service:

uvx a2a-proof demo
uvx a2a-proof demo --fail

The second command deliberately shows a contract failure and exits 1.

Point the runner at your agent:

uvx a2a-proof init https://agent.example.com

init reads the Agent Card and creates a2a-proof.yaml. Replace its smoke scenario with behavior your users depend on:

version: 1

agent:
  url: https://agent.example.com

defaults:
  trials: 5
  pass_rate: 0.8

scenarios:
  - name: billing dispute routing
    message: A customer says their card was charged twice for order 4815.
    latency:
      p95_seconds: 15
    expect:
      state: completed
      data:
        - path: /queue
          equals: billing-disputes
        - path: /priority
          matches: "(?i)^high$"
$ uvx a2a-proof run
┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━┓
┃ Result ┃ Scenario                ┃ Trials ┃ Time ┃
┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━┩
│ PASS   │ billing dispute routing │    4/5 │ 3.2s │
└────────┴─────────────────────────┴────────┴──────┘

1 scenario passed in 3.2s

Run one scenario, save failure evidence, or compare the same contract against another deployment:

uvx a2a-proof run --scenario "billing dispute routing"
uvx a2a-proof run --format junit --output a2a-proof.xml --evidence evidence
uvx a2a-proof diff --against https://candidate-agent.example.com

GitHub Actions

After checking out the repository, one step runs its default contract as a CI check:

- uses: aspix2k/a2a-proof@v0.15.0

Set config only when the contract is not a2a-proof.yaml.

Documentation

The schema provides completion and inline validation in YAML-aware editors. init links it automatically.

Safety

Agent responses and file metadata are treated as untrusted input. Requests, response parts, regular expressions, embedded schemas, evidence, and local file access are bounded. Redirects, credential-bearing URLs, external schema references, and cross-origin interfaces are rejected by default. Remote file URLs are never fetched or written to reports. Requests recorded by the delegation agent stay in memory and are never written to reports or evidence.

See SECURITY.md for private vulnerability reports.

Contributions follow CONTRIBUTING.md. Licensed under the MIT License.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

a2a_proof-0.15.0.tar.gz (54.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

a2a_proof-0.15.0-py3-none-any.whl (62.6 kB view details)

Uploaded Python 3

File details

Details for the file a2a_proof-0.15.0.tar.gz.

File metadata

  • Download URL: a2a_proof-0.15.0.tar.gz
  • Upload date:
  • Size: 54.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for a2a_proof-0.15.0.tar.gz
Algorithm Hash digest
SHA256 48643a17364bf4744644e25e8c514071f60a4d9478b103f1bb1c5fe4ed902f8c
MD5 005e60206f61a06e464649754d5b8e3a
BLAKE2b-256 eb9181fb8345706afe699ec01540e6b89cd3ac338b63e9ac3395b89021422e9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for a2a_proof-0.15.0.tar.gz:

Publisher: release.yml on aspix2k/a2a-proof

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file a2a_proof-0.15.0-py3-none-any.whl.

File metadata

  • Download URL: a2a_proof-0.15.0-py3-none-any.whl
  • Upload date:
  • Size: 62.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for a2a_proof-0.15.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6d89cb243c6feed3f56fdadf6144781139333771e2a5c82ba691803555c9e1db
MD5 7dc1bf3853d5302a614367e7df63ae2b
BLAKE2b-256 d27cbb82377a497b810370a95f1f1dd44a5b390c203ce3f0cf80fb0ceb5310f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for a2a_proof-0.15.0-py3-none-any.whl:

Publisher: release.yml on aspix2k/a2a-proof

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page