feat(a2a): implement JSON-RPC 2.0 wire format and method routing #708

Closed
freemo wants to merge 2 commits from feature/m9-a2a-jsonrpc into master
Owner

Summary

Implements the A2A JSON-RPC 2.0 wire format and method routing layer per ADR-047 and the specification (§Architecture > A2A Integration Architecture), replacing the custom ACP envelope types with standard JSON-RPC 2.0 via the A2A SDK.

Closes #690

Changes

New modules in src/cleveragents/a2a/

  • jsonrpc_models.py — Pydantic models for JSON-RPC 2.0 request/response/error envelopes, batch support, and A2A-specific method parameters
  • jsonrpc_router.py — Method routing dispatcher supporting standard A2A methods (message/send, message/stream, tasks/get, tasks/cancel) and _cleveragents/ extension methods (plan/, registry/, context/, sync/, namespace/*, health)
  • jsonrpc_handlers.py — Handler implementations for each routed method, delegating to existing application services
  • jsonrpc_errors.py — Error taxonomy mapping domain exceptions to JSON-RPC error codes (-32600 through -32099 for A2A-specific errors)
  • agent_card.py — Agent Card generation for /.well-known/agent.json endpoint, declaring capabilities, supported interfaces, auth schemes, and _cleveragents/ extensions

Test files

  • features/a2a_jsonrpc.feature + step definitions — BDD tests for JSON-RPC routing, error codes, and Agent Card
  • robot/a2a_jsonrpc.robot + helper — Integration tests for wire format compliance

Quality Checks

  • nox -e typecheck — 0 Pyright errors
  • nox -e lint — all checks passed
  • nox -e format — all files unchanged
## Summary Implements the A2A JSON-RPC 2.0 wire format and method routing layer per ADR-047 and the specification (§Architecture > A2A Integration Architecture), replacing the custom ACP envelope types with standard JSON-RPC 2.0 via the A2A SDK. Closes #690 ## Changes ### New modules in `src/cleveragents/a2a/` - **`jsonrpc_models.py`** — Pydantic models for JSON-RPC 2.0 request/response/error envelopes, batch support, and A2A-specific method parameters - **`jsonrpc_router.py`** — Method routing dispatcher supporting standard A2A methods (`message/send`, `message/stream`, `tasks/get`, `tasks/cancel`) and `_cleveragents/` extension methods (plan/*, registry/*, context/*, sync/*, namespace/*, health) - **`jsonrpc_handlers.py`** — Handler implementations for each routed method, delegating to existing application services - **`jsonrpc_errors.py`** — Error taxonomy mapping domain exceptions to JSON-RPC error codes (-32600 through -32099 for A2A-specific errors) - **`agent_card.py`** — Agent Card generation for `/.well-known/agent.json` endpoint, declaring capabilities, supported interfaces, auth schemes, and `_cleveragents/` extensions ### Test files - `features/a2a_jsonrpc.feature` + step definitions — BDD tests for JSON-RPC routing, error codes, and Agent Card - `robot/a2a_jsonrpc.robot` + helper — Integration tests for wire format compliance ## Quality Checks - `nox -e typecheck` — 0 Pyright errors - `nox -e lint` — all checks passed - `nox -e format` — all files unchanged
refactor(a2a): rename ACP module and symbols to A2A standard
All checks were successful
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 20s
CI / build (pull_request) Successful in 16s
CI / quality (pull_request) Successful in 35s
CI / security (pull_request) Successful in 47s
CI / typecheck (pull_request) Successful in 1m37s
CI / integration_tests (pull_request) Successful in 3m38s
CI / unit_tests (pull_request) Successful in 4m44s
CI / docker (pull_request) Successful in 1m6s
CI / coverage (pull_request) Successful in 5m30s
CI / benchmark-regression (pull_request) Successful in 35m37s
2fe95d1b38
Renamed src/cleveragents/acp/ to src/cleveragents/a2a/ and all 13
Acp* classes to A2a* per ADR-047 (A2A Standard Adoption). Updated
all imports, structlog event names (acp.* → a2a.*), field names
(acp_version → a2a_version), and test references across the entire
codebase. This is a cosmetic rename only — no behavioral changes.

ISSUES CLOSED: #688
feat(a2a): implement JSON-RPC 2.0 wire format and method routing
All checks were successful
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 14s
CI / build (pull_request) Successful in 16s
CI / quality (pull_request) Successful in 18s
CI / security (pull_request) Successful in 35s
CI / typecheck (pull_request) Successful in 55s
CI / unit_tests (pull_request) Successful in 2m57s
CI / integration_tests (pull_request) Successful in 3m23s
CI / docker (pull_request) Successful in 41s
CI / coverage (pull_request) Successful in 5m36s
CI / benchmark-regression (pull_request) Successful in 35m11s
33900eab03
Implement the JSON-RPC 2.0 wire format layer and method routing for the
A2A protocol, building on the ACP-to-A2A rename from #688.

New modules in src/cleveragents/a2a/:
- jsonrpc_models.py: Pydantic v2 models for JSON-RPC 2.0 request,
  response, error, and notification envelopes
- jsonrpc_router.py: Method router that dispatches JSON-RPC requests
  to registered handlers, with support for standard A2A methods and
  _cleveragents/ extension methods
- jsonrpc_handlers.py: Handlers for standard A2A methods (message/send,
  message/stream, tasks/get, tasks/cancel) and extension method factory
  that delegates to A2aLocalFacade
- jsonrpc_errors.py: Maps domain error taxonomy to JSON-RPC 2.0 error
  codes (standard -32700 to -32603, application -32001 to -32008)
- agent_card.py: Agent Card model and generation for the
  /.well-known/agent.json capability advertisement endpoint

Standard A2A methods:
- message/send: Create/update tasks via messages
- message/stream: Streaming variant with SSE event indicators
- tasks/get: Retrieve task by ID
- tasks/cancel: Cancel running tasks

CleverAgents extension methods (_cleveragents/ prefix):
- plan/use, execute, status, diff, apply, cancel
- registry/list_tools, list_resources
- context/show
- sync/status
- namespace/list
- health

Tests:
- Behave BDD: features/a2a_jsonrpc.feature (28 scenarios)
- Robot Framework: robot/a2a_jsonrpc.robot (9 integration tests)

ISSUES CLOSED: #690
freemo added this to the v3.8.0 milestone 2026-03-12 01:01:11 +00:00
freemo self-assigned this 2026-03-12 20:33:28 +00:00
Author
Owner

PM Status — Day 32

State: CONFLICTED — needs rebase onto master.

Priority: Low — M9 (v3.8.0) has no deadline and current focus should remain on M3-M6. This is exploratory/ahead-of-schedule work.

Dependency chain: This PR (#708, JSON-RPC wire format) is the foundation. #713 (stdio) and #720 (HTTP) depend on it. #722 (LangGraph Platform) depends on both transports.

Recommended merge order: #708#713#720#722

Missing labels: Adding Priority/Low, MoSCoW/Could have, Points/13, State/In Progress.

Note on file overlap: #713 and #720 both create transport_protocol.py and transport_selector.py independently. This will need reconciliation during merge — #713 should merge first, then #720 rebases onto it.

@freemo — No rush on the rebase. Focus on merging the 3 approved PRs first (#723, #681, #725), then the mock removal #699/#701 pipeline. These M9 PRs can wait.

### PM Status — Day 32 **State:** CONFLICTED — needs rebase onto master. **Priority:** Low — M9 (v3.8.0) has no deadline and current focus should remain on M3-M6. This is exploratory/ahead-of-schedule work. **Dependency chain:** This PR (#708, JSON-RPC wire format) is the foundation. #713 (stdio) and #720 (HTTP) depend on it. #722 (LangGraph Platform) depends on both transports. **Recommended merge order:** #708 → #713 → #720 → #722 **Missing labels:** Adding Priority/Low, MoSCoW/Could have, Points/13, State/In Progress. **Note on file overlap:** #713 and #720 both create `transport_protocol.py` and `transport_selector.py` independently. This will need reconciliation during merge — #713 should merge first, then #720 rebases onto it. @freemo — No rush on the rebase. Focus on merging the 3 approved PRs first (#723, #681, #725), then the mock removal #699/#701 pipeline. These M9 PRs can wait.
Author
Owner

Rebase Required

@freemo — This PR has merge conflicts with master. Please rebase onto the latest master and force-push. See also: #668, #669, #703, #713, #720, #722 (all need rebase).

## Rebase Required @freemo — This PR has merge conflicts with `master`. Please rebase onto the latest `master` and force-push. See also: #668, #669, #703, #713, #720, #722 (all need rebase).
Author
Owner

PM Review — Day 34

Status: NOT mergeable (conflicts), 0 reviews, M9 (v3.8.0), Priority/Low, Points/13
Author: @freemo

A2A JSON-RPC 2.0 wire format and method routing. M9 is furthest-out milestone — lowest urgency.

[BLOCKING] Merge conflicts. No action needed until M9 sprint.

Action Items

Who Action Deadline
@freemo Rebase when M9 sprint begins M9 sprint
## PM Review — Day 34 **Status**: NOT mergeable (conflicts), 0 reviews, M9 (v3.8.0), Priority/Low, Points/13 **Author**: @freemo A2A JSON-RPC 2.0 wire format and method routing. M9 is furthest-out milestone — lowest urgency. **[BLOCKING] Merge conflicts.** No action needed until M9 sprint. ### Action Items | Who | Action | Deadline | |-----|--------|----------| | @freemo | Rebase when M9 sprint begins | M9 sprint |
freemo left a comment

PM Day 36: JSON-RPC 2.0 wire format and method routing. M9 scope (deferred). @freemo author.

PM Day 36: JSON-RPC 2.0 wire format and method routing. M9 scope (deferred). @freemo author.
Author
Owner

This feature is for a later version, so closing it and will do it at the appropriate time.

This feature is for a later version, so closing it and will do it at the appropriate time.
freemo closed this pull request 2026-03-16 22:34:31 +00:00
All checks were successful
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 14s
Required
Details
CI / build (pull_request) Successful in 16s
Required
Details
CI / quality (pull_request) Successful in 18s
Required
Details
CI / security (pull_request) Successful in 35s
Required
Details
CI / typecheck (pull_request) Successful in 55s
Required
Details
CI / unit_tests (pull_request) Successful in 2m57s
Required
Details
CI / integration_tests (pull_request) Successful in 3m23s
Required
Details
CI / docker (pull_request) Successful in 41s
Required
Details
CI / coverage (pull_request) Successful in 5m36s
Required
Details
CI / benchmark-regression (pull_request) Successful in 35m11s

Pull request closed

Sign in to join this conversation.
No reviewers
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.

Reference
cleveragents/cleveragents-core!708
No description provided.