Files
cleveragents-core/features/agent_card.feature
T
HAL9000 e4224eb8ec fix(a2a): resolve JSON-RPC protocol conformance and code quality issues
- Fix malformed JSON parse error: wrap request.json() in try/except,
  return -32700 Parse error instead of unhandled HTTP 500
- Fix JSON-RPC error responses: add required 'id' field to all error
  responses per JSON-RPC 2.0 Section 5
- Fix HTTP status codes: return HTTP 200 for all JSON-RPC responses
  (error codes expressed in JSON body per JSON-RPC 2.0 over HTTP)
- Fix error message leakage: return generic messages instead of raw
  Pydantic ValidationError internals (CWE-209)
- Add catch-all exception handler returning -32603 Internal error
- Fix Agent Card url field: use base server URL without /a2a suffix;
  interfaces[0].url correctly uses endpoint URL with /a2a suffix
- Fix 0.0.0.0 host: substitute 127.0.0.1 for Agent Card URL
- Fix context typing: replace context: Any with context: Context in
  all step files per project convention
- Fix inline imports: move all imports to top of step files
- Fix _COMMANDS typing: use dict[str, Callable[[], None]] to avoid
  type: ignore suppression in helper files
- Add BDD scenarios for entity-sync and namespace-mgmt skill enumeration
- Update server_lifecycle.feature: correct HTTP status assertions to 200

ISSUES CLOSED: #867
2026-06-11 19:58:52 -04:00

230 lines
10 KiB
Gherkin

@phase2 @a2a @agent_card
Feature: A2A Agent Card Discovery
As an A2A-compatible client
I want to discover the agent's capabilities via an Agent Card
So that I can determine which operations the CleverAgents server supports
# -----------------------------------------------------------------------
# Agent Card model construction
# -----------------------------------------------------------------------
Scenario: Build an Agent Card with a facade
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card name should be "CleverAgents"
And the agent card version should be "1.0"
And the agent card should have a non-empty url
And the agent card should have at least 1 skill
And the agent card should have at least 1 extension
Scenario: Build an Agent Card without a facade
When I build an agent card without a facade
Then the agent card name should be "CleverAgents"
And the agent card version should be "1.0"
And the agent card should have 0 skills
Scenario: Agent Card includes supported versions
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card supported versions should contain "1.0"
Scenario: Agent Card includes supported operations
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card should list extension operations
Scenario: Agent Card includes security schemes
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card should have at least 1 security scheme
Scenario: Agent Card includes protocol interfaces
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card should have at least 1 interface
And the first interface protocol should be "jsonrpc"
Scenario: Agent Card includes default input and output modes
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card default input modes should contain "text"
And the agent card default output modes should contain "text"
Scenario: Agent Card capabilities reflect current state
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card streaming capability should be false
And the agent card push notifications capability should be false
# -----------------------------------------------------------------------
# Agent Card validation
# -----------------------------------------------------------------------
Scenario: Build rejects invalid host
When I try to build an agent card with an empty host
Then a ValueError should be raised for agent card
Scenario: Build rejects invalid port zero
When I try to build an agent card with port 0
Then a ValueError should be raised for agent card
Scenario: Build rejects port above 65535
When I try to build an agent card with port 70000
Then a ValueError should be raised for agent card
# -----------------------------------------------------------------------
# Agent Card model validation
# -----------------------------------------------------------------------
Scenario: AgentCard rejects empty name
When I try to create an AgentCard with empty name
Then a validation error should be raised for agent card
Scenario: AgentCard rejects empty version
When I try to create an AgentCard with empty version
Then a validation error should be raised for agent card
Scenario: AgentCardSkill rejects empty id
When I try to create an AgentCardSkill with empty id
Then a validation error should be raised for agent card
Scenario: AgentCardSkill rejects empty name
When I try to create an AgentCardSkill with empty skill name
Then a validation error should be raised for agent card
Scenario: AgentCardExtension rejects empty uri
When I try to create an AgentCardExtension with empty uri
Then a validation error should be raised for agent card
Scenario: AgentCardSecurityScheme rejects empty type
When I try to create an AgentCardSecurityScheme with empty type
Then a validation error should be raised for agent card
Scenario: AgentCardInterface rejects empty protocol
When I try to create an AgentCardInterface with empty protocol
Then a validation error should be raised for agent card
# -----------------------------------------------------------------------
# A2A conformance validation
# -----------------------------------------------------------------------
Scenario: Valid Agent Card passes conformance validation
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
And I validate the agent card conformance
Then the conformance violations should be empty
Scenario: Agent Card with empty url fails conformance
Given an agent card with empty url
When I validate the agent card conformance
Then the conformance violations should include "url is required"
Scenario: Agent Card with unsupported version fails conformance
Given an agent card with version "99.0"
When I validate the agent card conformance
Then the conformance violations should include "not in supported versions"
Scenario: Agent Card with empty supportedVersions fails conformance
Given an agent card with empty supported versions
When I validate the agent card conformance
Then the conformance violations should include "supportedVersions must not be empty"
Scenario: Conformance validation rejects non-AgentCard argument
When I try to validate conformance of a non-AgentCard object
Then a TypeError should be raised for conformance validation
# -----------------------------------------------------------------------
# Serialization
# -----------------------------------------------------------------------
Scenario: Agent Card serializes to dict
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
And I serialize the agent card to dict
Then the serialized dict should have key "name"
And the serialized dict should have key "version"
And the serialized dict should have key "capabilities"
And the serialized dict should have key "skills"
And the serialized dict should have key "supportedVersions"
And the serialized dict should have key "supportedOperations"
Scenario: agent_card_to_dict rejects non-AgentCard argument
When I try to serialize a non-AgentCard object
Then a TypeError should be raised for serialization
# -----------------------------------------------------------------------
# Discovery endpoint (ASGI)
# -----------------------------------------------------------------------
Scenario: Discovery endpoint returns Agent Card with skills
Given a running ASGI test client with facade
When I request GET /.well-known/agent.json
Then the response status code should be 200
And the response body should contain "CleverAgents"
And the response body should contain "skills"
And the response body should contain "supportedVersions"
And the response body should contain "supportedOperations"
Scenario: Discovery endpoint Agent Card has correct structure
Given a running ASGI test client with facade
When I request GET /.well-known/agent.json and parse JSON
Then the agent card JSON should have key "name" with value "CleverAgents"
And the agent card JSON should have key "version" with value "1.0"
And the agent card JSON "capabilities" should be a dict
And the agent card JSON "skills" should be a non-empty list
And the agent card JSON "supportedVersions" should be a non-empty list
Scenario: Discovery endpoint Agent Card lists extension operations
Given a running ASGI test client with facade
When I request GET /.well-known/agent.json and parse JSON
Then the agent card JSON "supportedOperations" should be a non-empty list
And all supported operations should start with "_cleveragents/"
# -----------------------------------------------------------------------
# Skill enumeration from facade
# -----------------------------------------------------------------------
Scenario: Agent Card enumerates plan lifecycle skill
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card skills should include id "plan-lifecycle"
Scenario: Agent Card enumerates registry skill
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card skills should include id "registry-crud"
Scenario: Agent Card enumerates context skill
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card skills should include id "context-mgmt"
Scenario: Agent Card enumerates health skill
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card skills should include id "health-diagnostics"
# -----------------------------------------------------------------------
# Additional conformance edge cases
# -----------------------------------------------------------------------
Scenario: Agent Card with empty defaultInputModes fails conformance
Given an agent card with empty default input modes
When I validate the agent card conformance
Then the conformance violations should include "defaultInputModes must not be empty"
Scenario: Agent Card with empty defaultOutputModes fails conformance
Given an agent card with empty default output modes
When I validate the agent card conformance
Then the conformance violations should include "defaultOutputModes must not be empty"
Scenario: Agent Card enumerates entity sync skill
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card skills should include id "entity-sync"
Scenario: Agent Card enumerates namespace management skill
Given an A2aLocalFacade for agent card testing
When I build an agent card from the facade
Then the agent card skills should include id "namespace-mgmt"