Skip to main content

a2a-doctor

One command, every A2A audit in the family. Dumb math, honest numbers, zero dependencies.

tests PyPI License: MIT

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)

Source distribution for a2a-doctor 0.2.0
File Size Uploaded
a2a_doctor-0.2.0.tar.gz 31.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for a2a-doctor 0.2.0
File Interpreter ABI Platform
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}

Release history Release notifications | RSS feed

0.4.0

2 release files

0.3.0

2 release files

This release

0.2.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page