A standard shape for “an agent needs you”.
Every agent framework invents its own way to say a person is required, so every notifier has to learn all of them. ARC is one transport-neutral JSON contract for that moment: what is being asked, what shape the answer takes, and how the answer gets back — without prescribing how any of it is carried, stored, or displayed.
AgentNotify defines ARC and is its first reference implementation. The contract does not depend on the product.
request.created
Run the staging migration? · kind: permission · awaiting: allow | deny
4
event types in the whole contract
6
request kinds
3
answer shapes an agent can ask for
0.1 could only say a person was needed.
It had no way to say what was being asked, and no way to carry back what the person said. 0.2 closes that loop, and replaces 0.1 rather than extending it.
response.submitted carries exactly one human answer to the producer, authorised by the request's digest and nonce.turn_id and native_request_id let a host adapter return an accepted answer into the very call that is blocking on it.Six kinds cover what agents actually interrupt you for.
The kind says why the agent stopped. Priority, routing, sound, and presentation are the consumer's policy, not the producer's — which is what lets one contract serve a toast, a phone, and a chat room at once.
information
Something happened you may want to know. No answer expected.
question
The agent is waiting for a choice or a short text before it continues.
permission
The agent wants to do something consequential and needs a yes or no.
blocked
Work cannot proceed until something outside the agent changes.
failure
An attempt failed in a way a person should see.
completion
The work finished, with the result in the payload.
What ARC does not try to be.
A contract that covers everything gets implemented by nobody. ARC 0.2 defines no agent telemetry, no model traces, no tool inputs or outputs, no attachments, no authentication, no discovery, no network transport, no broker storage, and no outbound delivery. It also does not define multi-select answers, or unsolicited messages from a person to an agent.
request.created · abridged
{
"arc_version": "0.2",
"event_type": "request.created",
"sender": { "id": "claude", "name": "Claude Code" },
"context": { "project": "checkout-service" },
"request": {
"key": "migrate-staging",
"kind": "permission",
"title": "Run the staging migration?",
"response": {
"kind": "permission",
"choices": [
{ "id": "allow", "label": "Allow" },
{ "id": "deny", "label": "Deny" }
]
}
}
}