intentframe.org
Comparison

AIF and A2A

They are not alternatives. A2A moves a task between two agents and tracks its lifecycle. AIF describes what the task means, under what limits, and what counts as done. A frame travels inside an A2A message.

1The short answer

A2A is the delivery layer for agent-to-agent work: discovery through Agent Cards, three transport bindings, a nine-state task lifecycle, streaming, webhooks, and enterprise authentication. It answers which agent can do this, how do I reach it, and what is the task doing now.

AIF is a payload format. It answers what exactly is being asked, under which enforceable limits, and how will we know the result is acceptable. It specifies no transport, no discovery, and no lifecycle, because A2A already does those well.

If you are already sending A2A tasks and your problem is that the receiving agent sometimes does things it should not, or returns work nobody can objectively evaluate, that gap is what a frame fills.

flowchart TB
    subgraph A2A["A2A · the envelope and the pipe"]
        direction TB
        DISC["Agent Card<br/>/.well-known/agent-card.json"]
        TRANS["JSON-RPC · gRPC · HTTP+JSON"]
        LIFE["Task lifecycle<br/>9 states, streaming, webhooks"]
        AUTH["OAuth2 · mTLS · OIDC"]
    end
    subgraph MSG["A2A Message"]
        direction TB
        TP["TextPart<br/>prose for the model"]
        DP["DataPart<br/>the intent frame"]
    end
    subgraph AIF["AIF · what is inside the envelope"]
        direction TB
        C["constraints<br/>enforced before invocation"]
        AC["acceptance_criteria<br/>typed checks"]
        IT["intent_type<br/>dispatch"]
    end
    A2A --> MSG
    DP --> AIF
    class DISC,TRANS,LIFE route
    class AUTH enforce
    class TP model
    class DP context
    class C enforce
    class AC check
    class IT route
A frame is cargo, not a competitorA2A carries structured data in a message part already. A frame is a well-specified thing to put there.

2Different questions

QuestionAnswered by
Which agent can do this work?A2A — Agent Card skills
How do I reach it and authenticate?A2A — bindings and security schemes
What is the task doing right now?A2A — task states, streaming, push
How do I get incremental output?A2A — artifact update events
What exactly is being asked?AIF — goal, inputs, reasoning
What may the receiver spend, and which tools may it use?AIF — constraints
What counts as an acceptable result?AIF — acceptance_criteria
Is this produce-work or check-work?AIF — intent_type
Why was it refused, and whose problem is it?AIF — refused_at, violation codes

Nothing in the top half belongs in a frame. Nothing in the bottom half is in scope for A2A, and that is a deliberate choice rather than an oversight — see the next section.

3Opaque execution, and why the gap exists

A2A lists opaque execution among its guiding principles: agents collaborate based on declared capabilities and exchanged information, without needing to share their internal thoughts, plans, or tool implementations. The specification is explicit that agents interoperate without access to each other's internal state, memory, or tools.

That principle is correct for a protocol spanning organisational boundaries, and it is precisely why A2A does not specify token ceilings, tool grants, or completion criteria. Those are internal matters, and A2A treats the remote agent as a black box on purpose.

The distinction worth holding onto

A frame does not make execution transparent. It makes the terms explicit while leaving execution opaque. You still cannot see how the remote agent thinks. You can state what it may spend, which tools it may use, and what its output must satisfy — and check the result against that statement without knowing anything about how it was produced.

This is why the two compose rather than collide. A2A deliberately declines to describe the inside of the box; a frame describes the contract on the outside of it.

4Where they genuinely overlap

Three places. Pretending otherwise would be dishonest, and in two of them A2A is the better answer.

4.1 Agent Card and Skills

This overlap has been resolved rather than described. An earlier AIF draft specified a capability manifest at a well-known path. It has been withdrawn, and discovery is now explicitly out of scope for AIF in the same way transport is.

The Agent Card is the better answer by a wide margin: security schemes, transport interfaces, signing, extended cards behind authentication, and caching semantics. Reproducing a fraction of that would have earned nothing but an integration burden.

So the mapping is one-directional. An A2A Skill declares what an agent can do, and AIF has no counterpart at all — deliberately. A frame has no A2A counterpart either, and that is the gap this project addresses.

A2AAIFAnswers
Agent CardWhere is it, and how do I authenticate?
Skill(out of scope)What can be asked, and what comes back?
MessageFrameWhat am I asking for this time, under what terms?

A Skill is authored once and cached; it is identical for every caller and every invocation. It cannot express that this particular call gets 80 tokens and one cent, because per-request terms have no business in a cached discovery document. That is what a frame carries.

Declare each capability as a Skill, using the same name the frame addresses:

{
  "id": "research.summarize",
  "name": "Executive incident summary",
  "description": "Condenses incident artifacts into an executive summary.",
  "tags": ["research"],
  "inputModes": ["application/vnd.aif+json", "text/plain"],
  "outputModes": ["application/vnd.aif+json", "text/plain"]
}

The dual inputModes is the incremental adoption path. A caller that knows nothing about frames sends a plain text part and is served normally; one that sends a frame gets enforced limits and a validated result.

4.2 Task rejection and refusal frames

A2A has a REJECTED task state, described as the agent deciding not to perform the task, either at creation or later. That is real overlap with refusal at admission.

The difference is granularity. REJECTED tells the caller that the agent said no. A refusal frame carries which terms were unacceptable, as stable codes, plus whether the sender should amend the request or accept that the work was not achievable. If the distinction between "your request was inadmissible" and "the work could not meet the standard" does not matter to your callers, A2A's state is enough.

Use both: set the task state to REJECTED and return the refusal frame as the reason.

4.3 Task state and frame outcome

A2A owns the lifecycle. A frame's outcome maps onto it rather than duplicating it:

AIF outcomeA2A task state
Frame accepted, work runningWORKING
ResultFrame, all criteria passedCOMPLETED
Refused at admissionREJECTED
Failed at validation or budgetFAILED
Clarification needed before proceedingINPUT_REQUIRED

5What only A2A does

This list is long, and none of it is on the AIF roadmap. Duplicating any of it would be a mistake.

  • Three protocol bindings — JSON-RPC 2.0, gRPC, HTTP+JSON/REST — with functional-equivalence requirements between them.
  • Enterprise authentication: OAuth 2.0 flows, OpenID Connect, mutual TLS, API keys, plus in-task authorization when an agent needs credentials mid-task.
  • A nine-state task lifecycle with defined terminal and interrupted states.
  • Streaming with ordering guarantees, multiple concurrent subscribers per task, and resubscription after disconnection.
  • Push notification webhooks with authentication, retry, and delivery guarantees for long-running work.
  • Task listing with cursor-based pagination and filtering.
  • Agent Card signing and canonicalisation, extended cards behind auth, caching rules.
  • Multi-tenancy routing, protocol version negotiation via the A2A-Version header, registered media type and well-known URI.
  • SDKs, a formal extension governance process, and Linux Foundation stewardship.

A2A is a production protocol. AIF is a schema and an argument.

6What only AIF adds

Correspondingly short, because it is one idea applied consistently.

Constraints enforced before invocation

A2A carries whatever the caller puts in a message. If a caller writes "do not use write tools" as prose, nothing enforces it. A frame makes limits structured data that admission control compares against policy, and a violating request is refused with zero model invocations.

Machine-checkable completion

A2A returns artifacts. Whether an artifact is acceptable is outside its scope. Typed acceptance criteria make that decision mechanical, and specific enough to drive a repair loop.

Intent as a dispatch key

A2A skills identify what an agent can do. intent_type distinguishes producing work from checking work, so the runtime can select a different model, temperature, and tool grant without changing any prompt.

Criteria withheld from the model

A frame can declare a check the model must never see, because the source material contains exactly what the check forbids. There is nowhere in A2A to express that, because A2A does not model the inference call at all.

7Using them together

A2A messages carry Part objects, one of which holds arbitrary structured JSON. A frame goes in a data part alongside the human-readable text part.

{
  "message": {
    "messageId": "msg-8f21",
    "role": "ROLE_USER",
    "extensions": ["https://agentintentframe.org/ext/v0.1"],
    "parts": [
      { "text": "Summarise incident 4471 for the executive committee." },
      {
        "data": { /* the intent frame */ },
        "mediaType": "application/vnd.aif+json"
      }
    ]
  }
}

A2A defines a formal extension mechanism: extensions are declared in the Agent Card, identified by URI, and negotiated per request through the A2A-Extensions service parameter. The specification notes that extensions can be used to strongly type metadata values — which is exactly what a frame is.

Declared on the receiving agent:

"capabilities": {
  "extensions": [
    {
      "uri": "https://agentintentframe.org/ext/v0.1",
      "description": "Accepts Agent Intent Frames and returns typed result or refusal frames.",
      "required": false
    }
  ]
}

Marking it required: false is the right default: a caller that knows nothing about frames sends a plain text part and is served normally. A caller that sends one gets enforced limits and a validated result. Adoption is incremental and nothing breaks.

On the return path, put the result or refusal frame in a data part of the task's artifact, and set the task state per the mapping in §4.3.

Status

This extension is a proposal, not a registered A2A extension. The URI above is illustrative. If frames prove useful in practice, the correct next step is A2A's own extension governance process rather than a parallel standard.

8Do you need both?

SituationUse
Agents from different vendors or teams need to interoperateA2A. This is what it is for.
Long-running work, streaming, webhooks, enterprise authA2A.
Everything runs in one process; you just need the contractAIF alone. No transport needed.
An agent has credentials it should not use for a given taskBoth. A2A delivers, AIF constrains.
You cannot objectively tell whether returned work is acceptableBoth.
You must evidence, afterwards, which controls appliedBoth.
Two agents, a prototype, nothing in productionNeither. Send a prompt.

The honest default: adopt A2A first, and add frames at the specific boundaries where you need enforcement or checkable completion. Adopting AIF everywhere before you have felt either problem is overhead without a return.

9And MCP, and AG-UI

The four occupy different edges, and the distinctions are crisp:

ProtocolEdgeGoverns
MCPagent → toolsHow an agent reaches tools and context
A2Aagent ↔ agentDiscovery, delivery, task lifecycle
AIFagent ↔ agentWhat a single request means and what counts as done
AG-UIagent → user interfaceStreaming a run to a frontend

AIF is the only one of the four that is not a wire protocol, which is why it sits inside one rather than beside it. A production system might use all four: A2A routes the task, a frame states its terms, MCP gives the receiving agent its tools, and AG-UI shows a person what is happening.

Specification → · Library adapters → · A2A specification →