| Status | Draft |
| Version | 0.3 (2026-10-27) |
| License | Apache-2.0 |
| Schemas | schemas/ |
| Extensions | Acts · Decisions |
AI agents working for someone keep reaching things only that someone may settle: work only they can do (pay, sign, buy) and choices only they may make (which design, whether to spend). That someone is the agents’ principal. Principal Handoff specifies how such items leave the agents, reach the principal’s own tool (the principal side), and come back settled, when the items outlive every agent session.
The core defines one model for every kind of item. Each item has two registers with different owners: the need, owned by the agent that raised it, and the settlement, owned by the principal side. Every change is an append-only, attributable record that names who made it, under what authority, with what evidence. Assertions by anyone else are claims, which change nothing until the owner of the register records something. The extensions define the two kinds of item: Acts (work only the principal can do, with a Markdown binding for a project’s state document) and Decisions (answers and choices only the principal may make).
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in BCP 14 [RFC 2119] [RFC 8174] when, and only when, they appear in all capitals, as shown here. Sections marked non-normative, examples and notes are informative.
act or decide), a
key, a project, terms, and two registers.project, key). Extensions say who assigns keys and how. need register (owner: requester) settlement register (owner: principal side)
───────────────────────────────── ───────────────────────────────────────────
requester ──────▶ raised · amended(terms_rev) · withdrawn settled(outcome, authority, evidence) · reopened ◀── principal side
│ ▲
└──── terms the settlement saw (terms_rev) ─────┘
anyone ─────▶ claim · note (change no register)
principal side ──▶ relation (same_as) requester ──▶ relation (derived_from)
Each item has two registers because the two questions they answer have different owners:
An item’s current state (§6) is computed from both registers. Neither register can overwrite the other: a late answer does not undo a withdrawal, and a withdrawal does not settle anything.
These rules replace any notion that an item is “resolved” by whoever last spoke.
raised, amended and withdrawn for its
item.settled and reopened. Each
carries a decider and an authority kind (§5).derived_from the first (§7), and settles the first only from that item’s
settlement.by is the principal identifier is invalid.Every record is a JSON object (RFC 8259) that validates against
schemas/record.schema.json and against the schema its extension assigns to its
(type, origin) pair.
| Member | Type | Req. | Meaning |
|---|---|---|---|
ph |
string | yes | Core version; "0.3" for this document. |
ext |
string | yes | Extension name and version, e.g. "acts/0.3", "decisions/0.3". |
id |
string | yes | Record id, no whitespace, 1–256 characters (§10). |
type |
string | yes | One of the record types below. |
origin |
string | yes | The role that emitted it: requester, principal (the principal side), agent (any other agent), or a role the extension defines. |
by |
string | yes | Party identifier of the emitter. |
key |
string | yes | Key of the item. |
project |
string | yes | Project of the item. |
ts |
string | yes | RFC 3339 date-time at which the record was created. |
supersedes |
array of strings | no | Ids of records in the same register that this one replaces (§6). |
terms |
object | on raised, amended |
The item’s terms; the members are defined by the extension. text is always present. |
terms_rev |
integer ≥ 1 | on raised, amended, settled |
On need records, the terms version (1 on raised, increasing by one on each amended). On a settlement, the terms version it was made against. |
outcome |
string | on settled, claimed |
What the settlement says or the claim asserts; values defined by the extension. |
authority |
object | on settled |
§5. |
evidence |
object | no | §5. |
relation |
object | on related |
§7. |
reason |
string | on withdrawn |
Why the requester withdrew; values defined by the extension. |
adopts |
array of strings | no | On settled: ids of claims this settlement accepts (§7). |
about |
object | on note |
§7. |
note |
string | no | Free text from the emitter (§8). |
context |
string | no | Free-form tag for why the record was sent, e.g. bulk-import. |
Receivers MUST ignore members they do not recognise. Senders MAY add members; names beginning with x_ are reserved
for private extensions.
type |
Register | Allowed origin |
|---|---|---|
raised |
need | requester |
amended |
need | requester |
withdrawn |
need | requester |
settled |
settlement | principal |
reopened |
settlement | principal |
claimed |
(claim) | any origin except principal |
related |
(relation) | per relation kind (§7) |
note |
(note) | any |
Extensions MAY restrict this table further, and MUST NOT widen it. A receiver selects the schema by ext and the
(type, origin) pair as the extension’s table lists, and MUST reject a record whose pair is not listed. A receiver
that does not implement the extension or version named in ext MUST NOT act on the record; it SHOULD consume it
without error and MAY report it. The schemas use JSON Schema draft 2020-12 restricted to type, required,
properties, enum, const, pattern, items and $ref (a relative path), so that a small validator suffices.
Every settled record carries authority:
| Member | Req. | Meaning |
|---|---|---|
kind |
yes | principal, confirmed, delegated or attested. |
decider |
yes | Party identifier of whoever made the settlement. |
under |
for delegated |
Opaque reference to the mandate or standing instruction relied on. The principal side MUST be able to produce what it refers to. |
chain |
for delegated |
Party identifiers from the principal to the decider, in order. |
representative |
no | For an organisation principal: the natural person who acted for it. |
The four kinds:
principal: the principal decided. decider MUST be the principal identifier.confirmed: the principal confirmed a proposal made by a delegate. decider MUST be the principal identifier.
evidence.proposal, identifying what was confirmed, is REQUIRED.delegated: a delegate decided under a mandate, without the principal deciding or confirming. decider MUST
NOT be the principal identifier, and chain MUST begin with the principal identifier and end with decider. The mandate’s format, scope and revocation belong to its own system (§16); this
family only records the reference. A settlement whose mandate the principal side cannot produce MUST NOT be sent.attested: the principal side or a delegate settled from evidence that the item was done or decided (for
example a payment record), without the principal confirming. decider MUST NOT be the principal identifier, and
evidence.basis is REQUIRED.When the principal is a legal person, a settlement of kind principal or confirmed MUST carry representative,
naming the natural person who acted for it, and evidence.proof SHOULD include evidence of their power to represent
it.
evidence, when present, is an object:
| Member | Meaning |
|---|---|
presented |
Digest (sha-256: + lowercase hex) of exactly what was shown to the person who decided or confirmed: the terms at terms_rev and any options or consequences the principal side displayed (§9). |
proposal |
For confirmed: id of the record, or digest of the content, that was confirmed. |
basis |
For attested: what the evidence was. |
proof |
An independently verifiable proof, such as a detached JWS or a verifiable credential, over the record with evidence.proof removed, serialised with the JSON Canonicalization Scheme [RFC 8785]. |
A settlement of kind principal or confirmed SHOULD carry evidence.proof made with the principal’s own credential
on a surface no agent controls. A verifiable principal side (§12) MUST.
Each register is folded separately, over all its records a receiver holds, regardless of arrival order:
supersedes.ts. Equal ts are broken by the greater id in code-point
order. If there is no head (supersedes links form a cycle), the same rule applies to all records of the register.A requester’s amended and withdrawn MUST list the item’s current need record in supersedes, and a
principal-side settled that replaces an earlier settlement, and every reopened, MUST list it. A receiver that
nonetheless holds several heads uses the rule above and reports the conflict.
From the two current records, the item’s state is:
| Settlement (current) | Need (current) | State |
|---|---|---|
settled |
any, or none | settled, with its outcome. It is stale if its terms_rev is lower than the highest terms_rev held in the need register. |
none, or reopened |
raised or amended |
open |
none, or reopened |
withdrawn |
by the extension’s policy (§11): open under the keep policy (the principal side keeps presenting it and asks the principal), withdrawn under the stop policy (it is no longer presented) |
none, or reopened |
none | unknown: no need record is held yet |
In every state the item also reports whether its current need is withdrawn, so that a principal side under the
keep policy knows to ask.
Receivers MUST reject an amended whose terms_rev is lower than 2 and a settled whose terms_rev is lower than
terms_rev, and a settlement whose
terms_rev is higher than any need record it holds (it is not stale). The current terms are those of the current
need record.A stale settlement stays settled. The principal side SHOULD present it to the principal again, and the requester SHOULD treat it as made against outdated terms.
Claims. A claimed record asserts an outcome that the claimant has no authority to record: an agent that heard
the principal say “I paid it”, or a registrar that saw a declared line disappear. It SHOULD carry evidence.basis. A
claim changes no register. The principal side MAY accept it by recording a settlement that lists the claim’s id in
adopts, with kind confirmed if the principal confirmed it and attested otherwise; adopts MUST NOT appear on a
settlement of any other kind. A claim never removes an item
from the principal’s view.
Relations. A related record carries relation:
| Member | Meaning |
|---|---|
kind |
same_as or derived_from. |
target |
The other item: {"ext", "project", "key"} (all three) for an item of this family, or {"uri"} for anything else (an A2A task, a bus message, an issue). Exactly one of the two forms MUST be used. |
active |
true, or false to retract an earlier relation of the same kind and target. |
same_as is emitted by the principal side (origin: "principal") when it treats two items as one, for example the
same request raised by two projects, or a request repeating one already settled. Relations never change any item’s
state (§6): when the principal side settles a group of related items, it MUST emit a settled for each item, so
that every requester computes the same state. One requester withdrawing leaves the other items open.
A requester that disagrees sends a note about its item saying why the two differ; the principal side SHOULD then
retract the relation.derived_from is emitted by the requester when its item arises from another item, inside or outside this family
(§3 R5; a question asked while answering an inquiry from the principal; a task that an answer created).Notes. A note record carries information that changes no register: progress, a fact the principal mentioned, a
premise that changed. It carries about, either {"key": …} for a keyed item or {"quote": …} with text in the
recipient’s own words for something that was never keyed. A note never settles anything. In particular, a note from
the principal side saying a premise changed (a moved date) is not an amendment: the requester decides whether to amend
its terms.
quote, is
applied by judgement: the recipient decides what changes. Implementations MUST NOT apply a quote reference
mechanically.note on any record is for the other party: on need records and claims, for the principal side, which SHOULD show
it with the item; on settlements and notes from the principal side, for the project.These rules apply to every settlement of kind principal or confirmed, that is, whenever a natural person decides
or confirms, whether the principal or an organisation’s representative.
terms_rev it records, and SHOULD record evidence.presented. If
the terms change before the person decides, the principal side MUST present them again.presented, the authority kind and the decider makes that visible, and is a precondition for the human oversight
that rules such as the EU AI Act Article 14 require of high-risk systems.ext name, project), and MUST be the same on every
retransmission. Extensions say how ids are derived when a sender must re-create them after a crash. A sender MUST
NOT reuse an id for a different record.ext name, project, id) they have already processed. A record that fails
validation is not processed: it is ignored, and does not block a valid record with the same id. A receiver that sees
an id reused with different valid content SHOULD report it, and keeps the one whose RFC 8785 serialisation is
greater in code-point order, so that the result does not depend on arrival order.An extension document MUST define:
ext value) and the item kind it covers;terms, and how keys are assigned;outcome values for settlements and claims, and its reason values for withdrawals;type, origin) pairs with schemas, restricting §4;terms_rev on each amendment, and applies delivered records as in §8.evidence.proof on every settlement of kind
principal or confirmed.by is the
authenticated sender and that its role may emit the record (§3). R6 keeps an agent from becoming the principal by
saying so.evidence.proof over the principal’s own
credential, made on a surface no agent controls, is what lets a receiver tell a principal’s decision from the
instrument’s; without it, receivers trust the authenticated principal side.ph carries the core version; ext carries each extension’s name and version.Change log. 0.3 (2026-10-27): the event model of 0.2 is replaced by two registers with owners, claims, relations and notes; resolutions carry an authority kind, a decider and evidence; the principal is defined structurally and configured (R6); Tasks and Questions become the Acts and Decisions extensions. A mapping from every 0.2 event to 0.3 records is in each extension. 0.2 (2026-10-27): split from Human Task Handoff 0.1.
Out of scope, deliberately:
under) and the chain.derived_from with the
inquiry’s uri.Non-normative. The detailed comparison is in RELATED-WORK.md.
Existing protocols that involve a person place the request inside a live unit of work (a call, a task an agent server runs, a run on a thread), and the system that created the unit decides when it is complete. Principal Handoff covers items that outlive every agent run and that only the principal side settles. It is meant to be carried by those protocols and to reference their mandates, not to replace them.
under references their
mandates; chain records the actors in the way RFC 8693’s nested act claims do, except that here the whole chain
matters for accountability, not only the current actor. AP2’s Trusted Surface is the model for evidence.proof.by, decider), acting on behalf of
(chain, under), revision (supersedes) and derivation (derived_from).