Releases: aspix2k/a2a-proof
Releases · aspix2k/a2a-proof
Release list
v0.14.1
Immutable
release. Only release title and notes can be modified.
Bug fixes
- Made the loopback demo ignore proxy environment variables. It now stays local even when a
corporate proxy is configured without a localhost exception; normal agent runs remain
proxy-aware.
Documentation
- Linked the
uvinstallation instructions and updated the Action example to v0.14.1.
Maintenance
- Changed the release workflow to prepare a titled draft with assets after PyPI publication, so
Marketplace metadata and categories can be reviewed before publishing. CONTRIBUTING documents
the manual step. - Kept the live proxy regression in normal CI but outside mutmut's instrumented test selection;
the new runner path kills all four of its generated mutants.
v0.14.0
Immutable
release. Only release title and notes can be modified.
Security
- Made the first-party Action execute the source selected by its reference with the committed
uv.lock, a pinnedsetup-uvrevision, and an explicit uv version. The contract path crosses
the composite Action boundary through an environment variable and remains a quoted argument
rather than shell input. An option terminator prevents option-like filenames from changing CLI
behavior. - Kept CI evidence opt-in. The Action neither uploads response data nor requests write
permissions, leaving potentially sensitive artifacts under the caller's explicit control.
Features
- Added a root composite GitHub Action that runs
a2a-proof.yamlas a behavioral CI check. Its
single optionalconfiginput selects a non-default contract; advanced controls remain in the
CLI. - Added
a2a-proof demo, which starts a deterministic loopback agent and performs an A2A JSON-RPC
exchange without keys or an external service. It checks state, structured data, file size, and
SHA-256;--faildemonstrates diagnostics and exit code1.
Documentation
- Added the local demo and minimal Action invocation to the README, while keeping complete
workflow, security, evidence, and advanced-option guidance in the operations guide.
Maintenance
- Added a CI consumer for the repository's own Action. It starts the demo agent on an ephemeral
port and runs the environment-backed contract through the locked Action runtime. - Added CLI and live protocol coverage for both successful and intentionally failing demo paths.
- Established a clean core mutation baseline: 4,405 of 4,579 mutants are killed (96.20%). Four
timeouts remain in the bounded push wait, listener, and socket-read mutations; all other abnormal
statuses are zero. The threaded demo agent stays under live and negative protocol tests because
mutating its request handlers destabilizes the in-process mutation collector.
v0.13.0
Immutable
release. Only release title and notes can be modified.
Security
- Bound every task-subscription event to the task ID and context returned by the preceding turn.
A stream that crosses task or context boundaries now fails before its content reaches assertions,
reports, or evidence. - Kept file-content verification local and bounded. SHA-256 is computed only for inline raw parts;
remote URLs are never fetched, and computed digests and bytes are excluded from reports and
evidence.
Features
- Added
action: subscribefor black-boxSubscribeToTaskcontracts. A scenario can accept an
active task, resume its stream, and apply existing state-trajectory, text, data, file, AP2,
timing, and invariant checks to the completed subscription result. - Required the subscription to start with the current task snapshot and finish in a terminal or
interrupted state, matching the A2A 1.0 lifecycle contract across JSON-RPC, HTTP+JSON, and gRPC. - Added exact
size_bytes, inclusivemin_size_bytesandmax_size_bytes, andsha256assertions
for inline raw file parts. Exact size and range predicates are mutually exclusive, and content
checks explicitly requirekind: raw.
Documentation
- Added a focused stream-resumption contract to the lifecycle guide and documented file-integrity
syntax, validation rules, and the passive treatment of remote URL parts. - Updated the README capability map to surface stream resumption and file integrity without
expanding the onboarding path.
Maintenance
- Added real JSON-RPC, HTTP+JSON, and gRPC subscription exchanges through the official A2A Python
SDK, including task continuity, artifact collection, terminal state, timing, and digest checks. - Extended runner, configuration, generated schema, protocol rejection, serialization, and
assertion coverage while retaining the 99% coverage gate. - Established a clean mutation baseline: 4,406 of 4,579 mutants are killed (96.22%), with no
survivors in the v0.13 subscription or file-integrity paths. The three timeouts remain in the
bounded push receiver's listener and socket-read mutations.
v0.12.0
Immutable
release. Only release title and notes can be modified.
Features
- Added
--transporttorunanddiff, allowing one contract to exercise JSON-RPC, HTTP+JSON,
and gRPC without editing or duplicating its YAML. Evidence manifests record the requested
transport mode, includingauto.
Documentation
- Added concise, reproducible showcases for the official Python, Go, and Rust SDK agents plus an
independent Turul multi-turn agent. The examples cover routed discovery, all three A2A bindings,
task cancellation, and same-taskinput_requiredcontinuation. - Updated the project comparison to distinguish application behavior contracts from the official
A2A ITK's SDK interoperability matrix.
Maintenance
- Validate every checked-in example configuration offline in CI. Live upstream agents remain
opt-in so external networks, compilers, and repository drift cannot make normal builds flaky. - Established a clean mutation baseline: 4,234 of 4,406 mutants are killed (96.10%), with no
uncovered, suspicious, skipped, interrupted, or crashed mutations. The four timeouts are known
bounded-concurrency and socket-read mutations.
v0.11.0
Immutable
release. Only release title and notes can be modified.
Security
- Added an authenticated, bounded push callback receiver with a unique route and high-entropy token
for every trial. It accepts standard Bearer authentication plus the legacy token header emitted
by A2A Python SDK 1.1.1. Accepted events are bound to the task and context returned by the initial
A2A request, exact retries are deduplicated, and public callback URLs require HTTPS. Plain HTTP is
limited to loopback and private-network hosts. - Limited callback concurrency, active subscriptions, request and aggregate body sizes, event
counts, path length, and connection lifetime. Malformed requests, ambiguous headers, unsupported
media types, and unknown protobuf fields are rejected before evaluation.
Bug fixes
- Rejected callbacks that omit the expected context ID, and canceled active connection handlers
when the receiver closes so no accepted request outlives the run. - Closed a newly registered callback subscription when message sending, file preparation, task-ID
validation, or binding fails, preventing failed trials from consuming the run-wide subscription
limit. - Started the
await_pushtimeout when the wait action begins instead of when the callback was
registered, and surfaced authenticated invalid deliveries immediately instead of waiting for a
timeout.
Features
- Added black-box push delivery contracts. A turn can register an inline A2A push configuration,
return its task immediately, and useaction: await_pushto assert the state trajectory, text,
structured data, files, timing, AP2 proofs, and global invariants of the delivered events. - Added a loopback callback listener for local agents and explicit
listen_host,listen_port, and
public_urlsettings for remote agents behind an HTTPS reverse proxy or tunnel.
Documentation
- Replaced the README's toy capital-city example with a realistic structured routing contract and
a compact risk-to-capability map covering behavioral drift, nondeterminism, lifecycle, deployment
comparison, leak detection, and AP2 verification. - Added a focused push notification guide covering local and remote setup, callback routing,
authentication, lifecycle rules, bounds, and failure behavior without expanding the README into
a reference manual.
Maintenance
- Added real JSON-RPC and HTTP+JSON push exchanges plus an interoperability test that delivers an
event through the official A2A Python SDK sender. Extended configuration, protocol rejection,
cleanup, schema, and runner coverage while retaining the 99% coverage gate. - Added the lightweight HTTP/1.1 parser as a direct dependency and included the callback receiver
in deterministic mutation testing.
v0.10.0
Immutable
release. Only release title and notes can be modified.
Security
- Added signed AP2 payment and checkout receipt verification with an exact ES256 protected-header
requirement, official AP2 success/error payload validation, and explicit local public P-256
issuer keys. Remote key discovery, private JWK material, and token-supplied trust remain rejected. - Bound every response receipt to a mandate assertion that passed full chain verification in the
same turn. The receipt reference is recomputed from that exact closed-mandate JWT instead of
trusting a caller-provided response field. - Redacted selected receipt JWTs before reports and evidence are produced. Offline inspection reads
bounded files or standard input, never accepts token values as arguments, and does not expose
mismatched signed fields in diagnostics.
Features
- Added
kind: receiptAP2 contract assertions for payment and checkout receipts. Contracts can
check issuer, success or error status, payment or order identifiers, and error codes while using
binds_toto reference a named mandate assertion. - Added
a2a-proof ap2 inspect-receiptwith concise terminal and stable JSON output. It can derive
the expected reference from a mandate file or accept an already known reference hash. - Extended the generated JSON Schema with receipt assertions, binding identifiers, path and
response-part filters, and type-specific validation.
Bug fixes
- Made official receipt tampering tests flip a decoded signature bit instead of a trailing
base64url character whose unused padding bits could leave the signature unchanged.
Documentation
- Expanded the focused AP2 guide with a complete mandate-to-receipt contract, trust boundary, CLI
walkthrough, exact output, exit semantics, and copyable success-path example. - Updated the README feature summary and documentation links without expanding the onboarding
path.
Maintenance
- Added synthetic payment-receipt fixtures signed by discarded demo keys and official AP2 v0.2.0
integration tests for payment and checkout receipts, success and error payloads, signature
tampering, and mandate-reference binding. - Extended unit, schema, CLI, reporting, configuration, redaction, and negative-path coverage while
retaining complete statement and branch coverage. - Established a clean mutation baseline after removing the generated
mutants/tree: 3,617 of
3,697 mutants are killed (97.84%), with no uncovered, suspicious, skipped, timed-out, or crashed
mutations. Surviving receipt mutants were triaged for observable contract and security impact.
v0.9.0
Immutable
release. Only release title and notes can be modified.
Security
- Added offline AP2 mandate inspection without accepting tokens as command-line values. Tokens are
read from a bounded file or standard input, never echoed, and omitted from success and failure
output. - Rendered verified mandate fields as literal, bounded text so terminal control characters and
Rich markup cannot alter inspector output. Trust roots remain local public P-256 JWKs; remote key
discovery and private JWK material remain rejected. - Split invalid mandates from setup failures: cryptographic, delegation, audience, nonce, validity,
schema, constraint, and checkout-binding failures return exit code1; input, key, and missing
SDK errors return2.
Features
- Added
a2a-proof ap2 inspectwith automatic payment or checkout type detection, optional
type-specific expected bindings, concise terminal output, and stable JSON output. - Added verified summaries for payment payee, amount, transaction, and instrument type, plus
checkout merchant, status, currency, item count, and signed checkout hash. Raw mandate tokens and
payment instrument identifiers are not reported.
Documentation
- Added a copyable inspector walkthrough with the exact terminal result, stdin usage, JSON mode,
and exit-code contract while keeping AP2 reference material outside the README.
Maintenance
- Added a synthetic signed AP2 payment fixture whose private demo keys were discarded. CI verifies
the documented command against the pinned official AP2 v0.2.0 SDK. - Extended official integration coverage to inspect real payment and checkout chains and reject a
tampered signature through the same verifier used by response contracts. - Strengthened AP2 and cross-module contract tests; a clean full mutation run now kills 3,108 of
3,138 mutants (99.04%) with no uncovered, suspicious, timed-out, or crashed mutations.
v0.8.0
Immutable
release. Only release title and notes can be modified.
Security
- Added cryptographic verification for AP2 v0.2.0 dSD-JWT mandate chains, including every
delegation signature and binding, terminal audience and nonce, validity windows, typed payloads,
and open-to-closed constraints. - Required an explicit local public P-256 trust root. Key paths are confined to the contract
directory, private JWK material is rejected, reads are bounded, and remote key discovery is never
attempted. - Redacted mandate tokens selected by AP2 assertions before JSON, JUnit, terminal, or evidence
output while preserving unrelated response data. Verification failures do not echo untrusted
token payloads.
Features
- Added
expect.ap2assertions for signed payment and checkout mandate chains. Official AP2 data
keys are inferred from the mandate type, with optional response-part filters and custom JSON
Pointer paths. - Added payment checks for expected transaction IDs and open-checkout references, plus checkout
checks for expected hashes and automatic binding ofcheckout_hashto the signed
checkout_jwt.
Documentation
- Added a focused AP2 guide covering the pinned official SDK install, trust-root setup, payment and
checkout examples, verification semantics, redaction, and current protocol boundary.
Maintenance
- Added a pinned CI integration test against the official AP2 v0.2.0 source commit. It creates
valid payment and checkout chains, verifies both, and rejects a tampered signature. - Confirmed real interoperability between the current A2A client and an AP2-style A2A 0.3.24
JSON-RPC server, including legacy extension-header translation and signed mandate transport. - Extended the generated configuration schema and deterministic mutation target for AP2 while
retaining complete statement and branch coverage.
v0.7.0
Immutable
release. Only release title and notes can be modified.
Features
- Added black-box cancellation contracts. A multi-turn scenario can request an initial
non-terminal task withreturn_immediately: true, invoke the protocol-levelcanceloperation,
and assert the returned task state, content, timing, files, data, and invariants. - Added task persistence contracts through
action: get_task, with optional bounded
history_length. Task IDs and contexts flow between message, cancel, and retrieval turns without
exposing transport-specific methods in the configuration. - Added
a2a-proof diff --against URLfor running one selected contract against baseline and
candidate deployments. Terminal and JSON output classify Agent Card and scenario outcomes as
regressions, improvements, changed, or unchanged; the candidate contract result controls the
exit status. - Kept lifecycle behavior portable across JSON-RPC, HTTP+JSON, and gRPC. Streaming agents use a
dedicated non-streaming client for the A2Areturn_immediatelyrequest while normal scenarios
retain streaming state trajectories and first-event timing.
Security
- Applied the existing URL credential rejection, Agent Card origin checks, redirect policy,
request headers, extensions, response bounds, and timeouts to lifecycle and candidate diff runs. - Kept differential comparison at the contract-result layer instead of fetching or comparing
untrusted remote resources; response file URLs remain passive and omitted from reports.
Documentation
- Added a complete cancellation-and-persistence contract and documented lifecycle ordering,
missing-task behavior, history limits, diff classifications, and diff exit codes. - Kept the README focused on first use and moved contract, assertion, lifecycle, and operational
reference material into short topic guides.
Maintenance
- Added real lifecycle exchanges for every supported transport and a real CLI deployment diff;
272 tests retain complete statement and branch coverage across the expanded surface. - Added lifecycle configuration constraints to the generated JSON Schema and differential result
classification to mutation testing, with 98.8% of 2,362 mutants killed.
v0.6.0
Immutable
release. Only release title and notes can be modified.
Security
- Kept invariant secrets out of YAML and reports by accepting environment variable names,
resolving their values only in memory, and redacting values case-insensitively before evidence
truncation or serialization. - Removed response text, structured data, and file metadata from every report when a global
invariant detects a leak in that turn. - Redacted resolved request-header values and their environment substitutions throughout evidence
records, and continued to omit remote file URLs. Evidence output is limited to 100 failed trials
and bounded response previews. - Wrote evidence through a private temporary directory with flushed files and an atomic final
rename; existing destinations are never overwritten.
Bug fixes
- Made JUnit agree with
pass_rate: failed trials within the accepted budget are now reported as
skipped instead of failing an otherwise successful CI report. - Made an explicitly empty environment mapping remain empty instead of silently falling back to
the process environment during configuration loading.
Features
- Added suite-wide response invariants for forbidden text and environment-backed secret values.
They run on every response turn and identify the violated rule without printing the secret. - Added
--evidence DIRfor atomic, machine-readable run bundles. Each bundle records the contract
and Agent Card hashes, run metadata, failed-trial summaries, and a normalized response trace in
JSONL. Agent Card and aggregate latency failures are included even when no trial fails. - Added scenario-level
p50_secondsandp95_secondslatency contracts across completed trials,
with aggregate results in terminal, JSON, and JUnit reports. - Added opt-in
--jobsconcurrency for repeated trials. Concurrency is bounded at 32, remains
sequential by default, and preserves deterministic result ordering.
Documentation
- Documented global invariants, evidence contents and limits, percentile semantics, and safe
parallel trial execution.
Maintenance
- Added evidence handling to mutation testing and extended the generated configuration schema for
invariants and aggregate latency contracts.