Simulation · not live traffic

A2A TRAFFIC

The observation layer for agent-to-agent protocol traffic. Today it observes the protocol, not your traffic — what A2A specifies, what it structurally cannot express, and what this surface has actually witnessed.

Messages witnessed here: 0. The animation above is decorative.

// the ledger

verified 2026-08-17 · records frozen
1.0 A2A spec version latest release · the specification
3 Protocol bindings officially supported · a2a.proto:341
9 Task states incl. UNSPECIFIED · a2a.proto:187
1/12 Governance coverage A2A v1.0.1 · preprint 2606.31498
0 Messages witnessed here why zero →
// what the protocol cannot say

A2A scores 1 out of 12 on governance

Generic A2A telemetry is a category with incumbents in it. This is the other half of the picture, and nobody publishes it: a six-dimension assessment of what five agent-interoperability protocols can and cannot express. Not what they carry slowly — what they have no vocabulary for at all.

Two points per dimension, twelve available. full = 2, partial = 1, absent = 0. Best coverage of any protocol assessed is 2/12.
Protocol G1Membership G2Deliberation G3Voting G4Dissent preservation G5Human escalation G6Audit and replay Coverage
MCP v1.1 absent absent absent absent absent partial 1/12
A2A v1.0.1 partial absent absent absent absent absent 1/12
ACP partial partial absent absent absent absent 2/12
ANP absent absent absent absent absent absent 0/12
ERC-8004 partial absent absent absent absent partial 2/12

Governance Gaps in Agent Interoperability Protocols: What MCP, A2A, and ACP Cannot Express — Richard Kang, Yudho Diponegoro, submitted 2026-06-30, arXiv:2606.31498. arXiv preprint. Their finding, quoted: “Voting and dissent preservation are universally absent across all five protocols.” Scores are the paper's; this site has not re-scored the protocols.

Version drift, stated: This paper was submitted 2026-06-30. MCP shipped its largest revision since launch on 2026-07-28 — the version string is literally "2026-07-28"; the C# SDK calls its implementation v2.0 and much of the press calls it MCP 2. The paper therefore scores MCP v1.1, which is superseded. Read against the 2026-07-28 release notes, that revision is about transport and deployment shape, not community governance: a stateless request/response core, an Extensions framework, Tasks moved out to the io.modelcontextprotocol/tasks extension, MCP Apps, Enterprise Managed Authorization, Multi Round-Trip Requests, and authorization hardening (RFC 9207 issuer validation, Dynamic Client Registration replaced by Client ID Metadata Documents). Roots, Sampling, Logging and the legacy HTTP+SSE transport are deprecated on a twelve-month window. Nothing in it adds membership, deliberation, voting, dissent preservation, human escalation or tamper-evident replay. So the G1-G6 row is very unlikely to have moved — but this site has NOT re-scored it, and 'unlikely to have moved' is not a measurement. The 2026-07-28 release notes.

G1 Membership A2A: partial

“Protocol encodes admission, invitation, removal, and role assignment for community participants.”

What A2A transports

Agent Cards declare capabilities and can be registered in directories.

What it cannot express

There is no protocol-native admission, invitation, or removal primitive. A card says what an agent claims it can do; nothing in A2A says whether it was allowed to join, or how it leaves.

What a refusal looks like here in_tree

box-and-box deontic rung (rung 3 of eight) and the delegatic OS-006 governance shim.The kernel answers 'is this permitted' with a certificate attached, over a floor that cannot be weakened. 118 enforced property-tested laws and 3 declared-open.

G2 Deliberation A2A: absent

“Protocol encodes structured argument exchange with turn-taking, challenge, and response semantics.”

What A2A transports

Messages and tasks. An argument can be sent as text.

What it cannot express

Nothing distinguishes an argument from a message, a challenge from a reply, or a turn from a retry. Structure has to be re-invented above the protocol by every party, which means no two parties agree on it.

What a refusal looks like here spec

deliberatic — Dung's argumentation framework extended to weighted bipolar (wBAF), graded semantics.Specified, no implementation. Its own page says so.

G3 Voting A2A: absent

“Protocol encodes preference aggregation with quorum, rounds, and position resolution.”

What A2A transports

Nothing. A vote is an ordinary message.

What it cannot express

No quorum, no round, no resolution rule. Two agents cannot disagree in a way the protocol can settle.

What a refusal looks like here spec

deliberatic argues explicitly against majority voting and specifies graded semantics instead; agentromatic covers bidding, debate and election.Specified, no implementation.

G4 Dissent preservation A2A: absent

“Protocol ensures minority positions are retained in decision outputs, not silently dropped.”

What A2A transports

Nothing. A losing position is a message nobody reads again.

What it cannot express

A decision transported over A2A carries its result and not its objections. The disagreement that produced it is unrecoverable from the wire.

What a refusal looks like here spec

deliberatic makes attacks first-class in the formal tuple (R-), and specifies that three vindicated dissents trigger constitutional review.Specified, no implementation.

G5 Human escalation A2A: absent

“Protocol defines conditions and mechanisms for routing decisions to human authority.”

What A2A transports

Push notifications, and TASK_STATE_INPUT_REQUIRED / TASK_STATE_AUTH_REQUIRED as interrupted states.

What it cannot express

Those are transport and status. Neither says under what condition a human MUST be reached, who counts as the authority, or what happens if nobody answers. An agent can ask; nothing obliges the escalation.

What a refusal looks like here live_local

The RRABBIT mailbox. A message is 4 lanes x <=32 bits, so it carries an escalation signal and never prose. Mailbox is the only role with no ports, so 'beside the road' is forced by the algebra rather than chosen. Unread is a projection, never a stored count, because otherwise reading a message mutates the world.node test/mail.mjs -> 68 passed, 0 failed (run 2026-08-17).

G6 Audit and replay A2A: absent

“Protocol produces tamper-evident event logs enabling deterministic reconstruction of the decision process.”

What A2A transports

A Traceability extension exists.

What it cannot express

The paper scores this absent despite that extension, because it does not define tamper-evident logs or replay semantics. You can observe the traffic; you cannot prove the log was not edited, and you cannot re-run it.

What a refusal looks like here live_local

REPLAY — typed refusals, no silent repair. A step whose road is gone is refused by name, never remapped.Five typed refusal codes: TRACK_EMPTY, TRACK_ROAD_GONE, TRACK_ROAD_CLOSED, TRACK_WINDOW_GONE, TRACK_BUSY (RRABBIT/docs/TRACKS_HANDOFF.md:135). An internal review said six; the file says five, and the file wins.

Two censuses, taken separately, agreeing about the holes

The matrix above is an outside reading of five wire protocols. The Periodic Table of Agent Invariants is an inside census of the measurements a system needs to know what position it is in and what authority that grants — 43 cells, ten groups, built for a different purpose by different people. Laid side by side they point at the same places.

6proved 4shipped 4named 8sketched 21missing
Dimension A2A Invariant cell Status here
G1 membership partial No cycles · IV Governance Monotonic · IV Governance Deny default · IV Governance provedprovedproved
Membership is admission, removal and role assignment. The authority graph answers all three structurally: delegation cannot cycle, a child cannot exceed its parent, and absence of a grant is refusal. That is a membership rule a protocol could carry but does not.
G2 deliberation absent ? Convergence · V Deliberation? Seal integrity · V Deliberation missingmissing
Both cells are missing. The table names convergence and seal integrity as the measurements a deliberation would need; neither exists. This dimension is as empty here as it is on the wire.
G3 voting absent no cell exists none
There is no cell for voting anywhere in the table. deliberatic argues against majority voting and specifies graded semantics instead, at spec rung — so the absence may be deliberate rather than an oversight, but an absent cell is an absent cell.
G4 dissent preservation absent ? Dissent durability · V Deliberation sketched
Dissent durability is the single cell in the table that names this, and it is sketched. It is also the strongest thing either census has to say about a dimension the paper finds absent in all five protocols.
G5 human escalation absent ? Escalation monotonicity · VII Tier / Budget missing
Escalation monotonicity is missing, and it is filed under Tier / Budget (OS-005, model tier adaptation) — escalating to a bigger model, not to a person. Read strictly, the table has no human-escalation cell at all; the working artifact is the RRABBIT mailbox, which is live_local and not in this table.
G6 audit and replay absent Append-only · IV Governance? Non-replay · X Security & Federation provedmissing
Append-only audit is proved: history cannot be rewritten, which is half of what the dimension asks. The other half — deterministic reconstruction — maps to non-replay in Security & Federation, and that is missing. So this dimension is genuinely split, and the page should not round it up.

This mapping is a judgement, not a measurement

Which invariant answers which governance dimension is a reading, not a measurement. Nobody has published a mapping between these two vocabularies, the two were built independently and for different purposes, and no test enforces the correspondence. DOCTRINE.md rule 1: where a condition cannot be settled by a command, say that it is a judgement and whose. This is one, and it is mine. The A2A scores are the paper's. The invariant statuses are extracted from the canonical table by tools/sync-invariants.mjs and re-derived on every build. Only the arrows between them are argued.

The short reading: where A2A is least weak, this stack is strongest — G1 and G6 land on invariants that are proved, and four of the six proved cells in the whole table are the one governance group. Where A2A is empty, this stack is also mostly empty. That is not a marketing result. It says the delegation-and-audit half of agent governance has been done here and the deliberation half has been specified and not built — and that no shipping protocol has either.

Inspect an Agent Card

Fetches /.well-known/agent-card.json from a domain and reads it against the v1.0 shape. This runs entirely in your browser — nothing is sent to this server, and nothing is logged. Most agents will refuse the cross-origin read; when that happens you get the exact curl to run instead, not a spinner.

Try: outcomes measured 2026-09-05
idle Enter a domain, or paste a card. Nothing has been fetched.

Limit: a browser cannot read a cross-origin URL that does not send Access-Control-Allow-Origin. That is the common case, so the common result of this tool is a refusal that tells you what to run in a terminal.

It does verify an ES256 signature, in your browser, canonicalising the card per RFC 8785 and fetching the key the signature's own jku names. This paragraph used to say it could not, and that a reader in a page could not honestly claim to — which was simply wrong, and was corrected when this site signed its own card and had to read its own limit back. A verified signature proves the card has not changed since it was signed. It does not prove who signed it, and when the key is served by the same origin as the card the result says so: that is a tick for TLS, not for the signature.

// our own card

The card is served, because the interface answers

A2A v1.0 requires supportedInterfaces[] on every Agent Card — there is no spec-valid way to say “discoverable but not serving”. For 19 days this surface declared https://a2atraffic.com/a2a/json and served nothing there, so the card stayed a draft at a draft path and the discovery path returned 404 on purpose.

That interface answers now, so the card is published at the discovery path. It was measured on 2026-09-05, against the deployed site rather than against the intention to deploy it:

// the interface base URL — not an A2A method, a human-readable descriptor
curl -sS -o /dev/null -w '%{http_code} %{content_type}' https://a2atraffic.com/a2a/json
200 application/json

// ListTasks — an empty page, because the list is empty
curl -sS https://a2atraffic.com/a2a/json/tasks
200 application/a2a+json   {"tasks": [], "nextPageToken": "", "pageSize": 50, "totalSize": 0}

// GetTask — no id has ever been issued, in the google.rpc.Status shape §11.6 requires
curl -sS https://a2atraffic.com/a2a/json/tasks/task-123
404 application/a2a+json   error.status NOT_FOUND, details[0].reason TASK_NOT_FOUND, domain a2a-protocol.org

// SendStreamingMessage — refused by the capability the card declares false
curl -sS -X POST https://a2atraffic.com/a2a/json/message:stream
400 application/a2a+json   UNSUPPORTED_OPERATION

// SendMessage — an example the card advertises, answered out of records/gap-matrix.json
curl -sS -X POST https://a2atraffic.com/a2a/json/message:send -H 'content-type: application/a2a+json' -d '{"message":{"messageId":"1","role":"ROLE_USER","parts":[{"text":"Score MCP against the governance taxonomy."}]}}'
200 application/a2a+json   role ROLE_AGENT, skill gap-matrix, and the answer carries the preprint caveat with it

What it does not do, stated where the claim is made. It holds no state, so nothing it says can depend on anything you said before. It has no model. Requests reach a skill by keyword match, not by understanding, and an unmatched request says so and lists what it can answer rather than guessing. It answers only out of /records/*.json — the same published records this page is generated from, read at request time over this origin's own asset store, so the agent and the page cannot disagree. The card IS signed (ES256, A2A §8.4, key at /.well-known/jwks.json) — but the verifying key is published on the same domain as the card, so the signature proves the card has not changed since signing, not who signed it. Anyone able to serve you a forged card could serve a forged key beside it. TLS carries the domain binding; the signature is not a second opinion about the same channel.

The agent holds no state, so it creates no Tasks: SendMessage answers with a Message, the arm of SendMessageResponse's oneof that promises nothing retrievable. ListTasks returns an empty page because the list IS empty, and GetTask returns TaskNotFoundError because no id has ever been issued. Those are true answers, not stubs. The four methods the card marks unsupported are refused by name, each citing the capability that refuses it: SendStreamingMessage → UnsupportedOperationError · SubscribeToTask → UnsupportedOperationError · CreateTaskPushNotificationConfig → PushNotificationNotSupportedError · GetExtendedAgentCard → ExtendedAgentCardNotConfiguredError.

The retraction stays. An earlier draft of this section promised the discovery path returned 404 and invited you to check. The inspector below — written for this page, pointed at this domain as its own first test — came back 200 text/html; charset=utf-8 (2026-08-17, before this build was deployed, the site's own index.html, served in full — 77,879 bytes). The fix was a root 404.html; re-measured 404 text/html; charset=utf-8 on 2026-08-17, immediately after deploying commit fd387b4 measured. It was never this domain's alone: OPEN 2026-08-17, measured on 4 spot-checked siblings: runefort.com 200 (35,111 B) · fleetprompt.com 200 (41,975 B) · computedriven.com 200 (164,656 B) · specprompt.com 200 (38,795 B). Widened to 24 affected domains before the fix went out. CLOSED 2026-08-17. Found here, fixed everywhere: 24 domains shipped a root 404.html and all 24 re-measured 404 — agentelic, agentromatic, bendscript, computedriven, delegatic, deliberatic, fleetprompt, geofleetic, graphonomous, opensentience, runefort, specprompt, ticktickclock, webhost.systems, ampersandboxdesign, wrand.cc, academy, pulse, weave, workbench, traaviis, code, trvm, wrl. docs.ampersandboxdesign.com and prism.opensentience.org already answered 404 and were left alone. A page that shows only the number that flatters it is not showing the retraction, and the fault is only checkable against what repaired it.

It is signed. A2A v1.0 §8.4 binds a card to a domain with a detached JWS over the card canonicalised by RFC 8785, with signatures[] itself excluded from what is signed. This one is ES256, signed 2026-09-05, over a canonical payload whose SHA-256 is e7612d215a8f18cf…. The verifying key is published at /.well-known/jwks.json, which is the jku in the signature's own protected header, and its kid is the key's RFC 7638 thumbprint rather than a name — a name can be reused after a rotation and point at a different key.

What the signature does not prove. It proves this card was signed by whoever holds that key and has not changed since. It does not prove who that is: the key is published on this domain, so anyone who could serve you a forged card could serve you a forged key beside it. That is the ordinary limit of jku-on-the-same-origin discovery, and TLS is what is actually carrying the domain binding. A signature is not a second opinion about the same channel.

So are the records underneath it. A signed card that points at unsigned evidence moves the problem rather than solving it, so all 7 published records — every file this page is generated from — carry their own detached signature under the same key, listed at /.well-known/records-signatures.json, which is itself signed so an entry cannot be quietly removed. Each entry also states the plain SHA-256 of the bytes served, so the cheap check needs sha256sum and nothing else. Two files are deliberately outside it: the manifest, which carries its own signature, and the public key, because a key vouching for itself adds nothing — whoever could swap it could swap a signature over it.

The build never signs — ECDSA is randomised, so a build that signed would not be byte-identical to the one before it. The signature is a committed input and the build only verifies it, refusing to publish when the card has changed since it was signed. A stale signature is worse than none: it claims authenticity over content that has since moved.

{
  "name": "a2a-traffic-observatory",
  "description": "Publishes what the A2A protocol specifies, what it structurally cannot express, and what this surface has witnessed. Read-only. Observes; does not orchestrate.",
  "supportedInterfaces": [
    {
      "url": "https://a2atraffic.com/a2a/json",
      "protocolBinding": "HTTP+JSON",
      "protocolVersion": "1.0"
    }
  ],
  "provider": {
    "organization": "ComputeDriven",
    "url": "https://computedriven.com"
  },
  "version": "0.2.0",
  "documentationUrl": "https://a2atraffic.com/#protocol",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "extendedAgentCard": false
  },
  "defaultInputModes": [
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/plain"
  ],
  "skills": [
    {
      "id": "gap-matrix",
      "name": "Governance gap matrix",
      "description": "Returns the six-dimension governance assessment (G1 membership, G2 deliberation, G3 voting, G4 dissent preservation, G5 human escalation, G6 audit and replay) for a named agent-interoperability protocol, with the source citation and the coverage score.",
      "tags": [
        "governance",
        "a2a",
        "mcp",
        "acp",
        "assessment"
      ],
      "examples": [
        "What can A2A not express about membership?",
        "Score MCP against the governance taxonomy."
      ]
    },
    {
      "id": "protocol-reference",
      "name": "A2A v1.0 reference",
      "description": "Returns verified facts about the A2A protocol: the discovery path, the three protocol bindings, the nine task states, the v1.0 method names, and the v0.3 to v1.0 migration deltas. Every entry carries the primary source it was derived from.",
      "tags": [
        "a2a",
        "reference",
        "migration",
        "v1.0"
      ],
      "examples": [
        "What is the well-known path for an Agent Card?",
        "What replaced preferredTransport in v1.0?"
      ]
    }
  ],
  "signatures": [
    {
      "protected": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpPU0UiLCJraWQiOiI5RkpTVEVHZ2NPMmRmd19KV196Q3h5cGpzc3dQNzJwOFJuWERhdGFSQWFFIiwiamt1IjoiaHR0cHM6Ly9hMmF0cmFmZmljLmNvbS8ud2VsbC1rbm93bi9qd2tzLmpzb24ifQ",
      "signature": "VJCo6RQ1MANP0r28859dZ_13LbKburD6m59t0WAB1Xwr6kzrxA0g-qenZTooQm3tJAVRu0PbfkQ7k8bpF6W22Q"
    }
  ]
}

Served at /.well-known/agent-card.json, emitted from records/agent-card.draft.json with its annotation keys stripped. The interface it declares is https://a2atraffic.com/a2a/json (HTTP+JSON, protocol version 1.0).

A2A v1.0, re-derived

Every fact below was read from the specification or from a2a.proto on 2026-08-17, not copied from a summary. Where a field is marked required, that is google.api.field_behavior on the proto field, read directly.

Discovery

// the standard path — RFC 8615
GET https://{agent-server-domain}/.well-known/agent-card.json

// NOT this. An earlier-draft path. It is the one this site shipped until 2026-08-17.
GET https://{agent-server-domain}/.well-known/agent.json
MechanismHow it works
Well-Known URIThe agent hosts its card at the standardised path. Public or domain-controlled discovery.
Curated registriesA catalog service holds cards and answers queries by skill or tag. The spec does not yet prescribe a registry API.
Direct configurationHardcoded details, config files, environment variables. For known, static relationships.

What v1.0 changed

If you built against v0.3, this is the migration. It is not a rename pass — the Agent Card, the Part object and the stream events all changed shape.

Areav0.3v1.0
Agent Card url, preferredTransport, additionalInterfaces, protocolVersion at top level supportedInterfaces[] — each entry carries url, protocolBinding, protocolVersion, tenantOne ordered list, first entry preferred. Protocol version is now per-interface, so an agent can serve 0.3 and 1.0 side by side.
Task state "working" "TASK_STATE_WORKING"All states became SCREAMING_SNAKE_CASE with a TASK_STATE_ prefix. Nine values.
Message role "user" / "agent" "ROLE_USER" / "ROLE_AGENT"Same normalisation.
Part separate TextPart / FilePart / DataPart with a kind discriminator one Part with oneof content: text, raw, url, dataDiscriminate by member presence — 'text' in part — not by part.kind. mimeType became mediaType; filename applies to all kinds.
Stream events { kind: "status-update", …, final: true } { statusUpdate: { … } } / { artifactUpdate: { … } }Wrapper-based discrimination. The final boolean is gone; closing the stream signals completion.
HTTP+JSON paths POST /v1/message:send POST /message:sendThe /v1 prefix was dropped; version lives on the interface.
Pagination page / perPage pageSize / pageToken / nextPageToken, with totalSize on the responsePage-token based. ListTasksRequest carries page_size and page_token; ListTasksResponse carries next_page_token, page_size and total_size. Corrected 2026-09-05 — see drift_2026_09_05.
Errors RFC 9457 application/problem+json google.rpc.Status under an `error` key, application/a2a+jsonErrors carry a details[] whose first entry is a google.rpc.ErrorInfo with reason in UPPER_SNAKE_CASE and domain a2a-protocol.org, beside error.code (the HTTP status) and error.status (the gRPC status name). Required because several A2A errors share one HTTP status. Media type corrected 2026-09-05 — see drift_2026_09_05.
OAuth implicit and password flows device code (RFC 8628); pkce_required on authorization codeThe two deprecated flows were removed.
Agent Card trust unsigned signatures[] — JWS (RFC 7515) over JCS-canonicalised JSON (RFC 8785)A card can now be cryptographically bound to a domain.
Multi-tenancy tenant on every request and on AgentInterfaceRoute to one agent among many behind a shared endpoint.
Capabilities supportsAuthenticatedExtendedCard at top level capabilities.extendedAgentCardMoved inside the capability set.

Task lifecycle

9 states — 4 terminal, 2 interrupted, 2 open, 1 unknown. An interrupted task is waiting on somebody, which is the only place a human can currently be reached — see G5 for why that is not the same as escalation.

TASK_STATE_UNSPECIFIED unknown The task is in an unknown or indeterminate state.
TASK_STATE_SUBMITTED open Successfully submitted and acknowledged.
TASK_STATE_WORKING open Actively being processed by the agent.
TASK_STATE_INPUT_REQUIRED interrupted The agent requires additional user input to proceed.
TASK_STATE_AUTH_REQUIRED interrupted Authentication is required to proceed.
TASK_STATE_COMPLETED terminal Finished successfully. Terminal.
TASK_STATE_FAILED terminal Finished with an error. Terminal.
TASK_STATE_CANCELED terminal Canceled before completion. Terminal.
TASK_STATE_REJECTED terminal The agent decided not to perform the task. Terminal.

Methods

v1.0was (v0.3)What it does
SendMessage message/send Send a message; may create a task.
SendStreamingMessage message/stream Same, with a stream of updates back.
GetTask tasks/get Read one task.
ListTasks — (new in 1.0) Enumerate tasks. Cursor-paginated.
CancelTask tasks/cancel Request cancellation.
SubscribeToTask tasks/resubscribe Re-attach to a task's event stream.
GetExtendedAgentCard agent/getAuthenticatedExtendedCard Fetch the authenticated extended card.
CreateTaskPushNotificationConfig tasks/pushNotificationConfig/set Register a push target for a task.

Protocol bindings

protocolBindingNameNotes
JSONRPC JSON-RPC 2.0 The original binding. Methods are called by name over a single endpoint.
GRPC gRPC Address form is hostname:port, e.g. grpc.example.com:443.
HTTP+JSON HTTP+JSON / REST Custom-verb paths, e.g. POST /message:send. The /v1 prefix was dropped in 1.0.

'This is an open form string... The core ones officially supported are JSONRPC, GRPC and HTTP+JSON.' Three is the count of officially supported bindings, not a closed set.

A2A and MCP

MCP

Agent to tool. An agent reaches a server to call a tool or read a resource.

A2A

Agent to agent. Two independent agents discover each other, delegate a task, and exchange artifacts.

They are not competitors and a system usually runs both: A2A across the agent graph, MCP down from each agent to its tools. Both are now Linux Foundation projects. The A2A documentation states the two are 'highly complementary' and 'designed to work together'.

MCP moved — 2026-07-28

The spec identifies itself by date — the version string is "2026-07-28". The official C# SDK calls its implementation v2.0 and much of the coverage calls it MCP 2; the specification does not. It is billed as the largest revision of the protocol since it launched.

Nothing for agent-to-agent communication, and nothing for governance — no membership, deliberation, voting, dissent preservation, human escalation or tamper-evident replay. It sharpens the boundary rather than blurring it. Both protocols now have a task concept, so 'A2A has tasks, MCP does not' is no longer the distinction — the distinction is the axis: MCP went further down toward tools and infrastructure, A2A stays across peers. And a stateless MCP makes the governance question louder, not quieter: a protocol that deliberately holds no session state is not the layer that will remember who was permitted to do what.

the 2026-07-28 specification announcement · The gap matrix above scores MCP v1.1, because that is what the paper assessed and the paper predates this release by 28 days. It has not been re-scored here. See the version-drift note.

Who is behind it

Created by Google, announced April 2025, donated to the Linux Foundation June 2025. It is maintained by a Technical Steering Committee under the Linux Foundation.

Reported August 2026: Google is transferring A2A into the Agentic AI Foundation, the Linux Foundation entity formed 2025-12-09 that already holds MCP, goose and AGENTS.md. Stated here as reported, not as verified — the primary source cited for it returned HTTP 403 and could not be read. reported

Technical Steering Committee: AWS · Cisco · Google · IBM Research · Microsoft · Salesforce · SAP · ServiceNow

Adoption, as reported by the Linux Foundation on 2026-04-09: 150+ organizations, 22,000+ GitHub stars, SDKs in Python, JavaScript, Java, Go, .NET. press release

Named in that release — the A2A ecosystem, not this site's customers: AWS Cisco Google IBM Research Microsoft Salesforce SAP ServiceNow 150+ organizations
// capabilities — design, not deployment

What an A2A observatory would do

These are design notes for a product that does not exist. Every card below is proposed. A card flips to implemented when a receipt exists in the witness log and not before — which is the rule that would have stopped the previous version of this page.

Message tracing

Follow one task across agent hops — client initiation, delegation, artifact, completion — as a single chain rather than four unrelated POSTs.

proposed

Agent discovery map

Topology built from Agent Cards: who has been discovered, what they declare, whether their card is signed, and what changed since it was last read.

proposed

Task lifecycle analytics

State transitions across the nine TASK_STATE values, including how often a task ends interrupted and never returns.

proposed

Artifact inspection

The unified v1.0 Part — text, raw, url, data — read by member presence, with mediaType and filename surfaced.

proposed

MCP and A2A in one timeline

Tool calls beneath an agent and messages between agents on the same clock. Two protocols, one execution graph.

proposed

Streaming monitor

SSE streams for SendStreamingMessage: throughput, dropped connections, and the fact that v1.0 removed the final flag so closure is the signal.

proposed

Witness log

The only place a traffic number on this site may come from.

0 A2A messages witnessed by this surface

There is no collector. This surface serves static files; nothing routes A2A traffic through it and no agent has been instrumented to report to it. Zero is not a placeholder for a number we have not looked up — it is the measurement.

A receipt. One witnessed A2A message, recorded with its task id, context id, the two endpoints, the protocol binding, and a hash. Until a receipt exists in this file, the canvas on this page is a simulation and says so, and no capability card may flip from proposed to implemented.

The shape a receipt will take

Declared now, so the empty state is a schema and not a shrug.

FieldValue
idsha256 of the canonicalised record
witnessed_atISO 8601 UTC, millisecond precision
methodone of the v1.0 method names in protocol.json
protocol_bindingJSONRPC | GRPC | HTTP+JSON
task_idstring
context_idstring
fromagent card origin
toagent card origin
task_stateone of the TASK_STATE_* values in protocol.json
card_signature_verifiedboolean | null — null when the card carried no signatures[]
// status

Where this surface actually stands spec

What is claimed

This surface observes the A2A protocol, not your traffic. It publishes what the specification says, re-derived from primary sources on 2026-08-17; what a governance assessment finds the protocol structurally cannot express; and a count of the A2A messages it has itself witnessed, which is zero.

How that was checked

records/protocol.json was derived from a2a-protocol.org/latest and a2aproject/A2A@main/specification/a2a.proto. records/gap-matrix.json was re-read from arxiv.org/html/2606.31498v1 Table II and Table III. records/witness.json is zero because there is no collector.

What is NOT claimed

There is no product. Nothing here proxies, captures, traces or stores A2A traffic, and no agent has been instrumented to report to this domain. The capability cards in the design section are proposed and labelled; none is implemented. The gap matrix is one preprint's reading of one version of five protocols, not our re-scoring of them, and the preprint is not peer-reviewed.

Rung witness

There is no witness and the page says so. This surface specifies an observatory; it collects nothing. The only thing on it that RUNS is the Agent Card inspector, which is client-side and is labelled live_local where it appears. Everything else is a reading of published documents, which is exactly what a spec rung permits.

Removed on 2026-08-17

Retract out loud, in the same place it was published. These claims were served from this domain until today.

Deferred, and why

DeferredBlocked on
compose_ledger blockedBlocked on the [TRAVIS] shared-facts ruling and on a COMPOSE record existing. See records/witness.json compose_seam.
wrl_block blockedBlocked on the grammar freeze, same dependency as every other surface's WRL block.
replay_hero blockedThe canvas graduates from labelled simulation to replay of a real receipt when a receipt exists. There are none.

The observatory reports what it has seen.

So far: the map. When there is traffic, the number above changes and the animation stops being a decoration. Until then, this page is a reading of published documents — which is a real thing to be, and a checkable one.