a2a-doctor
One command, every A2A audit in the family. Dumb math, honest numbers, zero dependencies.
pip install a2a-doctor
a2a-doctor check --card card.json --stream stream.jsonl
The umbrella entry point for the ZidoCode A2A audit suite:
| Repo | What it audits |
|---|---|
| a2a-tax | token cost of the agent card + polling model |
| a2a-stream-tax | token cost of a recorded SSE stream |
| a2a-reconnect-tax | replayed-event tax across SSE reconnects |
| a2a-artifact-audit | chunk gaps, duplicates, writes after last_chunk |
| a2a-task-state-audit | task resurrection, illegal transitions, unknown states |
| a2a-context-audit | empty IDs, context mutation, orphan contexts (A2A#1309) |
| a2a-webhook-audit | webhook SSRF: metadata IPs, credentials, risky ports (a2a-go#373) |
| a2a-timeline-replay | time-travel explorer — per-task timelines, event windows, raw JSON at any line |
| a2a-card-lock | agent-card pin + drift gate |
| a2a-card-drift | protocol version sanity: MCP-date versions, 1.0 cards on pre-1.0 shape, snapshot diff (LiteLLM#30795) |
Each member works standalone. a2a-doctor runs them all in one pass and gives one verdict.
Install
pip install a2a-doctor # or: copy the .py files (they are all stdlib-only)
Usage
$ a2a-doctor check --card card.json --stream stream.jsonl --lock a2a-card.lock
a2a-doctor check — 7 section(s)
✓ card 418 tok estimated
✓ polling ~418 tok/task estimated
✓ stream 17 event(s) recorded
✗ artifacts 1 critical — event 14: write to 'a1' after last_chunk (artifact already closed)
✗ lifecycle 5 critical — line 7: task 'zombie-task' resumed after terminal state 'failed' -> 'working'
✓ reconnect no replayed events
✓ lock card unchanged — hash matches
verdict: FAIL (artifacts, lifecycle)
$ echo $?
2
check is the CI gate: exit 0 clean, 1 warnings only, 2 critical findings.
Individual sections:
a2a-doctor tax card.json # card size + $ estimate
a2a-doctor stream stream.jsonl # token breakdown of a recorded stream
a2a-doctor reconnect stream.jsonl # replayed events across reconnects
a2a-doctor artifacts stream.jsonl # artifact integrity report
a2a-doctor lifecycle stream.jsonl # task state machine audit
a2a-doctor context stream.jsonl # context/task correlation audit
a2a-doctor webhook stream.jsonl # webhook SSRF audit (offline)
a2a-doctor timeline stream.jsonl # time-travel explorer: per-task state chains
a2a-doctor card card.json # protocol version drift audit
a2a-doctor lock card.json a2a-card.lock # drift check
Stream format
One JSON event per line — record your client's message/stream session, replay it anywhere, anytime. Deterministic: same input, same verdict, byte for byte.
Why
Auditing an A2A endpoint once is easy. Continuously — in CI, on every deploy — is the point. a2a-doctor exists so there is one command to wire into the pipeline, not six. MIT license.
Metadata
Release files for a2a-doctor 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| a2a_doctor-0.2.0.tar.gz | 31.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| a2a_doctor-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 68.3 kB
Release files / a2a_doctor-0.2.0.tar.gz
| Download URL | a2a_doctor-0.2.0.tar.gz |
|---|---|
| Size | 31.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
17714b5de9615f734e005bf87821cd8cb85eee826d2034da9ffff17dcf96ade7
|
|
BLAKE2b-256 checksum How to use checksums |
7c01790c0beea208b218183e82ec1d9f43cebbabb1ac586a0e7db33f55342ca5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / a2a_doctor-0.2.0-py3-none-any.whl
| Download URL | a2a_doctor-0.2.0-py3-none-any.whl |
|---|---|
| Size | 36.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
83ce82e6996b0262000967a1ae3dc223ff6d24034c827735eb6282e71ab2b262
|
|
BLAKE2b-256 checksum How to use checksums |
b49814d2a0838d29c7f2992983a6d596545537284db9e683c4187759bd60053d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|