From f531fe1367857317ce6a2a02a423dd3871ea52a1 Mon Sep 17 00:00:00 2001 From: Hongming Wang Date: Mon, 27 Apr 2026 07:16:16 -0700 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20drop=20state=5Ftransition=5Fhistory?= =?UTF-8?q?=20field=20=E2=80=94=20removed=20in=20a2a-sdk=201.x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit a2a-sdk 1.x's AgentCapabilities only exposes 4 fields: streaming, push_notifications, extensions, extended_agent_card. The state_transition_history field was removed in the v1 protobuf schema. main.py still passed it as a kwarg, so every workspace that reached the AgentCard construction step (line 188) crashed: ValueError: Protocol message AgentCapabilities has no "state_transition_history" field Symptom: every claude-code + hermes workspace stuck in `provisioning` forever — caught when the user provisioned a Design Director crew manually via the canvas while harness 5 was running. Why every prior smoke gate missed it: - runtime-pin-compat.yml smokes `from molecule_runtime.main import main_sync` — only imports the module. AgentCapabilities() runs inside `async def main()`, not at module load. - Template image boot smoke does `import every /app/*.py` — same story. main.py imports fine; the field error only fires at call. The fix is one line — drop the kwarg. Fields we actually need (streaming + push_notifications) are still passed. Follow-up worth filing: smoke step that instantiates Adapter() + calls a no-op setup() against a stub config. That would have caught this before publish. Co-Authored-By: Claude Opus 4.7 (1M context) --- workspace/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/workspace/main.py b/workspace/main.py index a947123c..e70b0f7a 100644 --- a/workspace/main.py +++ b/workspace/main.py @@ -188,7 +188,6 @@ async def main(): # pragma: no cover capabilities=AgentCapabilities( streaming=config.a2a.streaming, push_notifications=config.a2a.push_notifications, - state_transition_history=True, ), skills=[ AgentSkill( From 12d446bc8ed9ed976e852f8dba45fc8929c96afb Mon Sep 17 00:00:00 2001 From: Hongming Wang Date: Mon, 27 Apr 2026 07:20:05 -0700 Subject: [PATCH 2/2] docs: explain why state_transition_history is gone (research-backed) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a comment block citing a2a-sdk's own a2a/compat/v0_3/conversions.py, which says verbatim: state_transition_history=None, # No longer supported in v1.0 So a future reader who notices the missing kwarg won't try to add it back. The capability is now universal: every v1.x Task carries a history list and tasks/get supports historyLength via the apply_history_length helper. No flag because nothing's optional. Confirmed by reading the SDK source directly: - a2a/types.py AgentCapabilities exposes only: streaming, push_notifications, extensions, extended_agent_card. - a2a/compat/v0_3/conversions.py explicitly maps None when down-converting v1 → v0.3 (deliberate removal, not rename). - a2a/server/request_handlers/default_request_handler_v2.py uses apply_history_length(task, params) — agent doesn't opt in. Co-Authored-By: Claude Opus 4.7 (1M context) --- workspace/main.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/workspace/main.py b/workspace/main.py index e70b0f7a..16b57d7d 100644 --- a/workspace/main.py +++ b/workspace/main.py @@ -188,6 +188,12 @@ async def main(): # pragma: no cover capabilities=AgentCapabilities( streaming=config.a2a.streaming, push_notifications=config.a2a.push_notifications, + # Note: state_transition_history (a 0.x capability flag) was + # removed in a2a-sdk 1.0. Per the SDK's own + # a2a/compat/v0_3/conversions.py: "No longer supported in + # v1.0". The capability is now universal — Task.history is + # always available and tasks/get accepts historyLength via + # apply_history_length(). Don't add this kwarg back. ), skills=[ AgentSkill(