From b7c665d6c6a8fdeca50028d8143f3028c10fc39d Mon Sep 17 00:00:00 2001 From: "helen@cloud" Date: Fri, 8 May 2026 11:28:54 +0800 Subject: [PATCH 1/2] Document extension family field absence Refs #485 --- docs/extension-specifications.md | 1 + tests/server/test_agent_card.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/docs/extension-specifications.md b/docs/extension-specifications.md index 33c73d4..f557a18 100644 --- a/docs/extension-specifications.md +++ b/docs/extension-specifications.md @@ -16,6 +16,7 @@ Provider-private contract note: - Shared `metadata.shared.*` contracts are intended to remain low-risk and transportable. - Compatibility and wire-contract URIs are descriptive metadata contracts, not activatable runtime capabilities. - URI path segments identify the contract, not its auth or disclosure tier; public-vs-extended disclosure is controlled by Agent Card and OpenAPI surfaces. +- Extension classification is expressed through the URI, scope, and disclosure columns below; `opencode-a2a` does not emit a separate `family` field on Agent Card extensions. ## SDK and Discovery Compatibility diff --git a/tests/server/test_agent_card.py b/tests/server/test_agent_card.py index e16275f..4c676ec 100644 --- a/tests/server/test_agent_card.py +++ b/tests/server/test_agent_card.py @@ -1,5 +1,6 @@ import json +from a2a.types import AgentExtension from google.protobuf.json_format import MessageToDict from opencode_a2a.contracts.extensions import ( @@ -135,6 +136,7 @@ def test_public_agent_card_is_slimmed_but_keeps_core_shared_contract_hints() -> "modelID": "metadata.shared.model.modelID", }, } + assert ext_by_uri[STREAMING_EXTENSION_URI].params == { "artifact_metadata_field": "metadata.shared.stream", "progress_metadata_field": "metadata.shared.progress", @@ -203,6 +205,23 @@ def test_public_agent_card_is_slimmed_but_keeps_core_shared_contract_hints() -> assert public_size < 10000 +def test_agent_card_extensions_do_not_emit_family_field() -> None: + card = build_agent_card( + make_settings(test_bearer_token="test-token"), + include_detailed_contracts=True, + ) + + assert [field.name for field in AgentExtension.DESCRIPTOR.fields] == [ + "uri", + "description", + "required", + "params", + ] + assert all( + "family" not in MessageToDict(extension) for extension in card.capabilities.extensions or [] + ) + + def test_agent_card_injects_profile_into_extensions() -> None: card = build_agent_card( make_settings( From e2300b1f82bbfac3c6fa797e625636703b3f92ce Mon Sep 17 00:00:00 2001 From: "helen@cloud" Date: Fri, 8 May 2026 11:35:59 +0800 Subject: [PATCH 2/2] Revert "Document extension family field absence" This reverts commit b7c665d6c6a8fdeca50028d8143f3028c10fc39d. --- docs/extension-specifications.md | 1 - tests/server/test_agent_card.py | 19 ------------------- 2 files changed, 20 deletions(-) diff --git a/docs/extension-specifications.md b/docs/extension-specifications.md index f557a18..33c73d4 100644 --- a/docs/extension-specifications.md +++ b/docs/extension-specifications.md @@ -16,7 +16,6 @@ Provider-private contract note: - Shared `metadata.shared.*` contracts are intended to remain low-risk and transportable. - Compatibility and wire-contract URIs are descriptive metadata contracts, not activatable runtime capabilities. - URI path segments identify the contract, not its auth or disclosure tier; public-vs-extended disclosure is controlled by Agent Card and OpenAPI surfaces. -- Extension classification is expressed through the URI, scope, and disclosure columns below; `opencode-a2a` does not emit a separate `family` field on Agent Card extensions. ## SDK and Discovery Compatibility diff --git a/tests/server/test_agent_card.py b/tests/server/test_agent_card.py index 4c676ec..e16275f 100644 --- a/tests/server/test_agent_card.py +++ b/tests/server/test_agent_card.py @@ -1,6 +1,5 @@ import json -from a2a.types import AgentExtension from google.protobuf.json_format import MessageToDict from opencode_a2a.contracts.extensions import ( @@ -136,7 +135,6 @@ def test_public_agent_card_is_slimmed_but_keeps_core_shared_contract_hints() -> "modelID": "metadata.shared.model.modelID", }, } - assert ext_by_uri[STREAMING_EXTENSION_URI].params == { "artifact_metadata_field": "metadata.shared.stream", "progress_metadata_field": "metadata.shared.progress", @@ -205,23 +203,6 @@ def test_public_agent_card_is_slimmed_but_keeps_core_shared_contract_hints() -> assert public_size < 10000 -def test_agent_card_extensions_do_not_emit_family_field() -> None: - card = build_agent_card( - make_settings(test_bearer_token="test-token"), - include_detailed_contracts=True, - ) - - assert [field.name for field in AgentExtension.DESCRIPTOR.fields] == [ - "uri", - "description", - "required", - "params", - ] - assert all( - "family" not in MessageToDict(extension) for extension in card.capabilities.extensions or [] - ) - - def test_agent_card_injects_profile_into_extensions() -> None: card = build_agent_card( make_settings(