UAT: A2aLocalFacade missing standard A2A operations message/send and message/stream — spec requires these as the primary agent conversation interface #2569

Open
opened 2026-04-03 18:56:29 +00:00 by freemo · 2 comments
Owner

Bug Report

What Was Tested

The A2aLocalFacade class (src/cleveragents/a2a/facade.py) was analyzed against the A2A protocol specification requirements for standard operations.

Expected Behavior (from spec)

The specification (§Agent-to-Agent Protocol, §Server and Client Architecture) states:

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

The spec also states (§43464):

  1. Standard A2A operations (message/send, message/stream): Routed to SessionWorkflow and actor execution (via LangGraph Platform RemoteGraph); Agent Card served at discovery endpoint

And (§23422–23423):

| message/send | Client → Server | SessionWorkflow.tell() — send user message to orchestrator actor; creates or updates a Task |
| message/stream | Client → Server | SessionWorkflow.tell() with streaming — returns TaskStatusUpdateEvent / TaskArtifactUpdateEvent via SSE |

The spec explicitly states (§43210):

In local mode, the client spawns the agent as a subprocess. A2A JSON-RPC messages flow over stdin/stdout. Standard A2A operations (message/send, message/stream) drive the conversation.

Actual Behavior

The A2aLocalFacade handler map (_handlers() method) contains only:

Extension methods (_cleveragents/*):

  • _cleveragents/plan/use, _cleveragents/plan/execute, _cleveragents/plan/apply, etc.
  • _cleveragents/registry/*, _cleveragents/context/*, _cleveragents/health/*, etc.

Legacy proprietary names (deprecated):

  • session.create, session.close, plan.create, plan.execute, etc.

Missing entirely:

  • message/send — the primary A2A operation for agent conversation
  • message/stream — the streaming variant for real-time responses
  • tasks/get — task status retrieval
  • tasks/cancel — task cancellation
  • tasks/sendSubscribe — task subscription for streaming

The dispatch() method raises A2aOperationNotFoundError for any of these standard A2A operations.

Code Location

  • src/cleveragents/a2a/facade.py_EXTENSION_OPERATIONS list (lines 57–95) and _LEGACY_OPERATIONS list (lines 98–110)
  • src/cleveragents/a2a/facade.py_handlers() method (lines 237–298)

Steps to Reproduce

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

facade = A2aLocalFacade()

# This should work per spec but raises A2aOperationNotFoundError
try:
    response = facade.dispatch(A2aRequest(
        method="message/send",
        params={"message": {"role": "user", "parts": [{"text": "Hello"}]}}
    ))
except A2aOperationNotFoundError as e:
    print(f"Bug confirmed: {e}")  # "Unknown A2A method: message/send"

Impact

High. The spec states A2A is the sole communication protocol and message/send/message/stream are the primary operations for agent conversation. Without these:

  • The session tell command cannot route through A2A in local mode
  • The TUI cannot send messages to actors via A2A
  • Third-party A2A clients cannot interact with local CleverAgents agents
  • The architectural boundary between Presentation and Application layers is broken

Note on Scope

The spec acknowledges that in local mode, A2A flows over stdio (not HTTP). The A2aLocalFacade is the in-process handler for local mode. The message/send and message/stream operations should be handled by the facade and routed to SessionWorkflow.tell(). Currently, the facade has no SessionWorkflow dependency and no handlers for these operations.


Automated by CleverAgents Bot
Supervisor: UAT Testing | Agent: ca-uat-tester

## Bug Report ### What Was Tested The `A2aLocalFacade` class (`src/cleveragents/a2a/facade.py`) was analyzed against the A2A protocol specification requirements for standard operations. ### Expected Behavior (from spec) The specification (§Agent-to-Agent Protocol, §Server and Client Architecture) states: > Standard A2A operations handle agent messaging (`message/send`, `message/stream`), task lifecycle, streaming updates, and Agent Card-based discovery. The spec also states (§43464): > 1. **Standard A2A operations** (`message/send`, `message/stream`): Routed to `SessionWorkflow` and actor execution (via LangGraph Platform RemoteGraph); Agent Card served at discovery endpoint And (§23422–23423): > | `message/send` | Client → Server | `SessionWorkflow.tell()` — send user message to orchestrator actor; creates or updates a Task | > | `message/stream` | Client → Server | `SessionWorkflow.tell()` with streaming — returns `TaskStatusUpdateEvent` / `TaskArtifactUpdateEvent` via SSE | The spec explicitly states (§43210): > In **local mode**, the client spawns the agent as a subprocess. A2A JSON-RPC messages flow over stdin/stdout. Standard A2A operations (`message/send`, `message/stream`) drive the conversation. ### Actual Behavior The `A2aLocalFacade` handler map (`_handlers()` method) contains only: **Extension methods** (`_cleveragents/*`): - `_cleveragents/plan/use`, `_cleveragents/plan/execute`, `_cleveragents/plan/apply`, etc. - `_cleveragents/registry/*`, `_cleveragents/context/*`, `_cleveragents/health/*`, etc. **Legacy proprietary names** (deprecated): - `session.create`, `session.close`, `plan.create`, `plan.execute`, etc. **Missing entirely:** - `message/send` — the primary A2A operation for agent conversation - `message/stream` — the streaming variant for real-time responses - `tasks/get` — task status retrieval - `tasks/cancel` — task cancellation - `tasks/sendSubscribe` — task subscription for streaming The `dispatch()` method raises `A2aOperationNotFoundError` for any of these standard A2A operations. ### Code Location - `src/cleveragents/a2a/facade.py` — `_EXTENSION_OPERATIONS` list (lines 57–95) and `_LEGACY_OPERATIONS` list (lines 98–110) - `src/cleveragents/a2a/facade.py` — `_handlers()` method (lines 237–298) ### Steps to Reproduce ```python from cleveragents.a2a.facade import A2aLocalFacade from cleveragents.a2a.models import A2aRequest from cleveragents.a2a.errors import A2aOperationNotFoundError facade = A2aLocalFacade() # This should work per spec but raises A2aOperationNotFoundError try: response = facade.dispatch(A2aRequest( method="message/send", params={"message": {"role": "user", "parts": [{"text": "Hello"}]}} )) except A2aOperationNotFoundError as e: print(f"Bug confirmed: {e}") # "Unknown A2A method: message/send" ``` ### Impact **High.** The spec states A2A is the **sole** communication protocol and `message/send`/`message/stream` are the primary operations for agent conversation. Without these: - The `session tell` command cannot route through A2A in local mode - The TUI cannot send messages to actors via A2A - Third-party A2A clients cannot interact with local CleverAgents agents - The architectural boundary between Presentation and Application layers is broken ### Note on Scope The spec acknowledges that in local mode, A2A flows over stdio (not HTTP). The `A2aLocalFacade` is the in-process handler for local mode. The `message/send` and `message/stream` operations should be handled by the facade and routed to `SessionWorkflow.tell()`. Currently, the facade has no `SessionWorkflow` dependency and no handlers for these operations. --- **Automated by CleverAgents Bot** Supervisor: UAT Testing | Agent: ca-uat-tester
Author
Owner

Issue triaged by project owner:

  • State: Verified
  • MoSCoW: Should Have

Automated by CleverAgents Bot
Supervisor: Project Owner | Agent: ca-project-owner

Issue triaged by project owner: - **State**: Verified - **MoSCoW**: Should Have --- **Automated by CleverAgents Bot** Supervisor: Project Owner | Agent: ca-project-owner
Author
Owner

Issue triaged by project owner:

  • State: Verified — A2aLocalFacade missing standard A2A operations message/send and message/stream. This is a core A2A compliance gap.
  • Existing Priority/High and MoSCoW/Should Have labels are appropriate. Consider elevating to Must Havemessage/send is the primary agent conversation interface per the spec.
  • Parent Epic: #933 (A2A Protocol Compliance)

This issue is tightly coupled with #2574 (A2A Task lifecycle model) — the Task model must be implemented before message/send can work properly.


Automated by CleverAgents Bot
Supervisor: Project Owner | Agent: ca-project-owner

Issue triaged by project owner: - **State**: Verified — A2aLocalFacade missing standard A2A operations `message/send` and `message/stream`. This is a core A2A compliance gap. - Existing Priority/High and MoSCoW/Should Have labels are appropriate. Consider elevating to **Must Have** — `message/send` is the primary agent conversation interface per the spec. - **Parent Epic**: #933 (A2A Protocol Compliance) This issue is tightly coupled with #2574 (A2A Task lifecycle model) — the Task model must be implemented before message/send can work properly. --- **Automated by CleverAgents Bot** Supervisor: Project Owner | Agent: ca-project-owner
freemo added this to the v3.8.0 milestone 2026-04-05 04:53:57 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cleveragents/cleveragents-core#2569
No description provided.