Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

feat(extensions): add AIAR identity extension (v0 MVP)#1592

Draft
ibrahimokuyucu wants to merge 1 commit intoa2aproject:mainfrom
ibrahimokuyucu:feature/aiar-identity-extension
Draft

feat(extensions): add AIAR identity extension (v0 MVP)#1592
ibrahimokuyucu wants to merge 1 commit intoa2aproject:mainfrom
ibrahimokuyucu:feature/aiar-identity-extension

Conversation

@ibrahimokuyucu
Copy link

Summary

This PR introduces the Agent Identity and Accountability Reporting (AIAR) extension (v0 MVP), a backwards-compatible A2A extension that provides verifiable identity binding for Agent Cards and runtime proof-of-possession for agent endpoints.

Problem: The A2A protocol enables agent discovery and communication but does not provide a mechanism for clients to verify that an Agent Card or runtime endpoint is bound to a verifiable issuer identity. Discovery is not identity; runtime auth is not ownership.

Solution: AIAR adds opt-in, cryptographic identity primitives using standard formats (JWS, JCS canonicalization) that higher-level trust frameworks can build upon.

What's included

  • Extension specification (docs/extensions/aiar-identity-v0.md):

    • Agent Card identity params: issuer, kid, signedFields, jws, attestations
    • Signing target definition using RFC 8785 (JCS) canonicalization
    • Step-by-step verification procedure
    • Message-level opt-in request (minAssurance, acceptableIssuers, requireFreshnessSeconds)
    • Response proof bundle (cardDigest, proofOfPossession, timestamps)
    • Optional RPC methods: aiar.getProofBundle, aiar.getIssuer
    • Security considerations (Sybil, replay, key compromise, phishing, privacy)
  • Specification updates (docs/specification.md):

    • AIAR Agent Card example in Section 4.6 (Extension Declaration)
    • Message-level identity request example
  • Extensions list update (docs/topics/extensions.md):

    • AIAR added to the extension list table
  • Example payloads (examples/aiar-identity/):

    • agent-card.json — standard Agent Card without AIAR
    • agent-card.signed.json — Agent Card with AIAR extension params + JWS
    • message.request.json — SendMessage with identity requirements in metadata
    • message.response.json — task response with proof bundle in metadata
    • proof-bundle.json — standalone proof bundle (as returned by aiar.getProofBundle)
    • README.md — step-by-step verification guide

How clients opt in

  1. Inspect capabilities.extensions[] in the Agent Card for the AIAR URI
  2. Include A2A-Extensions: https://github.com/a2aproject/A2A/extensions/aiar.identity/v0 header
  3. Optionally include identity requirements in SendMessageRequest.metadata
  4. Verify the proof bundle in the response metadata

What's explicitly out of scope (v0)

  • Global governance or federated identity registries
  • Certificate revocation infrastructure (CRL/OCSP)
  • Reputation systems or behavioral trust metrics
  • End-to-end message encryption
  • Agent-to-agent mutual authentication
  • Automated key rotation (aiar.rotateKeys deferred to future version)

Compatibility

  • No breaking changes: all AIAR data uses existing extension points (AgentExtension.params, Message.metadata, Task.metadata)
  • No core schema modifications: no changes to a2a.proto or core data structures
  • Graceful degradation: agents/clients unaware of AIAR are completely unaffected

Checklist

  • docs/extensions/aiar-identity-v0.md exists with full spec + examples
  • Agent Card schema/docs updated to show extension declaration + AIAR example
  • Message schema/docs updated with AIAR request + proof bundle response
  • Optional RPC methods defined in spec
  • examples/ folder includes valid JSON payloads + verification README
  • No breaking changes; existing schemas remain valid

Introduce the Agent Identity and Accountability Reporting (AIAR)
extension, providing verifiable identity binding for Agent Cards
and runtime proof-of-possession for agent endpoints.

Includes:
- Extension spec: docs/extensions/aiar-identity-v0.md
- Agent Card extension params (issuer, kid, JWS, attestations)
- Message-level opt-in request and proof bundle response
- Optional RPC methods (aiar.getProofBundle, aiar.getIssuer)
- Example payloads with verification README
- Updated specification.md and extensions.md with AIAR examples

Made-with: Cursor
@ibrahimokuyucu ibrahimokuyucu requested review from a team as code owners March 5, 2026 05:00
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces the Agent Identity and Accountability Reporting (AIAR) extension, a significant enhancement to the A2A protocol. It addresses the critical need for verifiable identity binding in Agent Cards and runtime endpoints, allowing clients to cryptographically confirm the authenticity and ownership of agents. By providing a robust framework for identity and accountability, this extension lays the groundwork for more trusted and secure agent interactions within the A2A ecosystem, all while maintaining full backwards compatibility.

Highlights

  • New AIAR Identity Extension (v0 MVP): Introduced the Agent Identity and Accountability Reporting (AIAR) extension, a backwards-compatible A2A extension designed to provide verifiable identity binding for Agent Cards and runtime proof-of-possession for agent endpoints.
  • Verifiable Identity Binding: Implemented cryptographic identity primitives using JWS signatures and JCS canonicalization to bind Agent Cards to declared issuer identities.
  • Runtime Proof-of-Possession: Enabled clients to confirm that an agent endpoint controls the signing key through message-level identity requests and response proof bundles.
  • Optional RPC Methods: Defined new optional RPC methods, aiar.getProofBundle and aiar.getIssuer, for programmatic retrieval of identity proofs and issuer metadata.
  • Comprehensive Documentation and Examples: Added a detailed specification document for the AIAR extension, updated core specification examples, and provided a dedicated folder with various example JSON payloads and a verification guide.
  • Compatibility and Graceful Degradation: Ensured the extension is fully opt-in, additive, and backwards-compatible, utilizing existing extension points without modifying core schemas, allowing agents and clients unaware of AIAR to remain unaffected.
Changelog
  • docs/extensions/aiar-identity-v0.md
    • Added a new specification document detailing the AIAR extension, including its abstract, motivation, terminology, activation, identity parameters, message-level requests/proofs, optional RPC methods, security considerations, and compatibility.
  • docs/specification.md
    • Updated Section 4.6 to include examples of an Agent Card with the AIAR identity extension and a client requesting identity proof via message metadata.
  • docs/topics/extensions.md
    • Added the AIAR extension to the list of available extensions.
  • examples/aiar-identity/README.md
    • Added a README file explaining the example JSON payloads for the AIAR identity extension and providing verification steps for Agent Card signatures and runtime proof bundles.
  • examples/aiar-identity/agent-card.json
    • Added an example of a standard Agent Card without the AIAR extension.
  • examples/aiar-identity/agent-card.signed.json
    • Added an example of an Agent Card with the AIAR extension declared, including issuer metadata and a JWS signature.
  • examples/aiar-identity/message.request.json
    • Added an example of a SendMessage request incorporating AIAR identity requirements in its metadata.
  • examples/aiar-identity/message.response.json
    • Added an example of a task response that includes an AIAR proof bundle in its metadata.
  • examples/aiar-identity/proof-bundle.json
    • Added an example of a standalone proof bundle object.
Activity
  • No human activity has been recorded for this pull request yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the Agent Identity and Accountability Reporting (AIAR) extension, a significant and well-documented feature. The specification is thorough, covering verifiable identity in Agent Cards and runtime proof-of-possession. My feedback focuses on improving consistency across the new documentation and examples, particularly regarding naming conventions for enum-like values and metadata keys, and ensuring JWS headers in examples align with the specification.

Note: Security Review has been skipped due to the limited scope of the PR.

"issuer": "https://example.com",
"kid": "example-key-2025-01",
"proofOfPossession": {
"protected": "eyJhbGciOiJFUzI1NiJ9",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The JWS protected header in this example for proofOfPossession is missing the kid field. Other examples in this specification (e.g., for the Agent Card signature and the message-level response) include the kid in the protected header. For consistency within the AIAR specification, the kid should also be included here.

The current protected value eyJhbGciOiJFUzI1NiJ9 decodes to {"alg":"ES256"}. It should also contain the kid to be consistent with other examples, like {"alg":"ES256","kid":"example-key-2025-01"}.

Suggested change
"protected": "eyJhbGciOiJFUzI1NiJ9",
"protected": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImV4YW1wbGUta2V5LTIwMjUtMDEifQ",


| Field | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| `minAssurance` | string | Yes | Minimum assurance level required. Values: `"self-signed"`, `"org-signed"`, `"third-party-signed"`. |
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The string values for minAssurance ("self-signed", "org-signed", "third-party-signed") resemble enum values. To align with the A2A protocol's convention of using SCREAMING_SNAKE_CASE for enum values, it would be better to use this format. This improves consistency across the protocol. This also applies to the Assurance levels table on lines 202-204 and the example on line 229.

Suggested change
| `minAssurance` | string | Yes | Minimum assurance level required. Values: `"self-signed"`, `"org-signed"`, `"third-party-signed"`. |
| `minAssurance` | string | Yes | Minimum assurance level required. Values: `"SELF_SIGNED"`, `"ORG_SIGNED"`, `"THIRD_PARTY_SIGNED"`. |
References
  1. Enum values in the A2A protocol should be in SCREAMING_SNAKE_CASE to comply with the ProtoJSON specification.

`Message.metadata` for direct message responses), keyed by the extension URI
with a `/proof_bundle` suffix:

**Metadata key:** `https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/proof_bundle`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The metadata key for the response proof bundle is .../proof_bundle. This is inconsistent with the request metadata key suffix, which is /request. For consistency with JSON camelCase conventions used elsewhere in the protocol, I suggest changing this to /proofBundle.

Suggested change
**Metadata key:** `https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/proof_bundle`
**Metadata key:** `https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/proofBundle`

},
"metadata": {
"https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/request": {
"minAssurance": "org-signed",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

To maintain consistency with the suggested change in docs/extensions/aiar-identity-v0.md, the value for minAssurance should be updated from "org-signed" to ORG_SIGNED. This aligns with the SCREAMING_SNAKE_CASE convention for enum-like values.

Suggested change
"minAssurance": "org-signed",
"minAssurance": "ORG_SIGNED",
References
  1. Enum values in the A2A protocol should be in SCREAMING_SNAKE_CASE to comply with the ProtoJSON specification.

## How to Verify a Runtime Proof Bundle

1. **Extract the proof bundle** from the response `metadata` under the key
`https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/proof_bundle`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The metadata key .../proof_bundle should be updated to .../proofBundle to be consistent with the suggested change in the main extension specification for better naming consistency.

Suggested change
`https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/proof_bundle`.
`https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/proofBundle`.

},
"metadata": {
"https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/request": {
"minAssurance": "org-signed",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

For consistency with protocol conventions, the minAssurance value should be ORG_SIGNED instead of org-signed, following the SCREAMING_SNAKE_CASE format for enum-like values.

Suggested change
"minAssurance": "org-signed",
"minAssurance": "ORG_SIGNED",
References
  1. Enum values in the A2A protocol should be in SCREAMING_SNAKE_CASE to comply with the ProtoJSON specification.

}
},
"metadata": {
"https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/proof_bundle": {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The metadata key .../proof_bundle should be updated to .../proofBundle for consistency with other metadata keys and JSON naming conventions.

Suggested change
"https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/proof_bundle": {
"https://github.com/a2aproject/A2A/extensions/aiar.identity/v0/proofBundle": {

"issuer": "https://example.com",
"kid": "example-key-2025-01",
"proofOfPossession": {
"protected": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImV4YW1wbGUta2V5LTIwMjUtMDEiLCJ0eXAiOiJwb3Aram3rIn0",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The protected header in the proofOfPossession JWS includes "typ":"pop+jws". This typ value is not defined in the AIAR specification. To maintain consistency with the spec, it's best to remove this undocumented field. The new protected header would be {"alg":"ES256","kid":"example-key-2025-01"}.

Suggested change
"protected": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImV4YW1wbGUta2V5LTIwMjUtMDEiLCJ0eXAiOiJwb3Aram3rIn0",
"protected": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImV4YW1wbGUta2V5LTIwMjUtMDEifQ",

"issuer": "https://example.com",
"kid": "example-key-2025-01",
"proofOfPossession": {
"protected": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImV4YW1wbGUta2V5LTIwMjUtMDEiLCJ0eXAiOiJwb3Aram3rIn0",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The protected header in the proofOfPossession JWS includes "typ":"pop+jws". This typ value is not defined in the AIAR specification. To keep the examples aligned with the specification, I suggest removing this field. The new protected header would be {"alg":"ES256","kid":"example-key-2025-01"}.

Suggested change
"protected": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImV4YW1wbGUta2V5LTIwMjUtMDEiLCJ0eXAiOiJwb3Aram3rIn0",
"protected": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImV4YW1wbGUta2V5LTIwMjUtMDEifQ",

@chorghemaruti64-creator
Copy link

This directly addresses a gap we've encountered in production: discovery ≠ identity.

When building Agenium — a platform where agents have persistent addresses (agent://name.agenium) — we found that most implementations conflate the endpoint URL with the agent's identity. AIAR's proof-of-possession approach is the right abstraction.

One question on the v0 spec: how does AIAR handle identity continuity across endpoint migrations? If an agent moves from host A to host B (common with rolling deploys), the cryptographic binding needs to transfer. Is the issuer identity anchored to a key pair independent of the endpoint, or is there a re-attestation flow?

This matters especially for A2A trust scoring — behavioral reputation accumulated at identity X should persist even if X migrates endpoints. Otherwise you get cold-start penalties every deploy cycle.

@ibrahimokuyucu ibrahimokuyucu marked this pull request as draft March 5, 2026 07:59
@ibrahimokuyucu
Copy link
Author

This directly addresses a gap we've encountered in production: discovery ≠ identity.

When building Agenium — a platform where agents have persistent addresses (agent://name.agenium) — we found that most implementations conflate the endpoint URL with the agent's identity. AIAR's proof-of-possession approach is the right abstraction.

One question on the v0 spec: how does AIAR handle identity continuity across endpoint migrations? If an agent moves from host A to host B (common with rolling deploys), the cryptographic binding needs to transfer. Is the issuer identity anchored to a key pair independent of the endpoint, or is there a re-attestation flow?

This matters especially for A2A trust scoring — behavioral reputation accumulated at identity X should persist even if X migrates endpoints. Otherwise you get cold-start penalties every deploy cycle.

Great question. The intent in v0 is that identity is anchored to the key pair, not the endpoint. So an agent can move from host A to host B and keep the same identity as long as it proves possession of the same key and presents a valid signed Agent Card.

Key rotation / successor identities are not specified in v0 yet. How did you handle this in Agenium?

@The-Nexus-Guard
Copy link

Strong proposal. The JWS + JCS canonicalization approach is well-suited for enterprise environments where existing PKI infrastructure already issues keys.

I maintain AIP (Agent Identity Protocol) and submitted a DID-based identity extension in #1511. Reading through AIAR, I see significant overlap in goals but complementary design choices:

Aspect AIAR AIP (#1511)
Identity format Issuer URI + kid DID (did:aip:...)
Signing JWS (JOSE ecosystem) Ed25519 raw signatures
Trust model Attestations (delegated) Vouching network (peer-to-peer)
Key management Standard JWKS rotation Key rotation with signature chain
Implementation Specification Working service + CLI + PyPI package

Rather than competing proposals, I think A2A benefits from a unified approach. Some thoughts:

  1. The issuer field could be a DID. did:web:example.com or did:aip:... are valid issuer URIs, which means AIAR's framework is naturally compatible with DID-based identity. The JWS wrapping adds standard envelope semantics that raw Ed25519 signatures lack.

  2. Attestations and vouches solve the same problem differently. AIAR's attestations are top-down (issuer attests for agent). AIP's vouches are peer-to-peer (agents vouch for each other). Both are needed — institutional trust AND organic trust.

  3. Proof-of-possession at runtime is the key contribution. This is something docs: DID-based agent identity verification extension via AIP #1511 handles via challenge-response but AIAR specifies more formally with minAssurance and acceptableIssuers. Worth adopting.

Would be interested in collaborating on a unified identity extension that supports both enterprise (JWS/JWKS) and decentralized (DID/Ed25519) patterns. The verification procedure in AIAR Section 5 could accept either format.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants