Skip to content
8.6. AAIF

8.6. AAIF

In one glance

  • You will: Map each open contract to its governance home and its exact pin, then route a sanitized failure to the narrowest owner.
  • You need: Nothing running; check the current project pages before filing anything.
  • Time: about 12 minutes, reference.

Why one broken turn crosses four independently governed contracts

Four open contracts carry every message this stack sends. MCP connects agents to read-only tools and data. A2A exposes agent discovery, messages, tasks, streaming, and cancellation. The OpenAI-compatible Responses API connects the local Go model adapter to Ollama or to the gateway. OTLP carries traces, metrics, and logs to the collector. OCI and Kubernetes contracts then package and deploy the same application. Each is open and maintained by a different community, so implementations stay replaceable, no vendor owns every seam, and no seam has a default owner.

AAIF, the Agentic AI Foundation, is a Linux Foundation home for open agentic-AI projects; it hosts one project in this stack, not the boundaries between them. Routing a seam failure is therefore your work: a report in the wrong tracker waits, and one with a whole checkout attached is never read. This page shows how to print the exact module and version behind each contract, name a failure’s narrow owner, and tell governance apart from compatibility. The worked case is a protocol error between a Go SDK and its collector. You reach this page once something upstream breaks.

Open governance versus a pinned version: what each answers

Open governance means a project publishes its contribution rules, security routes, and decision processes. It does not promise API stability, compatibility with this repository, maintenance speed, or a particular licence. The AAIF hosts agentgateway, whose role here spans MCP, A2A, model, API, policy, and observability traffic. Compatibility is a separate, local claim: the repository pins one exact gateway release — a version in the root mise.toml, an image digest in the Kubernetes base — and validates its concrete routes.

So when something breaks, read the pin, not the governance home:

rg -N 'a2a-go/v2|modelcontextprotocol/go-sdk|openai-go/v3|opentelemetry.io/otel v' agents/go/go.mod | awk '{print $1, $2}'
github.com/a2aproject/a2a-go/v2 v2.4.0
github.com/modelcontextprotocol/go-sdk v1.7.0
github.com/openai/openai-go/v3 v3.49.0
go.opentelemetry.io/otel v1.44.0

Four contracts, four upstream modules, four exact versions — printed as module and version only, with the trailing compatibility comments cut by the awk. Those comments name the ADK release constraining a version and the checks that must pass before a bump. The tuple above is what an upstream maintainer needs from you, and none of it is derivable from knowing which foundation hosts what.

A report that opens with the failing module and its exact version skips the first round trip: a maintainer asking what you actually ran.

HomeCourse components or contracts
Agentic AI Foundation / LFagentgateway
Linux FoundationA2A and MCP protocol projects
CNCFKubernetes, Prometheus, OpenTelemetry, and Sandbox-stage kagent
GoogleADK Go and the optional Gemini/Vertex integration
Grafana LabsGrafana, Tempo, and Loki
project/vendor communitiesOllama runtime and Qwen open weights

Sandbox is CNCF’s entry stage: a neutral home and public process, no stability promise. Treat every row as a starting point and the current project pages as the authority, because governance and maturity both move. Governance answers who changes a project. A lock and a compatibility test answer whether this repository supports the change.

Provider portability follows the same split. The Go model adapter keeps the transport-specific client behind it, so moving from direct Ollama to the gateway changes OPENAI_BASE_URL while AGENT_MODEL_PROVIDER and typed model construction keep the application seam explicit, and native Gemini stays a separate optional path. Standardized calls are not standardized behavior, though. A new provider and model pair is supported only once all of these have passed for a recorded source revision and model identity: the black-box evalset (the committed file of scored cases), the cases it requires in every sample, its cost bounds, and any applicable judge calibration against human labels.

Route the failure to the narrowest owner

Reduce the problem to one contract before you write a word. Reproduce it against the repository pin and, when practical, against the version upstream currently supports. Strip credentials, personal data, prompts, responses, runtime databases, and private infrastructure. Supply the smallest protocol payload or configuration that still fails, follow the upstream security policy for anything exploitable, and link a temporary workaround only when it helps someone else reproduce the gap. A maintainer can only act on what reproduces without your repository: sending the whole course checkout when one wire request and a version tuple would do is how a good report becomes an ignored one.

Failure surfaceOwning project to inspect first
listener, route, policy, gateway metricsagentgateway
MCP message or Go SDK behaviorMCP specification or MCP Go SDK
A2A message, task, stream, cancellationA2A specification or A2A Go SDK
ADK runner, callbacks, launcher, modelGoogle ADK Go
kagent CRD or controllerkagent
Kubernetes API or NetworkPolicyKubernetes
OTLP SDK, Collector, exporterOpenTelemetry project owning that component
Tempo, Loki, or Grafana query/UIthe corresponding Grafana Labs project

Two worked examples, neither requiring a code change, both reduced the same way: owner, pin, smallest failing payload. If kubectl apply rejects a v1alpha2 field in a kagent resource, the narrow owner is kagent, the pinned version lives in the chart in the helmfile, and the sanitized reproduction is the smallest rejected manifest with your identifiers removed; the overlay you control is the only place to work around it.

If the Go OTLP exporter reports a protocol error before a span reaches the collector, the narrow owner is whichever OpenTelemetry component failed, and the error message usually says which. The pinned version is the module line you printed above, and the reproduction is one span with a minimal collector configuration.

The repository’s own tracker owns integration mistakes and course claims. An upstream tracker owns a minimal bug in its own contract.

AGENTS.md is a repository convention, not a runtime protocol

AGENTS.md is a vendor-neutral instruction convention for coding agents editing this repository. The deployed AgentOps Agent never reads it, no network service speaks it, and it replaces neither MCP nor A2A. The repository dogfoods the convention by keeping operational rules, owners, and limits in that one root file, which makes it easy to mistake for runtime.

Neighbouring pages own the rest: 0.4. Ecosystem maps runtime ownership, 0.5. Provider Options separates the required open-source path from optional proprietary ones, 5.4. Model Gateway owns Responses routing and provider movement, 8.0. Repository owns source layout, and 8.5. Contributions owns changes to this course.

What you can do now

  • You can tell governance, licence, maturity stage, and repository compatibility apart.
  • You printed the exact upstream module and version behind each of the four open contracts.
  • You can route an MCP, A2A, gateway, kagent, ADK, or telemetry failure to its narrow owner with a sanitized reproduction.
  • You can say why a provider swap needs a recorded evaluation run rather than a successful HTTP response.

Return to 8. Community, or to 8.7. Capstone, which keeps these four contracts while the domain changes.