UAT: A2A facade missing standard message/send and message/stream operations — spec requires these as primary conversation entry points #3590

Open
opened 2026-04-05 20:11:49 +00:00 by freemo · 1 comment
Owner

Metadata

  • Branch: fix/a2a-message-send-stream-operations
  • Commit Message: feat(a2a): implement message/send and message/stream standard A2A operations
  • Milestone: v3.6.0
  • Parent Epic: #366

Background

Per docs/specification.md (line 55, 166, 23422-23423, 23477), the A2A protocol is the sole communication protocol for all client-server interaction. The specification explicitly states:

Standard A2A operations handle agent messaging (message/send, message/stream), task lifecycle, streaming updates, and Agent Card-based discovery.

In local mode, the agent runs as a subprocess. Standard A2A operations (message/send, message/stream) drive the conversation.

The spec further defines (line 23422-23423):

  • message/sendSessionWorkflow.tell() — send user message to orchestrator actor; creates or updates a Task
  • message/streamSessionWorkflow.tell() with streaming — returns TaskStatusUpdateEvent / TaskArtifactUpdateEvent via SSE

Current Behavior

A2aLocalFacade._EXTENSION_OPERATIONS and _LEGACY_OPERATIONS in src/cleveragents/a2a/facade.py do not include message/send or message/stream. These are the standard A2A protocol operations (not _cleveragents/ extensions), and they are completely absent from the facade's supported operations list and handler map.

Calling facade.dispatch(A2aRequest(method="message/send", params={...})) raises A2aOperationNotFoundError: Unknown A2A method: message/send.

Code location: src/cleveragents/a2a/facade.py_EXTENSION_OPERATIONS, _LEGACY_OPERATIONS, and _handlers() method.

Expected Behavior

Per the specification, message/send and message/stream must be supported by the A2A facade:

  1. message/send — synchronous: accepts a message payload, routes to SessionWorkflow.tell(), returns a completed Task result
  2. message/stream — streaming: accepts a message payload, routes to SessionWorkflow.tell() with streaming, returns SSE events (TaskStatusUpdateEvent, TaskArtifactUpdateEvent)

A2A uses a Task-centric model: each message/send or message/stream creates or updates a Task that transitions through states: submittedworkingcompleted (or failed, canceled, input-required).

Impact

Without message/send and message/stream, the A2A facade cannot serve as the primary conversation entry point as required by the spec. All clients (CLI, TUI, IDE plugins) that attempt to send user messages via the standard A2A protocol will receive A2aOperationNotFoundError. This is a critical gap that blocks the milestone's core acceptance criteria.

Steps to Reproduce

from cleveragents.a2a.facade import A2aLocalFacade
from cleveragents.a2a.models import A2aRequest

facade = A2aLocalFacade()
response = facade.dispatch(A2aRequest(method="message/send", params={"message": {"role": "user", "content": "hello"}}))
# Raises: A2aOperationNotFoundError: Unknown A2A method: message/send

Subtasks

  • Add message/send to _EXTENSION_OPERATIONS (or a new _STANDARD_OPERATIONS list) in facade.py
  • Add message/stream to the operations list
  • Implement _handle_message_send() — routes to SessionWorkflow.tell() or stub when service absent
  • Implement _handle_message_stream() — routes to streaming SessionWorkflow.tell() or stub
  • Implement Task lifecycle model: submitted → working → completed states
  • Add TaskStatusUpdateEvent and TaskArtifactUpdateEvent to A2aEventQueue publishing
  • Write Behave unit tests for both operations
  • Verify all nox stages pass

Definition of Done

  • message/send and message/stream are supported by A2aLocalFacade
  • Both operations return valid Task-centric responses
  • Unit tests cover both operations
  • All nox stages pass; coverage ≥ 97%

Automated by CleverAgents Bot
Supervisor: UAT Testing | Agent: ca-new-issue-creator

## Metadata - **Branch**: `fix/a2a-message-send-stream-operations` - **Commit Message**: `feat(a2a): implement message/send and message/stream standard A2A operations` - **Milestone**: v3.6.0 - **Parent Epic**: #366 ## Background Per `docs/specification.md` (line 55, 166, 23422-23423, 23477), the A2A protocol is the **sole** communication protocol for all client-server interaction. The specification explicitly states: > Standard A2A operations handle agent messaging (`message/send`, `message/stream`), task lifecycle, streaming updates, and Agent Card-based discovery. > In **local mode**, the agent runs as a subprocess. Standard A2A operations (`message/send`, `message/stream`) drive the conversation. The spec further defines (line 23422-23423): - `message/send` → `SessionWorkflow.tell()` — send user message to orchestrator actor; creates or updates a Task - `message/stream` → `SessionWorkflow.tell()` with streaming — returns `TaskStatusUpdateEvent` / `TaskArtifactUpdateEvent` via SSE ## Current Behavior `A2aLocalFacade._EXTENSION_OPERATIONS` and `_LEGACY_OPERATIONS` in `src/cleveragents/a2a/facade.py` do **not** include `message/send` or `message/stream`. These are the standard A2A protocol operations (not `_cleveragents/` extensions), and they are completely absent from the facade's supported operations list and handler map. Calling `facade.dispatch(A2aRequest(method="message/send", params={...}))` raises `A2aOperationNotFoundError: Unknown A2A method: message/send`. **Code location:** `src/cleveragents/a2a/facade.py` — `_EXTENSION_OPERATIONS`, `_LEGACY_OPERATIONS`, and `_handlers()` method. ## Expected Behavior Per the specification, `message/send` and `message/stream` must be supported by the A2A facade: 1. `message/send` — synchronous: accepts a message payload, routes to `SessionWorkflow.tell()`, returns a completed Task result 2. `message/stream` — streaming: accepts a message payload, routes to `SessionWorkflow.tell()` with streaming, returns SSE events (`TaskStatusUpdateEvent`, `TaskArtifactUpdateEvent`) A2A uses a **Task-centric model**: each `message/send` or `message/stream` creates or updates a Task that transitions through states: `submitted` → `working` → `completed` (or `failed`, `canceled`, `input-required`). ## Impact Without `message/send` and `message/stream`, the A2A facade cannot serve as the primary conversation entry point as required by the spec. All clients (CLI, TUI, IDE plugins) that attempt to send user messages via the standard A2A protocol will receive `A2aOperationNotFoundError`. This is a critical gap that blocks the milestone's core acceptance criteria. ## Steps to Reproduce ```python from cleveragents.a2a.facade import A2aLocalFacade from cleveragents.a2a.models import A2aRequest facade = A2aLocalFacade() response = facade.dispatch(A2aRequest(method="message/send", params={"message": {"role": "user", "content": "hello"}})) # Raises: A2aOperationNotFoundError: Unknown A2A method: message/send ``` ## Subtasks - [ ] Add `message/send` to `_EXTENSION_OPERATIONS` (or a new `_STANDARD_OPERATIONS` list) in `facade.py` - [ ] Add `message/stream` to the operations list - [ ] Implement `_handle_message_send()` — routes to `SessionWorkflow.tell()` or stub when service absent - [ ] Implement `_handle_message_stream()` — routes to streaming `SessionWorkflow.tell()` or stub - [ ] Implement Task lifecycle model: submitted → working → completed states - [ ] Add `TaskStatusUpdateEvent` and `TaskArtifactUpdateEvent` to `A2aEventQueue` publishing - [ ] Write Behave unit tests for both operations - [ ] Verify all nox stages pass ## Definition of Done - [ ] `message/send` and `message/stream` are supported by `A2aLocalFacade` - [ ] Both operations return valid Task-centric responses - [ ] Unit tests cover both operations - [ ] All nox stages pass; coverage ≥ 97% --- **Automated by CleverAgents Bot** Supervisor: UAT Testing | Agent: ca-new-issue-creator
freemo added this to the v3.6.0 milestone 2026-04-05 20:11:53 +00:00
freemo removed this from the v3.6.0 milestone 2026-04-06 23:37:50 +00:00
Owner

Label compliance fix applied:

  • Removed conflicting label: State/Unverified (issue already has State/In Progress)
  • Normalized label IDs to canonical versions
  • Reason: CONTRIBUTING.md requires exactly one State/* label per issue. State/In Progress is the more advanced state.

Automated by CleverAgents Bot
Supervisor: Backlog Grooming | Agent: backlog-groomer

Label compliance fix applied: - Removed conflicting label: `State/Unverified` (issue already has `State/In Progress`) - Normalized label IDs to canonical versions - Reason: CONTRIBUTING.md requires exactly one `State/*` label per issue. `State/In Progress` is the more advanced state. --- **Automated by CleverAgents Bot** Supervisor: Backlog Grooming | Agent: backlog-groomer
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Blocks
#366 Epic: Post-MVP Deferred Work
cleveragents/cleveragents-core
Reference
cleveragents/cleveragents-core#3590
No description provided.