Skip to content

fix(deps): re-pin a2a-sdk<1.0.2, add protobuf>=6 floor + matrix canary#588

Merged
bokelley merged 2 commits intomainfrom
bokelley/revert-a2a-bump
May 5, 2026
Merged

fix(deps): re-pin a2a-sdk<1.0.2, add protobuf>=6 floor + matrix canary#588
bokelley merged 2 commits intomainfrom
bokelley/revert-a2a-bump

Conversation

@bokelley
Copy link
Copy Markdown
Contributor

@bokelley bokelley commented May 5, 2026

Summary

Reverts #586 and adds a protobuf>=6,<8 floor to actually fix the upstream caller (salesagent) that motivated the original bump attempt.

The matrix

a2a-sdk 1.0.1 (reads is_repeated) a2a-sdk 1.0.2 (reads label)
protobuf 5.29.5 + upb BROKENsalesagent's environment works
protobuf 6.x + upb works works
protobuf 7.34.1 + upb works BROKEN#586 CI failure

The matrix has two broken cells. Reverting #586 alone (a2a-sdk → 1.0.1) only unbroke our CI; salesagent stayed broken because they run protobuf 5.29.5. Adding protobuf>=6 closes the second broken cell so adopters land in a working column on every supported wheel.

Why both pins are needed

  • a2a-sdk >=1.0.1,<1.0.2 — 1.0.2 reads field.label on the upb FieldDescriptor, which protobuf 7.x dropped. CI confirmed.
  • protobuf >=6,<8 — 1.0.1 reads field.is_repeated, which the upb extension only exposes from 6.x onward. Without this floor, salesagent and other adopters on protobuf 5.x get an SDK that 500s on every message/send.

Canary test

tests/test_a2a_protobuf_compat.py probes a real FieldDescriptor instance and fails fast with a readable error message when a future dep bump moves us back into a broken cell. Two assertions:

  1. The attribute the resolved a2a-sdk reads (is_repeated for 1.0.1, label for 1.0.2) must be readable on the resolved protobuf upb FieldDescriptor.
  2. The resolved protobuf must respect the >=6 floor.

Verified locally:

  • protobuf 5.29.5 → both canaries fail with the right error
  • protobuf 6.33.6 → both pass
  • protobuf 7.34.1 → would fail if a2a-sdk were 1.0.2 (but our pin keeps it on 1.0.1, where 7.x works)

Impact

  • v4.4.1 was published with the broken bump and should be yanked manually from PyPI before this PR's release goes out as 4.4.2.
  • The extra_headers fix from fix(client): add extra_headers escape hatch for multi-tenant servers #585 stays intact and ships in 4.4.2.
  • Salesagent's message/send now actually works on adcp 4.4.2 regardless of which protobuf wheel they pull, because the dep resolver can no longer land them on the broken 5.x cell.

Test plan

  • Canary passes on protobuf 6.33.6 (working cell)
  • Canary fails with readable error on protobuf 5.29.5 (salesagent's broken cell)
  • All a2a conformance + integration tests pass on protobuf 6.x locally
  • Full CI matrix (Python 3.10–3.13) on PR

🤖 Generated with Claude Code

@bokelley bokelley changed the title fix(deps): re-pin a2a-sdk<1.0.2 (revert #586) fix(deps): re-pin a2a-sdk<1.0.2, add protobuf>=6 floor + matrix canary May 5, 2026
bokelley and others added 2 commits May 5, 2026 14:14
Reverts the bump from #586. CI Python 3.11 confirmed a2a-sdk 1.0.2
still triggers `'google._upb._message.FieldDescriptor' object has no
attribute 'label'` on every A2A wire test — the regression that forced
the original `<1.0.2` ceiling is NOT fixed in 1.0.2. Restoring the
ceiling so adopters of 4.4.x stay on the working 1.0.1 line.

PyPI 4.4.1 published the broken pin and should be yanked manually.
This revert ships as 4.4.2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous revert (a2a-sdk<1.0.2) unbroke our CI on protobuf 7.34.1
but did NOT fix the original upstream caller (salesagent), who runs
protobuf 5.29.5 — the upb FieldDescriptor on 5.x lacks ``is_repeated``,
which a2a-sdk 1.0.1's ``@validate_proto_required_fields`` reads on
every ``message/send``. Result: every JSON-RPC invocation 500s before
any handler runs.

Adding ``protobuf>=6,<8`` rules out the broken 5.x cell. Combined with
the existing ``a2a-sdk>=1.0.1,<1.0.2``, adopters land in a known-good
matrix cell on every supported wheel.

Adds tests/test_a2a_protobuf_compat.py — a fast canary that probes a
real ``FieldDescriptor`` instance and fails with a readable error when
a future dep bump moves us back into a broken cell.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@bokelley bokelley force-pushed the bokelley/revert-a2a-bump branch from 08ff88f to 2696253 Compare May 5, 2026 18:14
@bokelley bokelley merged commit 1e16d6f into main May 5, 2026
16 checks passed
@bokelley bokelley deleted the bokelley/revert-a2a-bump branch May 5, 2026 18:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant