Agent SoW: A2A Interview Extension
Rendered from sow/SPEC-A2A-INTERVIEW.md in the Common Agent Standards repository, at commit 1da8262f. It extends the Agent SoW specification, which is the authority for every term it borrows.
The terms extension lets an A2A Agent Card commit to signed standing terms. A committed document proves what was declared; it cannot prove that the running agent agrees with its own declarations. This extension adds the live half: five questions any client may put to the agent itself, identity, capabilities, usage, terms, and refusals, each answered by projecting the agent's declared documents, never by generating text. The answers are lookups, so a verifier can diff what the agent says against what the agent signed, and a persistent conflict is non-conformance, detectable by code that holds no model.
This is a method extension in A2A's own taxonomy: it defines new
operations, is inactive by default, and is activated per request through
the A2A-Extensions header. It lives on this site, beside the terms
extension, as a stated choice: the two activate together in practice,
because the interview's terms answers must match the terms extension's
committed proposals, and a reader implementing one needs the other on the
same shelf.
This document defines an extension to the A2A protocol (https://a2a-protocol.org/latest/specification/). It is not part of the A2A specification and is not endorsed by the A2A project. For the terms vocabulary it defers to the Agent SoW specification (SPEC.md on this site) and to the terms extension (SPEC-A2A-TERMS.md); where they disagree with this document, they win.
1. Conformance language and terminology#
The key words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are to be interpreted as described in RFC 2119.
- Card: an A2A Agent Card, the self-description document an A2A agent
serves, typically at
/.well-known/agent-card.json. - Terms extension: the sibling extension at
https://agentsow.com/extensions/a2a-terms/v1, whose card entry commits to the agent's signed standing proposals by digest. - Declared documents: the card itself, and the standing proposals the card's terms extension entries commit to. These are the only sources an interview answer may draw from.
- Projection: an answer consisting of a value copied from a named member of a declared document, together with the name of that document and member.
- Interviewer: the client making interview calls.
- Verifier: an interviewer that also fetches the declared documents and diffs the answers against them.
2. Extension URI#
https://agentsow.com/extensions/a2a-interview/v1
The URI identifies this extension in a card's extensions array and in the
A2A-Extensions header. Future revisions that change the methods, the
answer shape, or the refusal shape take a new version segment; consumers
match the URI exactly.
3. Declaration and activation#
The card declares support with an AgentExtension object inside
capabilities.extensions:
{
"uri": "https://agentsow.com/extensions/a2a-interview/v1",
"description": "The five questions, answered from declared documents",
"required": false
}
Rules:
requiredMUST NOT betrue. The interview is offered, never imposed: it asks nothing of clients that do not use it, and ordinary traffic is unaffected by its presence.- Activation follows A2A's method-extension semantics exactly. The
extension is inactive by default. An interviewer activates it by listing
the URI in the
A2A-Extensionsrequest header; the agent lists the URIs it actually activated in theA2A-Extensionsresponse header. A request naming an interview method without the URI in itsA2A-Extensionsheader is a request for a method that does not exist, and receives the protocol's standard method-not-found error rather than anything defined here. - An agent that declares this extension SHOULD also declare the terms
extension. It is not required to: an agent with no published terms can
still answer four questions and answer the fifth honestly (section 4,
interview/terms).
4. The five methods#
The extension defines five operations, named in the category/action
style A2A's own methods use (message/send, tasks/get) and its method
extensions follow:
| Method | Question | Answered from |
|---|---|---|
interview/identity |
Who are you? | The card: name, provider, url, version, and its JWS signature. |
interview/capabilities |
What do you do? | The card: skills, each with its id and description. |
interview/usage |
How are you used? | The card: interfaces and transports, per-skill input and output modes, securitySchemes. |
interview/terms |
On what terms? | The terms extension's committed standing proposals, fetched and projected by their clauses. |
interview/refusals |
What do you refuse? | The closure of the above: the declared skill ids, stated as the boundary, plus the standard refusal everything outside it receives. |
Rules:
- Every answer is a projection of declared bytes. An implementation MUST serve interview answers from the card and the committed proposals as published, and MUST NOT invoke the agent's model, tools, or memory to produce, rephrase, summarize, or decorate them. The answers are lookups. Two interviews of an unchanged agent return identical answers.
- The methods MUST be idempotent and side-effect-free, MUST NOT create tasks, and MUST NOT enqueue anything for the agent. Implementations SHOULD serve them from cache and SHOULD rate-limit them per client; the answers change when the declarations change, not per request.
interview/usageandinterview/termsMAY take one OPTIONAL parameter,skill, an exact-match selector against declared skill ids. A selector that matches no declared id receives the standard refusal of section 6 with reasonout_of_scope. Selectors are matched byte for byte, never interpreted.interview/termson an agent whose card carries no terms extension entry answers with an empty projection list and"declared": false. That is an answer, not an error and not a blank: the agent is stating that it has published no terms, the same way the reputation extension's enrollment states are answers. An implementation MUST NOT fabricate a terms answer from anything other than committed proposals.interview/refusalsis answered mechanically from the declaration: the declared skill ids, the statement that requests outside them are refused, and the refusal shape of section 6. An agent whose deployment also refuses on other declared grounds (an admission policy, a security scheme) MAY include those grounds as projections of wherever they are declared, and MUST NOT include grounds declared nowhere.
5. The answer shape#
Every response is an object naming the question and carrying projections:
{
"question": "terms",
"declared": true,
"projections": [
{
"source": {
"document": "proposal",
"url": "https://stonework.example/terms/reconcile-statement.sow.json",
"digest": "sha256:9f2c41d08a6b57e3c1d94f0b2a7e86c5d13f9a04b8e62d7c50a1f3e8b96c4d27",
"member": "/price"
},
"value": {
"arrangement": "fixed_fee",
"currency": "XCR",
"rates": [ { "offering": "reconcile-statement", "per_task": 2500000 } ],
"grade": "enforced"
}
}
]
}
Rules:
source.documentis"card"or"proposal". Acardsource needs no locator: the document is the agent's own card, the one the interviewer already fetched to find this extension. Aproposalsource MUST carry theurlanddigestof the terms extension entry it projects, so the verifier knows exactly which committed document to check against.source.memberis an RFC 6901 JSON Pointer into the source document.valueMUST be exactly the value at that pointer: equal, under JCS (RFC 8785) canonicalization of both sides, byte for byte. Not a summary, not a translation, not a subset.- An answer MUST NOT carry any member that is not a projection, a
question, ordeclared. There is no free-text field in an interview answer, deliberately: a field for commentary is a field a model will eventually fill.
6. Refusals: the closure#
Anything outside the five methods and the declared skills gets one standard refusal, produced mechanically:
{
"refused": true,
"reason": "out_of_scope",
"detail": "no declared skill matches",
"declared_skills": ["reconcile-statement", "flag-exceptions"]
}
Rules:
- Any method under this extension's activation other than the five of
section 4 MUST receive this refusal with reason
out_of_scope. The extension's method set is closed; there is nothing else to ask it. reasonis drawn from a closed set:out_of_scope(the request names nothing the agent declares) andnot_declared(the request asks a question whose declared source is absent, reserved for future revisions). The set grows by revision of this document, never by deployment.- The refusal MUST be produced without invoking the agent's model, tools, or memory, from the declaration alone. This is the security argument, stated the way the family states it: the interview is a document, not a conversation. Nothing an interviewer sends can make the agent think. The five methods take no free text, the selectors match exactly or refuse, and the refusal itself is assembled from declared ids. An implementation in which any interview input reaches a model has not implemented this extension; it has implemented an attack surface with this extension's name.
7. The consistency rule#
An agent's spoken statements about itself are subordinate to its declared documents. Where an interview answer conflicts with the card or with a committed proposal, the declared bytes govern, and a counterparty MAY rely on them without further inquiry. A persistent conflict is non-conformance.
The conflict is detectable by construction, and the diff is defined precisely enough to implement:
- For each projection with a
cardsource: fetch the agent's card, verify its JWS signature (A2A specification section 8.4), resolvesource.memberagainst it, canonicalize the resolved value and the answer'svalueunder JCS, and compare byte for byte. - For each projection with a
proposalsource: verify the cited document under the terms extension's own procedure (SPEC-A2A-TERMS.md sections 5 and 6: fetch fromurl, canonicalize, hash, compare againstdigest, verify the provider signature), then resolvesource.memberand compare the same way. A projection citing aurlanddigestthat appear in no terms extension entry of the card fails the diff: the agent is answering from terms its card never committed to. - Any comparison failure is a conflict. A single conflict on a fresh fetch MAY be churn, an agent mid-update whose card and answers crossed; the verifier re-fetches and re-asks. A conflict that survives a re-run is persistent, and persistent conflict is non-conformance.
8. The interview as procedure#
The five questions are testable by code that holds no model. A verifier:
- fetches the card and verifies its signature;
- activates the extension and makes the five calls;
- runs the diff of section 7 over every projection;
- probes the closure: calls an undefined method under the activation, and
calls
interview/usagewith a selector matching nothing, expecting the standard refusal both times, mechanically produced; - records the result.
Who ran the procedure is part of the result, and the distinction is mandatory in any display: a result an agent ran against itself is a claim; a result a platform or an independent third party recorded is evidence; a surface MUST NOT present the first as the second. The procedure is deliberately cheap, five reads and a diff, so that recording it as evidence costs a platform almost nothing.
9. Honesty rules#
- Answering the interview asserts exactly this: the agent's live answers are consistent with its declared documents. It asserts nothing about quality. Conformance is not competence: a perfectly conformant agent can be bad at its job, and finding that out is what reputation measures (the reputation extension points at it), not what the interview measures.
- Absence of the extension states nothing. An agent without it is an agent that has not implemented the interview; its declared documents still bind it exactly as far as they bound it before. A consumer MUST NOT read absence as evasiveness or as a defect, and MUST NOT rank or filter on absence as if it were a negative assertion.
- A refusal is an answer, not a failure. A verifier's probe that draws the standard refusal has received the correct response, and a surface MUST NOT count correct refusals against an agent.
- Interview results MUST carry who ran them (section 8), and a self-run result MUST NOT be presented as evidence.
10. Security considerations#
- The model boundary is the whole game. Every rule in sections 4 through 6 exists to keep interviewer input away from the agent's model. The threat is not exotic: an interview endpoint that passes questions to a model is a prompt-injection surface reachable by any stranger who can send a header. The mitigations are structural, no free-text inputs, exact-match selectors, closed method set, mechanical refusals, and an implementation MUST NOT weaken any of them for friendliness.
- Churn between answer and diff. The card and the answers can change between a verifier's fetch and its calls. Section 7 rule 3 handles it: re-fetch and re-ask before concluding anything; only a persistent conflict is non-conformance.
- Amplification. The methods are cheap to serve but not free. Deployments SHOULD rate-limit interview calls per client and serve them from cache. Nothing here obliges an agent to answer interviews from anyone: admission is the deployment's business, enforced with A2A's own security schemes at the transport, and an agent MAY require authentication before answering, exactly as it may for any method.
- Selective honesty. An agent could answer the interview correctly while behaving differently in ordinary traffic. The interview never claimed otherwise: it tests consistency of statements with declarations, and conduct is reputation's territory. A surface that presents a passed interview as evidence of conduct is making the claim this extension refuses to make.
11. Out of scope#
Four things are deliberately not in this document:
- Negotiation and counter-offers. Asking for a variant of the declared terms is a different act from asking what the declared terms are, and it is exactly the act that requires the agent to think. It belongs to a future document, gated by the formation question below.
- Formation over A2A. Countersigning a standing proposal follows the Agent SoW specification wherever the parties conduct it; carrying the request to form over A2A is future work shared with the terms extension.
- Reputation. What a population of counterparties concluded about the agent is the reputation extension's pointer, a separate document.
- Any obligation to answer. Who may interview an agent, how often, and after what authentication is the deployment's admission policy, built from A2A's security schemes, and this document takes no position beyond the rate-limiting advice above.
12. Relationship to other work#
This extension is the A2A binding of the five questions defined in the Agent Messaging specification (its section 3.3.1), whose mesh binding is the describe operation and public-block machinery there (its section 10.14); the two bindings must stay answer-compatible, so that an agent reachable both ways gives the same answers from the same declarations. The sentence this family uses for the boundary applies verbatim over A2A: a tool is invoked, an agent is engaged, and the interview is what makes engagement possible over A2A, because an engagement begins with a counterparty that can ask "on what terms" and rely on the answer. Within this site's pair of card extensions, the terms extension publishes the declarations and this extension makes the running agent answerable to them; the reputation extension (https://agentreputations.com/extensions/a2a-reputation/v1) covers the third thing, what the agent's record says, which neither declaration nor interview can.
Changelog#
0.1.1-draft (2026-10-18). Editorial, with no normative change. Section 12 and the entry below name Agent Messaging, where the five questions are defined, rather than a platform.
0.1.0-draft (2026-08-11). Ask, then diff.
First draft, and the family's first method extension, which is itself the argument: the terms and reputation extensions are data-only because their content is declarations, and declarations ride in cards. But no card entry can answer a live consistency probe, because the thing being tested is whether the running agent agrees with its card, and data cannot disagree with itself. Testing that requires asking the running agent, and asking requires methods, so this document defines five, named in the category/action style A2A's own methods and its method extensions already use.
The answers are lookups, and that is the product, not a limitation. A model asked "what do you do" gives the best answer it can construct, which is precisely the answer a buyer cannot rely on; a lookup gives the declared answer, identical on every ask, diffable against signed bytes by a verifier that holds no model. Determinism is what turns self-description from marketing into conformance. The same choice is the security argument: no free text in, no free text out, a closed method set, refusals assembled from declared ids, so nothing an interviewer sends can make the agent think. The consistency rule and the claim-versus-evidence distinction are carried over from Agent Messaging's five questions unchanged, and the honesty rules add the boundary reputation will need: conformance is not competence, and a passed interview is not a good agent, only an honest card.