1Participants#
Six roles. The first four appear in every operation; the operator runs the company's side, and the verifier can be anyone who later checks the evidence.
Person
The person the agent acts for, and the company's end customer. Approves exact terms, approves a relationship, and can revoke either.
Signs nothing in the chain
Personal agent
The person's OAuth client or A2A agent. Identifies with its own key, holds the delegation, asks, accepts, answers the company's requests and keeps the proof.
Proves possession of its key on each call
Company
Who executes the operation. Has its own issuer, publishes what it offers, and is the party the terms and the result belong to.
Signs terms, company_review, outcome, correction, revocation
Company system
The system of record, such as the ERP, where the effect actually lives. It is changed once and read back afterwards.
Read, never trusted as a signer
Operator
Hosts the company's side and executes on its behalf, as processor for each company. In the reference implementation, the operator is SOVRAS.
Signs request, counter, user_approval, execution, read_back
Verifier
Anyone who checks a proof package: the agent itself, a bank, an arbitrator, an auditor. Anchors the issuer on its own and derives the level of evidence.
Signs nothing; reports a verdict
2Identities#
A phone number, a customer account and a delegation answer different questions. VXP keeps them as three layers that are never merged, and moves from one to the next only through a step the company controls.
3Native profile and discovery Experimental#
The native profile is VXP's own form: an agent that speaks neither Poppy nor PACT discovers the company, identifies, receives authority per request, operates, obtains the proof and keeps the relationship with it alone. It works alone, without either adapter (specification §8, native-only gateway), and a company can also publish it next to the adapters. All entries share one issuer, one authorization server and one set of metadata.
| Document | Where | What it carries |
|---|---|---|
vxp.json Experimental | /.well-known/vxp.json on the company's domain | Organization and domain, issuer, endpoint, capabilities with access and admission, negotiation limits, "status": "experimental". No trust members |
| Issuer metadata | RFC 8414, under the issuer | vxp_proof: the proof keys, operator, custody, log and domains. vxp_relationship: the relationship key and the actions the company may start |
poppy.json | The company's domain | The Poppy draft 0.2 document, as written, with the vxpprotocol.org/proof extension |
| Agent Card | The PACT provider, or redirected from the brand's domain | The PACT 1.0 card over A2A 1.0.1, as written, with https://vxpprotocol.org/ext/proof/v0.1 |
The trust members live in one place, the issuer metadata. Any copy in poppy.json or the Agent Card must be identical, and vxp.json carries none. Only the well-known locations and the native endpoints are fixed; every other location, such as the key sets or the log, is read from the metadata and is the implementation's own choice (implementation paths). Discovery, authorization and endpoints in detail: specification, §8.
4Entries and adapters#
A request can arrive through the native profile or through an adapter. An adapter speaks the external protocol literally; what VXP adds travels only in that protocol's extension points. All entries end in one normalized request, the same operation requirements and one enterprise execution.
- contract in the specification
- reference implementation, or outside VXP
| Entry | Identity and authority | Where VXP travels |
|---|---|---|
| VXP native Experimental | Client metadata, private_key_jwt, DPoP, per-request authorization_details | It is VXP's own profile |
| Poppy draft 0.2 | Poppy sign-in, sessions, conversations and Operations | A domain-named member, vxpprotocol.org/proof, only for an agent that lists the extension |
| PACT 1.0 over A2A 1.0.1 | PACT agent identity and delegated authority | An A2A extension and message.metadata, next to pact.receipt |
| Traditional channels | None: WhatsApp, web chat and voice are a SOVRAS capability | Not part of VXP. A write never runs in the channel; the agent is offered the structured connection |
Whatever the entry, the company needs no conversational agent of its own: a deterministic intermediary serves the Poppy API and the PACT A2A service (I3). Interoperability rules I1 to I5: specification, §4.
5Operation requirements#
A valid identity is a starting point. What passes is the intersection of what the person delegated, what the company allows and what the resource admits. VXP states this as operation requirements O1 to O7: the behaviour every implementation shows where an external request becomes an operation. They are requirements, not a component: VXP defines no interface for them, and how an implementation builds them inside is its own decision.
authorization_required, or the same not-found answer for someone else's resource and for a missing one.| Requirement | What the implementation does | Evidence in VXP Proof |
|---|---|---|
| O1 Identity and owner | Links an account only through an authentication the company controls; the owner is (profile, client_id, sub, account) | Not shown by the chain; still required |
| O2 Scope | What is asked fits the delegation and what the company publishes | Not shown by the chain; still required |
| O3 Own resource | Someone else's, missing and unlinked resources answer the same | Not shown by the chain; still required |
| O4 Terms and commitment | The company signs the exact revision and its commitment; a change is a new revision | terms and user_approval on the same digest |
| O5 Company review | When its rule requires it, a person at the company decides on the same digest | company_review |
| O6 One execution | One per resource, with precondition and idempotency key | One execution on the approved digest |
| O7 Read-back | No succeeded without it; a contradiction goes to waiting_human | read_back, by term name |
Requirement and evidence
- Required behaviour: rules O1 to O7, defined by the specification.
- Evidence: what VXP Proof records so that anyone can check that behaviour afterwards. A rule the chain cannot show is still required; the verifier only reports what the chain carries.
Internal controls, outside VXP
- The catalog, policies, checks and locks that enforce the rules inside one company's systems belong to each implementation.
- In the reference implementation they are SOVRAS's own mechanism: catalog, prior read in the ERP, policy, commitment, one execution, read-back and projection to Poppy and A2A.
Each rule with its identifiers, and the table of requirement, evidence and control: specification, §9.
6Relationship#
With an agreement the person approved, the company can start a request toward the person's agent. The agreement names its actions, a daily limit and an expiry, and ends when the delegation is revoked. Before signing or sending anything, the company checks that all of it still holds (R6). A relationship does not replace the company's authorization: inside it, each request still passes the company's own rules.
- The agent asks for the relationship in the Device Authorization, with an
authorization_detailsentry of type relationship. - The consent screen shows the relationship in business language, with its own checkbox.
- The person approves the actions, the daily limit and the validity.
- The token carries
relationships[]and the agreement, a JWSvxp-relationship+jwt. - The company sends a JWS
vxp-company-request+jwtto the agent's inbox. Proposing a change never executes it. - The agent shows the person the exact terms of the new revision.
- The person approves.
- The agent accepts; the company checks again that the relationship and the delegation are in force.
- The operation runs once and is read back, with its own proof chain.
| Delivery path | How the agent receives and answers | State |
|---|---|---|
| HTTP inbox | POST {inbox_uri} declared in the agent's client metadata, on the same origin as its client_id | Experimental Tested only with a server of SOVRAS's own |
| Poppy conversation | Messages with data["vxpprotocol.org/relationship"] inside the agent's conversation; offer, agreement, request, answer and a signed reply receipt | Run once with a live personal agent through the Poppy adapter; no agent outside SOVRAS's runs yet |
| PACT | Not specified yet | Pending |
Rules R1 to R17: specification, §7.
7Proof#
Each operation leaves a chain of signed statements. Each one names the previous by its digest and is signed by the role that observed it, so a verifier knows who said what at every link. The terms digest ties the approval, the execution and the result to one exact revision. VXP Proof is not an execution engine: it records what was asked, approved, executed and observed.
- company
- operator
- optional statement
| Situation | What the chain says | Rule |
|---|---|---|
| Read-back matches the approved terms | outcome: succeeded | P1 |
| Not known whether the effect happened | outcome: unknown; Poppy sees in_progress | P3 |
| Known later | A correction on the latest final statement | P4 |
| Read-back contradicts the terms | matches_terms: false, unknown, waiting_human | P5 |
| The capability cannot be read back | read_back.method: none, never succeeded | P6 |
Approval comes in two kinds, named by what they prove: agent_asserted (the agent said the person approved) and company_channel (the person answered from the channel the company linked to them, with a code derived from the terms digest). Format, chain rules and P1 to P8: specification, §6.
8Enterprise execution#
Execution uses the systems and permissions the company already has. The protocol fixes how many times it runs, under which conditions, and what has to be read afterwards.
- One per resource (I2). Whatever entries arrive, one execution per resource. Each entry produces its own operation, and only the first that passes the precondition takes effect; the others end
failed, without effect and with their evidence. - Precondition. The terms that describe the starting state are checked against the company's system right before executing. If they no longer hold, nothing runs and the operation ends
failedwithout anexecutionin the chain. - One in progress. While a confirmed operation on a resource is in progress, no other one is opened on it; the native profile answers
resource_busy. - Re-verification. Before executing, the grant for the resource, the policy and the precondition are evaluated again with the token of the accepting call.
- At most once. No more than one automatic execution attempt per accepted revision.
- Declared effects. A request that ends
failedorcancelledafter execution started listseffects[]per system touched. A compensation is read back before it is declared reverted.
The outcome of an operation comes from that operation's execution, never from the close of the conversation that contains it.
9States#
Eleven internal states are the source. Outside, each protocol sees only its own enum: VXP adds no values to Poppy's or A2A's. Under A2A and PACT, the internal state travels in metadata.
Scroll sideways to see the whole diagram
correction in the proof. Under PACT there are no tasks, so the A2A value is used only in metadata, next to the internal state. Legal transitions: specification, §4.waiting_human covers two cases: the company's review before executing, and a contradiction found after executing. pending_verification is where an operation waits while nobody knows yet whether the effect happened; it is never reported as failed.
10Recovery#
What happens when something goes wrong, or when the answer is not known yet. In every case the action is not repeated and nothing is claimed that was not read back.
| Situation | What happens |
|---|---|
| The agent repeats a request | Same Idempotency-Key and same body return the same request; another body with the same key gets 409 idempotency_key_reused |
| The terms changed before approval | A new revision, approved again; accepting an old one gets 409 terms_changed |
| The result is not known | pending_verification and outcome: unknown; reading again reconciles against the system and never repeats the action |
| The result becomes known later | A correction in the chain; to succeeded only with a later matching read-back |
| The system contradicts the approved terms | waiting_human, no retry, no success declared |
| The agent cancels while it runs | A request to stop: 202, the state does not change because of it, reversal_promised: false; it ends cancelled with known effects, or in the state it reached |
| An approval message could not be delivered | The operation stays proposed and does not run; a code that was never sent approves nothing |
| The person revoked in the meantime | Accepting a relationship's proposal gets 403 relationship_revoked, without effect |
| A company request could not be delivered | Recorded as failed in the company's outbox. Retries with backoff are Pending |
11Verification and trust boundaries#
Who signs what, who holds each key, and what a verifier can conclude from it. In the reference implementation today, the operator holds every proof key, so the operator is the single root of trust, and the verifier says so in every verdict.
Scroll sideways to see the whole diagram
A verifier can check today
- That the chain has not changed since it was received, is coherent and ordered.
- Which role signed each link.
- That the execution was on the approved revision, and the read-back matched it.
- That nobody other than whoever controls the issuer assembled the package.
What independence still needs Pending
- Witnesses of the log outside the operator; the list of witnesses is empty today, so no package reaches
logged. - The company's key held outside the operator, in a way a verifier can check.
- A second independent issuer.
The relationship has its own key, published as vxp_relationship.jwks_uri and different from the proof keys and from the Poppy and PACT keys (R5). Each statement names its key by kid; an issuer that rotates a key keeps the earlier public key published, so older proofs still verify (key rotation). How to read each part of a verdict: reading a verdict. Assurance levels and the verification algorithm: specification, §10. Check a proof yourself in Verify.
Every rule behind these diagrams, with its identifier.
Read the specification