Finding — the A2A dependency gap
Finding — the A2A dependency gap
Found while acting on Young's "only report if error" request: I read the cron list to make the backup quiet, and the restore-proof job had been failing for a day. Chasing that failure surfaced a second, more important one.
What was wrong
a2a-sdk==1.2.2 is installed, but its declared runtime dependencies were not:
| Declared by a2a-sdk | Was it installed? |
|---|---|
protobuf>=5.29.5 | ❌ no |
pydantic>=2.11.3 | ❌ no |
httpx>=0.28.1 | ❌ no |
json-rpc>=1.15.0 | ❌ no |
google-api-core>=1.26.0 | ❌ no |
googleapis-common-protos>=1.70.0 | ❌ no |
starlette / uvicorn (http-server extra) | ❌ no |
Consequence: any module that touches the real A2A wire types failed to import —
from a2a.types.a2a_pb2 import CancelTaskRequest → ModuleNotFoundError: No module named 'google'. That took out 7 tests: 1 in test_observability.py, 6 in
test_stage3_4_corrections.py — i.e. exactly the tests that prove the A2A cancel
and streaming paths. The SDK was importable at the top level, so nothing noticed.
The tell: the failures were IDENTICAL on the live tree and the restored clone. That is what separated "the backup is broken" from "the code env is broken" — the restore rehearsal earned its keep by surfacing a live defect it did not cause.
Why it went unseen
a2a.typeswas never imported on the happy path, so the missing deps were invisible.- Tests that DID import it were skipped or passed on a different interpreter.
- The restore-proof's own python probe (fixed the same day) was masking it further by reporting its environment as a backup failure.
The fix, applied
Installed the declared set into the Hermes toolchain interpreter
(~/.hermes/tools/python-*/bin/python3) via uv pip install --python:
a2a-sdk==1.2.2 + pydantic httpx json-rpc packaging protobuf google-api-core googleapis-common-protos + starlette uvicorn sse-starlette.
Verified: from a2a.types.a2a_pb2 import CancelTaskRequest, SendMessageRequest
and from operation.runtime.a2a_server import V3RequestHandler both import; the
full suite is 457 passed, 2 skipped, 2 xfailed; the two affected test files go
from 7 failed → 45 passed.
What this implies (for the register, not for me to fix)
- The env has no lockfile. There is no
requirements.txt/pyproject.tomlin the code tree, so "457 passed" was true only on a machine where deps happened to be present. A clean env cannot reproduce it — which is precisely what a restore proof is supposed to catch, and did. a2a-sdkshould be installed with its extra, not bare:a2a-sdk[http-server]==1.2.2. Bare install leaves the HTTP surface (starlette) out.- Suggested owner: Sol (code env / architecture). This is his lane; I applied the minimal fix to unblock the proof and am reporting it, not claiming it.
Honest limits
- I fixed the environment, not the root cause (no lockfile). The gap will recur on any fresh machine until the deps are pinned in the repo.
- I did not add the lockfile — that is a code-tree change in Sol's lane.
V3 structure — Min's finding on .solos/ as a package root
Date: 2026-10-10 Author: Min (registry & contract lane) Status: BLOCKING — needs a decision before either lane writes code Addressed to: Sol (transport & execution lane), Young (authority)
The Brain stopped on 429. It is not rate limited. It is misconfigured.
Young, 2026-10-11: "I saw Brain Unit stopped due to 429 on Hermes, now how do we fix this issue and switch to different model when it happen and resume tasks."

