Skip to content

Standards conformance

ROADMAP.md section 4 asks for this table to be generated rather than written by hand. Every row's status is computed by scanning the listed files for evidence - see the Evidence model section at the bottom for exactly what a check proves.

Status Meaning
implemented every evidence check passed
partial some evidence checks passed
planned no evidence yet; README/ROADMAP say planned
missing no evidence; nothing claims it exists (includes deliberate gaps)
Standard Capability Status Evidence
MCP Server: Streamable HTTP endpoint POST /mcp (mcpserver profile, Spring AI MCP server) implemented core/app-config/src/main/resources/application-mcpserver.yml
core/mcpserver/src/main/java/com/agenticai/core/mcpserver/McpServerToolConfig.java
core/security/src/main/java/com/agenticai/core/security/SecurityConfig.java
core/mcpserver/pom.xml
MCP Server: curated tools list_my_agents, call_agent, list_my_workflows, call_workflow, search_knowledge implemented core/mcpserver/src/main/java/com/agenticai/core/mcpserver/tools/McpListAgentsToolCallback.java
core/mcpserver/src/main/java/com/agenticai/core/mcpserver/tools/McpCallAgentToolCallback.java
core/mcpserver/src/main/java/com/agenticai/core/mcpserver/tools/McpListMyWorkflowsToolCallback.java
core/mcpserver/src/main/java/com/agenticai/core/mcpserver/tools/McpCallWorkflowToolCallback.java
core/mcpserver/src/main/java/com/agenticai/core/mcpserver/tools/McpSearchKnowledgeToolCallback.java
MCP Server: async task tools start_agent_task/get_task/cancel_task (off by default: app.mcpserver.async-tasks.enabled) implemented core/mcpserver/src/main/java/com/agenticai/core/mcpserver/tools/McpAgentTaskToolCallbacks.java
core/app-config/src/main/resources/application-mcpserver.yml
MCP Server: per-grant dynamic tools agent_*/workflow_*/get_run via tools/list+tools/call hook (off by default: app.mcp-server.expose-agents.enabled) implemented core/mcpserver/src/main/java/com/agenticai/core/mcpserver/expose/McpExposureRpcHandler.java
core/mcpserver/src/main/java/com/agenticai/core/mcpserver/expose/McpExposedToolCatalog.java
core/app-config/src/main/resources/application-mcpserver.yml
MCP Server: API-key auth + per-key rate limiting (vmcp_ bearer keys, per-tenant grants) implemented core/mcpserver/src/main/java/com/agenticai/core/mcpserver/McpApiKeyAuthFilter.java
core/mcpserver/src/main/java/com/agenticai/core/mcpserver/McpServerRateLimiter.java
core/mcpserver/src/main/java/com/agenticai/core/mcpserver/McpServerAccessGrantService.java
MCP Client: stdio transport (incl. env-isolated spawn and mcp-stdio-runner sidecar routing) implemented core/agents-tools/src/main/java/com/agenticai/core/agents/tools/McpTransportFactory.java
core/mcp/src/main/java/com/agenticai/core/mcp/McpServerType.java
MCP Client: SSE transport implemented core/agents-tools/src/main/java/com/agenticai/core/agents/tools/McpTransportFactory.java
core/mcp/src/main/java/com/agenticai/core/mcp/McpServerType.java
MCP Client: Streamable HTTP transport implemented core/agents-tools/src/main/java/com/agenticai/core/agents/tools/McpTransportFactory.java
core/mcp/src/main/java/com/agenticai/core/mcp/McpServerType.java
MCP Client: OAuth 2.0 for remote servers (RFC 9728/8414 discovery, PKCE, dynamic registration, refresh; off by default: app.mcp.oauth.enabled) implemented core/mcp/src/main/java/com/agenticai/core/mcp/oauth/McpOAuthService.java
core/mcp/src/main/java/com/agenticai/core/mcp/oauth/McpOAuthPkce.java
core/mcp/src/main/java/com/agenticai/core/mcp/oauth/McpOAuthDiscovery.java
core/mcp/src/main/java/com/agenticai/core/mcp/oauth/McpOAuthController.java
MCP Client: resources/read for MCP Apps ui:// resources (off by default: app.mcp.apps.enabled) implemented core/agents-tools/src/main/java/com/agenticai/core/agents/tools/mcpapps/McpAppsService.java
core/agents-tools/src/main/java/com/agenticai/core/agents/tools/DynamicMcpConnectionManager.java
MCP Registry: per-tenant server registration + official MCP registry catalog search implemented core/mcp/src/main/java/com/agenticai/core/mcp/McpRegistryController.java
core/mcp/src/main/java/com/agenticai/core/mcp/registry/OfficialMcpRegistryClient.java
A2A Platform Agent Card at /.well-known/agent-card.json (+ legacy /.well-known/agent.json) implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aAgentCardController.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aAgentCardService.java
A2A Per-agent card GET /api/agents/{agentId}/a2a/agent-card.json (RUNNER-gated) implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aAgentCardController.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aAgentCardService.java
A2A Signed Agent Cards (detached JWS / Ed25519 signatures, public key at /.well-known/jwks.json) implemented core/agents/src/main/java/com/agenticai/core/agents/a2a/A2aCardSigningService.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aAgentCardService.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aAgentCardController.java
A2A JSON-RPC message/send (0.3) / SendMessage (1.0) at POST /api/a2a and POST /api/agents/{agentId}/a2a implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aJsonRpcController.java
A2A JSON-RPC message/stream / SendStreamingMessage (SSE task + status/artifact frames) implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aJsonRpcController.java
A2A JSON-RPC tasks/get / GetTask implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aJsonRpcController.java
A2A JSON-RPC tasks/cancel / CancelTask implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aJsonRpcController.java
A2A Dual wire dialects 0.3 and 1.0 selected by the A2A-Version header implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aVersion.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aWire.java
A2A HTTP+JSON/REST binding (spec section 11): POST /message:send, POST /message:stream (SSE), GET /tasks/{id}, POST /tasks/{id}:cancel under /api/a2a/rest and /api/agents/{agentId}/a2a/rest implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aRestController.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aAgentCardService.java
core/agents-interop/src/test/java/com/agenticai/core/agents/a2a/A2aRestControllerTest.java
A2A REST errors as google.rpc.Status with an ErrorInfo detail (domain a2a-protocol.org) and the section 5.4 HTTP statuses implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aRestController.java
A2A Agent Card declares both bindings in supportedInterfaces (JSONRPC first, then HTTP+JSON), each with protocolVersion implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aAgentCardService.java
A2A ListTasks (JSON-RPC and REST GET /tasks) returns tasks instead of an unsupported error missing core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aJsonRpcController.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aRestController.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aTaskStore.java
A2A SubscribeToTask (re-attach to a running task's stream) missing core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aJsonRpcController.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aRestController.java
A2A gRPC binding (spec section 10) missing core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aGrpcService.java
A2A Agent Card caching headers (Cache-Control; ETag is a spec SHOULD) partial core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aAgentCardController.java
A2A Outbound client: a2a_call_agent tool with signed-card verification and an egress allow-list (off by default: app.a2a.client.enabled) implemented core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aClientService.java
core/agents/src/main/java/com/agenticai/core/agents/a2a/A2aRemoteAgentToolSource.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aRemoteAgentToolCallback.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aEgressGuard.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aCardVerifier.java
core/agents-tools/src/main/java/com/agenticai/core/agents/tools/AgentIntegrationToolResolver.java
A2A Push notifications (tasks/pushNotificationConfig/*), tasks/resubscribe, extended agent card missing core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aJsonRpcController.java
core/agents-interop/src/main/java/com/agenticai/core/agents/a2a/A2aAgentCardService.java
AG-UI SSE run endpoint POST /api/agents/{agentId}/agui/run (RunAgentInput in, data:-framed event JSON out) implemented core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiRunController.java
core/agents-interop/src/main/java/com/agenticai/core/agents/agui/RunAgentInput.java
AG-UI Lifecycle events RUN_STARTED / RUN_FINISHED / RUN_ERROR implemented core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiEvent.java
AG-UI Text message events TEXT_MESSAGE_START / CONTENT / END implemented core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiEvent.java
AG-UI Tool call events TOOL_CALL_START / ARGS / END / RESULT implemented core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiEvent.java
AG-UI STATE_SNAPSHOT and CUSTOM events (plan, guardrail, handoff) implemented core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiEvent.java
core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiEventMapper.java
AG-UI Run event replay/resume GET .../agui/runs/{runId}/events (Last-Event-ID / ?after=, durable buffer) implemented core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiRunController.java
core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiRunEventBuffer.java
AG-UI Agent tool discovery GET .../agui/tools (protocol Tool shape) implemented core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiRunController.java
AG-UI Binary/protobuf transport missing core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiRunController.java
AG-UI Optional event types STEP_*, STATE_DELTA, MESSAGES_SNAPSHOT, RAW missing core/agents-interop/src/main/java/com/agenticai/core/agents/agui/AgUiEvent.java
OpenTelemetry OTLP/HTTP trace export (Micrometer Observation -> OTel bridge -> management.otlp.tracing.endpoint, Langfuse or any collector) implemented core/app-config/src/main/resources/application.yml
core/app/pom.xml
OpenTelemetry gen_ai.* attributes on LLM-call spans (operation.name=chat, request.model, usage.input/output_tokens, usage.reasoning.output_tokens, agent.id, agent.version, conversation.id, error.type) implemented core/chat/src/main/java/com/agenticai/core/chat/GenAiSpanRecorder.java
OpenTelemetry Renamed-attribute migration gen_ai.system -> gen_ai.provider.name (app.observability.genai-attrs: legacy/new/both, semconv v1.37.0) implemented core/chat/src/main/java/com/agenticai/core/chat/GenAiAttributeNames.java
core/app-config/src/main/resources/application.yml
OpenTelemetry invoke_agent span around agent-attributed calls (chat/execute_tool nest under it) implemented core/chat/src/main/java/com/agenticai/core/chat/AgentInvocationObservation.java
core/chat/src/main/java/com/agenticai/core/chat/LlmMetricsAdvisor.java
core/chat/src/main/java/com/agenticai/core/chat/LlmModelSupport.java
OpenTelemetry execute_tool span (gen_ai.operation.name=execute_tool, gen_ai.tool.name, gen_ai.tool.type) implemented core/chat/src/main/java/com/agenticai/core/chat/GenAiToolObservationConvention.java
core/chat/src/main/java/com/agenticai/core/chat/ResilientToolCallingManagerFactory.java
OpenTelemetry Tail sampling keeps errors + slow invoke_agent runs (off by default: app.observability.tail-sampling.enabled) implemented core/app/src/main/java/com/agenticai/core/common/tracing/TailSamplingSpanProcessor.java
core/app-config/src/main/resources/application.yml
OpenTelemetry Micrometer meters per LLM call (llm.calls, llm.call.errors, llm.latency, llm.cost.usd, cache-token counters) implemented core/chat/src/main/java/com/agenticai/core/chat/LlmMetricsAdvisor.java

Drift vs README.md / ROADMAP.md

Rows where the committed prose claims a different status than the source tree proves. Fix the prose, or remove the capability:

Standard Capability Claimed Detected
OpenTelemetry invoke_agent span around agent-attributed calls (chat/execute_tool nest under it) planned implemented
OpenTelemetry execute_tool span (gen_ai.operation.name=execute_tool, gen_ai.tool.name, gen_ai.tool.type) planned implemented

Evidence model

Each row lists the files the generator scanned. A check is a small set of regular expressions that must all match inside its file (a bare path is an existence check). implemented means every check in the row passed - code that is wired, not merely present; partial means some did; missing/planned mean none did. The checks are intentionally structural (class/flag/method-name level), not behavioural: this table says the capability exists in the tree, and the unit/integration tests are what prove it works. Regenerate after touching any listed file:

python3 scripts/ci/conformance-report.py          # rewrite this page
python3 scripts/ci/conformance-report.py --check  # CI gate: fail if stale
Standard Rows implemented partial planned missing
MCP 11 11 0 0 0
A2A 17 12 1 0 4
AG-UI 9 7 0 0 2
OpenTelemetry 7 7 0 0 0