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
2Different questions
| Question | Answered 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.
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.
| A2A | AIF | Answers |
|---|---|---|
| Agent Card | — | Where is it, and how do I authenticate? |
| Skill | — (out of scope) | What can be asked, and what comes back? |
| Message | Frame | What 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 outcome | A2A task state |
|---|---|
| Frame accepted, work running | WORKING |
ResultFrame, all criteria passed | COMPLETED |
| Refused at admission | REJECTED |
| Failed at validation or budget | FAILED |
| Clarification needed before proceeding | INPUT_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-Versionheader, 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.
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?
| Situation | Use |
|---|---|
| Agents from different vendors or teams need to interoperate | A2A. This is what it is for. |
| Long-running work, streaming, webhooks, enterprise auth | A2A. |
| Everything runs in one process; you just need the contract | AIF alone. No transport needed. |
| An agent has credentials it should not use for a given task | Both. A2A delivers, AIF constrains. |
| You cannot objectively tell whether returned work is acceptable | Both. |
| You must evidence, afterwards, which controls applied | Both. |
| Two agents, a prototype, nothing in production | Neither. 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:
| Protocol | Edge | Governs |
|---|---|---|
| MCP | agent → tools | How an agent reaches tools and context |
| A2A | agent ↔ agent | Discovery, delivery, task lifecycle |
| AIF | agent ↔ agent | What a single request means and what counts as done |
| AG-UI | agent → user interface | Streaming 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.