Repository navigation
fix(signing)!: preserve Agent Card presence for the next major release - #1360
UncleSaurus wants to merge 3 commits into
Conversation
BREAKING CHANGE: Agent Card signing and verification preserve required fields, explicitly present optional defaults and extension JSON values. Affected cards must be re-signed with coordinated verifier rollout. Propose the next SDK major release with an explicit 2.0.0 release boundary. Required-field warning policy is unchanged. Related to a2aproject#1278 and a2aproject/A2A#2122; their broader discussions remain open.
🧪 Code Coverage (vs
|
| Base | PR | Delta | |
|---|---|---|---|
| src/a2a/server/routes/agent_card_routes.py | 85.00% | 85.71% | 🟢 +0.71% |
| src/a2a/utils/proto_utils.py | 95.65% | 95.69% | 🟢 +0.04% |
| src/a2a/utils/signing.py | 95.77% | 96.94% | 🟢 +1.16% |
| Total | 92.89% | 92.92% | 🟢 +0.02% |
Generated by coverage-comment.yml
Independent verification — a2a-python PR #1360Tested head Results
Finding:
|
Agent Card signing currently drops required defaults and explicitly present optional defaults, and recursively removes valid JSON empties. This draft next-major proposal preserves field presence before the existing RFC 8785 canonicalizer so the public signer and verifier follow the published A2A 1.0.1 presence rules.
This intentionally changes some signed bytes. Following the major-release requirement on #1355, it proposes SDK 2.0.0, independently of the A2A wire-protocol version. It leaves the required-field warning policy unchanged and adds no legacy-signature retry or alternate canonicalization path. Cross-SDK agreement and the release window remain upstream decisions; this does not close #1278 or a2aproject/A2A#2122.
release-as: 2.0.0override because the currentalways-bump-patchstrategy selects a patch even for a breaking commit. The release owner must remove the override after 2.0.0 and before later releases. No release manifest, tag, or publication is advanced here.Validation:
./scripts/lint.sh,uv run pytest, anduv run pytest --cov=src --cov-report=term-missingpass on CPython 3.10.19: 2285 passed, 183 skipped, 3 xfailed, 1 xpassed, 93% coverage. Skips are missing Postgres/MySQL DSNs and SQLite row locking. A completed full-worktree Claude Opus 5.5 review approved headd11c05d, independently exercising presence-byte/signature oracles, valid-card controls, cache rollout orderings, protobuf 5.29.5/7.36.2, and release-please 17.6.0's real manifest/strategy selection. It also ran focused checks on Python 3.14.2. No other language SDK, real CDN, or publication was exercised; fresh repository CI remains required.Related to #1278, #1355, and a2aproject/A2A#2122.