{
  "_draft": "THE FILENAME IS NOW A MISNOMER AND IS KEPT ANYWAY, because the homepage has linked this exact path since 2026-08-17 and breaking a published URL to improve a word is a bad trade. This is the SOURCE record. Since 2026-09-05 it is ALSO SERVED, with the _-prefixed keys stripped, at https://a2atraffic.com/.well-known/agent-card.json — because the interface it declares answers now. It did not for the 19 days before that, and during those 19 days the discovery path returned 404 on purpose. Both were the honest reading of their day.",

  "_why": "A2A v1.0 requires supportedInterfaces[] on every AgentCard (a2a.proto:371, field_behavior REQUIRED). There is no spec-valid way to say 'discoverable but not serving'. So while nothing answered, the refusal was published instead of the card. The condition written here as the price of publishing — that something answer at the declared URL — was met rather than waived. records/surface.json:a2a_endpoint holds the measurements, taken against the deployed site.",

  "_flip": "records/surface.json -> serve_agent_card. Now true; build-site.mjs emits this file to .well-known/agent-card.json with the _-prefixed keys stripped. launch-gate.mjs rule 5b refuses a true flag with no a2a_endpoint record behind it, a card whose declared interface disagrees with that record, and a capability declared false that nothing refuses on. Set it back to false if the endpoint ever stops answering — a card whose interface refuses is the defect this surface exists to refuse.",

  "_schema_note": "Field names and required-ness read from a2aproject/A2A@main/specification/a2a.proto:336-455 on 2026-08-17, not from an example.",

  "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"
    }
  ],
  "_supportedInterfaces_note": "Answering since 2026-09-05, as Cloudflare Pages Functions under functions/a2a/. Four methods implemented (SendMessage, ListTasks, GetTask, CancelTask); four refused by name, each citing the capability below that refuses it. The agent holds no state, so SendMessage returns a Message and never a Task — a Task is a retrievable resource, and returning one would promise a GetTask that could not be kept.",

  "provider": {
    "organization": "ComputeDriven",
    "url": "https://computedriven.com"
  },

  "version": "0.2.0",
  "_version_note": "0.1.0 described an agent that did not exist — the interface was declared and nothing was behind it. 0.2.0 describes one that answers. The skills and the interface list did not change; whether they were true did.",
  "documentationUrl": "https://a2atraffic.com/#protocol",

  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "extendedAgentCard": false
  },
  "_capabilities_note": "All false, and each is enforced rather than merely declared: the method that would need it returns the error the spec names for a capability the card does not declare. The previous version of this site printed streaming: true and pushNotifications: true for an agent that did not exist.",

  "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?"
      ]
    }
  ],

  "_signature_note": "SIGNED since 2026-09-05. A detached JWS per A2A \u00a78.4: ES256 over the card canonicalised by RFC 8785 with signatures[] excluded from the payload. The signature is NOT in this record — it lives in records/agent-card.signature.json, and build-site.mjs attaches it to the emitted card only after verifying it against records/signing-key.public.json. Edit any field above and the build refuses until `node tools/sign-card.mjs` re-signs, because a signature over content that has since changed is worse than no signature at all. The private key is not in this repository and never will be; losing it means publishing a new key, which is a real single point of failure and is stated rather than hidden.",
  "_signature_limit_note": "What it does not prove: the verifying key is published on the same domain as the card, so a party who could serve a forged card could serve a forged key beside it. TLS is what actually binds this card to this domain. The signature proves integrity since signing and nothing about identity, and this file says so rather than letting the presence of a signature imply more."
}
