A2A

Embeds a signed governance extension inside A2A Agent Cards so receiving agents can make a trust decision before accepting a task. The extension is a verbatim subset of the live Governance Attestation, served over a public endpoint and re-verifiable with ML-DSA-65.

Why

The A2A protocol describes what an agent can do but not how governed it is. Two agents from different orgs negotiate a task without any standardized view of each other's compliance posture. Asqav fills the gap by shipping governance metadata inside the Agent Card under extensions.asqav.governance, matching the proposal in a2aproject/A2A#1717.

Endpoint

Public, no auth:

bash
curl https://api.asqav.com/api/v1/agents/{agent_id}/card

Returns 200 for any agent that has issued at least one attestation. 404 if the agent has never been attested. 410 if the attestation has expired, or the agent has been revoked or decommissioned. 403 if the agent is suspended or quarantined, or its organization is not able to sign. Re-issuing a fresh attestation, or lifting the suspension, restores 200.

Attestations expire in seven days

An attestation is valid for seven days from issuance and does not renew on its own. Once it expires, this endpoint and the public attestation endpoint both return 410 until the organization issues a fresh one.

Platform discovery

Asqav exposes its own A2A Agent Card at the standard well-known path:

bash
curl https://api.asqav.com/.well-known/agent.json

This describes Asqav-as-a-platform. The card advertises its governance capabilities and a card_resolver URL template for looking up governance metadata on any Asqav-governed agent.

Card shape

json
{
  "schemaVersion": "1.0",
  "name": "support-bot",
  "description": "asqav-governed AI agent",
  "serviceEndpoint": "https://api.asqav.com/api/v1/agents/agt_abc123",
  "capabilities": ["read", "reply"],
  "extensions": {
    "asqav": {
      "governance": {
        "attestation_url": "https://api.asqav.com/api/v1/public/attestation/agt_abc123",
        "trust_level": "L2",
        "trust_score": 0.6234,
        "policy_digest": "sha256:...",
        "compliance_attestations": ["HIPAA", "GDPR"],
        "retention_ttl_seconds": 31536000,
        "derivation_rights": {
          "retention_permitted": true,
          "derivative_works": false,
          "third_party_sharing": false,
          "license_reference": null
        },
        "issuer": "asqav",
        "schema_version": 2
      }
    }
  }
}

Verifying on the receiving side

After receiving a peer's Agent Card, fetch the full signed attestation at extensions.asqav.governance.attestation_url. Verify the ML-DSA-65 signature against the returned public key. If the body matches the governance subset in the card and the signature verifies, the trust posture is genuine.

Forward-compatible

Old A2A clients that don't understand extensions.asqav ignore it and see a regular Agent Card. Clients that DO understand it can enforce trust thresholds before accepting tasks.

Integration example

python
import httpx, json

async def accept_task_if_governed(peer_agent_id: str, min_trust_score: float = 0.5):
    card = httpx.get(f"https://api.asqav.com/api/v1/agents/{peer_agent_id}/card").json()
    gov = card.get("extensions", {}).get("asqav", {}).get("governance")
    if not gov:
        raise RuntimeError("peer has no governance metadata")
    if gov["trust_score"] < min_trust_score:
        raise RuntimeError(f"peer trust_score {gov['trust_score']} below threshold")
    # Optionally re-verify the signed attestation
    att = httpx.get(gov["attestation_url"]).json()
    # ... verify signature_b64 against public_key_b64 with ML-DSA-65
    return True