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) |
| a2a-fleet-compare | fleet audit: duplicate skill ids, capability conflicts, version drift across agent cards (A2A#921, A2A#1377) |
| a2a-error-audit (vendored) | error envelope hygiene: silent voids, missing messages, untyped error.data, failed tasks without a signal (a2a-rs#146, ADK#4309) |
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 — 10 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 errors stream.jsonl # error envelope hygiene audit
a2a-doctor fleet card1.json card2.json [...]
# fleet overlap & conflict 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.4.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.4.0.tar.gz | 37.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| a2a_doctor-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 80.1 kB
Release files / a2a_doctor-0.4.0.tar.gz
| Download URL | a2a_doctor-0.4.0.tar.gz |
|---|---|
| Size | 37.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d156e50fc15fd34bc1bc043a51482fff5d1c7ebebe3d2e89247b4cd73844b2e1
|
|
BLAKE2b-256 checksum How to use checksums |
d33572a80aa0de400ba6507a09d2134038b5b43a4c57e96694c5c2fc21136f9e
|
| 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.4.0-py3-none-any.whl
| Download URL | a2a_doctor-0.4.0-py3-none-any.whl |
|---|---|
| Size | 43.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
efdbe09f61aa9cb9aebf7741bc98b6ac05acdf523f19c45f58a3999fd7f68579
|
|
BLAKE2b-256 checksum How to use checksums |
5625b3d1851c7b86451eb7e06851d0222d9561416e4c9048adcfec61d4514db6
|
| 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}
|