Black-box contract tests for A2A agents
Project description
a2a-proof
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, 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 agent produces an invalid payment proof | Signed AP2 mandate-chain and receipt verification |
Quick start
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.14.0
Set config only when the contract is not a2a-proof.yaml.
Documentation
- Writing contracts
- Assertions
- Task lifecycle
- Push notifications
- AP2 contracts
- External agent showcases
- Running in development and CI
- Configuration schema
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.
See SECURITY.md for private vulnerability reports.
Contributions follow CONTRIBUTING.md. Licensed under the MIT License.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file a2a_proof-0.14.0.tar.gz.
File metadata
- Download URL: a2a_proof-0.14.0.tar.gz
- Upload date:
- Size: 49.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0dadeaa59189af90f81ce78f02f416b63e620f50bf39bfe75a3879b93ca6391a
|
|
| MD5 |
94c491228d1c3eba0c04aac9f597843a
|
|
| BLAKE2b-256 |
b8bcd4ae8d5031c955ca193ae757cf8c559eddf998cd0364fb770ec0fdacb33d
|
Provenance
The following attestation bundles were made for a2a_proof-0.14.0.tar.gz:
Publisher:
release.yml on aspix2k/a2a-proof
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
a2a_proof-0.14.0.tar.gz -
Subject digest:
0dadeaa59189af90f81ce78f02f416b63e620f50bf39bfe75a3879b93ca6391a - Sigstore transparency entry: 2208233680
- Sigstore integration time:
-
Permalink:
aspix2k/a2a-proof@7bb21d2106fc920bdb1a6b37d10e27c24dd18ecb -
Branch / Tag:
refs/tags/v0.14.0 - Owner: https://github.com/aspix2k
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7bb21d2106fc920bdb1a6b37d10e27c24dd18ecb -
Trigger Event:
push
-
Statement type:
File details
Details for the file a2a_proof-0.14.0-py3-none-any.whl.
File metadata
- Download URL: a2a_proof-0.14.0-py3-none-any.whl
- Upload date:
- Size: 57.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f21da71222b152acd43d64a39b4a3f259694c410bcb30eeff855de07cdf226e8
|
|
| MD5 |
2f013682fd86fb6f95efda682a0db43a
|
|
| BLAKE2b-256 |
2173e4de20313f1e5db2be41e7c602536915c0e165d6f5a3ed9ff3fc27aeadc9
|
Provenance
The following attestation bundles were made for a2a_proof-0.14.0-py3-none-any.whl:
Publisher:
release.yml on aspix2k/a2a-proof
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
a2a_proof-0.14.0-py3-none-any.whl -
Subject digest:
f21da71222b152acd43d64a39b4a3f259694c410bcb30eeff855de07cdf226e8 - Sigstore transparency entry: 2208233717
- Sigstore integration time:
-
Permalink:
aspix2k/a2a-proof@7bb21d2106fc920bdb1a6b37d10e27c24dd18ecb -
Branch / Tag:
refs/tags/v0.14.0 - Owner: https://github.com/aspix2k
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7bb21d2106fc920bdb1a6b37d10e27c24dd18ecb -
Trigger Event:
push
-
Statement type: