V3 — Dependencies, Toolchain Cost, and the SDK Proof
V3 — Dependencies, Toolchain Cost, and the SDK Proof
Why this exists. Sol's 03-decisions/sol-conflicts-and-corrections.md §5
lists three things neither author had verified. All three are now measured. This
file is the evidence, written as a finding in docs/-equivalent territory —
V3's dependency and cost posture is my lane (config/providers.json,
fallback chain, cost policy per 05-operations/layer-ownership.md), so this is
a report from my lane, not a patch to Sol's or Min's.
1. The SDK claim — CLOSED (positively)
| Sol §5 said | Measured 2026-10-10 |
|---|---|
"The SDK has not been installed. import a2a has not been tried." | a2a-sdk 1.2.2 installs and imports cleanly. A venv with the SDK is provisioned and working. |
From the installed environment:
a2a-sdk 1.2.2
TaskState.keys():
TASK_STATE_UNSPECIFIED, TASK_STATE_SUBMITTED, TASK_STATE_WORKING,
TASK_STATE_COMPLETED, TASK_STATE_FAILED, TASK_STATE_CANCELED,
TASK_STATE_INPUT_REQUIRED, TASK_STATE_REJECTED, TASK_STATE_AUTH_REQUIRED
This confirms both V3 documents at once:
canceledis the spec spelling — one L. Confirmed against the installed enum, value5.input-required/auth-requiredare hyphenated, values6and8.- Min's
states.yamlmapping inDESIGN-OF-RECORD.md§2.4 is correct against the reference implementation. The proposed mapping is not a guess.
Two facts about the SDK worth having before Phase 1
| Fact | Consequence |
|---|---|
TaskState is a protobuf enum, not a Python enum. | It is not iterable. for s in TaskState raises TypeError. Read it with TaskState.keys(). A test written the obvious way will fail for the wrong reason. |
The enum's JSON serialisation is the ProtoJSON name (TASK_STATE_CANCELED), not the lowercase wire string. | The wire value V2 was producing (cancelled) came from a (str, Enum). With the SDK, the JSON form and the enum form are different strings. Whoever writes states.yaml must record both, or Phase 4's mapping will encode the wrong one. |
That second row is a genuine trap for Phase 4 and is not in either design document.
2. The dependency bill — what adopting the SDK actually costs
Measured in the provisioned venv, not estimated:
| Measure | Value |
|---|---|
The a2a package itself | 3.1 MB |
| Total installed tree | 26 packages |
| Heavy transitive deps present | google-auth, google-api-core, googleapis-common-protos, cryptography, protobuf 7.36.2, pydantic 2.14.0, opentelemetry-api |
| Optional extras not needed | [fastapi], [grpc], [postgresql], [telemetry], [encryption], [signing] — all off by default |
My assessment. Against the defect it prevents — a hand-rolled transport serving three non-spec state values — the dependency is cheap and the extras are correctly optional. Nothing here blocks adoption.
One caution, cost-adjacent. google-auth and cryptography are
security-relevant transitive dependencies in a system that runs unattended. They
should be pinned and auditable, not floating. Recommend uv.lock or a
requirements.txt with hashes, committed into the V3 repo. V2's spec/ was
untracked and one git clean from gone — see §3.
3. spec/ — the reference implementation is one command from deleted
Sy answering Sol's "copied or referenced?" question from the money side:
| Fact | Measured |
|---|---|
spec/ size | 18 MB (4 official a2aproject repos) |
Tracked files in solos2 | 0 |
solos2 total | 731 MB |
solos2/.git | 156 MB |
| Risk | One git clean from gone. |
Recommendation — reference it, tracked, as a submodule. Sol's answer is correct and I agree with his reasoning; the size figures support it. An 18 MB commit inside a new repo is the wrong fix, and an untracked copy is the defect we already have. A submodule pins a revision, so "which SDK did we build against?" is answerable.
4. The Inspector — the high-value, not-yet-cheap piece
Sol's §5 is right that it has never run here. I went further and measured what standing it up actually requires:
| Requirement | State on this host |
|---|---|
bun | not installed |
a2a-sdk[all] (Inspector's own dep) | not installed |
| Docker | not installed |
node | v24.19.0 present |
uv | present at ~/.local/bin/uv |
| Frontend build needed? | Yes — Inspector is a FastAPI backend + a bun-built frontend, served together |
| Backend alone? | NO — measured, and it fails. The Python backend does not even import. See the correction below. |
Correction to my own earlier claim — recorded, not quietly edited
My first draft of this table asserted that the backend could run headless "without the UI." That was inference, not measurement, and it was wrong. I tried to import it:
cd /home/lab/solos2/spec/insp/backend && python -c "import app"
ModuleNotFoundError: No module named 'bleach'
So the Inspector's backend is not a drop-in CLI probe. Its own dependency
list (bleach, jwcrypto, pyjwt, python-socketio, uvicorn, jinja2,
sse-starlette, validators, plus a2a-sdk[all]) is unmet on this host, and
the .venv that exists beside it is incomplete. There is no cheap path to
"just the conformance check" — running the Inspector means satisfying its whole
backend, and its frontend needs bun on top of that.
This is a real cost and it is not in either design document. The Inspector
is described in both DESIGN-OF-RECORD.md §2.6 and A2A-ADOPTION-2026-10-10.md
as "the gate" — and in Phase 1.3 as the proof. Before it can be a proof, it has
to run once.
Recommendation. Budget an explicit setup task for the Inspector — install
bun and a2a-sdk[all], or vendor the exact checks we want as our own pytest
conformance tests and call those the gate. Do not carry an acceptance
criterion that depends on a tool that has never executed here, and do not assume
the backend is a usable shortcut — I assumed that and was wrong.
5. The A2A CLI — cannot be built here
| Requirement | State |
|---|---|
go | not installed |
| CLI language | Go (go.mod requires go 1.25.0) |
| Prebuilt binary in repo | none |
So a2a-cli is not usable on this host without installing Go. It is named in
the design as the "operate with it" tool — it is a nice-to-have, not a
blocker. The Inspector is the load-bearing one.
6. Port placement — agreeing with Sol, with a cost reason
Sol recommends different port numbers for V3 so the "run both" proof in D4 is runnable. Agreed, plus a reason from my lane: same-ports migration means any cost sampling during the change is unattributable — you cannot tell V2's spend from V3's. A clean, different block also makes the cost baseline measurable, which is what I need in order to tell Young what V3 actually costs to run.
7. Summary — what this closes, and what it opens
Closed (measured, previously "not established"):
a2a-sdk1.2.2 installs and imports on this host.- The spec state spellings are confirmed against the installed enum.
- The dependency bill is known and small.
- The CLI needs Go; the Inspector needs
bun— both currently absent. - Corrected: the Inspector's backend is not a headless shortcut — it fails
to import (
No module named 'bleach'). My first draft said it was; that was inference, and the correction is in §4.
Opened:
- Phase 4 has a hidden trap — the SDK's JSON form and enum form of a task
state are different strings.
states.yamlmust record both. (New; neither doc has it.) - The Inspector must be budgeted as a setup task, not assumed present.
- Pinning policy needed —
google-authandcryptographyshould be locked and auditable, not floating. - Phase 1.3's acceptance criterion needs a substitute. "The Inspector passes" is currently un-runnable here. Either stand it up properly or write our own conformance tests and name them as the gate.

