Each test is run against both the JSON-RPC and HTTP+JSON (REST) bindings. Full test specifications are in acceptance.yaml.
GET /echo/.well-known/agent-card.json with the
A2A-Version: 1.0 header. Verify it conforms to the v1.0 AgentCard schema.
name, description, version, supportedInterfaces, capabilities, skillssupportedInterfaces[0] has a valid URL, protocolBinding = JSONRPC, protocolVersion = 1.0skills array contains at least 1 entrydefaultInputModes and defaultOutputModes are presentcapabilities.streaming is trueid, name, and descriptionprotocolVersion = 1.0Message
(not a Task) containing the echoed text. This is the simplest possible A2A interaction.
result.message (not result.task)ROLE_AGENTmessageId and parts arrayMessage
(not a Task). Tests the simplest spec agent interaction pattern where no task state machine is involved.
result.message but NOT result.taskROLE_AGENTSUBMITTED → WORKING → COMPLETED and returns the final task with at least one artifact.
Because returnImmediately defaults to false, the response blocks until the task reaches a terminal state.
result.task with state TASK_STATE_COMPLETEDGetTask callsGetTask with the task ID.
Tests that task state is persisted and can be queried after creation. Also exercises historyLength
control — historyLength=0 should omit history.
GetTask returns the same task ID in TASK_STATE_COMPLETED statehistoryLength=0, history is absent or emptyhistoryLength, default history behavior appliesTASK_STATE_FAILED
with an error message in status.message. Tests proper error state handling.
TASK_STATE_FAILED statestatus.message exists with role ROLE_AGENTtext, data (structured JSON), and file
(binary content with mediaType). Tests that all part types serialize and deserialize correctly across languages.
TASK_STATE_COMPLETEDtext field)data as a JSON object)mediaType and content)SendStreamingMessage. The agent responds with
text/event-stream containing JSON-RPC wrapped SSE events: status updates,
artifact updates, and a final task in terminal state. Tests the full SSE streaming lifecycle.
text/event-stream with multiple SSE data: linesartifactUpdate with partsCOMPLETED or FAILED)INPUT_REQUIRED state.
The client sends follow-up messages referencing the taskId. Sending "done" completes the task.
Tests the stateful multi-turn conversation pattern with task context preservation.
TASK_STATE_INPUT_REQUIRED, returns taskId and contextIdtaskId → task remains INPUT_REQUIREDTASK_STATE_COMPLETEDreturnImmediately: true so the agent returns immediately
with a WORKING task. Then cancel it with CancelTask. Tests the task
cancellation lifecycle.
returnImmediately: true returns task in SUBMITTED or WORKINGCancelTask with captured task ID succeedsTASK_STATE_CANCELEDGetTask confirms task remains CANCELEDtask-cancel skill), then cancel it with
metadata attached to the CancelTask request. The metadata includes
{"reason": "test-cancel-reason", "requestedBy": "<sdk-name>"}. The server echoes
the metadata back on the cancelled task. Tests that SDKs can send metadata with cancel requests and
that metadata round-trips correctly.
CancelTask request includes metadata fieldTASK_STATE_CANCELEDmetadata contains reason and requestedBy keysListTasks to retrieve them. Tests that the server
correctly tracks and returns previously created tasks. The response should contain at least one task
from the current session.
ListTasks returns a list with at least 1 taskid and status.statereturnImmediately: true. The agent MUST return
immediately with a task in a non-terminal state (SUBMITTED or WORKING).
The client then polls with GetTask until the task reaches COMPLETED.
Tests the async polling pattern.
SUBMITTED or WORKING (non-terminal)GetTask eventually reaches TASK_STATE_COMPLETEDGetTask with a non-existent task ID. The agent MUST return a JSON-RPC error with
code -32001 (TaskNotFoundError). Tests proper error handling for missing resources.
error (not result)error.code is -32001 (TaskNotFoundError)error.message is a descriptive string404CancelTask with a non-existent task ID. The agent MUST return a
TaskNotFoundError (code -32001).
error.code = -32001task-lifecycle), then attempt to cancel it. The agent SHOULD
return an error since the task is already in a terminal state.
taskId. The agent SHOULD
return an error because the task is already in a terminal state.
taskId that doesn't exist. The agent MUST return a
TaskNotFoundError.
-32001 (TaskNotFoundError)SetPushNotificationConfig on an agent that does not advertise push notification
support. The agent MUST return a PushNotificationsNotSupportedError (code -32003).
-32003SubscribeToTask with a non-existent task ID. The agent MUST return a
TaskNotFoundError.
SendMessage (with task-lifecycle skill), then call
SubscribeToTask with the returned taskId. Verifies that the agent
returns the current task state via SSE.
message-only request. The agent returns a message event (no task created)
via SSE.
task-lifecycle request. The agent streams status updates and artifact
chunks as the task progresses through submitted → working → completed.
taskId.
Verify the task context (taskId) is preserved across turns.
taskIdGetTask with historyLength to retrieve
the task with its message history.
task-failure skill), then call GetTask.
The task MUST be in the failed state.
failed/spec03/.well-known/agent-card.json. This endpoint serves a
native v0.3-format card with url and protocolVersion: "0.3.0" fields
instead of supportedInterfaces. Verifies that the card format is correct v0.3.
protocolVersion = "0.3.0"url field is present (v0.3 format)supportedInterfaces array/spec03 agent (which serves a v0.3 card) and
send a message-only hello message. Tests whether the SDK can detect a v0.3 agent
and fall back to the v0.3 protocol automatically.
task-lifecycle process to the v0.3 agent via the SDK. Tests whether the SDK
can complete a full task lifecycle (submitted → working → completed) when talking to a v0.3 agent.
completed statestreaming generate to the v0.3 agent via the SDK. Tests whether the SDK can
handle SSE streaming with v0.3 protocol (method name message/stream, v0.3 state names).