| Internet-Draft | APS | September 2026 |
| Pidlisnyi | Expires 1 April 2027 | [Page] |
This document specifies the Agent Passport System (APS), a protocol for representing and evaluating authority exercised by AI agents. APS separates agent identity, represented principal, delegated authority, policy approval, admission to dispatch, observed results, and external effects. It defines cryptographic identity and principal records, monotonic delegation, revocation and authority-lifecycle semantics, deterministic action and decision references, signed governed-action records, verifier outcomes, evidence resolution, profiles, and protocol bindings.¶
APS defines how an enforcement boundary rechecks current authority before admitting an action to dispatch, and how a verifier distinguishes what a signed record establishes from claims that remain unresolved or external to the protocol. Requirements are split into APS Core, which every conforming implementation carries, and Candidate features, which an implementation opts into by naming them in its claim, and most of the lifecycle and decision-to-effect material in this document is Candidate rather than Core. Candidate features specify additional lifecycle and decision-to-effect behavior without making those features requirements of APS Core conformance.¶
Implementation and conformance sections identify which requirements have exact conformance-vector coverage and which are implemented by the reference implementations. APS does not treat a valid signature, receipt, or delegation chain as proof of external truth or of the absence of an out-of-band execution path.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 1 April 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
This document specifies the Agent Passport System (APS), a protocol for identifying AI agents, narrowing delegated authority at each transfer point, deciding and admitting individual actions at an enforcement boundary, and recording signed evidence of what was decided and what was observed.¶
APS defines an authority and verification model that keeps identity, authority, approval, admission, execution and external effect apart. It defines Ed25519 agent passports and separately signed principal bindings. It defines delegation chains that a verifier rejects when authority widens across scope, spend, depth, time, reputation, values, or reversibility. It defines the lifecycle states an authority artifact can hold and the verdicts a verifier may report about them. It defines deterministic action and decision references, a common envelope for the signed records of a governed action, and bindings for Model Context Protocol tool calls and imported OAuth identity-assertion authorization grants.¶
A verification result keeps cryptographic integrity, signer authority, referenced-artifact resolution, policy semantics, and external truth on separate axes. Sections labelled Candidate are specified in this document rather than against a prior published rule. Their status blocks name related fixture families, and Appendix D is the sole authority for which requirements an exact vector exercises. An Implementation Status section states the coverage of the available open-source implementations.¶
APS fills this gap by providing (1) Ed25519 agent passports and separately signed principal bindings, (2) scoped delegation chains where authority narrows monotonically across seven constraint dimensions, (3) revocation that invalidates every chain depending on a revoked delegation, with revocation records, where produced, and optional cascade evidence carried as evidence of processing rather than as the cause of that invalidity, (4) a three-record policy chain binding intent, decision, and observed result, (5) a common signed-receipt envelope for those records, (6) a componentwise composition rule for institutional governance structures specified in companion work, and (7) an enforcement-gateway model that can serve as an external reference monitor.¶
Agentic work raises several distinct attribution questions: under whose authority an action was taken, what sources contributed to a deliverable, on whose behalf the agent acted, and who receives the value the work creates. This document specifies the authority core and the signed receipt layer through which principal resolution is recorded and other attribution axes may be referenced; it does not define contribution-attribution or beneficiary-attribution models.¶
The protocol's formal invariants and design rationale are published in the informative references. At the time of writing no IETF working group is chartered for AI agent identity or agentic authorization: WIMSE is chartered for workload identity, where a workload is a running instance of software executing for a specific purpose [IETF-WIMSE-CHARTER], and carries one agent-specific document [AIMS], the proposed DAWN charter places identity management of AI agents, tools and skills out of scope [IETF-DAWN-CHARTER], and the proposed agentproto charter commits its reference architecture to reusing existing identity, authentication and authorization building blocks rather than defining new ones [IETF-AGENTPROTO-CHARTER]. This individual submission specifies APS and identifies current implementation coverage and deviations in Appendix A. Its requirement keywords constrain implementations claiming conformance to this revision.¶
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 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
An APS Agent Passport is a self-signed cryptographic identity record. The version specified here has record_type "aps.agent-passport" and version "2.0". Its wire object contains exactly the following members: passport_id, agent_id, verification_method, public_key_multibase, issued_at, expires_at, nonce, self_asserted, record_type, version, and signature. The self_asserted object contains a required, UTF-8-byte-sorted unique capabilities array and an optional display_name. A principal or owner identifier is not a passport member; the principal relationship is carried by the separate record in Section 3.3.¶
The public key is a multibase base58btc encoding of the multicodec Ed25519 [RFC8032] public key prefix 0xed01 followed by the 32-byte public key. issued_at and expires_at use the exact UTC millisecond form YYYY-MM-DDTHH:MM:SS.sssZ, where SS is 00 through 59, and the validity interval is issued_at <= now < expires_at. nonce is 16 bytes encoded as 32 lowercase hexadecimal characters.¶
The passport identifier and signature are computed as follows, where JCS is RFC 8785 [RFC8785] over validated I-JSON, UTF8 converts the resulting string to bytes, and || denotes byte concatenation:¶
passport_id = lowercase-hex(SHA-256(
ASCII("APS-PASSPORT-ID-V2") || 0x00 ||
UTF8(JCS(passport without passport_id and signature))))
signature = Ed25519-Sign(agent_private_key,
ASCII("APS-PASSPORT-SIG-V2") || 0x00 ||
UTF8(JCS(passport without signature)))
¶
A valid self-signature establishes possession of the private key corresponding to public_key_multibase and protects the signed fields. It does not establish that verification_method was authorized for agent_id, or that any self-asserted claim is true. A verifier MUST report proof of possession separately from key authority. For an identifier that is not self-certifying, key authority is verified by resolving verification_method at issued_at under the identifier's own method and trust policy.¶
APS is DID-method-agnostic. agent_id and verification_method use the syntax and resolution rules of the selected DID method [DID-CORE]. New self-certifying passports SHOULD use an existing generative DID method whose identifier commits to the signing key, such as did:key [DID-KEY]. Rotation of a self-certifying key changes that identifier.¶
Deployments that require one stable agent identifier across key rotation MUST use an update-capable DID method and resolve the verification method at the artifact's signing time, for example by a method-defined versionId or versionTime. A successor statement between two self-certifying identifiers documents a claimed migration; it does not transfer delegations or establish that the identifiers are equivalent.¶
Earlier APS implementations emitted the experimental identifier did:aps:z<base58btc-multicodec-key>. A compatibility verifier MAY read that exact immutable form. It MUST treat the embedded key as the complete identifier state, MUST reject the earlier raw-hex alias, and MUST treat rotation as a new identifier. Conforming new-write paths in this revision do not emit did:aps identifiers.¶
A passport does not identify the person or organization on whose behalf an agent acts. That relationship is expressed by a PrincipalBindingV1 record with record_type "aps.principal-binding" and version "1.0". The record contains binding_id, agent_id, principal_id, verification_method, audiences, authority_profiles, status_uri, issued_at, expires_at, nonce, and signature. audiences and authority_profiles are non-empty, UTF-8-byte-sorted unique arrays. The principal signs the record with the key named by verification_method. The record is therefore scoped rather than a global assertion that the agent represents the principal for every purpose.¶
binding_id uses the tag "APS-PRINCIPAL-BINDING-ID-V1" and the same construction as passport_id, with binding_id and signature absent. signature uses the tag "APS-PRINCIPAL-BINDING-SIG-V1" and covers the binding with signature absent. Both tags are followed by one zero byte before the JCS bytes.¶
Claim levels are verifier results, not labels selected by the issuer. A principal string found only in a self-signed or legacy passport is self_asserted. A binding whose principal signature and signing-key authority verify is principal_attested. A verifier reports externally_verified_principal only when its own trust policy has also verified the principal identity. A verifier MUST NOT infer a higher level from the presence of a field.¶
Binding revocation is a separate signed record with record_type "aps.principal-binding-revocation", version "1.0", revocation_id, binding_id, principal_id, verification_method, revoked_at, reason_code, nonce, and signature. Its identifier and signature use the tags "APS-PRINCIPAL-BINDING-REVOCATION-ID-V1" and "APS-PRINCIPAL-BINDING-REVOCATION-SIG-V1", respectively. Revoking a principal binding does not revoke the agent's key or unrelated delegations; an enforcement profile defines which authority records depended on that binding.¶
An update-capable identifier MAY rotate its signing key. A retired key is eligible only for artifacts whose signing time falls within the key's method-defined validity interval. A resolver MUST select the key version authorized at the artifact's issued_at; selecting the key that is current at verification time is insufficient.¶
The artifact timestamp is an issuer claim. This document does not define a trusted timestamping service. When key retirement makes the result depend on whether an artifact was signed before a boundary, a profile MUST identify an acceptable timestamp, transparency-log, or equivalent evidence source. Without that evidence the key-authority result is indeterminate, even when the artifact signature is cryptographically valid. This requirement extends to any historical key-selection boundary, including a relying party's trust-policy pin used as a key-selection input. Without acceptable evidence that the artifact was signed on one side of such a boundary, the pin result is the ambiguous outcome of Section 3.5.¶
A verifier MUST report that indeterminate result through the
ambiguous resolution outcome of Section 3.5, whose outcome name is
KEY_AMBIGUOUS, and MUST NOT report it as a key that was not
found, as structurally malformed key material, or as a signature
failure. An issuer's unverified issued_at claim MUST NOT on its own
satisfy the evidence requirement above. This document defines no
outcome specific to a signing time that cannot be established. A
profile that needs that distinction carries it alongside the
ambiguous outcome, not instead of it.¶
Section 3.1, Section 3.2 and Section 3.4 govern an agent's own signing key and its historical resolution. A verifier also encounters signatures from parties outside the delegation chain: evidence issuers, counterparty systems, and attesting services. For these external signers this document specifies a resolution model rather than a registry.¶
An external signer identifier MAY be hash-bound to its subject: the identifier carries a digest of the subject identity (for example, a DID whose method-specific identifier is the SHA-256 of a server identity), and the resolver checks the presented subject against that digest before any key material is trusted. A hash-bound identifier is a binding, not a locator: key material located through the subject's own endpoint is accepted only when the subject hashes to the identifier, which excludes the case in which one tenant's key material is resolved under another tenant's identifier. A hash-bound locator presented without the subject it binds MUST be rejected.¶
Published key material MAY carry per-key validity windows. Key selection is gated on the artifact's own signed issuance time, evaluated against each key's window; a verifier MUST NOT select whichever key is current at verification time. A key set in which a key identifier is duplicated is malformed. The duplication makes the set unusable as a whole rather than key by key, and is reported as the ambiguous outcome. A relying party's trust-policy pin, where it is used as a key-selection input, is evaluated at the artifact's issued_at under the same rule. A verification-time cutoff a deployment applies for its own reasons is reported on its own axis and MUST NOT be folded into the key-selection result.¶
Resolution outcomes preserve failure structure. At minimum a resolver distinguishes: resolved; subject or key not found; ambiguous (including duplicate key identifiers); structurally malformed key material; transport unreachability; and an unsupported identifier scheme. Resolution is fail-closed by default. A deployment MAY adopt a fail-open policy for transport unreachability only; malformed key material that loads but is wrong is not a transient transport condition and MUST fail closed even under such a policy. A resolution outcome degraded by a fail-open policy MUST NOT be treated as a positive verification, consistent with Section 7.5.¶
Each failure outcome carries a stable outcome name. The five
failure outcomes above are named KEY_NOT_FOUND,
KEY_AMBIGUOUS, KEY_MATERIAL_MALFORMED,
KEY_UNREACHABLE and KEY_SCHEME_UNSUPPORTED. The
resolved outcome carries no failure name. This document
defines no further key-resolution outcome. Outcomes map to
verification states as follows. An unsupported identifier scheme is
unsupported. Subject or key not found, ambiguous, structurally
malformed key material, and transport unreachability are each
indeterminate, and a verifier MUST report them under distinct outcome
names rather than collapse them into one. Structurally malformed key
material MUST NOT be reported as a signature failure, because no
signature check ran. The key-authority case of Section 3.4, in which
the artifact's signing time relative to a key-validity boundary cannot
be established from acceptable evidence, is reported as ambiguous.¶
Identity claims about an agent arrive with different evidentiary weight, and a protocol that flattens them invites over-trust. APS distinguishes four provenance tiers for attested signals: observed (the receiving infrastructure itself recorded the signal, such as transport characteristics at connection termination); infrastructure-attested (a runtime or sandbox gateway signed a claim about the agent's execution environment); provider-attested (a third-party provider confirmed a claim, such as an account or tenant relationship); and self-declared (the agent asserts the claim, unverified).¶
In the reference implementation an attested signal carries: a signal key; a digest of the signal value rather than the raw value; its provenance tier; a verification status distinguishing cryptographically verified, observed without cryptographic proof, declared and unverified, and verification attempted but failed; a stability class indicating how long the signal remains constant; the attesting party; and issuance and expiry times. A signal's provenance tier and its verification status are independent axes: a provider-attested signal whose signature was never checked remains at declared, and a verifier MUST NOT infer verification from tier.¶
Two attestation record shapes are published with the reference implementation. A runtime attestation is a signed claim by an attesting infrastructure party about the agent's execution environment, bound by challenge-response: it carries a nonce supplied by the requesting issuer and a digest of the subject public key, so that the attestation cannot be replayed for a different request or a different key. A provider attestation is a signed or verifiable confirmation by a third-party provider of a subject relationship, carrying a digest of the subject identifier and the verification method used. This section defines the tier and status terminology that profiles import; it does not define a general attested-signal wire format and imposes no verifier behavior beyond the tier-independence rule above. The record shapes are illustrated by the reference implementation. How a deployment weighs, combines, or scores composed attestations is deployment policy and is not specified by this document.¶
AuthorityDelegationV1 is the signed authority record specified by this revision. It has record_type "aps:authority-delegation:v1", version "1.0", delegation_id, parent_delegation_id, issuer, subject, verification_method, issued_at, nonce, authority, and signature. parent_delegation_id is null only for a root selected by verifier trust policy. authority contains exactly seven required facets: scope, spend, depth, time, reputation, values, and reversibility. A missing facet is invalid rather than an implicit unconstrained value.¶
{
"record_type": "aps:authority-delegation:v1",
"version": "1.0",
"delegation_id": "sha256:<64-lowercase-hex>",
"parent_delegation_id": null,
"issuer": "did:example:principal",
"subject": "did:example:agent",
"verification_method": "did:example:principal#key-1",
"issued_at": "2026-07-18T22:00:00.000Z",
"nonce": "<32-lowercase-hex>",
"authority": {
"scope": {"profile":"aps-hierarchical-v1",
"grants":["commerce:checkout"]},
"spend": {"mode":"bounded","unit":"iso4217:USD:minor",
"per_action":"5000","cumulative":"10000"},
"depth": {"remaining":2},
"time": {"not_before":"2026-07-18T22:00:00.000Z",
"not_after":"2026-07-19T22:00:00.000Z"},
"reputation": {"profile":"aps-score-0-100-v1","ceiling":80},
"values": {"profile":"aps-values-identifiers-v1",
"required":["F-001","F-003"]},
"reversibility": {"profile":"aps-tci-v1",
"ceiling":"compensable"}
},
"signature": "<128-lowercase-hex>"
}
¶
The spend unit in that example is one deployment's choice. A unit is an opaque string compared by its UTF-8 bytes, as Section 5 states, and the iso4217:USD:minor form carries no meaning this document defines.¶
The object schema is closed. All timestamps use exact UTC milliseconds with a second value from 00 through 59. nonce is 16 random bytes. delegation_id and signature are computed as follows:¶
delegation_id = "sha256:" || lowercase-hex(SHA-256(
ASCII("APS-AUTHORITY-DELEGATION-ID-V1") || 0x00 ||
UTF8(JCS(delegation without delegation_id and signature))))
signature = Ed25519-Sign(issuer_private_key,
ASCII("APS-AUTHORITY-DELEGATION-SIGNATURE-V1") || 0x00 ||
UTF8(JCS(delegation without signature)))
¶
A verifier resolves verification_method for issuer at issued_at. A valid self-issued root is not trusted automatically; acceptance of a root is verifier policy.¶
Let child be directly delegated from parent. child is no wider than parent only when every comparison below succeeds. Profiles on a facet MUST match; a profile change is unsupported rather than narrower.¶
These comparisons define a componentwise partial order over the seven-facet vector. Scope narrows by coverage, Values narrows by adding requirements, and every other facet follows its rule above. A valid child is less than or equal to its parent in every component. The fuller formalization appears in [APS-NARROWING] and [APS-FACETED].¶
A verifier processes a root-to-leaf chain in this order: closed schema and canonical values; delegation_id; historical signing-key resolution and signature; duplicate identifiers; root trust; parent_delegation_id; issuer-to-subject continuity; child issuance time; the seven facet comparisons in Section 4.2; current validity; and revocation state for every member. A cycle, repeated identifier, broken parent link, or issuer discontinuity invalidates the chain.¶
That order is phase-major over the whole root-to-leaf chain. A verifier applies each listed phase to every member before it applies the next phase. The first phase in which any member fails determines the returned state and failure reason, and within that phase the lowest member index determines which failure is reported. Where two faults fall inside one phase, this document states no order between them and a verifier MAY report either. Inside the closed schema and canonical values phase, recognition of record_type and version precedes evaluation against the v1 schema, and a record whose record_type or version is not recognized is unsupported and is not additionally judged against that schema. A root member's null parent_delegation_id is checked in the parent_delegation_id phase and not earlier.¶
Verification returns one of valid, invalid, indeterminate, or unsupported with a failure reason the verifier reports. This document defines no failure-code vocabulary for chain verification. An unavailable or stale revocation result is indeterminate. An unsupported facet profile is unsupported. Cryptographic or attenuation failure is invalid. A root the verifier's trust policy does not accept is invalid, with a root-trust reason at the root's index, and a trust policy that is unavailable or cannot decide is indeterminate under the same rule as an unavailable revocation result. A caller MUST NOT collapse indeterminate or unsupported into valid.¶
A revocation-resolution outcome that a verifier does not recognize MUST NOT be treated as active. The revocation state is not established, and the chain result is indeterminate under the same rule as an unavailable or stale result. This applies to any answer outside the set a verifier recognizes, including a value a later revision of this document may define, and to a resolver that does not answer at all.¶
Two phase-scope rules follow from the phases above. In the closed schema and canonical values phase, a timestamp MUST carry a second value from 00 through 59. A verifier MUST reject the second value 60 wherever it appears, and MUST NOT consult a leap-second table. This is narrower than [RFC3339], which admits the second value 60 at the end of a month in which a leap second occurs. In the child issuance time phase, the rule that a record's not_before MUST NOT predate its issued_at applies only to a member whose parent_delegation_id is not null. A root MAY take effect before its own issued_at, and a verifier MUST NOT report a schema or attenuation failure on that basis alone.¶
Each action selects one root-to-leaf authority chain. A verifier MUST NOT union scopes or budgets from multiple chains. Cross-principal composition requires a separate profile.¶
The signed cumulative value is a ceiling for the entire delegation subtree, not an entitlement reserved for each child. Before an action with amount q is dispatched, an enforcement boundary performs one atomic transaction over every bounded delegation in the selected root-to-leaf chain. It verifies the common unit and each per_action limit, verifies committed plus reserved plus q is no greater than each cumulative limit, and reserves q against every bounded ancestor or against none.¶
The reservation is keyed by action_ref. A request whose footprint matches an unsettled and uncancelled reservation is an idempotent retry. A request under the same action_ref whose unit, amount or bounded ancestor set differs is conflicting reuse and MUST be rejected. Section 5 states the same rule in full. Successful settlement moves every ancestor counter atomically from reserved to committed. Cancellation releases a reservation only before dispatch or after trusted evidence that dispatch did not occur. This prevents two siblings from each consuming a parent's complete cumulative budget.¶
A distributed deployment needs one linearizable accounting ledger for the authority tree. Without it, live spend status is indeterminate. Signatures establish static limits; they do not establish the current cumulative total.¶
Any delegation MAY be revoked by its issuer. Revocation is irreversible. The enforcement gateway MUST recheck revocation status at the moment the approval is consumed to admit dispatch, not only at the moment the policy decision is issued. Section 5.3, Section 7.3.2 and Section 7.3.3 use the same phrase for that moment.¶
A revocation takes effect for a verifier at the point that verifier establishes it under the revocation and freshness rules of Section 4.3. From that point the verifier MUST NOT accept as valid any chain that contains the revoked delegation. This holds whether or not any further record exists for a descendant of the revoked delegation, and whether or not that descendant was ever enumerated. A descendant delegation does not remain valid pending descendant-specific cascade evidence. This document does not state that a revocation takes effect for every verifier at the same instant. Until a verifier has established the revocation, its result follows the freshness and staleness rules of Section 4.3.¶
A revoking party MAY additionally produce the cascade evidence described in Section 4.5.1. That evidence records how a revocation was processed. It is not what makes a descendant chain invalid, and its absence MUST NOT be read as leaving a descendant chain valid.¶
An implementation reports two results, and MUST NOT collapse them into one field. The authority result for a chain is valid, invalid, indeterminate, or unsupported, as specified in Section 4.3. The evidence cascade state for a revocation is complete, incomplete, or indeterminate, as specified in Section 4.5.1. An evidence cascade state MUST NOT be reported as an authority result.¶
Section 4.5 specifies revocation behavior. Behavior alone leaves a verifier dependent on the revoking system's current state. This section specifies the evidence through which revocation history is verifiable from records where a profile defines that evidence. The model separates two questions that MUST NOT collapse into one mutable lookup: whether a delegation is currently valid, answerable from state, and whether and why a revocation occurred, verifiable from signed records.¶
The records defined in this section are evidence about how a revocation was recorded and processed. A verifier MUST NOT treat the presence or the absence of a record defined in this section as an input to the authority result of Section 4.3.¶
A revocation SHOULD be evidenced by a signed revocation record, in a format defined by the applicable profile, carrying at minimum the revoked delegation's identity, the revocation time inside the signed content, a reference to the revoking authority, and a machine-readable reason code with optional free-text detail. This document defines no wire encoding, identifier construction, signature construction, reason-code vocabulary or signer rule for that record. Where no such record is available, current revocation state remains governed by the resolution and freshness rules of Section 4.3.¶
A record derived from a cascade is evidence about a descendant delegation. It carries no authority, it is not a revocation of that descendant, and it MUST NOT change an authority result. Where such a record is produced, it MUST carry a reference to the originating revocation and the cascade transaction identity of that originating revocation. A cascade-derived record is produced only where the originating revocation record exists. That transaction identity is bound to the content of the originating revocation and is shared by every record the cascade produces. This document does not define a wire format for a cascade-derived record and does not state who signs one.¶
A verifier that holds the originating revocation record and a profile for its format establishes why a descendant chain is invalid from that record and the signed chain. It does not need a record naming the descendant, and the absence of one is not a defect in the chain. A verifier that does not hold both the originating revocation record and a profile for its format reports the evidence cascade state of Section 4.5 as indeterminate, which does not change the authority result.¶
Cascade completeness (INV-4, Section 4.6) is a claim about evidence processing. It is not verifiable from individual revocation records, because a partially processed subtree is indistinguishable, record by record, from a completely processed one. A cascade-completion record, where a profile defines one, carries the cascade transaction identity of the originating revocation and states that every descendant in a defined set was processed.¶
A party MUST NOT emit a cascade-completion record unless it can state the basis on which that set was complete when the originating revocation took effect, and what prevented a further descendant from entering that set afterwards. This document does not define such a basis. A party without one reports the evidence cascade state of Section 4.5 as incomplete or indeterminate, which does not weaken the verifier obligation in Section 4.5.¶
A verifier MUST NOT read an incomplete record set as a completely processed subtree. An incomplete or indeterminate evidence cascade state does not make any chain valid.¶
Section 4.5.1 states what a revocation record carries at minimum and defines no wire encoding, identifier construction, signature construction, reason-code vocabulary or signer rule for it. This section specifies one format that carries those members. A profile MAY define others.¶
The record type is "aps:authority-revocation:v1" at version "1.0". The schema is closed. The members below are all a record carries, and detail is the only OPTIONAL one.¶
This name is in the aps: namespace rather than the proposed: namespace other features of this revision use, because its semantics are fixed for this record_type and version, its wire shape is specified below, a fixture family exercises it against distinct negative cases, and both reference implementations map to it. The record type is inside the signed content, so the name is part of every preimage in this subsection. Wire compatibility: the released packages emit and verify records under this exact record_type and version, so a record minted by either of them is a record under this subsection.¶
{
"record_type": "aps:authority-revocation:v1",
"version": "1.0",
"revocation_id": "sha256:<64-lowercase-hex>",
"delegation_id": "sha256:<64-lowercase-hex>",
"revoker": "did:example:principal",
"verification_method": "did:example:principal#key-1",
"revoked_at": "2026-03-15T12:00:00.000Z",
"reason_code": "issuer-key-compromise",
"detail": "Issuer key retired after hardware replacement.",
"cascade_transaction_id": "sha256:<64-lowercase-hex>",
"nonce": "<32-lowercase-hex>",
"signature": "<128-lowercase-hex>"
}
¶
delegation_id names the revoked delegation. revoker is that delegation's issuer, and Section 4.5 names no other party for a direct revocation, so this format covers issuer revocation and no other. A record whose revoker member differs from the named delegation's issuer is invalid under a revoker-not-issuer reason code, and a conforming issuer does not issue one. Both reference implementations decide such a record invalid under that reason code and both refuse to issue one, which is the behavior Appendix A records. verification_method names the key that signed. All timestamps use exact UTC milliseconds with a second value from 00 through 59. nonce is 16 random bytes. A record carrying a record_type other than "aps:authority-revocation:v1", or a version other than "1.0", is unsupported rather than invalid.¶
A record under this format MUST carry revoked_at. revoked_at is a member, so the revocation time is inside every preimage below, and the closed schema leaves no member that could carry a revocation time outside the signed content.¶
The three identifiers and the signature are constructed as follows, following the pattern of Section 4.1. Each domain tag is followed by one zero byte.¶
cascade_transaction_id = "sha256:" || lowercase-hex(SHA-256(
ASCII("APS-AUTHORITY-REVOCATION-CASCADE-TRANSACTION-ID-V1")
|| 0x00 ||
UTF8(JCS(revocation without revocation_id, signature and
cascade_transaction_id))))
revocation_id = "sha256:" || lowercase-hex(SHA-256(
ASCII("APS-AUTHORITY-REVOCATION-ID-V1") || 0x00 ||
UTF8(JCS(revocation without revocation_id and signature))))
signature = Ed25519-Sign(revoker_private_key,
ASCII("APS-AUTHORITY-REVOCATION-SIGNATURE-V1") || 0x00 ||
UTF8(JCS(revocation without signature)))
¶
revocation_id is inside the signature preimage, so the identifier is signed rather than carried as a label beside the signature. A verifier MUST recompute cascade_transaction_id and revocation_id from the record's own content before it checks the signature. A verifier resolves verification_method for the revoked delegation's issuer at revoked_at, not for the revoker member the record carries, so no field inside a revocation selects the key that authorizes it. revoked_at is the signing instant for key selection, so the key version that has to be authorized is the one authorized at revoked_at and not the one current at verification time, which is the historical selection rule of Section 3.4.¶
cascade_transaction_id is derived from the record's own originating content rather than chosen by the party that issues it, so a verifier recomputes it instead of accepting the value written there. It is the transaction identity that Section 4.5.1 says every record one cascade produces shares. This section defines the direct revocation only. It defines no cascade-derived record and no cascade-completion record.¶
A revocation evidenced by a record under this format satisfies the SHOULD in Section 4.5.1.¶
Revocation is irreversible (INV-5, Section 4.6). A party that records one of these MUST NOT replace a record it already holds for the same delegation_id. A later valid record naming that delegation leaves the earlier one in place.¶
reason_code is a non-empty string. This document defines no vocabulary for its value and no rule relating a value to an authority result. No family named in the status block below varies a reason-code value, so nothing here is a statement about which values an implementation uses.¶
This section does not establish that this is the format Section 4.5.1 requires, and does not establish that a record under this format is an input to the authority result of Section 4.3. The record is evidence in the sense of Section 4.5.1, and the prohibition stated there applies to it unchanged: neither the presence nor the absence of the record is an input to that result. It does not establish that a cascade was processed, that a subtree was completely processed, or that any descendant chain is invalid, which follows instead from Section 4.5 and the signed chain. It does not establish that a recorded record is persistent, and it states nothing about how a party keeps the first-wins property above under concurrent writers. It states nothing about the recheck at the next authorization boundary required by Section 4.5.¶
Requirements. APS-REC-REVOCATION-TIME-SIGNED, a record carries revoked_at, exercised by ARR-04. APS-REC-REVOCATION-UNKNOWN-TYPE-UNSUPPORTED, a record_type or version other than the ones named is unsupported rather than invalid, exercised by ARR-05. APS-REC-REVOCATION-RECOMPUTE-IDS, a verifier recomputes cascade_transaction_id and revocation_id from the record's own content before checking the signature, exercised by ARR-02 and ARR-06, with ARR-03 covering the signature preimage. APS-REC-REVOCATION-FIRST-WINS, a party does not replace a record it already holds for the same delegation_id, exercised by ARR-07 and ARR-08. APS-REC-REVOCATION-REVOKER-IS-ISSUER, a record whose revoker member differs from the named delegation's issuer is invalid under a revoker-not-issuer reason code and a conforming issuer does not issue one, specified, not exercised: no vector in the family presents a revoker other than the issuer.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: authority-revocation-record, 8 vectors, 6 under record verification and 2 under store first-wins. Both reference runners reported 8 pass, 0 fail, 0 not_supported, asserting the state, the valid flag and the full failure list including message strings: TypeScript against agent-passport-system 7.2.0 from npm, and Python against agent-passport-system 4.2.0 from PyPI. The family is merged into the conformance suite at commit 5829e2ff00d75f49ce21e9d87e756658deb1ef33. This subsection is a Candidate feature because the format is one format under the SHOULD of the previous subsection, and supporting it is not a requirement of APS Core. Exercised requirements: APS-REC-REVOCATION-TIME-SIGNED, APS-REC-REVOCATION-UNKNOWN-TYPE-UNSUPPORTED, APS-REC-REVOCATION-RECOMPUTE-IDS, APS-REC-REVOCATION-FIRST-WINS. Implemented requirements: APS-REC-REVOCATION-TIME-SIGNED, APS-REC-REVOCATION-UNKNOWN-TYPE-UNSUPPORTED, APS-REC-REVOCATION-RECOMPUTE-IDS, APS-REC-REVOCATION-FIRST-WINS, APS-REC-REVOCATION-REVOKER-IS-ISSUER. Related implementation surfaces: agent-passport-system 7.2.0 (npm), agent-passport-system 4.2.0 (PyPI).¶
The protocol specifies eight invariants: INV-1 (Identity Verifiability), INV-2 (Scope Monotonic Narrowing), INV-3 (Spend Limit Narrowing), INV-4 (Cascade Completeness), INV-5 (Revocation Irreversibility), INV-6 (Intent-Receipt Binding), INV-7 (Authority Attribution Completeness), and INV-8 (Signature Integrity). INV-4 is a claim about evidence processing, reported as the evidence cascade state of Section 4.5, and is not an input to the authority result. It is verifiable only from a completion record whose basis Section 4.5.1 leaves undefined. The signed receipt layer in Section 7 elaborates INV-6. INV-7 requires every governed action to identify an acting agent, an authority path, and a receipt context. It does not concern contribution-attribution or beneficiary-attribution, which are outside the scope of this document as described in Section 18.¶
INV-2, INV-3, and INV-8 are enforced at issuance, not only at verification. An issuer minting a child delegation MUST verify the parent delegation's signature and temporal validity before signing the child, and MUST refuse to issue under an expired, not-yet-valid, or revoked parent. Issuance from an expired parent MUST fail at the issuer; it MUST NOT produce a delegation whose invalidity is left for a later verifier to discover. Verification-time checking remains required (Section 4.3), but a conforming issuer does not rely on it as the sole enforcement point: a delegation that was invalid at issuance never becomes valid later.¶
APS defines a three-record policy chain: an action-intent record in which the agent declares the intended action; a policy-decision record in which the policy engine returns permit, deny, or narrow, with narrow carrying the reduced authority and applied constraints; and an action-result record in which the enforcement boundary records the observed execution result. The policy engine splits into a deterministic gate (scope, signature, revocation, authority path, spend) and an advisory evaluation path (deception, proportionality). The structure and verification of each signed record are specified in Section 7.¶
The spend check in the deterministic gate compares amounts only within a declared unit. When the action's declared unit and the governing delegation's declared unit differ, the gate MUST deny; it MUST NOT compare raw numeric amounts across units, and it MUST NOT apply a conversion. When the action does not declare a unit, the amount is evaluated under the delegation's resolved unit (Section 4.2); this is a defined interpretation rule, not a verifier assumption. Deployments handling monetary spend SHOULD require actions to declare their unit, and a profile MAY require the gate to deny when it is undeclared.¶
A unit is an opaque non-empty string. This document defines no grammar for unit values. Two units are the same unit when their UTF-8 byte sequences are equal, and are different units otherwise. An implementation MUST NOT reject a unit for failing a grammar this document does not state, and MUST NOT treat two unequal unit strings as one unit because they appear related.¶
A delegation's spend value is a limit fixed at issuance. A signed delegation is immutable and cannot carry mutable state; live spend is enforcement-boundary state. A cumulative limit applies to the complete delegation subtree, not independently to each descendant. Before dispatch, the boundary MUST atomically reserve the proposed amount against every bounded ancestor in the selected root-to-leaf chain. It MUST dispatch only if the reservation succeeds for all of them. After settlement, the boundary atomically moves the reservation to committed spend for every affected ancestor. This all-or-none operation prevents sibling delegations and concurrent requests from overspending a shared ancestor. Signatures establish the static limits; the accounting ledger establishes the live totals.¶
A reservation is keyed by action_ref. Its footprint is the action_ref, the unit, the amount, and the set of bounded ancestor delegation_id values in the selected chain. Unbounded ancestors do not contribute to that footprint. A request presenting a footprint already reserved and not yet settled or cancelled is a retry of the same reservation, and the boundary MUST NOT reserve a second amount for it. A request under the same action_ref whose unit, amount or bounded ancestor set differs is conflicting reuse, and the boundary MUST reject it. After a reservation is cancelled, a later request carrying the same footprint MUST reserve again.¶
Each governed action is identified by an action_ref under the profile "aps-action-ref-v2". The reference commits to who is acting, what operation is requested, where it will occur, the exact payload, the authority scopes needed, when the intent was issued, and a replay-resistant nonce. The input object has exactly these members:¶
{
"profile": "aps-action-ref-v2",
"agent_id": "did:key:z6Mk...",
"action_type": "commerce_preflight",
"target": "https://api.example/payments",
"payload_ref": "<64 lowercase hexadecimal characters>",
"scope_required": ["commerce:read", "commerce:write"],
"issued_at": "2026-04-08T12:00:00.000Z",
"nonce": "<32 lowercase hexadecimal characters>"
}
¶
profile MUST equal "aps-action-ref-v2". agent_id is the acting agent's identifier. action_type is the operation identifier. target is the exact resource, tool, or endpoint against which the action will be dispatched; a profile MUST define its target string construction. payload_ref is the lowercase hexadecimal SHA-256 digest defined below. scope_required is a duplicate-free array of NFC [UAX15] strings sorted by the lexicographic order of their UTF-8 encodings. issued_at is an RFC 3339 [RFC3339] UTC timestamp with exactly three fractional digits, a second value from 00 through 59, and the literal "Z" suffix. nonce is 16 random bytes encoded as 32 lowercase hexadecimal characters. All string fields MUST be non-empty except that a profile MAY permit an empty scope_required array.¶
Each scope_required value is a scope string under Section 4.2. This document states no grammar for it beyond what that section states, and an implementation MUST NOT reject a scope value against a pattern this document does not state.¶
Because profile is fixed to "aps-action-ref-v2", the input object cannot name the profile that permits an empty scope_required array. The permission is therefore supplied to the implementation as profile context, alongside the object and outside it, by the caller that holds the applicable profile. An implementation given no such context MUST reject an empty scope_required array. An implementation MUST NOT infer the permission from any member of the object.¶
The payload reference and action reference are computed as:¶
payload_ref = lowercase-hex(
SHA-256("APS-ACTION-PAYLOAD-V1" || 0x00 || JCS(payload)))
action_ref = lowercase-hex(
SHA-256("APS-ACTION-REF-V2" || 0x00 || JCS(input_object)))
¶
JCS is RFC 8785 [RFC8785] and SHA-256 is defined in [RFC6234]. The payload is the exact JSON value presented for authorization and dispatch. The input_object includes payload_ref and excludes the payload itself. A verifier MUST reject an object with an unknown or duplicate member, a non-I-JSON value, a non-canonical scope array, an invalid timestamp, or an invalid hexadecimal field. A parser MUST detect duplicate names before conversion to an ordinary map; it MUST NOT accept the last occurrence silently.¶
A number MAY appear in any spelling I-JSON admits. JCS serializes a number to one canonical form, so two admissible spellings of the same value produce the same digest, and an implementation MUST NOT reject a value on the ground that its spelling is not the canonical one. This governs spelling only. A value I-JSON does not admit is rejected as before.¶
A string containing an unpaired UTF-16 surrogate has no UTF-8 encoding and MUST be rejected. An implementation MUST NOT substitute U+FFFD, delete the code unit, or otherwise repair the string. Scope normalization occurs when the intent is created; a verifier accepts only the resulting NFC, sorted, duplicate-free form and does not normalize an untrusted wire object before verification.¶
The enforcement boundary MUST recompute payload_ref from the payload it will dispatch and action_ref from the received input object. It MUST reject either mismatch before policy evaluation. It MUST also reject reuse of nonce by the same agent within the deployment's replay window. The nonce prevents two otherwise identical requests from sharing an approval or receipt identity; it does not replace an enforcement-boundary replay ledger.¶
For correlating APS-governed actions with records produced by systems outside an APS deployment, this document defines a second deterministic reference, the external action reference, identified by the label "action-ref-v1-jcs-sha256":¶
external_action_ref =
lowercase-hex(SHA-256(canonicalize(input_object)))
¶
where canonicalize is RFC 8785 [RFC8785], the hash is computed over the UTF-8 encoding of the canonicalized JSON, and input_object is a JSON object with exactly four fields, named in snake_case:¶
Field values in the external form are hashed as supplied. The external form applies none of the native form's field transformations: no Unicode normalization and no array sorting, since the scope field is a single string.¶
This form predates aps-action-ref-v2 and remains only for correlation with records that already use it. It omits the target, payload digest, and nonce, and therefore MUST NOT identify an APS policy decision, approval, dispatch, spend reservation, or receipt. An implementation MUST label it "action-ref-v1-jcs-sha256" and MUST NOT present its digest as an action_ref under Section 5.1. A digest produced by any construction other than the one specified in this section MUST NOT carry that label.¶
The external form exists for cross-ecosystem byte parity: independent implementations outside an APS deployment compute this key from their own records, and agreement with the value carried in or derived from an APS receipt correlates the two without prior coordination. The aps-action-ref-v2 form of Section 5.1 is the only action identity within the APS policy chain. The two forms differ in field naming, field forms, scope arity, and timestamp precision, and produce unrelated digest values for the same underlying action.¶
Section 4.5 requires revocation to be rechecked at the moment the approval is consumed to admit dispatch, and the action-result record of Section 7.3.3 records the observed outcome after a policy decision is consumed. These requirements place enforcement at two distinct moments; this section names that model.¶
In two-phase execution, the enforcement boundary first evaluates the policy chain and, on a permit or narrow verdict, issues an approval bound to the authority the verdict grants: a first-class consumable artifact, bound to the action_ref it approves, single-use, and carrying a bounded lifetime. The permit or narrow policy-decision record of Section 7.3.2 is that artifact. Its receipt_id is the consumable identity, its action_ref is the binding, and its valid_until is the bounded lifetime. Execution then presents and consumes the approval. At the moment the approval is consumed to admit dispatch, the boundary MUST re-validate what can have changed since issuance, including revocation status and temporal validity, as required by Section 4.5. An approval that has expired, has already been consumed, or fails re-validation MUST NOT admit execution.¶
For actions carrying a spend dimension, the two phases align with reserve-then-settle: the amount is reserved against the boundary-held cumulative total (Section 5) at approval, and settled at completion. This document specifies the gate model and its obligations; the internal mechanics of an enforcement boundary implementing it are out of scope.¶
This document leaves several constructions to a profile. A profile is a separate document that fixes those constructions for a deployment or for a community of deployments, under a name that records can carry. This document does not register profiles, does not define a profile document format, and does not name any profile other than the facet, action-reference and receipt profile identifiers it already fixes.¶
Two things a profile is not. It is not a policy. Policy decides whether a particular action is allowed under authority that is already established, and is carried in the policy chain. A profile decides how the records are constructed and read before any policy runs. It is also not an extension point for new authority. The dimensions a verifier compares are the ones the delegation section fixes, and a profile supplies the construction inside a dimension rather than adding one.¶
The requirements in this subsection bind a profile document. They are requirements on what a profile has to say, not runtime checks a verifier performs on a record, so no fixture exists for them. This is the only normative content of Section 6, and it is marked as such because the rest of this section reports behavior that fixture families do exercise.¶
A profile MUST identify all of the following.¶
A profile MUST NOT widen authority. A profile defines constructions, and a construction that admits a grant, an action or an effect which the same records would not admit without the profile is a widening. This constraint is on the profile document, in the same way as the requirements above, and this document states no runtime test by which a verifier detects a widening construction.¶
The following is informative. Where an implementation does recognize such a construction, reporting the record unsupported rather than valid is the disposition consistent with the rest of this document. What recognizing a widening construction consists of is not defined here, so this disposition is not stated as a requirement.¶
What this subsection does not establish. It does not establish that any profile exists, that a profile satisfying this list produces interoperability with another profile that also satisfies it, or that a verifier can tell a conforming profile from a widening one by inspecting records. It states what a profile document has to contain and stops there.¶
Requirements. APS-PROF-REQUIRED-CONTENT, a profile identifies every item in the list above. APS-PROF-SEMANTIC-PRESERVATION, a profile states which of the six loss values applies to each APS semantic it touches and states the verifier result for a semantic it cannot represent, which is never valid. APS-PROF-NO-WIDENING, a profile does not widen authority. APS-PROF-UNKNOWN-NOT-VALID, a profile does not require an implementation that does not hold it to treat a record naming it as valid. All four are specified, not exercised, and no fixture exists for a requirement on a profile document.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: none. Implemented requirements: none. Related implementation surfaces: no released package.¶
This subsection is informative. It collects every point at which this document defers a construction to a profile, states what an implementation that does not hold the profile reports there, and names the fixture families that exercise the point. The obligations themselves are stated in the sections listed, not here.¶
Across the points above, the pattern this document holds to is that an unknown or unheld profile yields unsupported or not established, and never valid and never a narrower reading. The text states that outcome directly at the facet, receipt-envelope, imported-grant and cascade-evidence points. At the empty scope_required point the outcome is rejection instead, for the reason given above. The nearest exercised evidence for the general pattern is revocation-resolution-forward-compat, which shows both reference SDKs failing closed on a revocation answer they do not recognize rather than reading it as active. That family is about a resolver answer and not about a profile, so it supports the pattern by analogy and does not establish it.¶
What this subsection does not establish. It does not establish that the extension points listed are the complete set for future revisions, that any implementation behaves as described at a point no family covers, or that the SDK behavior read from source at the facet-profile point would survive a vector. Where a point has no family, that is recorded above rather than argued past.¶
This subsection states no requirement of its own and carries no requirement identifier. The obligations are in the sections it names.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: chain-selection-no-union, single-chain-selection, key-rotation-historical, capability-binding-drift, ancestor-revocation-chain, revocation-resolution-forward-compat, instruction-provenance, arap-binding. Implemented requirements: none. Related implementation surfaces: agent-passport-system 7.2.0 (npm) and agent-passport-system 4.2.0 (PyPI) for the UNSUPPORTED_PROFILE and KEY_AMBIGUOUS outcomes only. No released package implements a profile document, a profile registry, or profile-context passing.¶
APS represents a governed action as three signed records: an agent's intent, the enforcement boundary's policy decision, and, when dispatch occurs, the boundary's observed execution result. All three use the ReceiptV1 envelope. The common envelope permits one verification algorithm while receipt_type and result state the record's stage and bounded semantics.¶
A ReceiptV1 is a closed JSON object. The example below is an action-intent record and therefore omits the conditional decision_ref and prev members described after the example:¶
{
"profile": "aps-receipt-v1",
"receipt_id": "<64 lowercase hexadecimal characters>",
"receipt_type": "aps:action-intent:v1",
"issuer": "did:key:z6Mk...",
"subject_agent": "did:key:z6Mk...",
"action_ref": "<64 lowercase hexadecimal characters>",
"delegation_ref": "sha256:<64 lowercase hexadecimal characters>",
"issued_at": "2026-04-08T12:00:00.000Z",
"evidence_refs": [],
"result": {
"profile": "aps-action-intent-result-v1",
"status": "declared"
},
"signatures": [{
"signer": "did:key:z6Mk...",
"key_id": "did:key:z6Mk...#z6Mk...",
"alg": "Ed25519",
"value": "<128 lowercase hexadecimal characters>"
}]
}
¶
profile MUST equal "aps-receipt-v1". receipt_type identifies a stage defined in Section 7.3. issuer is the party responsible for that record. subject_agent is the acting agent. action_ref is the aps-action-ref-v2 digest from Section 5.1. delegation_ref identifies the selected AuthorityDelegationV1 leaf, or the authority basis when no delegation exists. decision_ref is REQUIRED for policy-decision and action-result records and MUST be absent from an action-intent record. issued_at uses exact UTC milliseconds with a second value from 00 through 59. prev is REQUIRED for policy-decision and action-result records and MUST be absent from an action-intent record. A member that is not applicable is absent, not null.¶
evidence_refs is a duplicate-free array of objects containing exactly artifact_type and sha256. sha256 is the lowercase hexadecimal SHA-256 digest of the artifact bytes defined by artifact_type. References are sorted first by the UTF-8 bytes of artifact_type and then by the ASCII bytes of sha256. result is the closed, typed object defined by receipt_type. signatures is a non-empty array sorted first by the UTF-8 bytes of signer and then by the UTF-8 bytes of key_id. Each signer and key_id pair occurs at most once, alg MUST equal "Ed25519", and one signature MUST be from issuer.¶
The receipt identifier is computed over the validated envelope with receipt_id and signatures absent:¶
receipt_id = lowercase-hex(SHA-256(
ASCII("APS-RECEIPT-ID-V1") || 0x00 ||
UTF8(JCS(receipt without receipt_id and signatures))))
¶
Each signature descriptor contains signer, key_id, and alg. Its value is computed over a form that contains the receipt with signatures absent and the descriptor as a separate signer member:¶
signature_form = {
"receipt": receipt without signatures,
"signer": {
"signer": signer,
"key_id": key_id,
"alg": "Ed25519"
}
}
value = lowercase-hex(Ed25519-Sign(signing_key,
ASCII("APS-RECEIPT-SIG-V1") || 0x00 ||
UTF8(JCS(signature_form))))
¶
The signature form includes receipt_id. It therefore binds the complete content-addressed body and the signer's own identifier, verification method, and algorithm. A verifier MUST recompute receipt_id before signature verification, resolve each key as authorized for signer at issued_at, and verify every required signature. A valid signature establishes that an authorized signing key attested to the canonical receipt body. It does not establish that an external event occurred or that a signed claim is true.¶
A prev reference cryptographically links one receipt body to a claimed predecessor. It does not establish wall-clock ordering, completeness, or absence of omitted receipts without an external log or sequencing mechanism.¶
This section defines three stages and their receipt_type values: "aps:action-intent:v1", "aps:policy-decision:v1", and "aps:action-result:v1". A verifier selects the rules to apply from the receipt_type the record carries, never from the stage a caller expects. A record whose receipt_type names no stage defined here is unsupported. A verifier MUST NOT report such a record valid, and MUST NOT judge its result object against a stage schema the record does not name. Each result object defined below is closed, so a result whose profile is not the one its named stage defines is invalid.¶
These rules bind the issuer as well as the verifier. A conforming issuer MUST NOT emit a receipt whose receipt_type names a stage defined here and whose content breaks that stage's rules. This is the obligation Section 4.6 states for delegations, applied to receipts. It does not require a general-purpose record-building function to apply the stage rules itself, but a record that breaks them is not a conforming receipt whatever produced it.¶
Where a stage below names the enforcement boundary as issuer, the expected boundary identity is a trust input the verifier supplies. A verifier given an expected identity MUST report a record whose issuer differs from it as invalid on that axis. A verifier given none MUST report that axis as not established, which is indeterminate and is never valid. This document states no rule that issuer differs from subject_agent at those stages, and no separate rule that an action-result issuer equals the issuer of the policy decision it follows. The latter follows only where both are checked against the same supplied boundary identity.¶
An action-intent record has receipt_type "aps:action-intent:v1". issuer and subject_agent MUST be the acting agent, prev and decision_ref MUST be absent, and result MUST contain exactly profile "aps-action-intent-result-v1" and status "declared". The agent signature binds the action_ref and selected delegation_ref before policy evaluation. It attests to the declared request; it does not establish that dispatch occurred.¶
A policy-decision record has receipt_type "aps:policy-decision:v1". issuer is the enforcement boundary, prev is the receipt_id of the action-intent record, and decision_ref is computed as specified in Section 7.4. result is a CoreDecisionOutputV1 object with exactly these members:¶
{
"profile": "aps-core-decision-output-v1",
"verdict": "permit",
"effective_authority_ref":
"<64 lowercase hexadecimal characters>",
"constraints": [],
"valid_until": "2026-04-08T12:00:05.000Z"
}
¶
verdict is permit, deny, or narrow. constraints is a duplicate-free array of NFC strings sorted by UTF-8 bytes. effective_authority_ref identifies the exact effective authority admitted by the decision. It is null for deny and a lowercase hexadecimal SHA-256 digest for permit or narrow. valid_until is null for deny and an exact UTC-millisecond timestamp later than issued_at for permit or narrow. valid_until and issued_at are compared as instants, not as strings.¶
The issuer puts constraints into that canonical form when it builds the decision output, before the output is hashed for Section 7.4, so that two byte-different encodings of one decision cannot produce different decision_ref values. A verifier takes the array as received. It MUST NOT normalize, deduplicate or sort a received array before evaluating it, and a received array that is not already duplicate-free, in NFC and sorted by UTF-8 bytes makes the record invalid. This is the rule Section 5.1 states for the other canonical array in this document.¶
A permit or narrow policy-decision record is a bounded, single-use approval for its action_ref. At the moment the approval is consumed to admit dispatch, the enforcement boundary MUST verify that it has not expired, atomically consume its receipt_id, recheck time and revocation state, and complete any spend reservation. An already consumed, expired, or stale approval MUST NOT admit dispatch. A deny record is terminal and MUST NOT be consumed as an approval.¶
An action-result record has receipt_type "aps:action-result:v1". issuer is the enforcement boundary, prev is the consumed policy-decision receipt_id, and decision_ref MUST equal that decision's decision_ref. result contains exactly profile, status, effect_ref, and error_code:¶
{
"profile": "aps-action-result-v1",
"status": "succeeded",
"effect_ref": "<64 lowercase hexadecimal characters>",
"error_code": null
}
¶
status is succeeded, failed, or unknown. For succeeded, effect_ref is REQUIRED and error_code is null. For failed, error_code is a non-empty stable identifier and effect_ref is either a digest of a returned error artifact or null. For unknown, both are null. A failure the boundary cannot characterize is reported unknown, because failed carries a stable failure identifier the boundary does not hold in that case. A non-null effect_ref is computed as lowercase-hex(SHA-256( ASCII("APS-ACTION-EFFECT-V1") || 0x00 || JCS(effect))). An action-result record attests to what the enforcement boundary observed after dispatch. External occurrence or settlement requires separately resolved evidence.¶
The validity window belongs to the policy decision. valid_until bounds the moment at which that decision may be consumed to admit dispatch, as Section 7.3.2 requires. It does not bound the issued_at of the action-result record that follows, because execution and observation can complete after the decision is consumed. A verifier MUST NOT treat an action-result record as invalid on the sole ground that its issued_at is later than the consumed decision's valid_until, and MUST NOT report a temporal relation between the two that it did not check.¶
DecisionRefV1 commits the policy decision to the action, evaluated authority state, policy input, decision context, and decision output without requiring those potentially sensitive objects to be embedded in every receipt. Each component reference is computed over the exact JSON value evaluated by the enforcement boundary:¶
authority_state_ref = H("APS-DECISION-AUTHORITY-V1",
authority_state)
policy_ref = H("APS-DECISION-POLICY-V1",
policy_input)
context_ref = H("APS-DECISION-CONTEXT-V1",
decision_context)
decision_output_ref = H("APS-DECISION-OUTPUT-V1",
decision_output)
where H(tag, value) =
lowercase-hex(SHA-256(ASCII(tag) || 0x00 || UTF8(JCS(value))))
¶
The DecisionRefV1 input is a closed object:¶
{
"profile": "aps-decision-ref-v1",
"action_ref": "<64 lowercase hexadecimal characters>",
"authority_state_ref": "<64 lowercase hexadecimal characters>",
"policy_ref": "<64 lowercase hexadecimal characters>",
"context_ref": "<64 lowercase hexadecimal characters>",
"decision_output_ref": "<64 lowercase hexadecimal characters>"
}
¶
decision_ref = lowercase-hex(SHA-256(
ASCII("APS-DECISION-REF-V1") || 0x00 ||
UTF8(JCS(decision_ref_input))))
¶
authority_state MUST include the selected authority chain, authority-basis resolution, revocation observations, and the spend state used by the decision. policy_input MUST identify the policy and version actually evaluated and include its decision-relevant input. decision_context contains decision-relevant environmental state. decision_output is the exact CoreDecisionOutputV1 carried in the policy-decision receipt. A deployment MAY keep component values private, but a verifier cannot independently recompute a component whose value is unavailable.¶
Matching decision_ref values establish that the same component digests were named. They do not establish that the policy was correct, the inputs were complete, or the underlying claims were true.¶
An evidence reference is a commitment, not evidence availability. When a verification policy depends on referenced evidence, the verifier resolves the artifact under the rules named by artifact_type, hashes the exact bytes those rules select, and compares the digest. Resolution reports at least resolved, not_found, unreachable, malformed, digest_mismatch, or unsupported. A not_found, digest_mismatch, or malformed result is invalid for a required artifact; unreachable is indeterminate; unsupported is unsupported. A verifier MUST NOT report the containing receipt fully valid for a claim that depends on unresolved evidence.¶
A verifier that does not resolve evidence at all reports the evidence-resolution axis as not_attempted, which is indeterminate. Declining to resolve evidence is a permitted verifier scope. Omitting the axis, or reporting a receipt valid for a claim that depends on evidence the verifier never resolved, is not.¶
Retrieval code MUST apply scheme allowlists, size limits, redirect limits, timeouts, and private-network restrictions appropriate to its environment. A receipt signature does not make an evidence locator safe to fetch.¶
A verifier performs these checks in order:¶
On step 5, the required signature set is the signature from issuer that Section 7.1 requires, plus any signature the applicable profile or the verifier's own input explicitly requires. Failure or non-resolution of a signature outside that set MUST NOT change the record's aggregate state and is reported on its own axis. A structurally malformed signature descriptor still makes the envelope invalid, because the envelope schema is closed and the descriptor is part of it.¶
On step 6, the action binding is established only against an independently supplied action input object. Where the verifier holds none, the action-binding axis is not established, which is indeterminate. Where it holds one, the object's agent_id of Section 5.1 and the record's subject_agent of Section 7.1 MUST be equal, and a verifier MUST report a mismatch as invalid on that axis. The two name the acting agent from the two sides of one action, and a record binding an action declared by one agent to a different subject_agent is not a conforming receipt.¶
On step 7, where an authority chain is supplied, delegation_ref MUST equal the delegation_id of the selected leaf byte for byte, and a verifier MUST report a mismatch as invalid. Where no chain is supplied, a verifier checks the form of delegation_ref only and MUST NOT report the delegation-validity axis as valid. Where delegation_ref names an authority basis rather than a delegation leaf, this document defines no encoding for that basis, and a verifier MUST report that axis as unsupported.¶
On step 10, the policy-decision record identifies the approval. Whether that approval has been consumed is enforcement-boundary state keyed by its receipt_id and is not content of the record. A verifier without access to that state reports the approval-state axis as not established, which is indeterminate.¶
The result keeps artifact integrity, signer authority, action binding, delegation validity, decision binding, stage continuity, enforcement-boundary identity, approval state, and evidence resolution separate. An invalid cryptographic or structural check is invalid. Missing live state is indeterminate. An unknown required profile is unsupported, as is a receipt_type that names no stage of Section 7.3. A result object whose profile is not the one its named stage defines is invalid, because those objects are closed. A caller MUST NOT collapse indeterminate or unsupported into valid, and a verifier MUST NOT let an axis it did not establish contribute to a valid result.¶
A ceiling an implementation reaches while parsing or verifying, such as a nesting depth, a wire size, or a chain length limit, is a property of that verifier and not of the record: the same bytes verify under a verifier with a higher ceiling. A verifier that reaches such a ceiling MUST report indeterminate with a reason naming the limit, and MUST NOT report the record invalid on that ground. A parse failure, a duplicate member, or any other schema violation remains invalid. Where a bounded parser both reaches a ceiling and observes a syntax violation, a ceiling reached before any syntax violation is observed is indeterminate, and a syntax violation observed first is invalid.¶
A policy decision and an external effect are separate facts about separate moments. The records of Section 7 carry the decision side and the boundary's own observation after dispatch. The effect side needs evidence a verifier resolves under Section 7.5. This section states what a verifier may carry across that gap, what it may not, and what it reports when the evidence it holds does not settle the question.¶
This section answers five questions, separately, and never lets an answer to one stand in for an answer to another. Was the action authorized. Was it still admissible at the moment of admission. Was it admitted. Was dispatch attempted. Was the external effect established. A deployment that can answer the first and reports it as an answer to the fifth has lost four findings.¶
The stage vocabulary this section uses has seven positions: proposed, then authorized or denied, then admitted or refused, then dispatch attempted, then result observed, then external effect established or not established, then settled or compensated. The positions are findings and not record types. Section 9.6 states which of them any record in this document carries.¶
One of the five questions has no durable answer in this revision. The admission transition produces no record. Whether an approval was consumed is enforcement-boundary state keyed by the approval's identity, and it is not content of any record this document defines, so a verifier without access to that state reports the approval-state axis as not established and can reach no further. Section 19.2.11 carries what that leaves open and what this document requires until it is settled.¶
Everything in this section is a Candidate feature except the Core restatements Section 9.1 and Section 9.8 name. It is specified here and tested against this text. A Candidate part of it is normative for an implementation claiming the feature and is not a requirement of APS Core conformance. No part of it is a conformance claim.¶
Four relations sit between a valid authority artifact and an effect in the world. None of them is transitive, and a finding about one is not a finding about the next.¶
A verifier MUST report each of these as its own finding. It MUST NOT derive a later one from an earlier one, and MUST NOT report a finding it did not establish. A caller holding a report on one of them MUST NOT read it as a report on another. This is the axis discipline of Section 7.6 applied across the decision and the effect rather than within one record.¶
Where a verifier holds a receipt and a decision, the binding between them is a recomputation, not a presumption. The reference is rebuilt under Section 7.4 from the full decision evidence together with the action reference the receipt itself carries, and it MUST equal the receipt's decision_ref. A decision supplied alongside a receipt that does not bind to it is not evidence about that receipt, and a verifier MUST settle the binding before it reads any member of the decision, including its validity window. Reading a window off a decision that belongs to a different receipt reports a temporal relation the verifier never checked.¶
The four relations were named on [COSAI-149], where the last three are stated as "an authorized action does not imply the exact authorized call ran", "an exact authorized call does not imply execution was non-bypassable" and "execution does not imply the intended effect occurred". The candidate corpus this section is written against isolates those three.¶
What this subsection does not establish. It does not establish that a verifier can reach any of the four findings from signed records alone. Three of the four need evidence from outside the record set. It does not establish an order in which a deployment must attempt them. It states only that a finding on one is not a finding on another.¶
Requirements. APS-EVID-RELATIONS-NOT-TRANSITIVE, a verifier reports each of the four relations as its own finding, derives no later one from an earlier one, and reports no finding it did not establish. Specified, not exercised. APS-REC-DECISION-REF-RECOMPUTED, the decision reference is rebuilt from the full decision evidence and the receipt's own action reference and must equal the receipt's decision_ref. That is the requirement Section 7.3.3 states with a keyword and Section 7.6 step 8 performs, restated here and not added here, and receipt-decision-relation exercises it by asserting DECISION_REF_MISMATCH over its seven vectors. APS-REC-DECISION-BINDING-BEFORE-READ, the binding is settled before any member of the decision is read, including its validity window, which the closed core does not state. Specified, not exercised: no vector asserts the ordering of the binding check against the temporal check.¶
Status: Core for one proposition, carried by APS-REC-DECISION-REF-RECOMPUTED, which restates Section 7.3.3 and Section 7.6 step 8. The rest of this subsection is a Candidate feature, normative for an implementation claiming it and not a requirement of APS Core conformance, and the additions are the four non-transitive relations and the ordering rule of APS-REC-DECISION-BINDING-BEFORE-READ. Related fixture families: receipt-decision-relation, 7 vectors. action-result-binding, 6 cases. approval-single-use, 9 presentations. The interop record cosai-ws4-149-decision-to-effect in the same suite, 11 cases, which is an interop record and not a fixture family. Exercised requirements: APS-REC-DECISION-REF-RECOMPUTED. Implemented requirements: APS-REC-DECISION-REF-RECOMPUTED, APS-REC-DECISION-BINDING-BEFORE-READ. Related implementation surfaces: agent-passport-system receipt-core 7.2.0 (TypeScript) and 4.2.0 (Python) for the receipt-to-decision binding and its temporal relation, no released package for the remaining three relations.¶
An approval admits one action. The permit or narrow record of Section 7.3 is bound to the action reference it approves, and that reference commits to the call, not to a class of calls.¶
At the next authorization boundary the boundary MUST compare the call it is about to admit against the action the approval names, and MUST NOT admit a call whose action reference differs from it. An argument changed after the decision produces a different action reference, so the comparison catches it without any separate argument-level rule.¶
A refusal on that ground is a finding in its own right and the boundary SHOULD record the cause it attributes the refusal to. Where a refusal carries no attributed cause, a verifier MUST NOT read it as a finding about the exact call, because a refusal on its own does not say which boundary refused or why.¶
What this subsection does not establish. It does not establish that admitting the call was the right decision under whatever policy governs the deployment. A call can match its approval exactly and still be a policy mistake. It does not establish that the arguments mean what the requesting agent intended them to mean. The comparison is between references over canonical bytes, not between intentions.¶
Requirement. APS-ENF-EXACT-ACTION-MATCH, the boundary compares the call it is about to admit against the action the approval names and admits no call whose action reference differs. Specified, not exercised.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: approval-single-use, action-result-binding, actionref-canonical, and the interop record cosai-ws4-149-decision-to-effect in the same suite, which is an interop record and not a fixture family. Implemented requirements: none. Related implementation surfaces: no released package for the boundary-side comparison. agent-passport-system 7.2.0 (TypeScript) and 4.2.0 (Python) recompute the action and decision references the comparison reads.¶
This document establishes that a governed path was valid. It does not establish that no other path reached the same effect. That assumption is load bearing, and a deployment that does not hold it loses the third relation of Section 9.1 and nothing else in this document replaces it.¶
A verifier that cannot establish coverage over the paths to an effect MUST NOT report that the effect was reached only through the boundary that admitted it. One observed use of a path that did not pass the boundary settles that finding negatively on its own. The absence of an observed alternate path settles nothing about paths outside what was actually observed.¶
A coverage premise is supplied to the verifier and is not established recursively by the same check. Where one is supplied, it MUST name the scope it covers and the claim instance it is bound to, and a premise whose scope or claim differs from the one being evaluated leaves the finding not established rather than settled either way. A premise that is asserted rather than established is not a premise for this purpose.¶
A verifier that holds the boundary's admission state MUST resolve a claim that a credential use went through the boundary to the admission that covers it. Where that verifier holds the admission state and the claim resolves to no admission, the claim is malformed input, not a weaker finding, because accepting it would let a relabelling turn a negative finding into an unsettled one. Where the boundary's admission state is not available to the verifier, the coverage claim is not established, and the verifier reports neither a governed path nor a malformed claim.¶
What this subsection does not establish. It does not establish that no alternate path exists anywhere. A coverage premise is scoped, and a path outside that scope is a path the verifier did not look at, in either direction. It does not establish that the boundary is the only way to reach the effect. It does not enumerate paths, and nothing here is a completeness claim.¶
Requirements. APS-ENF-NO-COVERAGE-NO-BYPASS-CLAIM, a verifier that cannot establish coverage over the paths to an effect does not report that the effect was reached only through the boundary that admitted it. APS-ENF-COVERAGE-PREMISE-SCOPED, a coverage premise names the scope it covers and the claim instance it is bound to, and a premise whose scope or claim differs leaves the finding not established. APS-ENF-COVERAGE-RESOLVES-TO-ADMISSION, a verifier holding the boundary's admission state resolves a claim of a governed path to the admission that covers it and treats a claim resolving to no admission as malformed input, and where that state is not available to the verifier the coverage claim is not established. All three are specified, not exercised: the interop record settles the negative direction on an observed alternate path and no vector establishes coverage.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: cached-authorization-revocation, runtime-authority-denial-continuity, conflicting-status-sources, and the interop record cosai-ws4-149-decision-to-effect in the same suite, which is an interop record and not a fixture family. Implemented requirements: none. Related implementation surfaces: no released package.¶
An action-result record attests what the enforcement boundary observed after dispatch, as Section 7.3 states. A verifier MUST NOT report an effect as externally established from an action-result record alone, whatever its status member says and whatever effect_ref it carries.¶
Where a deployment compares an executing tool's own report against a read-back obtained independently of that tool, three outcomes follow. Where the two agree, the verifier may report agreement between two records. Where they disagree, the verifier MUST NOT report the effect as established. Where the read-back cannot be obtained, the verifier MUST report the effect finding as not established and MUST name the source it could not obtain.¶
A runtime status value that names its own indeterminacy is evidence about the run. A verifier MUST NOT read it as a report about the effect finding, in either direction. The two are different objects: one says what the executing system observed, the other says what the evidence establishes.¶
What this subsection does not establish. Agreement between a self-report and a read-back does not establish that the action under test caused the state read back. Something else may have produced the same state, or the state may have held before the call ran. It does not establish that the read-back source is trustworthy. A verifier that treats the read-back as the arbiter is reporting agreement between two records and not ground truth. Establishing the standing of the read-back source is a separate question this document does not answer.¶
Requirements. APS-EVID-EFFECT-NOT-FROM-RESULT, a verifier does not report an effect as externally established from an action-result record alone, whatever its status member says. APS-EVID-READBACK-OUTCOMES, disagreement between a self-report and an independent read-back does not establish the effect, and an unobtainable read-back gives not established with the unobtainable source named. Both are specified, not exercised.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: action-result-binding, lifecycle-evidence-and-record, accountability-record, and the interop record cosai-ws4-149-decision-to-effect in the same suite, which is an interop record and not a fixture family. Implemented requirements: none. Related implementation surfaces: no released package.¶
A finding about any of the relations of Section 9.1 has three outcomes and not two. The property is established, the property is settled negatively, or the evidence does not settle it. The third is not a weak form of the second. It is a statement about the verifier's evidence, not a statement about the world.¶
A verifier reporting that the evidence does not settle a property MUST name what is missing, and the name MUST identify a source, a freshness bound or a coverage claim rather than restating the property. A caller MUST NOT collapse that outcome into either of the other two. A deployment MAY deny an action on it, and the denial states the unsettled property as its reason.¶
False and not established stay apart in the record. A verifier that establishes an alternate path was used reports a negative finding. A verifier that cannot establish coverage reports that it cannot. A record that writes the second as the first claims a finding nobody made, and a record that writes the first as the second loses one.¶
What this subsection does not establish. It does not define a code vocabulary for what is missing. The names a verifier reports are its own and are not protocol constants. It does not say how a deployment should act on an unsettled finding beyond permitting denial. It does not make an unsettled finding a defect in the records that were presented.¶
Requirement. APS-EVID-MISSING-NAMED, a verifier reporting that the evidence does not settle a property names what is missing, and the name identifies a source, a freshness bound or a coverage claim rather than restating the property. Specified, not exercised.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: activation-not-established, conflicting-status-sources, revocation-resolution-forward-compat, lifecycle-evidence-and-record, and the interop record cosai-ws4-149-decision-to-effect in the same suite, which is an interop record and not a fixture family. Implemented requirements: none. Related implementation surfaces: agent-passport-system lifecycle-state 7.2.0 (TypeScript) and 4.2.0 (Python), both experimental, for the verdict and boundary-outcome vocabulary, no released package for the decision-to-effect properties.¶
Eight findings about one action are routinely written as if they were one. They are not, and a record that uses one name for another loses the distinction permanently.¶
A verifier MUST NOT report one of these findings from evidence that establishes another. In particular, it MUST NOT report an effect externally established from an admitted approval, and MUST NOT report an action admitted from an approval that was issued.¶
This document defines no member name, enumeration or wire encoding for the eight. The status member of an action-result record carries succeeded, failed and unknown, as Section 7.3 defines, and those three do not partition the list above. Settled and compensated are stated here because the distinctions are real in the case corpus, and no fixture family in the conformance suite exercises either of them. They are informative in this document for that reason.¶
What this subsection does not establish. It does not add a state machine. It does not require a deployment to record all eight, or to record any of them as a distinct artifact. It does not establish that the eight are exhaustive.¶
Requirement. APS-EVID-STATES-NOT-SYNONYMS, a verifier does not report one of these findings from evidence that establishes another, and in particular reports neither an effect externally established from an admitted approval nor an action admitted from an approval that was issued. Specified, not exercised.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. The feature covers authorized, admitted, dispatch attempted, downstream response observed, effect externally established and unknown. Settled and compensated are informative here, because no family exercises either. Related fixture families: approval-single-use, action-result-binding, cached-authorization-revocation, and the interop record cosai-ws4-149-decision-to-effect in the same suite, which is an interop record and not a fixture family. Implemented requirements: none. Related implementation surfaces: no released package.¶
An action-result record with status unknown says the boundary reached no observation. It does not say the effect failed to occur, and a verifier MUST NOT read it as either outcome.¶
A consumed approval admits no further dispatch. A later attempt MUST obtain a fresh authorization decision and MUST NOT reuse the consumed approval, which Section 7.3 already makes unusable a second time.¶
The rest of this paragraph is informative. A deployment that reaches the same effect by a different call, a different tool or a different path has not continued the first attempt, and the rule above still applies to each attempt on its own, because it is stated on the approval a boundary consumed. This revision defines no identity for an effect, so a verifier cannot establish that two calls reach one effect, and the rule is not stated over an effect identity.¶
Where the action carries a reversibility ceiling at which no compensating action exists, a deployment that retries on an unknown result risks a second effect it cannot undo, and the record of the first attempt does not say whether the first effect occurred. This document states no normative retry rule for that case. No fixture family exercises one, and the deduplication mechanisms deployments use for it, including idempotency keys and at-least-once delivery, resolve to execution behaviour rather than to an authority finding. The case corpus records them as boundary cases for that reason.¶
Compensation is a new record. A compensating or reversing action is separate authority with its own authorization boundary and its own records, and its record refers to the prior action rather than amending it. A later finding about an earlier action, including a finding that the earlier effect did occur, is recorded the same way. A verifier MUST NOT treat a later record as having replaced an earlier one, and both MUST remain independently verifiable. Whether an operation interrupted at an authorization boundary resumes, restarts, compensates or stops is open and is not settled here.¶
What this subsection does not establish. It does not establish that a compensating action exists for any effect, or that a party holds authority to take one. It does not define a record type for compensation. It does not establish what the first effect was. An unknown result stays unknown until evidence outside the record set settles it, and a compensation record does not retroactively settle it.¶
Requirements. APS-ENF-RETRY-NEW-DECISION, a consumed approval admits no further dispatch, and a later attempt obtains a fresh authorization decision and does not reuse the consumed approval. APS-ENF-COMPENSATION-NEW-RECORD, a compensating action carries its own authorization boundary and its own records, a verifier does not treat a later record as having replaced an earlier one, and both remain independently verifiable. Both are specified, not exercised.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: authority-epoch-rollback, conflicting-status-sources, runtime-authority-denial-continuity, approval-single-use, action-result-binding, and the interop record cosai-ws4-149-decision-to-effect in the same suite, which is an interop record and not a fixture family. Implemented requirements: none. Related implementation surfaces: no released package.¶
This subsection is informative. It adds no requirement. It reads four sections of the closed core together and states the single contract they hold between them, because those four sections are where an implementer most often assembles two contracts by mistake.¶
The reservation contract is the core's, and it has four moments. Reserve at approval: Section 5.3 places the reservation against the boundary-held cumulative total at the moment the approval is issued, and Section 5 requires the reservation to succeed against every bounded ancestor in the selected chain before dispatch. Complete at admission: Section 7.3.2 requires the boundary to verify the approval has not expired, atomically consume its receipt_id, recheck time and revocation state, and complete any spend reservation, all at the moment the approval is consumed to admit dispatch. Settle after the result: Section 4.4 moves every ancestor counter from reserved to committed on successful settlement. Release only before dispatch or on trusted evidence that dispatch did not occur, which is the only release Section 4.4 permits.¶
The reservation is keyed by action_ref and its footprint is the action_ref, the unit, the amount and the set of bounded ancestor delegation identifiers. A request presenting a footprint already reserved and not yet settled or cancelled is a retry of the same reservation and the boundary reserves no second amount for it. A request under the same action_ref whose unit, amount or bounded ancestor set differs is conflicting reuse and is rejected.¶
An idempotent reservation lookup is not permission to dispatch again. That is entailed by Section 7.3.2, under which only an approval that has neither expired nor been consumed admits dispatch. Recognising a footprint tells the boundary that it already holds a reservation. It does not tell the boundary that the approval is still unconsumed, and the approval is what admits dispatch. The three identities are separate and stay separate: the reservation footprint, keyed by action_ref, the consumable approval identity, keyed by the policy-decision record's receipt_id, and the agent nonce, which the intent record carries inside the action input object that action_ref commits to and which the boundary refuses when the same agent reuses it inside the deployment's replay window, as Section 5.1 requires. A consumed approval does not become reusable because its reservation is still outstanding.¶
What this leaves open is the recovery contract. Nothing in this revision says what a boundary does after a crash between consumption and dispatch, how two concurrent admissions on one approval resolve beyond the requirement that consumption be atomic, or how an operation resumes without repeating its effect. Section 19.2.12 carries that, and it is the one thing a durable admission record would have to define before it could enter.¶
Requirement identifiers for the four core moments, so that a claim can cite them: APS-ENF-RESERVE-AT-APPROVAL, APS-ENF-COMPLETE-AT-ADMISSION, APS-ENF-SETTLE-AFTER-RESULT, APS-ENF-RELEASE-PRE-DISPATCH-ONLY, and APS-ENF-CONFLICTING-REUSE-REJECTED. All five are requirements of the closed core, restated here and not added here. Appendix D records their coverage.¶
What this subsection does not establish. It does not establish that any released package holds a reservation ledger, and none does, because the enforcement boundary is not a published package. It does not establish that a deployment's ledger is linearizable, which Section 4.4 requires for live spend status to be determinate at all.¶
This subsection is informative and states no requirement. No fixture family in the conformance suite exercises it, which is a fact about the corpus and not the reason.¶
Whether an authority chain is valid and whether the action it authorizes is permitted by rules outside that chain are separate findings. A restriction from outside the chain can block execution with no event anywhere in the chain, and removing the restriction restores execution on the unchanged chain without creating new authority. A verifier that returns one of those findings is not to be read as having answered the other. The reason-code rule of Section 4.6 is what keeps them apart in a record: a restriction from outside the chain does not make the chain invalid, it denies the action.¶
Block and release are not always symmetric. Where what changed is which party holds the resource rather than a restriction on reaching it, no release restores anything, and the case corpus carries that counterexample against any symmetric reading. Where the represented principal itself changes rather than being restricted, this is not the finding that applies.¶
What this subsection does not establish. It does not ask a verifier to decide whether an action is lawful. It does not claim a restriction pauses descendants. It says nothing about whether any legal doctrine applies to an AI agent, and no case behind it is a source of rules for one.¶
This subsection is informative and states no requirement. No fixture family in the conformance suite exercises it, which is a fact about the corpus and not the reason.¶
An authority artifact can be valid, unexpired, unexhausted and under no live restriction while the target, the executor or the capability it names no longer exists. The artifact verdict is unchanged. The execution attempt fails, and the record carries the referent that could not be resolved. A verifier reporting such an artifact invalid, expired, revoked or suspended reports a lifecycle event that did not happen.¶
Unexecutable is an execution outcome and not an artifact verdict. This document proposes no additional verdict for it.¶
What this subsection does not establish. It does not prescribe which party re-points a grant whose referent is gone, or whether that party may. It does not claim the authority is unaffected in the world, since a grant naming a permanently absent executor may well be worth revoking. It claims only that nothing in the grant's own lifecycle has changed. It does not cover a referent that changed rather than vanished.¶
The five examples below are informative. Each carries a state trace with six columns, and each walks one situation through the records this document defines, the lifecycle transition it turns on, the decision, the point at which an approval is consumed to admit dispatch, the result, and what an offline verifier holding only the records can and cannot conclude. Each names the case identifiers in Appendix C that the situation comes from and the fixture families that exercise the shapes involved. Naming a family records that vectors for that shape exist. It does not make any statement in an example a conformance result.¶
The examples use no record shape this document has not already defined. Field names are those of the authority delegation record in Section 4.1 and of the receipt envelope and stages in Section 7.1 and Section 7.3. Verdict and outcome names are those of Section 2.3, and the lifecycle states are those of Section 8. Reason codes are the module strings the reference implementations carry.¶
A principal issues a root authority delegation to a procurement agent. Its scope facet grants commerce:checkout, its spend facet bounds per_action and cumulative in minor units of one currency, its depth facet leaves two hops remaining, and its time facet closes at the end of the quarter. The procurement agent issues a child delegation to a subagent that handles one supplier. The child narrows scope to the one supplier's catalogue, lowers per_action, keeps cumulative at or below the parent, and sets depth remaining to one.¶
The lifecycle transition is issuance, and nothing about the parent changes. The child is a new artifact whose issuance validity rests on the issuer's standing at the moment it was signed. Because the issuer checks the parent's signature and temporal validity before signing, per the issuance obligations in Section 4.6, a child under an expired parent is refused at the issuer rather than left for a later verifier.¶
The subagent then submits one purchase. It emits an action-intent record whose subject_agent is itself, whose delegation_ref is the child delegation, and whose action_ref commits the action input object. The enforcement boundary evaluates the single root-to-leaf chain the subagent presented, issues a policy-decision record with verdict permit, and reserves the amount against the boundary-held cumulative total. At the next authorization boundary, which is the moment that approval is consumed to admit dispatch, the boundary rechecks time and revocation state, atomically consumes the decision's receipt_id, and dispatches. The action-result record carries status succeeded and an effect_ref.¶
Three narrowing failures are what this shape is worth walking. A child that widens scope is no wider than its parent only when every component comparison succeeds, so a widened child yields scope_not_covered and an invalid chain. A child issued past the parent's declared depth is a distinct failure from a scope failure, which is LC-H-008. A subagent that holds a scope and hands it to a process it spawned has not thereby acquired authority to confer it, which is LC-E-006. If the subagent also holds a second chain from an unrelated root, the two are never combined: each action selects one chain, and an amount above the presented chain's own ceiling but below the two ceilings added together is denied, with chain_set_presented_as_one where a caller presents both as one. LC-C-012 is the case that forces this to be a refusal to union rather than a refusal to coordinate.¶
The trace below has six columns, split into two tables keyed by step so that each half fits the page width. Columns one to three are the state before the step, the artifact or event, and the verifier rule that applies. Columns four to six are the new authority state, the next action the state permits, and the evidence available afterwards.¶
| Step | State before | Artifact or event | Verifier rule |
|---|---|---|---|
| 1 | no authority for the subagent | root AuthorityDelegationV1 signed by the principal | issuer standing is fixed at issuance |
| 2 | root valid, two hops remaining | child AuthorityDelegationV1 narrowing scope, per_action and depth | no facet wider than the parent under its component order |
| 3 | chain valid to the leaf | action-intent receipt committing the action reference | intent is a declaration and not an admission |
| 4 | chain valid, no approval | policy-decision receipt, verdict permit, amount reserved | one root-to-leaf chain, no union across chains |
| 5 | approval unconsumed | consumption at the enforcement boundary | recheck time and revocation, consume atomically, complete the reservation |
| 6 | dispatched | action-result receipt, status succeeded, effect reference present | an observed outcome is not an external effect |
| Step | New authority state | Permitted next action | Evidence afterwards |
|---|---|---|---|
| 1 | root valid | issue a child inside the root facets | the signed root |
| 2 | chain valid to the leaf | declare an intent | two signed delegations |
| 3 | unchanged | seek a decision | the intent receipt |
| 4 | approval exists and is unconsumed | present the approval at the boundary | the decision receipt |
| 5 | approval consumed | dispatch the exact bound call | none durable, the approval-state axis stays not established |
| 6 | unchanged, the reservation settles | resolve the effect evidence | the three-record chain |
An offline verifier holding the two delegations, the three receipts and the action input object can conclude that the chain narrows at each hop, that the receipt identifiers and signatures recompute, that the action binding holds because the supplied action input object's agent_id equals the record's subject_agent, and that the decision reference rebuilds from the decision evidence. It cannot conclude that the approval was consumed once, because whether a decision's receipt_id has been consumed is boundary state and not content of the record, so the approval-state axis is not established. It cannot conclude that the cumulative total across the subtree was correct, because the boundary holds that total. It cannot conclude that the purchase reached the supplier, because the action-result record attests to what the boundary observed.¶
Families. lifecycle-subdelegation-edges, 13 cases. lifecycle-conferral-without-authority, 10 vectors. single-chain-selection, 6 cases. chain-selection-no-union, 11 cases. lifecycle-purpose-exhaustion, 21 events, on an unmerged candidate branch. issuance-refusal-expiry, two parts, issuance and verification.¶
What this example does not establish. It does not establish that the subtree total was enforced, that the supplier received anything, or that the deployment's own facets are the seven this document defines. It does not establish that the child was the only child the parent issued.¶
A bookkeeping agent runs under a chain rooted in an organization and issued by an employee acting for an office. Descendants of that chain have work in progress. The employee resigns.¶
The departure is not a revocation. It is an external event, and its effect depends on the authority relationship and the rules that govern it. Two findings stay separate. Whether the grant was validly issued turns on the issuer's standing at issuance and does not change with the departure. What the grant continues to depend on is a separate question about the present. Where the record cannot distinguish the principal, the issuer and the relevant dependency, continuation has not been established, and not established is ignorance rather than a finding that the chain is invalid.¶
Suppose the organization revokes the employee's issuing authority. At the next authorization boundary, the old grant cannot authorize any new effect. Once a verifier establishes the revocation under the freshness rules this document states for chain verification, every chain containing the revoked delegation is invalid with reason revoked, which is Section 8.2.1, whether or not any record names the descendant and whether or not the descendant was ever enumerated. Replacement authority is a fresh grant from a principal who currently holds authority, and the successor's grant covers what the successor issues, not the departing principal's whole tree.¶
What happens to the work already in flight is a different question, and this document does not answer it in general. It answers one part. Effects already completed stand. A decision already consumed to admit dispatch is not undone by a later revocation, and an action-result record issued after the consumed decision's valid_until has passed is not invalid on that ground alone, because execution and observation can complete after the approval is consumed. Whether the operation resumes, restarts, compensates or stops is open, and Section 19.2.2 states why. LC-B-029 supplies one instrument's concrete boundary, a receiving institution's acceptance, after which a mid-flight authority change no longer stops the order. LC-E-013 is the same interval from the agent's side, where invalidation arrives mid-run rather than at the next gateway check.¶
A handover can be ordered differently from a compromise. A planned handover may require the incoming holder's acknowledgment, with authority staying with the outgoing holder until it arrives, which is LC-C-014. A compromised principal may call for revoking first and accepting a gap. In neither case does the old chain remain the basis for continuity.¶
The trace below has six columns, split into two tables keyed by step so that each half fits the page width. Columns one to three are the state before the step, the artifact or event, and the verifier rule that applies. Columns four to six are the new authority state, the next action the state permits, and the evidence available afterwards.¶
| Step | State before | Artifact or event | Verifier rule |
|---|---|---|---|
| 1 | chain valid, issued by the employee for an office | no event | issuance standing does not change with later events |
| 2 | valid | the employee resigns, no APS record exists | a departure is not a revocation |
| 3 | valid | the organization revokes the issuing authority | an established revocation invalidates every chain containing it |
| 4 | invalid | action-result receipt for work admitted before the revocation | execution and observation complete after admission |
| 5 | invalid | a new grant from a principal who currently holds the authority | a successor does not inherit the predecessor tree |
| Step | New authority state | Permitted next action | Evidence afterwards |
|---|---|---|---|
| 1 | valid | act under the chain | the chain |
| 2 | valid, continuation not established where the evidence cannot separate principal, issuer and dependency | act only where continuation is established | none inside APS |
| 3 | invalid | none under this chain | the revocation record and a status observation |
| 4 | invalid, the completed effect stands | none under the old chain | the receipt chain of the earlier action |
| 5 | a separate chain is valid, the old chain stays invalid | act under the replacement chain | the new delegation records |
An offline verifier holding the chain, a revocation record in a format its profile defines, and the receipts can conclude that the chain is invalid from the point it established the revocation, and can conclude from the receipts which actions the boundary recorded before that point. It cannot conclude that the set of descendants processed by a teardown was every descendant at the relevant moment, because that is a completeness claim with a basis this document does not define. It cannot conclude, from an audit window with no records in it, that nothing happened in that window, which is LC-F-027. It cannot conclude when any particular relying party learned of the revocation, because recording a transition and observing it are different events.¶
Families. sponsor-handover, 6 cases. lifecycle-organization-events, 35 cases. lifecycle-principal-events, 32 cases. ancestor-revocation-chain, 4 cases. cached-authorization-revocation, 9 cases. lifecycle-evidence-and-record, 12 cases.¶
What this example does not establish. It does not establish what the in-flight operation should do, it does not establish that the teardown was complete, and it does not establish that any relying party had notice. It states nothing about whether any legal rule about human agents applies here.¶
One grant acquires two causes at once, from two sources. A regulator imposes a suspension. The organization's own compliance function imposes a second, unrelated suspension. The chain itself is untouched and every signature still verifies.¶
The lifecycle transition is suspension, not revocation, which is Section 8.2.8 and Section 8.3.5. Suspension pauses the use of authority and of what depends on it, and it is releasable. Revocation is terminal for the artifact it names. The verdict is suspended, and it names which causes remain rather than collapsing to one flag, because causes compose and each release has to come from a source with standing over that cause.¶
The regulator's release arrives. It is genuine, its signature verifies, and the standing registry places its signer over the cause it releases. That cause clears. The verdict stays suspended, because the compliance suspension still stands, and a release from one source does not reach a cause imposed by another. Two further shapes matter. A release from a source the registry does not place over a cause does nothing to that cause even when the record is genuine. A release from a source that does hold standing over a cause it did not itself impose is effective, because standing is not authorship. LC-B-024 is the case that forces independent release, and LC-B-011 is the case where an externally imposed restriction needs an equally external release trigger.¶
Where only a restriction is left, the verdict is restricted rather than suspended, because authority continues in reduced form under a live constraint that does not pause it. A composition rule that is not satisfied does not make any artifact invalid. It denies the action, with reason composition_not_satisfied, and LC-C-011 is why a concurrence requirement is a gate at the next authorization boundary rather than a second chain to combine with the first.¶
Two timing shapes sit next to this one. A revocation recorded while the grant was suspended still makes the chain invalid after every cause has been released, and an unresolvable revocation answer leaves the chain not established rather than exercisable. A queued action that outlasts a suspension needs a live check when it fires rather than only at the moment it was queued, which is LC-E-034, a reviewed hypothetical whose point is that a scheduler with no view of suspension state can reach the right answer for the wrong reason.¶
The trace below has six columns, split into two tables keyed by step so that each half fits the page width. Columns one to three are the state before the step, the artifact or event, and the verifier rule that applies. Columns four to six are the new authority state, the next action the state permits, and the evidence available afterwards.¶
| Step | State before | Artifact or event | Verifier rule |
|---|---|---|---|
| 1 | chain valid, no causes | no event | chain verification |
| 2 | valid | a suspension cause record from the regulator | causes standing against one artifact are a set |
| 3 | suspended, one cause | a second suspension cause from the compliance function | causes compose and a count does not satisfy the reporting rule |
| 4 | suspended, two causes | a release record from a signer the standing registry places over the first cause | each named cause is decided independently, standing is resolved outside the record |
| 5 | suspended, one cause | the remaining cause is of kind restriction only | a restriction leaves the artifact in force |
| 6 | restricted | a revocation record dated inside the suspension | illustrative deployment outcome, the chain result reported ahead of the pause state |
| Step | New authority state | Permitted next action | Evidence afterwards |
|---|---|---|---|
| 1 | valid | act under the chain | the chain |
| 2 | suspended, one cause named | none | one cause record |
| 3 | suspended, two causes named | none | two cause records |
| 4 | suspended, one cause remaining | none | two causes and one release |
| 5 | restricted | act within the live constraint | the cause set as it stands |
| 6 | invalid | none | the revocation record |
The cell marked illustrative deployment outcome is one deployment's outcome and not a rule of this document. Section 8.3.5 requires a verifier not to report the pause state as if it answered the chain question, and states no order in which the two findings are reported.¶
An offline verifier holding the chain, the two cause records and the one release can conclude that the chain's signatures verify, that two causes attached, and that one release came from a signer the supplied standing registry places over the cause it names. It cannot conclude that no further cause exists, because it can only report on the causes it holds. It cannot conclude a precedence order among causes, because none is defined. It cannot conclude that the grant is exercisable now, because that is a boundary outcome against live state.¶
Families. suspension-cause-composition, 16 cases and 5 gates. lifecycle-legal-regulatory-events, 44 vectors. lifecycle-time-and-scheduling, 61 vectors. lifecycle-multiple-principals-and-conflict, 92 vectors. lifecycle-outside-the-chain-standing, 22 vectors.¶
What this example does not establish. It does not establish a precedence order among causes, it does not establish that the cause set it holds is complete, and it does not establish that any release restored an exercisable state.¶
A settlement adds a requirement that a named official personally certify a defined category of transactions, for the life of the settlement. It touches no existing delegation. LC-B-026 is that shape: a party outside the principal-agent relationship injects a new approval gate into an otherwise unmodified, valid chain.¶
The chain stays valid. A transaction inside the settlement's scope is no longer sufficient on the chain alone. The lifecycle state is restricted rather than suspended, because the added gate does not pause the grant. A gateway that rechecks only the chain keeps authorizing exactly the transactions the settlement was meant to catch, because nothing in the delegation changed.¶
An agent in one organization then submits an action against a target in another. It emits an action-intent record. The enforcement boundary evaluates the chain, the applicable policy version, and the additional evidence its profile requires for that category, and issues a policy-decision record with verdict permit or narrow. That record is the consumable approval. Its receipt_id is the consumable identity, its action_ref is the binding to the exact action, and its valid_until is the bounded lifetime.¶
At the next authorization boundary, the boundary verifies the approval has not expired, atomically consumes its receipt_id, rechecks time and revocation state, and completes the spend reservation. An approval already consumed, expired, or failing that recheck does not admit execution. A deny record is terminal and is never consumed as an approval. Consumption is what makes the admission one-time, and an approval that is still cryptographically valid after consumption does not admit the action a second time.¶
This document specifies the single-use approval bound to an action_ref and the rules under which it is consumed. It does not specify that the approver be a human distinct from the executing agent, it does not specify a designation of such a requirement carried inside delegated authority, and it does not specify preservation of such a designation across narrowing. A deployment that needs those states them in its profile. [WIMSE-XORG] states them as requirements on some mechanism and selects no mechanism.¶
The trace below has six columns, split into two tables keyed by step so that each half fits the page width. Columns one to three are the state before the step, the artifact or event, and the verifier rule that applies. Columns four to six are the new authority state, the next action the state permits, and the evidence available afterwards.¶
| Step | State before | Artifact or event | Verifier rule |
|---|---|---|---|
| 1 | chain valid | an externally imposed certification requirement, touching no delegation | illustrative deployment outcome, a restriction from outside the chain denying the action while the chain stays valid |
| 2 | restricted | action-intent receipt | intent is not admission |
| 3 | restricted | policy-decision receipt, verdict permit, issued after the required evidence resolved | the decision commits to the evaluated authority state, the policy input and the decision context |
| 4 | approval unconsumed | consumption at the enforcement boundary | single use, recheck, complete the reservation |
| 5 | approval consumed | the same approval presented a second time | an already consumed approval admits nothing |
| Step | New authority state | Permitted next action | Evidence afterwards |
|---|---|---|---|
| 1 | restricted | obtain the certification | none inside APS |
| 2 | restricted | seek a decision | the intent receipt |
| 3 | approval exists and is unconsumed | present the approval at the boundary | the decision receipt and the resolved evidence reference |
| 4 | approval consumed | dispatch the exact bound call | none durable |
| 5 | unchanged | obtain a fresh decision | none |
The cell marked illustrative deployment outcome is one deployment's outcome and not a rule of this document. Section 9.9 is informative and states no requirement.¶
An offline verifier holding the intent, decision and result records, the chain and the decision evidence can conclude that the decision commits to the action, the evaluated authority state, the policy input, the decision context and the decision output, because the decision reference rebuilds from those and the record's own action reference. It can conclude that the decision's validity window closed strictly after the receipt was issued. It cannot conclude that the approval was consumed once, or consumed at all, because consumption is boundary state keyed by the approval's receipt_id and the approval-state axis is not established without access to it. It cannot conclude that the named official's certification was genuine unless the evidence reference for it resolves under the rules its artifact_type names, and a verifier that does not resolve evidence reports that axis as not attempted, which is indeterminate.¶
Families. approval-single-use, 9 presentations and a declared defective fail set of 3. arap-binding, 12 denial-binding cases, 10 approval cases and 5 enforcement-point fallback cases, candidates against an unmerged profile. receipt-decision-relation, 7 vectors. lifecycle-policy-change, 13 presentations. lifecycle-legal-regulatory-events, 44 vectors.¶
What this example does not establish. It does not establish that the approval was consumed once, that the approver was a human, that the approver was distinct from the executing agent, or that the two organizations share a trust anchor. It states nothing about whether any legal rule about human agents applies here.¶
An approval is consumed, the boundary dispatches, and the target system returns nothing the boundary can classify. The connection drops after the request was accepted for processing. The boundary observed a dispatch and did not observe an outcome.¶
The action-result record carries status unknown. For unknown, both effect_ref and error_code are null, because the boundary has no effect to digest and no stable failure identifier to name. That is the honest record. Writing status failed would assert a finding the boundary does not hold, and writing succeeded with an invented effect_ref would assert one it cannot ground.¶
The approval is gone. Its receipt_id was atomically consumed at the admission point, so it cannot admit a second dispatch, and no rule in this document restores a consumed approval. A retry is a new action, needing a new intent, a new decision and a new admission, evaluated against current authority and current policy. Whether the operation should be retried at all is not an authority question. It depends on whether the effect is idempotent at the target, and two boundary cases record why that belongs to the target rather than to the delegation layer. LC-E-010 is an idempotency-key retry that returns the original result instead of re-executing. LC-E-011 is a reused key with changed parameters that errors outright rather than silently doing either thing.¶
A valid grant can be unexecutable, which is Section 9.10. Its verdict does not change when its target, its named executor or its named capability no longer resolves, and the unresolvable referent belongs in the record. LC-E-002 is that shape. Unexecutable is an execution outcome and not a verdict on the artifact.¶
The trace below has six columns, split into two tables keyed by step so that each half fits the page width. Columns one to three are the state before the step, the artifact or event, and the verifier rule that applies. Columns four to six are the new authority state, the next action the state permits, and the evidence available afterwards.¶
| Step | State before | Artifact or event | Verifier rule |
|---|---|---|---|
| 1 | approval unconsumed | consumption at the enforcement boundary | single use, recheck, complete the reservation |
| 2 | approval consumed | the call is handed to the effect adapter | holding the input does not establish that dispatch was attempted |
| 3 | dispatched | action-result receipt, status unknown, effect reference and error code null | unknown is an outcome and not the absence of one |
| 4 | unknown result held | no event | a reservation is released only before dispatch or on trusted evidence that dispatch did not occur |
| 5 | unknown result held | a new action-intent receipt for the same effect | a further attempt is a new action needing a fresh authorization decision |
| 6 | unknown result held | separately resolved evidence about the target system | an external effect is never inferred from the result record |
| Step | New authority state | Permitted next action | Evidence afterwards |
|---|---|---|---|
| 1 | approval consumed | dispatch the exact bound call | none durable |
| 2 | unchanged | wait for a result | none until a result |
| 3 | unchanged | none follows automatically | the three records |
| 4 | the reservation stays outstanding | obtain settlement evidence | boundary ledger state only |
| 5 | unchanged | a fresh decision if policy admits one | the new intent receipt |
| 6 | unchanged, the external-effect axis moves for the claim the evidence supports | settle or compensate | the resolved evidence |
An offline verifier holding the three receipts can conclude that the result commits to the decision the boundary consumed, because the result's decision reference equals that decision's and Section 7.6 step 8 recomputes it. Predecessor continuity is not established. Each record's prev names its predecessor, and neither Section 7.3.3 nor Section 7.6 step 9 requires a verifier to resolve prev or to report a failure where it does not match, which Section 19.2.16 records as held. It can conclude that the boundary recorded an unknown outcome at a stated time. It cannot conclude whether the external effect occurred, because status unknown records the absence of an observation rather than the absence of an effect, and these are not the same. It cannot conclude that the effect did not occur. It cannot conclude what the grant was used for over its whole valid window from the fact that the grant is valid, which is LC-D-025. It cannot read an empty window in an evidence store as proof that nothing happened in it, which is LC-F-027. Resolving the outcome needs separately resolved evidence about the external system, and until that resolves the outcome stays not established with the missing source named, as Section 9.5 states.¶
Families. action-result-binding, 6 cases. receipt-decision-relation, 7 vectors. runtime-authority-denial-continuity, 9 cases. lifecycle-evidence-and-record, 12 cases. lifecycle-infrastructure-failure, 30 cases.¶
What this example does not establish. It does not establish whether the effect occurred, it does not establish that a retry is safe, and it does not establish that the boundary's own observation was complete.¶
This section is informative. Where a rule it describes is normative, the rule is stated in the section this text cites, and naming a fixture family sets the normative status of nothing. It describes how an organization's own authority structures reach the delegation layer this document specifies. It does not specify wire formats, lifecycle or semantics for those structures. A profile has to define each projection and each containment check before monotonic narrowing can be checked across an institutional structure.¶
Six objects, each constraining the next.¶
A charter is the instrument that bounds what an organization may authorize. An office is a named position that carries standing authority under a charter. A holder is the party occupying an office over a stated window. A root authority basis is what a verifier accepts as the head of a chain for one action. It takes one of three forms: an APS root delegation whose parent identifier is null, authority imported from outside APS under an importing profile, or a trust anchor the verifier's own policy accepts. Under an institutional model the first form is the ordinary one, issued under an office's authority, and it is where the delegation layer begins. Accepting a basis does not establish which principal the authority represents, which is a separate and currently unanswered question at Section 19.2.10. This document defines no object for the step from a principal to a first authority, and nothing in this section depends on one. A delegation is one narrowing hop. An action is what an enforcement boundary decides.¶
The holder is not the office and the office is not the charter. Three findings that an implementation will be tempted to merge stay apart. Whether a party currently holds an office. Whether the office carries the authority the grant claims. Whether the charter permits the office to carry it.¶
An institutional layer reaches the delegation layer by projecting its authority into the faceted authority vector of Section 4.1 and applying the component orders at each layer. A charter constrains offices, an office constrains delegations, and a delegation constrains actions. Authority decreases at each transfer point and never increases.¶
A projection is lossy where the institutional layer carries a dimension the vector has no facet for. A profile states what it dropped rather than widening a facet to absorb it, and an unprojectable dimension makes the projection unsupported rather than silently absent. A profile that invents a facet value the institutional instrument does not supply has widened authority at the projection, which is the failure this subsection names.¶
This subsection is informative and states no requirement. No family in this suite exercises the projection itself, which is a fact about the corpus and not the reason. The component orders and the containment check a projection would have to satisfy are already specified in Section 4.6, and no released package projects an institutional instrument into the authority vector.¶
A holder leaving an office is an external event. It is not a revocation, and it does not by itself remove a dependency, re-parent authority or create replacement authority. Whether a grant issued under an office survives the departure of the individual who signed it is a question the governing authority model answers. Models differ, and this document does not choose between them.¶
Where the delegation is bound to an office, turnover moves it and the new occupant exercises it with nothing reissued. Where it is bound to an identity, turnover does not move it and the new occupant needs a fresh chain. Where the terms declare neither and the actor is not the named subject, the binding mode is not established and a verifier does not supply a default in either direction.¶
A successor does not inherit the predecessor's delegation tree. The successor's grant covers what the successor issues, and a descendant whose ancestor artifact was revoked stays invalid until a party with current authority reissues it. A departure is not a revocation, and where the delegation is bound to the office the turnover moves it with nothing reissued. This is the rule an implementation gets wrong most often, because inheriting the tree is the behaviour that keeps an organization running and it is the behaviour that silently restores revoked authority.¶
Informative. This subsection states no requirement, so it carries no status block and no requirement identifier. Related families: lifecycle-root-authority-succession, lifecycle-principal-events, lifecycle-organization-events, lifecycle-fiduciary-succession. Related implementation: chain verification in agent-passport-system 7.2.0 (TypeScript) and agent-passport-system 4.2.0 (Python). Office-holder records, vacancy records and binding mode are no released package.¶
A handover replaces the party responsible for an agent while the agent keeps its identity. The agent continues. Its old authority does not survive revocation of the ancestor it depended on, and the replacement chain stands on its own because it was independently issued. A handover may require the incoming holder's acknowledgment, with authority staying with the outgoing holder until that acknowledgment arrives, rather than an instant at which one party's authority ends and another's begins.¶
Ordering is a deployment choice. A planned handover may accept a short overlap. A compromised holder may call for revoking first and accepting a gap. In both cases the old chain must not remain the basis for continuity, and at the next authorization boundary after revocation the old grant authorizes no new effect.¶
Informative. This subsection states no requirement, so it carries no status block and no requirement identifier. Related families: sponsor-handover, lifecycle-organization-events. Related implementation: chain verification in agent-passport-system 7.2.0 (TypeScript) and agent-passport-system 4.2.0 (Python). Acknowledgment-gated handover is no released package.¶
A party outside the principal-agent relationship can hold standing to replace authority it never issued. A body appointed over the principal, a neutral forum holding a disputed root, or a collective body acting under its own composition rule are three shapes of this. Such a party issues a replacement grant on terms it supplies. It does not revive the terminated grant and it does not re-parent the old chain, so the replacement is new authority with its own scope and its own record. In this revision such a party ends the dependent authority by revoking its own ancestor grant where it holds one, or through a suspension cause under Section 8.3.5. Section 4.5 names only the issuer for a direct revocation, and direct revocation by a party other than the issuer is open at Section 19.2.15.¶
A collective body's own composition is a precondition for the validity of what it issued. Without the declared composition there is no body action to evaluate, which is a different finding from a defective but real action.¶
Where a root is disputed and held by a neutral forum, its state is neither valid nor invalid. A verifier reports not established and does not pick a claimant.¶
Informative. This subsection states no requirement, so it carries no status block and no requirement identifier. Related families: lifecycle-outside-the-chain-standing, lifecycle-fiduciary-succession. No released package resolves standing held from outside the chain.¶
Informative. Replacing the trust root an organization's chains descend from changes which issuers a verifier accepts, which is a change to verifier trust policy rather than a lifecycle event on any artifact. A verifier can stop trusting an issuer with nothing revoked anywhere. No artifact changes and no revocation occurs. A verifier that no longer accepts the old root returns the result Section 4.3 gives for a root a trust policy does not accept, which is invalid with a root-trust reason at the root's index. That is one verifier's finding under its own policy at one moment, and a verifier that still accepts the root returns valid on the same bytes. Those are two different statements and a record must not merge them.¶
No family in this suite exercises re-rooting, and no released package implements it, so this document states no rule for it. A deployment that re-roots has to decide, and record, whether artifacts under the old root are reissued, carried by a cross-signature, or left to expire.¶
It specifies no institutional wire format, no charter record, no office record and no holder registry. It does not say who publishes an office-holder registry or how a verifier comes to accept one. It does not resolve office vacancy, and it does not bound what an outgoing holder may sign before leaving. It makes no claim that a doctrine of human agency law, corporate law or fiduciary law applies to an AI agent. Those bodies of material are a source of case shapes for the questions above and nothing more. Where a case in this document derives from such material, it is a source of the question, never a source of the rule.¶
APS specifies a binding to MCP [MCP]. For this binding, an enforcement gateway mediates the privileged actions selected by deployment policy. A privileged action is any action the policy chain (Section 5) is configured to evaluate, including any action whose required scope is non-empty under the Scope rules of Section 4.2. In an APS-mediated MCP deployment, privileged actions covered by APS policy MUST pass through the gateway, which validates the delegation chain, evaluates the policy chain, and generates signed receipts. In deployments where the gateway is the exclusive holder of the target API credentials, the agent cannot bypass the gateway for those privileged actions; this exclusivity is a deployment precondition of the kind Section 15 describes, not an unconditional property of the binding.¶
This document does not specify an A2A binding. Section 11.3 specifies a binding for OAuth identity-assertion authorization grants. Other protocol bindings are not specified here.¶
Deployments in which an agent's authority originates from an enterprise authorization system need the delegation chain to begin from that system's grant rather than from an APS-native passport. This section specifies the binding for an OAuth identity-assertion authorization grant [OAUTH-ID-JAG], pinned to an identified draft version of that specification.¶
The binding is verifier-first: the importing party verifies the external grant by that specification's own rules before any APS structure is built, and APS records the verification rather than performing it. The record of verification is a caller-signed attestation, an accountability artifact naming the grant reference and the verification time under the importing party's own key, so that the party on the hook for the verification is identifiable. The binding does not re-verify the grant, and a binding result is never collapsed to a single safe-for-execution boolean; it reports what was projected and under what basis.¶
Two anchors are kept separate and MUST NOT be merged. The source grant reference is a digest over a committed preimage of the grant's provenance fields, its issuer, subject, grant identity, client, and audience, and never covers scope, spend, chain content, or receipt content. The delegation chain root is the canonical content digest over the APS-signed hops built under the imported grant. The first identifies where authority came from; the second identifies what was built under it; conflating them makes chain content unrecomputable from the records.¶
Scope projection from the external grant into the APS Scope dimension is lossy, and the binding preserves the grant's authorization details verbatim alongside the projection rather than pretending the projection is complete. A spend dimension MUST NOT be invented at import: because AuthorityDelegationV1 requires all seven facets, an external grant that carries no spend semantics cannot be projected into a conforming chain root unless an importing profile supplies an explicit spend basis accepted by verifier policy; otherwise the projection is unsupported. The grant's audience is carried in the binding but not enforced by it; the relying party at the point of use MUST reject an audience mismatch.¶
An adapter carries APS authority into another protocol's request, or carries another protocol's authority into an APS chain. Five things can fail to survive that trip: the principal on whose behalf the action is taken, the exact action, the authority epoch the decision was made in, the purpose bound the grant carries, and the evidence the grant requires before the action is admitted. This section states what an adapter must do about a dimension that has no carrier on the far side, and then records, per target protocol, which dimensions survive and which do not.¶
The general shape of the failure is silent widening. An adapter that drops a dimension and emits a request the far side reads as unconstrained has produced authority the APS side never granted. Recording the loss is what keeps it visible.¶
Every binding below fills one loss model, and the model has six values. Preserved exactly, the target representation carries the semantic with no change. Transformed with equivalent semantics, the representation differs and the set of actions admitted does not. Narrowed, the target representation admits a strict subset of what the APS side admits. Omitted and irrelevant to the operation, the semantic has no carrier and the adapter has established that the operation does not depend on it. Not representable, the semantic has no carrier and the operation does depend on it. Externally resolved, the semantic crosses as a reference and the far side resolves it under rules this document does not state.¶
Loss of a semantic required by the target operation or by the applicable profile prevents a valid result. Explicit narrowing may remain valid where the target representation preserves the narrowed semantics. Omission of a semantic established as irrelevant to the operation does not by itself prevent validity. A profile states, for each APS semantic, which of the six values applies to it, as Section 6.1 requires.¶
An adapter MUST NOT produce a target-side authority that admits an action the APS authority it was built from does not admit.¶
Where an APS dimension has no carrier in the target representation, the adapter MUST record that dimension as unsupported, and MUST NOT emit a value that a target-side evaluator reads as the dimension being satisfied. An unsupported dimension and a satisfied dimension are different findings and a verifier reports them differently.¶
An attribute carried across by any transcription scheme satisfies a target-side predicate only when the target-side authority independently permits the action. Transcribing an attribute never supplies a scope, an audience or an actor the target-side authority does not have.¶
Where the adapter re-expresses the action in the target's own terms, the action reference MUST be recomputed from the adapter's own payload rather than copied from the source record, and a mismatch MUST fail closed.¶
Where an adapter carries a commitment that names a stage of a pipeline, a commitment made at one stage MUST NOT satisfy a check at another stage, and a stage name outside the closed set MUST fail rather than default to any member of the set.¶
An adapter that maps an APS record into another stack's signed envelope MUST state the canonicalization it applies, and MUST NOT assume byte agreement with another implementation of the same canonicalization rule. Agreement on the rule and agreement on the bytes are separate facts.¶
This subsection does not establish that any released adapter satisfies these rules across its whole surface, and it does not establish a complete list of dimensions. It names five dimensions that the corpus behind this document repeatedly showed being lost.¶
Requirements. APS-ADAPT-NO-WIDENING, an adapter produces no target-side authority that admits an action the APS authority it was built from does not admit. APS-ADAPT-NO-SILENT-SEMANTIC-LOSS, a dimension with no carrier in the target representation is recorded as unsupported and no value is emitted that a target-side evaluator reads as the dimension being satisfied. APS-ADAPT-RECOMPUTE-ACTION-REF, where the adapter re-expresses the action, the action reference is recomputed from the adapter's own payload rather than copied, and a mismatch fails closed. APS-ADAPT-STAGE-COMMITMENT, a commitment made at one stage does not satisfy a check at another, and a stage name outside the closed set fails rather than defaulting. APS-ADAPT-CANONICALIZATION-STATED, an adapter states the canonicalization it applies and does not assume byte agreement with another implementation of the same rule. APS-ADAPT-STAGE-COMMITMENT is exercised by k8s-receipt-admission-stage-negatives, whose five candidate vectors reject a cross-stage digest, a mismatched stage kind and an unknown stage name. The other four are specified, not exercised.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: cross-stack, 11 sub-families at the pinned commit. actionref-canonical, 6 vectors. k8s-receipt-admission-stage-negatives, 5 vectors. canonical-bytes, 10 vectors. Exercised requirements: APS-ADAPT-STAGE-COMMITMENT. Implemented requirements: APS-ADAPT-RECOMPUTE-ACTION-REF. Related implementation surfaces: agent-passport-system 7.2.0 (npm) for the adapter surfaces, and agent-passport-system 4.2.0 (PyPI) for the action reference forms only.¶
MCP [MCP] carries a tool name and an arguments object.
The exact action survives, because a name and an arguments object are
enough to recompute an action reference over the adapter's own payload.
Nothing else on this list has a carrier defined by the base protocol. The
principal, the authority epoch, the purpose bound and the required
evidence are unsupported unless a profile assigns them keys in the
_meta object, which the specification describes as the general
extension point: "The _meta property/parameter is used by MCP to
allow clients and servers to attach additional metadata to their
interactions."¶
An adapter that assigns _meta keys carries a further
obligation that is described in Section 11.6: the component that checks the
request and the component that runs it may not receive the same bytes.¶
The requirement that privileged actions pass through the boundary, stated in Section 11.1, has no fixture in the conformance suite. The suite's coverage inventory records it as not exercised, since no vector asserts which actions were routed through a boundary. It is restated here as a deployment precondition and not as an exercised requirement.¶
Loss model. Exact action: preserved exactly, because the tool name and the arguments object are enough to recompute an action reference over the adapter's own payload. Principal, authority epoch, purpose bound and required evidence: not representable in the base protocol, and preserved only where a profile assigns them keys in the extension object, in which case they are externally resolved by whatever holds that profile.¶
This subsection does not establish that a profile assigning
_meta keys is interoperable with any other profile doing the
same, and it does not establish that an MCP server honours a governance
key it does not recognise.¶
Requirement. APS-ADAPT-MCP-EXTENSION-DECLARED, an adapter that assigns extension-object keys for APS material states which keys it uses and does not rely on a server honouring a key it does not recognise. Specified, not exercised.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: cross-stack (mcp-audit-gateway-v0.6). actionref-canonical, 6 vectors. Implemented requirements: none. Related implementation surfaces: agent-passport-system 7.2.0 (npm).¶
This document specifies no A2A [A2A] binding. An Agent Card describes an agent and its skills. It is not an authority record and it names no action, so none of the five dimensions crosses at the card layer. An adapter that derives APS scope strings from card skills is deriving a vocabulary and not importing authority. Signing a card establishes who published the description, which is a narrower fact than it looks. Section 11.5 records what reproducing that signature across two implementations showed.¶
Loss model. Not applicable. An Agent Card is not an authority record and names no action, so none of the five dimensions has a source value to carry and no cell of the model can be filled.¶
This subsection is informative. It does not establish that a signed Agent Card conveys any authority, and it does not establish that skills declared on a card correspond to actions the agent is authorized to take.¶
The OAuth identity-assertion grant binding of this document imports a caller-verified grant. Of the five dimensions, the principal survives as the grant's subject. The exact action does not cross: the grant is about access to an audience and a set of scopes, not about one call with its arguments, so the exact action is constructed on the APS side after import and is never imported.¶
The acting party is indeterminate rather than unsupported, which is a distinction worth keeping. [OAUTH-ID-JAG] carries an actor token parameter and then declines to say what it means: "This specification does not define normative processing requirements for actor_token or whether an act claim is included in the issued ID-JAG." An importer therefore cannot read an actor claim as establishing who acted. The reference implementation reconciles the claim against the chain leaf literally and marks the result advisory rather than authoritative, which is the correct handling of a field whose processing the source specification leaves open.¶
The authority epoch, the purpose bound and any required-evidence condition have no carrier in the grant and are unsupported on import. The spend dimension is the case where the rule is already stated normatively elsewhere in this document: a spend basis MUST NOT be invented at import, and an external grant carrying no spend semantics yields an unsupported projection unless an importing profile supplies an explicit basis that verifier policy accepts. Scope projection is lossy, so the binding keeps the grant's authorization details verbatim beside the projection.¶
The audience is the one dimension that crosses and then has to be
enforced somewhere else. It is carried in the binding and not enforced by
it, and the relying party at the point of use rejects a mismatch. The
conformance corpus exercises that rule, and it exercises it on a
different object: the vectors are an RFC 8693 [RFC8693]
token exchange, where an evaluation of the exchanged token denies with
the family's audience_mismatch reason at the point of use. No
fixture in the corpus carries an identity-assertion grant. The rule is
exercised, the object is not, and the status block below says so.¶
The same family pins the attenuation property that the general rules above state abstractly. A widening exchange is an invalid vector that a runner must refuse to evaluate rather than a case with a deny answer, an evaluation of the exchanged token reads only claims present on it, and an attribute transcribed from the subject token satisfies a predicate only where the exchanged token's own scope, audience and actor conditions independently permit the action.¶
Loss model. Principal: preserved exactly, as the grant's subject. Audience: preserved exactly in the binding and enforced externally at the point of use. Exact action: not representable, and constructed on the APS side after import rather than imported. Acting party: externally resolved, and the source specification declines to say what its actor token means, so an importer reads no actor claim as establishing who acted. Authority epoch, purpose bound and required evidence: not representable. Spend: not representable, and a spend basis is never invented at import, so the projection is unsupported unless an importing profile supplies an explicit basis that verifier policy accepts.¶
This subsection does not establish that an identity-assertion grant has been imported by any tested implementation, and it does not establish that the separation of the source grant reference from the delegation chain root has a fixture. The suite's coverage inventory records that separation as not exercised.¶
Requirement. APS-ADAPT-NO-INVENTED-SPEND-BASIS, a spend basis is not invented at import, and an external grant carrying no spend semantics yields an unsupported projection unless an importing profile supplies an explicit basis that verifier policy accepts. This restates a requirement of Section 11.3 and adds nothing to it. Specified, not exercised: the suite's coverage inventory records the corresponding requirement as partial and its vectors are an RFC 8693 token exchange rather than an identity-assertion grant.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Its one requirement identifier is an exception: APS-ADAPT-NO-INVENTED-SPEND-BASIS restates a requirement of Section 11.3 in the closed core, and Appendix D carries it as a Core restatement rather than as part of this feature. Related fixture families: cross-stack (token-exchange-attenuation-v0), 12 cases, on an RFC 8693 token exchange rather than on an identity-assertion grant. Implemented requirements: APS-ADAPT-NO-INVENTED-SPEND-BASIS. Related implementation surfaces: agent-passport-system 7.2.0 (npm).¶
Loss model. Verdict: narrowed to the point of loss in the outward direction, because a three-valued verdict collapses onto a boolean and collapsing narrow to true widens the decision. Constraints, effective authority reference, expiry and single-use semantics: not representable in the decision object. Inward, a decision obtained through that API is an input to admission and not an APS policy-decision record.¶
This subsection is informative. No fixture family in the conformance corpus exercises a mapping to or from the Authorization API, so nothing here is stated as a requirement.¶
The direction that matters is inward, and it is narrow. An Authorization
API decision [AUTHZEN] is a boolean with optional context:
"Decision is an object that contains a REQUIRED decision key with
a boolean value, and an OPTIONAL context key with an
object value." An APS policy-decision record is not that shape. It carries
a three-valued verdict, the constraints a narrow verdict imposes, a
reference to the exact effective authority admitted, an expiry, and
single-use semantics at the next authorization boundary. None of those
four has a defined carrier in the decision object, so a decision obtained
through that API is an input to admission and not an APS
policy-decision record. Treating it as one would supply an approval with
no expiry, no binding to an exact action, and no consumption point.¶
Outward, an APS verdict maps onto the boolean with loss. A narrow verdict and its constraints have nowhere to go, and collapsing narrow to true widens the decision.¶
This subsection does not establish that any implementation performs this mapping, and it does not establish what a profile that assigned the missing fields to the optional context object would have to specify.¶
Loss model. Not applicable in either direction. There is no credential format on the far side of this adapter, so no APS semantic has a carrier to be measured against and no cell of the model can be filled.¶
This subsection is informative. No fixture family exercises a mapping to a WIMSE credential format, and there is a plain reason for that: [WIMSE-XORG] is a problem statement, and it says so in its own abstract, "It does not specify a solution." There is no credential format on the far side of this adapter yet, so there is nothing to map into and no requirement to state.¶
What that document does carry is a requirement list, and one of its requirements is the admission rule this document arrives at from the evidence side. It requires evidence "bound to the specific action, including its arguments, its target resource, and the on-behalf-of principal", relied on at most once, and it requires that an unrecognized designation be treated as unauthorized: "A relying party that does not recognize a designation MUST treat the designated action as unauthorized." The convergence is worth recording. It is not adoption and it is not a claim that either document influenced the other.¶
This subsection does not establish that APS satisfies any requirement in that list, and it does not establish that a future credential format in that space will carry any of the five dimensions.¶
Loss model. All five dimensions: preserved exactly, because the record travels whole rather than being re-expressed. Signer authority: externally resolved, and registration establishes nothing about it.¶
This subsection is informative. No fixture family exercises carriage of an APS record as a signed statement to a transparency service, so nothing here is stated as a requirement.¶
Carriage preserves all five dimensions, because the record travels whole rather than being re-expressed. What carriage adds is inclusion evidence, and what it does not add is anything about the signer's authority to make the statement. [RFC9943] states the limit directly: "Issuers can make false Statements either intentionally or unintentionally; registering a Statement only proves it was produced by an Issuer."¶
That maps exactly onto the separation this document already keeps between cryptographic integrity, signer authority and external truth. A receipt from a transparency service raises confidence that a record was registered and has not been altered since. It moves nothing on the authority question. An adapter that presents a transparency receipt as evidence of authority has crossed the two axes.¶
This subsection does not establish that any APS record has been registered with a transparency service, and it does not establish a mapping from the APS receipt envelope described in Section 7.1 into a COSE signed statement.¶
This section is informative. It records a cross-implementation failure class that two independent signing implementations of the same specification reached, and what the canonicalization vectors in the conformance corpus do and do not cover against it.¶
The failure class sits above the canonicalization algorithm. Two implementations can both apply [RFC8785] correctly, byte for byte, and still fail to check each other's signatures, because one of them removed a field the other signed. Canonicalization pins the bytes for a given document. It says nothing about which document you had.¶
The A2A specification requires a card to be canonicalized under [RFC8785] before signing, and it states a field-presence rule that
runs first. Fetched from the specification repository on 2026-09-24 at
commit 43e0c874d3baba68ed84b98678d7f2268438e69f, section 8.4.1:
"Fields marked with REQUIRED MUST always be present, even if the
field value matches the default."¶
Two implementations of that rule diverge in opposite directions, and
each divergence originates in its own language's object-to-JSON mapping
rather than in its canonicalizer. Reproduced locally on 2026-09-23 against
a2a-go pull request 441 at commit
bb750f5c7913b967d8dcbe3d24537a8a84dd1a61 and a2a-python at commit
f3ac82489dd84ce9dcd3802357cb4e987ffdbb74, using only each
implementation's own public construction, serialization and signing
interfaces and one shared Ed25519 key. Six single-field cases were built
on an otherwise identical card. Of the six, three failed one direction:
an explicitly empty description, an explicitly empty skills list, and an
explicitly empty tags list on the first skill. In each of the three the Go
side kept the field in the bytes it signed and the Python side rebuilt the
card from those bytes for verification, dropping the field again, and
verified a different payload than the one that was signed. The card was
never altered in transit. The reverse direction passed on all six, and the
control case with no empty or default values produced byte-identical
canonical payloads on both sides.¶
The pull request was open at the time of that run. Fetched on 2026-09-24, it is merged, and the maintainer's response to the report reads the same way this document does about where the divergence sits: "This is unfortunate, but python behaviour is not spec-compliant here."¶
A report of the Python side of the divergence was filed by this document's author as issue 1278 on the a2a-python repository. Fetched on 2026-09-24, it is open, and its title names the class: "Signing/verification canonicalization drops REQUIRED fields at their default value, breaks cross-SDK Agent Card signature verification." The later merge and the earlier reproduction are separate records. The merge does not rewrite what was observed at the earlier commits.¶
This subsection does not establish that either implementation is defective in general, that the divergence affects deployments in practice, or that the merged state of the Go pull request changes the Python side. It records six cases at three named commits.¶
The canonical-bytes family pins the byte contract of [RFC8785] across implementations. Ten vectors, each naming the rule it exercises, cover the places a canonicalizer diverges without meaning to: the decimal-to-exponential threshold and how the exponent is spelled, negative zero, integers above the exactly-representable range and above signed 64-bit range, key ordering by UTF-16 code unit rather than code point, keys used exactly as given without Unicode normalization, and recursive sorting with array order preserved. The family runs the same ten vectors through four canonicalizers in four languages and publishes where the bytes and the digests agree or differ. A result there is a byte diff on ten cases and not a verdict on any implementation.¶
Running those ten vectors through the Go implementation's canonicalization entry points on 2026-09-23 produced ten matches under both decode paths, twenty comparisons in total. The same run against the A2A project's own canonicalization corpus separated two further findings that are worth keeping apart from the field-presence class: three of the eight scorable must-reject vectors were rejected, and five unpaired surrogate vectors were not, because the decoder substitutes the replacement character rather than refusing. That is a decode-layer finding, upstream of canonicalization.¶
The actionref-canonical family covers the adjacent APS-native property, where the action reference is a digest over the canonicalization of a fixed four-field tuple with each scope normalized to NFC and the scope array sorted by code point. Its vectors include the case where code-point order and code-unit order disagree, and two negatives on duplicate scopes, one raw and one that collides only after normalization.¶
Neither family covers the failure class above. Both take a document and pin its bytes. Whether a field was in the document is decided before either family's first vector runs, and no vector in either family asserts field presence against a schema's required-field rule. Stating that gap is the point of this subsection.¶
This subsection does not establish that a passing canonical-bytes run means two implementations will verify each other's signatures.¶
This section is informative. It records one seam that an adapter carrying APS material through a third-party MCP gateway has to account for, and it is the concrete case behind the obligation named in Section 11.4.2.¶
An MCP-aware gateway can call out to an external processor before
forwarding a call, so that the processor can allow, deny or rewrite it. In
one such interface, fetched on 2026-09-24 at commit
25702c3b561a0bc2130da75427e3debbd5b13918, the field carrying the
call to the processor is described as "JSON-RPC params as raw JSON
bytes; absent when the method has none", and the rewrite result is described
as replacing those same params, with the note that "The gateway does not
re-run other RBAC on the mutated request."¶
The seam is that the bytes the processor sees and the bytes the tool sees
are not the same bytes. A local reproduction on 2026-09-23, against that
same commit with a stub processor and a hand-written upstream server that
logs its raw input, sent one tool call whose params carried a
_meta member. The three captured surfaces are below, verbatim from
that run. A backslash at the end of a line is a continuation inserted here
to fit the page width and is not part of the captured bytes. First, the
client's exact request body:¶
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":\
{"name":"echo","arguments":{"x":1},"_meta":{"probe":1}}}
¶
what the external processor received as the call under check:¶
{"name":"echo","arguments":{"x":1}}
¶
and what the upstream server received on its own input:¶
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":\
{"_meta":{"probe":1},"name":"echo","arguments":{"x":1}}}
¶
The _meta member reached the tool and did not reach the check.
For an adapter that carries a passport reference, a delegation reference or
an approval reference in _meta, that is the whole problem: the
component asked to decide cannot see the material the decision depends on,
and the component that runs the call can. An adapter in this position
either carries its material where the processor can see it, or treats the
processor as unable to decide and denies rather than defaulting.¶
The interface also rewrites. A processor that replaces the params has changed the exact action, and the gateway does not re-run its other access checks on the replacement. An adapter that recomputes the action reference after a rewrite gets a different value than one computed before it, which is the general recomputation rule in Section 11.4.1 applied to a specific seam.¶
This section does not establish that this behaviour holds at any other
commit of that gateway, that other MCP gateways behave the same way, or that
the behaviour is a defect. It records what one pinned build did with one
call on one date. It also does not establish what a profile assigning
_meta keys for APS material should do about it, which stays open.¶
This section is informative. It describes one arrangement of an enforcement boundary that runs the checks this document specifies, taken from the open-source Agent Passport Gateway. It is a description, not a conformance target. An implementation that arranges these functions differently is not for that reason non-conforming, and nothing in this section adds a requirement to the ones stated elsewhere in this document. Deployment topology, network interfaces and operator configuration are out of scope here.¶
This section does not establish that any deployment is arranged this way, that the described arrangement is safe, or that the reference implementation is free of defects.¶
In this arrangement the boundary both decides and performs. The acting agent sends a signed request naming a tool and its arguments. The boundary evaluates the request, calls the target itself, and writes the record of what happened. The agent never constructs that record. The reference implementation states the reason in its own source: without the boundary holding execution, the library is optional and the agent can route around it.¶
A policy decision point may be a separate service. Only the
enforcement boundary admits an action to dispatch. Where a decision point
is separate, it computes the decision and the boundary is the issuer of
the aps:policy-decision:v1 record that carries it, as
Section 7.3.2 requires. Approval consumption, the
reservation, dispatch and the external effect are four steps and are not
one atomic transaction in this revision. A verdict arriving from a separate decision point is an input to
admission, in the same class as a revocation answer or a freshness answer,
and it is not itself admission. The Authorization API [AUTHZEN] draws the same line from the other side, placing the
decision point's internals outside its own scope: "The policy language,
architecture, and state management aspects of a PDP are beyond the scope
of this specification." Its response object is correspondingly thin: "Decision
is an object that contains a REQUIRED decision key with a
boolean value, and an OPTIONAL context key with an object
value."¶
The arrangement assumes there is no alternate privileged credential path to the same target. If the target accepts a credential the agent holds directly, the boundary governs one path and the other path is ungoverned. The MCP binding in this document already states that exclusivity as a deployment precondition rather than a property of the binding. The assumption is load bearing and it is worth naming plainly: an APS record establishes that a governed path was valid, and it does not establish that no ungoverned path existed. A verifier that cannot establish that the boundary implements the grant's declared scope reports the wider reachable scope or reports that the narrower scope is not established.¶
This subsection does not establish that the boundary is the only path to the target, and it does not establish that a separate decision point and the boundary evaluated the same inputs.¶
The boundary checks before the effect, not only before the approval. In the reference implementation the order at the next authorization boundary after an approval is: confirm the approval is unconsumed and unexpired, confirm the agent and the delegation still exist, recheck revocation and status against current state rather than the state read at approval time, recheck the governance version the approval was granted under, recheck any cross-context permit that the approval relied on, recheck the authority tier against the current reputation state, mark the approval consumed, and only then call the target.¶
Consumption is atomic against concurrency and not only against sequence. The reference implementation serialises execution per agent and re-tests the consumed flag inside the serialised section, because the test that runs before the lock lets two concurrent calls on the same approval both pass it and both reach the tool.¶
Where a budget must be held rather than spent, the boundary reserves. A hold is checked against the delegation's limit less the sum of live holds before it is granted, and it is released on fulfilment or on expiry. Where the budget is spent at admission instead, the reference implementation increments the used amount inside the same transaction that records the permit, so a permit and its charge cannot come apart.¶
Settlement comes after the result. Settlement records are assembled from recorded contributions over a closed period. They are not produced at admission and they are not an input to it.¶
The cross-organizational delegation requirements in [WIMSE-XORG] state the same ordering as a requirement on any solution in that space: "Consumption of the reliance unit occurs only upon admission: evaluation, exact-action matching, and refusal at any stage MUST NOT consume it".¶
Two things are worth separating here, because the ordering above is one implementation's and the obligation is this document's. The protocol requirement is the one stated at Section 7.3.2 and Section 5.3: at the moment the approval is consumed to admit dispatch, the boundary verifies the approval has not expired, atomically consumes its identity, rechecks time and revocation state, and completes any spend reservation. This document requires no particular order among the other checks the reference implementation runs, and it requires none of them. It also does not make consumption, reservation, dispatch and the external effect one atomic transaction, and Section 9.8 states what that leaves to a deployment.¶
This subsection does not establish that a reservation released on failure was released before any external effect, and it does not establish what happens to work already in flight when authority changes during execution.¶
What the reference implementation does. A denial and a permit both produce a record, so a refusal is evidence rather than an absence of it. The implementation signs the denial record under the boundary's own key. For a permit it stores what its own source calls a permit record, with a content hash and no signature. That object is not a receipt in the sense of Section 7.1, it is not an aps:policy-decision:v1 record, and this document names no such object. The implementation's source gives its reason directly: a denial is signed as proof of restraint, a permit is treated as routine. The structural reading is that a refusal leaves no other artifact anywhere, so a record nobody signed is the only trace it has, while a permitted action goes on to produce a separately signed result record at the next stage.¶
What this document requires, separately. The boundary records the policy decision, permit, narrow or deny. That record is not evidence of admission (Section 2.2, Section 19.2.11). Section 7.3.2 defines the signed policy-decision record and makes the boundary its issuer, for permit, narrow and deny alike. This document states no requirement about an additional internal permit object, defines no wire shape for one, and places no signing obligation on one, because it defines no such object at all. An implementation that keeps one is keeping deployment state, not producing an APS record.¶
The cost of that choice belongs beside the choice. An unsigned permit record is not attributable to the boundary by a third party. It can be checked for integrity against its own hash by a party who already trusts the store that holds it, and that is a different and weaker property. A deployment that needs a permit to be presentable as boundary-attributable evidence has to sign permits too.¶
This subsection does not establish that the store holding an unsigned permit record is honest, and it does not establish that a signed denial record was the only decision reached for that action. It does not establish that the reference implementation's permit record and the policy-decision record of this document are the same object, and they are not.¶
At each authorization boundary the reference implementation walks the bound chain of the delegation it selected, following each record's stored parent link rather than re-resolving whatever parent is current. A revoked or suspended member anywhere on that walk ends the leaf's authority, up to and including the terminal grantor, even when the leaf's own record still reads as active. The walk fails closed, so a leaf whose bound chain is dead is denied even where some other chain the same agent holds would still be live. This is the boundary-side form of the core invariant that a chain is rejected when any member is revoked, stated in Section 4.6.¶
The same walk runs a second time inside the write transaction when a new delegation is granted under an existing one, because the first read happens outside the lock and a revocation can commit between the two.¶
Enumerating descendants is a reporting and cleanup tool in this arrangement. It is not what makes a chain-verifiable descendant invalid. Where a credential carries no chain a verifier can walk, such as an opaque bearer token, an issuer-side revocation mechanism is still needed.¶
This subsection does not establish that revocation state was fresh at the moment of the walk, and it does not establish that a credential issued outside the chain was reached at all.¶
It does not decide truth about the world outside it. It records what it evaluated and what the target returned. Whether the external effect matched the returned result is a separate finding with separate evidence.¶
It does not classify content and it does not judge whether an action was a good idea. A permitted action is an action the presented authority and the configured policy admitted.¶
Settings that identify an operator are reconciliation and not a revocation mechanism. Removing such a setting later does not remove a role already held.¶
Blast-radius preview before a revocation is read-only. It changes nothing and it is not a revocation.¶
It is not a transparency service. On its own it gives no third party the ability to detect that it presented different histories to different parties. The reference implementation's own research notes list an append-only log with consistency proofs, and separating the receipt signer from the executor, as directions rather than as present behaviour.¶
This subsection does not establish a complete list. It names the limits that the corpus behind this document repeatedly turned up.¶
An implementation of this document is not one thing. A party that issues delegations, a party that verifies them, a party that admits actions at the boundary and a party that reads receipts have different obligations, and an implementation that does all four is rare. This section defines the classes a claim is made in, the identifiers a claim cites, the form of the claim, and the three results an implementation reports per vector.¶
The executable corpus this section refers to is the APS conformance suite [APS-CONFORMANCE], which is work by this document's author. Nothing in this section is a statement that any implementation has passed anything, and the corpus issues no verdicts.¶
An implementation claims conformance in one or more of the following classes. A claim MUST name its classes. An implementation MUST NOT claim a class whose obligations it does not implement, and MUST NOT present a claim in one class as covering another.¶
A requirement identifier applies to one or more of these classes, through its area. The table below maps each area of Section 13.2 to the classes in which a requirement carrying that area is mandatory for a Core requirement and claimable for a Candidate one. Three areas carry no identifier in this revision and are listed for completeness of the taxonomy.¶
| Area | Classes |
|---|---|
| ID | delegation verifier, receipt verifier. No identifier in this revision |
| PRIN | lifecycle and status verifier |
| AUTH | delegation verifier |
| LC | lifecycle and status verifier |
| POL | enforcement boundary. No identifier in this revision |
| ENF | enforcement boundary |
| REC | authority issuer, receipt verifier |
| EVID | receipt verifier, lifecycle and status verifier |
| PROF | profile implementation |
| ADAPT | protocol adapter |
| GOV | no class in this revision, and no identifier |
| CONF | every class, in whichever classes the claim names |
The classes are not a maturity ladder and are not ordered. An implementation in one class is not a partial implementation of another. A Core requirement outside every class an implementation claims is not an obligation on that implementation, and a claim that omits a class is not a claim that the class was met.¶
What this subsection does not establish. It does not establish that the seven classes partition the obligations of this document without gap or overlap, that a family named against a class covers that class, or that passing every family named against a class makes an implementation conforming in it. The families named are the ones that reach some obligation of the class, and the coverage each reaches is recorded in Appendix D.¶
Requirement. APS-CONF-CLASS-NAMED, a claim names its classes, an implementation does not claim a class whose obligations it does not implement, and a claim in one class is not presented as covering another. Specified, not exercised.¶
Status: Core, document requirement, specified, not exercised. APS-CONF-CLASS-NAMED binds every conformance claim made under this document, in every class, and is not gated by a feature a claimant can decline. It is a requirement on a claim document rather than a runtime check a verifier performs, of the same kind as the profile requirements of Section 6.1, so no runtime vector reaches it and a static claim fixture is needed before it is recorded as exercised. A claim is the one artifact whose form this document fixes for every claimant, because a claim that need not name its classes cannot be read at all. Related fixture families: issuance-refusal-expiry, lifecycle-conferral-without-authority, chain-selection-no-union, single-chain-selection, key-rotation-historical, ancestor-revocation-chain, revocation-resolution-forward-compat, conflicting-status-sources, authority-epoch-rollback, activation-not-established, suspension-cause-composition, cached-authorization-revocation, accountability-record, receipt-decision-relation, action-result-binding, read-fidelity-receipt, merkle-root-parity, instruction-provenance, approval-single-use, runtime-authority-denial-continuity, capability-binding-drift, arap-binding, cross-stack. Implemented requirements: none. Related implementation surfaces: agent-passport-system 7.2.0 (npm) and agent-passport-system 4.2.0 (PyPI) for the authority issuer, delegation verifier and receipt verifier classes. No released package for the enforcement boundary, the profile implementation or the protocol adapter classes.¶
This subsection is informative. It describes the identifier scheme this document uses, so that a claim can cite a requirement without quoting it.¶
A requirement identifier has the form APS-<AREA>-<SEMANTIC-SLUG>. The area is one of twelve fixed values: ID, PRIN, AUTH, LC, POL, ENF, REC, EVID, PROF, ADAPT, GOV and CONF. The slug names the proposition the requirement states, in uppercase words joined by hyphens. An identifier names what a requirement says rather than where it sits, so it never changes because a section moves, and it is never reused. Renumbering this document moves no identifier, and an identifier retired with its requirement stays retired.¶
Five identifiers from Appendix D show the shape: APS-PRIN-SILENCE-NOT-CONSENT, APS-AUTH-CHAIN-NO-UNION, APS-LC-NO-RESURRECTION, APS-ENF-COMPLETE-AT-ADMISSION and APS-EVID-EFFECT-NOT-FROM-RESULT. Each reads as a proposition, which is what makes it citable without the surrounding text.¶
Each identifier belongs to a conformance class through its area, under the map in Section 13.1, and a claim cites an identifier in the class it applies to.¶
Appendix D is the sole authority for which requirements an exact vector exercises. It records one of two coverage states per requirement. Exercised means a named vector plus a runner assertion that fails when the requirement is violated. Specified, not exercised means no such vector exists, whatever related fixture material does exist. A requirement whose violation no input produces is specified and not exercised even where a validator carries the check, because a check no input reaches is not coverage.¶
The conformance suite's own inventory identifiers for draft-pidlisnyi-aps-03 appear in this document in Appendix D.2 and nowhere else. They are section-derived and bound to that revision, and they are reproduced there as a legacy mapping rather than as a scheme a claim against this revision uses.¶
What this subsection does not establish. It does not establish that the identifiers cover every obligation of this document, since an obligation stated across two sentences, or stated in the closed core with no restating subsection, carries no identifier. It does not establish that a fully exercised matrix would mean an implementation is correct.¶
This subsection is informative and carries no requirement identifier.¶
Every normative subsection of this document outside the closed core carries a status of Core or Candidate.¶
Two places are outside that scheme. The BCP 14 sentences carried from -03 in Section 15 and Section 16 are closed-core carryover. They keep the force they had in -03, they carry no status block and no requirement identifier, and Appendix D does not list them, because that appendix records what this revision states outside the closed core.¶
Core means the requirement is mandatory for an implementation claiming the conformance class to which the requirement applies, under the area-to-class map in Section 13.1. Candidate means the requirement belongs to an opt-in feature. A Candidate requirement is normative for an implementation that claims that feature and is not a requirement of APS Core conformance. Candidate is not weaker normative language and not a lower grade of Core, and it is not a promise that the requirement will become Core.¶
A claim therefore names the classes it claims and the Candidate features it claims, in the form "APS Core in the named classes, plus named features", and Section 13.4 states what else a claim carries. Lifecycle Core is an informative grouping name and not a claimable base. It names the propositions in Section 8 that restate a requirement of the closed core, carried by six requirement identifiers drawn from six of the twelve continuity rules. L1 is in it whole. One identifier each comes from L3, for irreversibility, from L5, for one chain per action with no union, from L6, for the recheck at the moment of consumption, from L7, for an unknown revocation state not being active, and from L9, for historical key selection with its issuer-claim timestamp and indeterminate signing instant. Section 8 lists the six with the core sections they restate. Everything else in that section, including the rest of L3, L5, L6, L7 and L9, is one or more Candidate features.¶
The Candidate features an implementation can claim in this revision are: the revocation record format of Section 4.5.2, the evidence model of Section 2.3 and Section 2.4, the profile model of Section 6, the lifecycle continuity rules outside Lifecycle Core together with the material in L3, L5, L6, L7 and L9 outside their Core propositions, each lifecycle mechanism of Section 8.3 named as its own feature, the decision-to-effect model of Section 9, the adapter contracts of Section 11.4, and the per-vector result vocabulary of Section 13.5. A claim that names no feature is a claim of APS Core alone.¶
The claim rules of Section 13.1 and Section 13.4 are not a Candidate feature. They bind every claim made under this document, whatever classes and features the claim names, because they are the form in which a claim is legible rather than a behavior an implementation opts into. They are document requirements of the same kind as Section 6.1 states for a profile, so no runtime vector reaches them and Appendix D marks all three specified and not exercised.¶
The corpus carries its own label with a similar name and a narrower meaning. A family labelled candidate_against_proposed states that a runnable case exists against proposed text at one commit of one repository. That label is a statement about the family, and this document's Candidate is a statement about a requirement. The two are recorded separately and neither implies the other. The corpus itself records that the label spelling is not yet uniform across families and that two families carry the shorter spelling on their per-vector records while stating the longer one at the family level.¶
What this subsection does not establish. It does not establish that a Candidate requirement is correct, that the boundary between Core and Candidate is drawn the same way by any other document, or that a family passing means the rule it tests is the right rule. A pass establishes that a boundary implementing the stated reading reaches a stated verdict on stated bytes.¶
This subsection is informative and carries no requirement identifier.¶
A claim is APS Core in the classes it names, plus the Candidate features it names. It carries no other base.¶
The requirements in this subsection bind a claim document. Like the profile requirements of Section 6.1, they are not runtime checks and no vector exercises them.¶
A conformance claim MUST state all of the following.¶
A claim MUST NOT be stated as a verdict issued by this document, by the corpus, or by any party other than the claimant. A claim is a record of what one party observed on stated inputs. A later claim by another party is appended as a new record and does not alter or replace an earlier one, and a later finding does not rewrite what an earlier record states.¶
What this subsection does not establish. It does not establish that a complete claim is correct, that a claim covering every requirement means the implementation is safe, or that any registry of claims exists. It does not define a machine-readable claim format.¶
Requirements. APS-CONF-CLAIM-CONTENT, a claim states every item in the list above. APS-CONF-CLAIM-NOT-VERDICT, a claim is not stated as a verdict issued by this document, by the corpus, or by any party other than the claimant, and a later claim is appended as a new record rather than replacing an earlier one. Both are specified, not exercised, and no fixture exists for a requirement on a claim document.¶
Status: Core, document requirement, specified, not exercised. APS-CONF-CLAIM-CONTENT and APS-CONF-CLAIM-NOT-VERDICT bind a claim document and not a runtime verifier, so no runtime vector reaches them. A static claim fixture is required before either is recorded as exercised, and none exists. Related fixture families: none. Implemented requirements: none. Related implementation surfaces: no released package.¶
An implementation reports one of exactly three results per vector.¶
An implementation MUST NOT report not_supported as pass, and MUST NOT report a vector it did not run at all. not_supported and fail are different findings. A fail says the implementation answered and was wrong. A not_supported says it could not be asked.¶
A count of not_supported results MUST NOT be presented as a coverage score, a completeness percentage, or a comparison between implementations. The reason is arithmetic rather than editorial. The unit a family records differs by family, because the question differs. Some families record one row per named claim, some one row per verification layer, some a count of reachable exports, and some commit no per-vector record at all and print it on demand. Rows from different units do not add, and a total over them is an artifact of how each family chose to write its record. A family's own record is authoritative for that family and for nothing else.¶
A not_supported result is also not a defect report about the package it names. It states what a fixture could and could not get from a published package at a pinned version, which is a statement about that package's surface at that version.¶
What this subsection does not establish. It does not establish that the three results are exhaustive for every verification model, that the boundary between fail and not_supported is unambiguous in every case, or that two implementations reporting the same tallies are equally correct. It does not establish any suite-wide number.¶
Requirements. APS-CONF-THREE-RESULTS, an implementation reports one of exactly three results per vector, reports no not_supported as pass, and reports no vector it did not run. APS-CONF-NOT-SUPPORTED-NOT-SCORE, a count of not_supported results is not presented as a coverage score, a completeness percentage, or a comparison between implementations. Both are specified, not exercised.¶
Status: Candidate feature. Normative for an implementation claiming this feature, not a requirement of APS Core conformance. Related fixture families: activation-not-established, lifecycle-credential-events, lifecycle-multiple-principals-and-conflict, lifecycle-outside-the-chain-standing, lifecycle-legal-regulatory-events, lifecycle-identifier-reuse-and-rename, lifecycle-principal-events. Implemented requirements: none. Related implementation surfaces: agent-passport-system 7.2.0 (npm) and agent-passport-system 4.2.0 (PyPI) are the packages whose surface those families probe. No released package emits a per-vector result record.¶
This subsection is informative.¶
A passing run does not establish a rule. It establishes that a boundary implementing the reading under test reaches a stated verdict on stated bytes, and that the named defective boundaries diverge on exactly their declared sets.¶
It does not establish that the reading under test is the correct one. For a Candidate requirement the reading is this document's, and a family that runs it does not confirm it.¶
It does not establish that the reference runners are independent implementations. Both were written for the corpus by this document's author.¶
It does not establish liability or any accountability outcome. Where a family touches an accountability record, that family states its own limit.¶
It does not establish that any legal doctrine applies to AI agents. The corpus uses scenarios drawn from how institutions handle authority as a source of cases, and each family that does so says so. A case is a source of a test, never a source of a rule.¶
It does not establish adoption, endorsement or production use by any party whose artifacts the corpus carries. Admission of an external family means the vectors were deterministic, in scope and correctly labelled.¶
This subsection is informative and carries no requirement identifier.¶
Protocol properties that depend on mediation hold only when all privileged effects pass through the enforcement gateway described in Section 12. When agents use an SDK without an external enforcement boundary, those properties depend on agent cooperation. This section considers four attacker classes: adversarial agent, messaging attacker, runtime attacker, and compromised-but-signing agent. Runtime compromise is outside what this document specifies.¶
A compromised-but-signing agent is a hijacked agent that produces cryptographically valid signatures over false claims about its own state. Signature verification can succeed because the signing key remains available to the attacker. Addressing this class requires evidence issued outside the compromised agent's trust domain. This document separates proof of possession from key authority (Section 3.1), defines historical and external signer resolution (Section 3.4 and Section 3.5), defines separately signed principal bindings and claim levels (Section 3.3), and keeps attestation provenance separate from verification status (Section 3.6). These distinctions constrain what a verifier may conclude from a signed claim. They do not close the attack class. A single-domain deployment remains exposed, and general operationally independent witnessing of agent state remains future work (Section 20).¶
This epistemic boundary extends to signed receipts. The gap between what a cryptographic governance protocol can prove and what it cannot is analyzed in [APS-EVIDENCE-GAP]. A signed receipt attests what the policy chain observed and decided. It does not attest ground truth about the external world. A valid receipt signature proves that the issuer attests the receipt's payload; it does not prove the payload corresponds to external fact. Verifiers MUST treat receipts as evidence of what was attested, not as proof of what is true.¶
Signed governance mutations are exposed to a substitution class when an approval signature binds an identifier and a description rather than the mutated content itself. An approver who signs a proposal identifier can have a different proposal body substituted under the same identifier between approval and application. Approval signatures over any governance mutation SHOULD bind the full proposed content and the version transition it applies to, not a reference to them. The normative preimage for specific governance structures is companion work (Section 10); the consideration applies to any signed mutation of standing authority.¶
Where a deployment issues consumable challenge, token, or approval artifacts carrying an expiry (for example, the approval artifact of Section 5.3, or challenge artifacts in a protocol binding), verifiers MUST enforce the expiry, and issuance against an expired or unparseable challenge MUST fail closed. An expiry that is carried but not enforced is equivalent to no expiry.¶
The external correlation form (Section 5.2) hashes fields as supplied by the correlating ecosystem. A matching external action reference is evidence of correlation between records, not of the authenticity, authority, or integrity of either record, and it MUST NOT be treated as an authority claim; correlation strength is bounded by the external ecosystem's own field discipline.¶
The action references of Section 5.1 and Section 5.2 are correlation keys, not integrity seals. A reference stored in the same record as its own preimage fields binds nothing against that record's writer: a party able to edit the fields can recompute the reference in the same act. Recomputation detects accidental corruption, and detects alteration only relative to an independently held copy of the reference or of the record. Tamper evidence against a record's writer comes from a signature over the record (Section 7) or from an independently held copy, not from the reference itself.¶
An imported external chain root (Section 11.3) relocates the root of trust for the chain built under it: APS signature verification begins at the first APS-signed hop, and the standing of everything above that hop rests on the importing party's verification of the external grant. The caller-signed verification attestation exists to make that party identifiable; a verifier that accepts imported roots accepts the importing party as a trust anchor for those chains, and SHOULD treat the attestation as the auditable record of that acceptance. A verifier that has not itself verified the external grant under its native rules holds the imported root at the strength of the importer's claim, and an audience check omitted at the point of use can admit a grant outside its intended audience.¶
An activation condition of Section 8.3.1 is enforced only at a boundary that claims that feature. A delegation gated by a recorded_event condition verifies as valid at a boundary that does not claim it, because the condition is a separate record the chain does not carry and chain verification never reads. An issuer that needs a gate applied by every verifier has only the time facet of Section 4.1, whose not_before every chain verifier applies.¶
Every protocol artifact a decoder or verifier receives is untrusted input. Length, count, or size fields carried inside an artifact MUST NOT drive reads or allocation beyond the input actually received: a declared element count that exceeds the remaining input is a decoding error, and a read past the end of the input MUST fail rather than yield default values. Verification interfaces SHOULD handle a structurally malformed artifact through a defined result, whether a return value or a typed error, rather than an unhandled failure, so that malformed input cannot crash a verifier.¶
The considerations above are attacker classes. The classes below are failure shapes drawn from the case corpus this document is written against. Each one is stated with the deployment assumption it defeats and with what in the conformance suite exhibits it. Naming a fixture family means the suite carries executable cases of that shape. It does not mean the class is closed, and several classes have no family at all, which is recorded where it is true.¶
Two of these classes have no fixture family at all, ambient bypass on the coverage side and the build-integrity half of trust-root substitution. None of the thirteen is closed. A family exhibits a shape and closes nothing, so a reader treating the list as a checklist a deployment works through is reading it as something it is not. None of the cases behind any class is a source of rules for AI agents, and nothing here states that a legal doctrine applies to one.¶
APS uses persistent identifiers and signed records to support attribution and audit. These records can expose or correlate an agent's principal, authority path, counterparties, action timing, target systems, and referenced evidence across administrative domains, in the sense described by RFC 6973 [RFC6973]. Hashing a value does not make it anonymous when the input space is small or available to the observer. Deployments SHOULD disclose only the fields and evidence references needed for the verifier's decision, SHOULD avoid personal data in identifiers and free-text fields, and SHOULD define access and retention policies for passports, delegations, receipts, and evidence records. A receipt signature protects integrity; it does not authorize secondary use or onward disclosure. Where global correlation is unnecessary, profiles SHOULD use context-specific agent and principal identifiers. Key rotation does not prevent correlation when a stable agent identifier, action reference, or delegation lineage remains visible.¶
This document has no IANA actions. DID methods are recorded in the W3C DID Specification Registries rather than through IANA. The versioned strings defined or referenced here include provenance tiers, resolution outcomes, principal claim levels, receipt_type values, profile identifiers, and the external correlation label. They are published with the reference implementation; establishing registries for them is future work.¶
APS distinguishes four attribution axes for agentic work. They are distinct because, in multi-party workflows, they may resolve to different entities.¶
The protocol must preserve the distinction between principal and beneficiary. An agent may act on behalf of an authorizing principal, such as a consulting firm, to produce a deliverable whose beneficiary is a third party, such as that firm's client. Collapsing the two axes would make this ordinary case unrepresentable.¶
The mechanisms in this document resolve the authority axis from the selected chain, and resolve the claim level of the principal axis from the binding material, where that material is available. Associating that principal with the accepted authority lineage is profile and trust-policy dependent and may remain not established (Section 19.2.10). Contribution and beneficiary remain distinct attribution axes, but their normative mechanics are left to companion specifications. The allocation of credit, benefit, compensation, liability, or ownership across beneficiaries is out of scope for this document and is not implied by the authority chain.¶
This section is informative and has two parts. The first states five limits of what this document specifies. A limit is a property of the protocol and not a question waiting on an answer. The second states the open design questions, each with what is unresolved, why the current evidence does not settle it, what this document requires until it is settled, and whether it touches APS Core or a Candidate feature.¶
Nothing in either part is a defect report about this revision. A limit is a boundary a later revision does not move by adding a record type. An open question is a place where this document states less than an implementation already does, or less than a deployment needs.¶
This subsection is informative. The five limits below are properties of what this document specifies. They are not questions awaiting an answer, and no later revision closes them by adding a record type.¶
What this subsection does not establish. It does not establish that the five are the only limits of this document, and it does not establish that a deployment holding all five in mind is safe.¶
This subsection is informative. It lists the questions this document does not answer, so that the rest of the document is not read as a claim about them. Each question states four things: what is unresolved, why the current evidence does not settle it, what this document requires until it is settled, and whether it touches APS Core or a Candidate feature. A question that touches Core is one an implementation cannot opt out of by declining a feature.¶
Nine of these come from the authority lifecycle document [APS-LIFECYCLE]. Three are transitions in Section 2.6 that no section of this revision establishes. Two were drafted as candidate lifecycle extensions and are carried here instead, because the strongest counterexample against each is unresolved and a candidate with an unresolved counterexample is a question rather than an extension. One is the distance between the lifecycle standing of Section 8.1 and the issuer-only revocation of Section 4.5.¶
Each item names the cases in Appendix C that force it, where a case does, and the fixture families whose vectors touch it. None of those closes the question. A family's vectors are candidates against proposed text rather than conformance results, and naming one is not a conformance claim.¶
A list of processed descendants does not establish that the list was every authority descendant at the relevant boundary. Delegation can be issued locally, so a descendant can exist that the teardown process never saw, and a descendant can be signed after the revocation with a valid parent chain. Signed lineage establishes structure. It does not establish that the descendant was accepted authority when the revocation took effect.¶
Three things a completeness claim needs are unsettled. What set a boundary claims to have accepted at a given moment. What prevents something from entering that set afterwards while still counting as earlier authority. What public commitment can establish closure over that set without exposing private state. This is why the revocation evidence rules of this document require a party emitting a cascade-completion record to be able to state the basis on which its set was complete, and define no such basis. See also Section 8.2.12 and Section 4.5.2.¶
What is unresolved. What basis makes a completeness claim over a set of descendants checkable, and what prevents an addition to that set afterwards that still counts as earlier authority.¶
Why the current evidence does not settle it. Every family named above exercises what happens to one artifact or one chain. None of them presents a boundary asserting a set and a second party checking that assertion, because no record shape carries the basis on which the set was closed.¶
What this document requires until it is settled. A claim that a set is complete states the basis on which it is complete, under APS-LC-COMPLETENESS-BASIS. A verifier that cannot establish that basis reports not established with the coverage limb named, and does not read an incomplete teardown as a finding that the descendants the record does not name are valid.¶
Scope. Candidate. It touches the lifecycle continuity rules and no requirement of APS Core conformance.¶
Cases. LC-B-022, a legal-claims exception as an actual basis for retention. LC-B-023, preservation triggered by anticipated litigation, earlier than formal process. LC-D-003, a believed inventory standing in for a verified one. LC-D-025, what a grant was used for as a different completeness claim from whether it is valid. LC-F-027, an empty audit window as delivery lag rather than absence.¶
Candidates. BROAD-L7, whose coverage limb is a rule for reading a state claim rather than a duty to establish coverage. CAND-02, which keeps a later completeness finding as a new record rather than a rewrite. Neither closes it.¶
Families. lifecycle-legal-regulatory-events, 44 vectors. lifecycle-credential-events, 42 cases. lifecycle-infrastructure-failure, 30 cases. LC-B-023 has no family, because no record set decides it.¶
This does not establish that a complete teardown is unachievable. It establishes that this document states no basis on which a party could assert one.¶
When authority is revoked while a workflow is running, the old grant cannot authorize a new effect at the next authorization boundary. What happens to the operation itself, whether it resumes under new authority, restarts, compensates or stops, depends on the kind of effect. There is no general model for it here.¶
What is unresolved. Whether an operation already running resumes, restarts, compensates or stops after the authority it ran under changes.¶
Why the current evidence does not settle it. The families carry timelines in which authority changes mid-operation and record the authority result at each boundary. None of them decides what the operation does next, because that decision belongs to the effect and not to the authority record.¶
What this document requires until it is settled. The old grant authorizes no new effect at the next authorization boundary, under APS-LC-RECHECK-AT-ADMISSION. Effects already completed stand. A consumed approval admits no further dispatch, and a later attempt needs a fresh authorization decision, under APS-ENF-RETRY-NEW-DECISION.¶
Scope. Candidate. It touches the lifecycle continuity rules and the decision-to-effect feature.¶
Cases. LC-B-029, a receiving institution's acceptance as a terminal boundary a later change does not reach. LC-C-006, an ancestor found invalid long after the fact. LC-E-008, which policy version a long-running instance resolves its remaining steps against. LC-E-013, invalidation arriving mid-run rather than at the next gateway check. LC-E-020, dormant scheduled authority whose creator is gone.¶
Candidates. BROAD-L6, the decision at each boundary is fresh. CAND-12, completed effects stand. CAND-16, when a recorded change becomes effective. None of them says whether the operation resumes, restarts, compensates or stops.¶
Families. lifecycle-organization-events, 35 cases. lifecycle-multiple-principals-and-conflict, 92 vectors. lifecycle-time-and-scheduling, 61 vectors. cached-authorization-revocation, 9 cases.¶
This does not establish that completed effects are unaffected by every kind of later finding. It states that this document bounds future effects and says nothing about the in-flight operation.¶
Lifting one suspension should not clear another, bypass a revocation recorded while the agent was suspended, or recreate rights that changed in the meantime. Multiple suspension causes need to compose, with each one released separately. That composition is stated as a candidate and no precedence order among causes is defined.¶
What is unresolved. Which cause is read first where two releases point in opposite directions, and whether releasing a cause can restore the shape authority had before the cause was imposed.¶
Why the current evidence does not settle it. The composition family exercises independent release per cause. It carries no case in which two releases conflict, because the rule it tests defines no precedence and a fixture cannot test an order that does not exist.¶
What this document requires until it is settled. Causes are a set, each release is decided independently under APS-LC-RELEASE-PER-CAUSE, and authority stays inactive while any suspension cause remains. Where a standing resolver cannot say, the state is not established rather than released.¶
Scope. Candidate. It touches the suspension mechanism and no requirement of APS Core conformance.¶
Cases. LC-B-011, an externally imposed restriction needing an equally external release trigger. LC-B-024, independent suspensions released independently. LC-C-022, a pending-ratification state that is neither revoked nor not revoked. LC-E-034, a queued action that outlasts a suspension.¶
Candidates. CAND-05, which makes causes a set and requires standing for each release. CAND-09, which separates chain validity from an external block and its removal. CAND-05 defines no precedence order.¶
Families. suspension-cause-composition, 16 cases and 5 gates. lifecycle-legal-regulatory-events, 44 vectors. lifecycle-multiple-principals-and-conflict, 92 vectors. lifecycle-time-and-scheduling, 61 vectors.¶
This does not establish that causes never interact. It states that no rule here decides which cause is read first when two releases conflict.¶
Revoking a high-level authority can end the authority of a large set of agents at once. One design binds an approval for such a revocation to a snapshot of its impact and checks it again immediately before the revocation takes effect, treating uncertain impact as large rather than small. That design is written down and is neither built nor tested.¶
What is unresolved. Whether revoking an authority whose dependents are numerous needs an approval path different from any other revocation, for example one bound to a snapshot of its impact and rechecked immediately before it takes effect.¶
Why the current evidence does not settle it. No family in the suite exercises an impact snapshot, an approval bound to one, or a recheck against one. The design is written down and has never been run.¶
What this document requires until it is settled. Nothing. A revocation of any size is the ordinary revocation of APS-LC-ANCESTOR-REVOCATION-REACHES-DEPENDENTS, and this document places no additional condition on a revocation because of how many dependents it reaches.¶
Scope. Candidate. Adopting an additional condition would change a Core behavior, which is why it is not proposed here.¶
Cases. LC-B-025, one revoked licence invalidating every chain that depends on it at once. LC-D-004, a compromised operator identity as an implicit ancestor over many independent trees. LC-D-014, an issuer whose own issuance log cannot be relied on. LC-F-033, systemic issuer misbehaviour escalating to distrust of the whole issuer.¶
Candidates. CAND-01, an external event is authority-changing only when established. ANX-01, a verdict records its event-class coverage. Neither proposes binding an approval to an impact snapshot.¶
Families. lifecycle-legal-regulatory-events, 44 vectors. lifecycle-credential-events, 42 cases.¶
This does not establish that a large revocation needs a different approval path. It records that no vector here exercises one.¶
Where authority was exercised for an office and nobody currently holds it, nobody may be empowered to exercise, reaffirm or revoke what the previous holder issued. Whether office-based grants continue, suspend or need reaffirmation during a vacancy, and who may act for the office until it is filled, is not defined.¶
What is unresolved. Whether office-based grants continue, suspend or need reaffirmation while nobody holds the office, and who may act for the office until it is filled.¶
Why the current evidence does not settle it. The succession families exercise a covering holder record, a covering vacancy record and a conflicting pair. None of them exercises a vacancy in which no party holds standing to exercise, reaffirm or revoke what the previous holder issued, because a fixture with no standing source has nothing to assert against.¶
What this document requires until it is settled. A vacancy record covering the action instant leaves the question not established under APS-LC-VACANCY-NOT-ESTABLISHED, and a verifier does not carry the last known holder through a vacancy. Not established here is not a finding that the authority ended.¶
Scope. Candidate. It touches the succession mechanism and no requirement of APS Core conformance.¶
Cases. LC-A-019, a vacancy that does not have to be filled before the remaining holders can act. LC-C-007, office binding against identity binding as an explicit design choice. LC-C-008, a missing successor designation resolving to a named default rather than failing closed. LC-C-009, a succession order that is deliberately not public. LC-I-009, an interim holder's caretaking scope, including extending its own mandate.¶
Candidates. CAND-13, replacement authority may be pre-committed. CAND-04, activation is established, not yet effective, or not established. CAND-03, which separates issuance validity from current validity. None says what happens when nobody holds the office and nobody is empowered to act for it.¶
Families. lifecycle-root-authority-succession, 13 cases. lifecycle-fiduciary-succession, 25 cases. activation-not-established, 19 cases and 5 gates. lifecycle-expiry-and-renewal, 15 vectors.¶
This does not establish that a vacancy ends office-based authority. It states that this document selects none of the three outcomes.¶
Where issuer standing is evaluated at issuance, an issuer who knows they are leaving can sign long-lived grants that stay valid after they are gone. A bounded lifetime for grants issued for an office, or a review when the office changes hands, are possible answers. Neither is specified.¶
What is unresolved. Whether anything bounds what an issuer who knows they are leaving may sign, for example a bounded lifetime for office grants or a review when the office changes hands.¶
Why the current evidence does not settle it. Issuer standing is evaluated at issuance and the families exercise it there. None of them carries an issuer signing in anticipation of a departure, because the record of such a grant is indistinguishable from any other grant signed at the same instant.¶
What this document requires until it is settled. Nothing beyond the temporal facet the grant itself carries. Issuance validity and current validity stay separate findings under APS-PRIN-TWO-FINDINGS, and a grant signed before a departure is valid until an ordinary lifecycle event ends it.¶
Scope. Candidate. It touches the succession mechanism and no requirement of APS Core conformance.¶
Cases. LC-A-016, replacement authority pre-committed at issuance rather than issued after the fact. LC-C-007, whether the grant was bound to the office or to the person. LC-H-010, a resignation effective on delivery of notice, which fixes when the departure happened. LC-I-009, an interim holder extending its own reach.¶
Candidates. CAND-03, which separates issuance validity from current validity and deliberately does not answer this. CAND-13, which covers pre-commitment and not a bound on what an outgoing issuer may pre-commit.¶
Families. lifecycle-root-authority-succession, 13 cases. lifecycle-principal-events, 32 cases. lifecycle-agent-renunciation, 13 cases. lifecycle-expiry-and-renewal, 15 vectors.¶
This does not establish that such grants are invalid. It states that nothing here bounds what an outgoing issuer may sign.¶
A grant can stay byte for byte the same while what it authorizes changes, because a tool, an API version or a resource classification changed underneath it. When a change in meaning should invalidate an earlier grant or approval, and how a verifier would detect it, is open.¶
What is unresolved. When a change in what a grant authorizes, with no change to the grant itself, should invalidate the grant or an approval under it, and how a verifier holding only records would detect such a change.¶
Why the current evidence does not settle it. The drift family exercises the pinned case, the unpinned case and a change of controller against a model-declared basis. Every one of those starts from something that was pinned or declared. No vector presents a change no party declared, because a fixture cannot supply evidence of a change nobody recorded.¶
What this document requires until it is settled. Where the authority model declares a class of referent change capability-relevant, continuity across such a change is established by something that pins it, under APS-LC-REFERENT-CONTINUITY-PINNED. Where nothing pins it, continuity is not established and the verdict says so. An unchanged name is never read as evidence of an unchanged referent.¶
Scope. Candidate. It touches the capability-binding mechanism and no requirement of APS Core conformance.¶
Cases. LC-E-001, a stable model alias as a pointer with a documented default. LC-E-002, a valid grant whose named executor is gone. LC-E-027, a precedent for gating expanded capability behind re-consent. LC-E-033, a provider-side capability upgrade with no delegation-layer event.¶
Candidates. CAND-07, a stable name does not establish stable semantics, which handles the pinned, unpinned and controller cases against a model-declared basis. CAND-11, a valid grant can be unexecutable. Whether a change in meaning should invalidate an earlier grant, and how a verifier would detect it unaided, stays open.¶
Families. capability-binding-drift, 8 presentations and a declared defective fail set of 5. lifecycle-agent-side-events, 20 presentations.¶
This does not establish that a pinned referent is enough. It states that detection of a meaning change by a verifier holding only records is not specified.¶
A revocation can be recorded at one moment and reach an agent, a gateway and an outside counterparty at different moments. What a relying party that acted on stale but authentic evidence is entitled to, and what evidence of notice a principal needs to show, is not defined here.¶
What is unresolved. What a relying party that acted on stale but authentic evidence is entitled to, and what evidence of notice a principal needs to show.¶
Why the current evidence does not settle it. The families exercise what a verifier establishes from records. Entitlement is not a finding a verifier returns from records, so no vector can assert it, and the reliance-notice family records the separation rather than resolving it.¶
What this document requires until it is settled. Recording a transition and observing it stay separate events. Where a profile makes a change effective on a party notice, the notice finding carries its own time and a verifier records a notice finding or records that it has none. This document states no entitlement for any party.¶
Scope. Candidate. It touches the principal and departure mechanism. No case behind this question states that a rule about human agents applies to an AI agent.¶
Cases. LC-A-001, termination effective on the agent's notice rather than at the event. LC-A-027, a verifier's chain-is-void finding and a relying party's protected reliance as two facts. LC-A-028, two tiers of notice for known counterparties and for strangers. LC-H-006, a disputed root deposited with a neutral forum. LC-I-001, a re-registered identifier with no delegation-layer event marking the change of hands.¶
Candidates. ANX-03, which separates chain validity from a party's knowledge and gives the notice finding its own timestamp. CAND-16, on when a recorded change becomes effective. ANX-03 proposes the separation and nothing about entitlement.¶
Families. lifecycle-principal-events, 32 cases. lifecycle-third-party-reliance-notice, 12 vectors. lifecycle-multiple-principals-and-conflict, 92 vectors. lifecycle-identifier-reuse-and-rename, 13 presentations.¶
The cases above come from bodies of law about human agents. Nothing here states that any of those rules applies to an AI agent, and nothing here establishes any entitlement for a relying party.¶
The stage chain is intent, decision, result. Admission sits between the second and the third and produces nothing. Whether an approval was consumed is enforcement-boundary state keyed by the approval's identity, and it is not content of any record this document defines.¶
What is unresolved. Whether the admission transition should produce a signed record, and if it should, what that record's predecessor is, what a refusal before admission produces, and what becomes the predecessor of the action-result record.¶
Why the current evidence does not settle it. No family exercises a fourth stage. The family that pins the action-result stage supplies no predecessor in any of its cases, so the predecessor axis a fourth stage would depend on is reported as not checked throughout. A signed admission record would also not establish that the boundary performed consumption, reservation and dispatch atomically, so the record alone would not answer the question it looks like it answers.¶
What this document requires until it is settled. A verifier that holds no consumption state reports the approval-state axis as not established, under the axis discipline of Section 7.6, and does not report an action admitted from an approval that was issued, under APS-EVID-STATES-NOT-SYNONYMS. Evaluation alone never consumes an approval, and a refusal before admission leaves the approval unconsumed.¶
Scope. Core. The stage chain is core, so any durable admission record changes a Core construction rather than adding a feature beside it. Versioning, predecessor resolution and the handling of records written under this revision are settled together or not at all.¶
Families. action-result-binding, 6 cases, with the predecessor axis not checked in all six. approval-single-use, 9 presentations, which exercises consumption at the boundary without producing a record of it.¶
Consumption of an approval is atomic. Reservation against every bounded ancestor is atomic. Dispatch is neither of those things and the three are not one transaction.¶
What is unresolved. What a boundary does after a failure between consumption and a durably established dispatch, how two concurrent admissions on one approval resolve beyond the requirement that consumption itself be atomic, and how an operation resumes without repeating its effect.¶
Why the current evidence does not settle it. The single-use family exercises a race pair at the boundary and admits the first presentation while refusing the second. That establishes serialisation of consumption. It does not reach a failure after consumption, because a fixture that stops a boundary mid-transaction would be testing the boundary's storage and not the protocol.¶
What this document requires until it is settled. The four moments the closed core already holds, which Section 9.8 reads together without adding to them. An idempotent reservation lookup is not permission to dispatch again, and a consumed approval does not become reusable because its reservation is still outstanding, both entailed by Section 7.3.2, under which only an approval that has neither expired nor been consumed admits dispatch. A reservation is released only before dispatch or on trusted evidence that dispatch did not occur, which Section 4.4 states.¶
Scope. Core. The reservation contract is the core's. A portable recovery contract would have to be defined before any durable admission record could carry one, which is why the two questions are settled in that order.¶
Families. approval-single-use, 9 presentations, for serialised consumption. lifecycle-infrastructure-failure, 30 cases, for the partition and restore shapes a recovery contract would have to survive.¶
This question was drafted as a candidate lifecycle extension and is carried here instead, because the counterexample against it is unresolved.¶
What is unresolved. What an authority model that declares no effectiveness rule for a change type falls back to.¶
Why the current evidence does not settle it. The drafted default was effective from the moment the change is recorded. The counterexample is the default itself. Effective on observation is equally defensible and is what a lagging enforcement point actually does, and a deployment that treats actions allowed by a lagging boundary inside a declared bound as a declared and bounded risk has chosen it deliberately. No family runs the same change under both readings, so nothing here distinguishes them.¶
What this document requires until it is settled. A verifier that treats a recorded change as effective records which rule it applied. Where the model declares a rule, the rule governs. Where it declares none, this document supplies no default and the effectiveness of the change at a given boundary is not established.¶
Scope. Candidate. This is not a freshness rule, which asks how old a verifier's answer is rather than whether the change took effect at all, and it is not a notice rule about third parties. Cases. LC-F-018, regional enforcement points briefly disagreeing. Families. conflicting-status-sources, 14 cases. lifecycle-infrastructure-failure, 30 cases.¶
A party can hold standing to end an authority artifact it never issued. Section 8.1 names that standing and Section 10.5 gives three shapes of it. For a direct revocation Section 4.5 names one party, the delegation's issuer, and the format at Section 4.5.2 carries one revoker member and requires it to equal that issuer.¶
What is unresolved. Whether a party holding lifecycle standing over an artifact it did not issue can end that artifact directly, and what record carries such an act.¶
Why the current evidence does not settle it. One requirement is keyed to the revoker member, APS-REC-REVOCATION-REVOKER-IS-ISSUER, which Section 4.5.2 states for that format and Appendix D marks specified and not exercised, and no vector named there presents a revocation from a party other than the issuer. A vector in either direction would need a standing source the corpus does not model, which is the same missing piece as the standing registry named elsewhere in this section.¶
What this document requires until it is settled. A direct revocation is the issuer's. A party with lifecycle standing that is not the issuer ends dependent authority by revoking its own ancestor grant, or through a suspension cause under Section 8.3.5, which pauses use without ending the artifact. A verifier does not accept a revocation record whose revoker is not the named delegation's issuer, which the format at Section 4.5.2 carries as APS-REC-REVOCATION-REVOKER-IS-ISSUER for records under that format.¶
Scope. Core. The revocation rule is in the closed core, so a party other than the issuer is not admitted by claiming a feature.¶
Cases. LC-B-008, authority ending completely and instantly from outside the delegation system. LC-B-025, one revoked licence invalidating every chain that depends on it at once.¶
Families. lifecycle-outside-the-chain-standing, 22 vectors, for standing held from outside the chain. authority-revocation-record, 8 vectors, which exercises the format for an issuer revocation only.¶
The two items below were drafted, reviewed and left out on purpose. They are recorded here so that the sections they would touch are not read as settled. Both are held by a ruling rather than by a missing answer, which is why they are listed apart from the questions above.¶
The cascade-derived and cascade-completion record formats. This revision now specifies one direct revocation record format, at Section 4.5.2, which a family exercises against five independent negatives and a duplicate-offer case. That subsection defines neither a cascade-derived record nor a cascade-completion record, and no released package issues or verifies either. What is missing before this document could specify them is a family that settles who signs a cascade-derived record, how duplicates are treated, and on what basis a completion record could claim its set was complete, which is the question at Section 19.2.1. Until then the SHOULD of Section 4.5.1 and its profile-defined format stand, and a verifier without both the originating revocation record and a profile for its format reports the evidence cascade state as indeterminate, which does not change the authority result.¶
The action-result predecessor binding. For an action-result record, the prev clause carries no BCP 14 keyword while the decision-reference equality in the same sentence carries MUST, and the step that validates prev and stage transitions during receipt verification carries none. Both reference implementations accept an action-result record whose prev names the action-intent record rather than the consumed policy decision. Opt-in predecessor binding shipped in the reference implementations and is recorded there as hardening rather than as a conformance fix, and the family that pins the action-result stage supplies no predecessor in any of its cases, so the predecessor axis is reported as not checked throughout. Two things a ruling has to settle first. Whether the action-intent to policy-decision link is made normative at the same time, since it is stated in the same unkeyworded form and is a different pairing with a different expected predecessor type. What a verifier that cannot obtain the predecessor reports, which on the axis discipline this document applies elsewhere is indeterminate rather than invalid, because an unobtainable predecessor is a gap in the verifier's evidence and not a defect in the record.¶
Families. action-result-binding, 6 cases, with the predecessor axis not checked in all 6. receipt-decision-relation, 7 vectors.¶
Neither item establishes a defect in this revision. Each records a place where this document states less than an implementation already does.¶
The four designs below are written down and are not part of this document. Each is stated with the one thing missing before it could enter, which in every case is a conformance family that exercises it. None of them is a commitment, and their presence here is not notice that a later revision will carry them.¶
A root authority grant object. Authority delegation in this document starts from a record whose parent identifier is null, and acceptance of such a root is verifier policy rather than something the record establishes. A separate object for the step from a principal to the first authority would make that step checkable from records. Missing: no family exercises a record for that step, so every family starts from a chain whose root is accepted by configuration.¶
A principal reference bound through the decision and the admission. The action-binding rule during receipt verification compares the supplied action input object's agent_id with the record's subject_agent. Both name the acting agent. A principal reference carried through the decision and then through the moment the approval is consumed would let a verifier establish that the action was admitted for the principal the chain names, and would bear on principal substitution. Missing: no family binds a principal reference across the decision and the admission point, so no vector distinguishes a substituted principal from a matching one at that boundary.¶
An admission record between the decision and the result. Today the stage chain is intent, decision, result, and whether a decision was consumed is boundary state rather than record content, which is why the approval-state axis is not established for a verifier without access to that state. A fourth stage would make the admission itself a signed record, would give Section 9.6 a record to rest on, would make a refusal a signed record rather than an absence, and would make the result's predecessor the admission rather than the decision. Missing: no family exercises a fourth stage, and the predecessor axis that a fourth stage would depend on is not checked in any case of the family that pins the action-result stage.¶
A facet partition into core and profile dimensions. The authority object here carries exactly seven facets, a missing facet is invalid rather than an implicit unconstrained value, and a profile change on a facet is unsupported rather than narrower. Splitting the set into facets every implementation compares and facets a profile declares would let a deployment add a dimension without making every other implementation report unsupported. Missing: no family exercises a facet set other than the seven, so no vector shows what a verifier should return for a facet it does not know.¶
None of the four establishes a gap that this revision has to close. Each records a design whose entry condition is a family that does not exist.¶
Future work includes a uniform wire vocabulary for verifier claims and evidence states across APS artifacts. This revision defines principal claim levels (Section 3.3), key and evidence resolution outcomes (Section 3.5 and Section 7.5), and separate receipt-verification axes (Section 7.6). Generalizing those results into one normative vocabulary remains future work. A crosswalk from those results to whatever vocabulary the wider evidence-sufficiency discussion settles on [COSAI-189] is future work on the same footing. This revision does not rename its own outcomes against an unadopted proposal.¶
Cross-implementation profiles for DecisionRefV1 also remain future work. Section 7.4 defines the digest computation, while authority_state, policy_input, and decision_context contain deployment-defined structures. A profile that requires independent recomputation across implementations must define those component schemas and disclosure rules. The contribution-attribution and beneficiary-attribution layers (Section 18) and the normative specification of institutional governance structures (Section 10) remain companion work.¶
A profile carrying a ReceiptV1 record (Section 7.1) as a signed statement for registration with a Transparency Service [RFC9943] also remains future work. Section 14 positions the envelope against that architecture. This revision does not define the carriage, the protected claims such a registration requires, or what a relying party may conclude from a registration receipt.¶
Operationally independent witnessing of agent state remains partially addressed. This revision separates proof of possession from signer authority (Section 3.1, Section 3.4, Section 3.5 and Section 7.2), defines separately signed principal bindings and claim levels (Section 3.3), and keeps attestation provenance separate from verification status (Section 3.6). These mechanisms constrain what a verifier may conclude from signed claims. They do not provide a general witness for the internal state of a compromised-but-signing agent, which remains open.¶
Reasoned reaffirmation and constitutional change are future work. This revision states that a recorded revocation is irreversible, that restoring superseded authority is a new record from a party with lifecycle standing rather than a reversal, and that a successor inherits no tree. It states nothing about the case where the rule that grants authority changes rather than the authority itself: an institution amending its own charter, a principal changing the terms on which every grant beneath it stands, or a party reaffirming an authority for a stated reason after the condition that suspended it is gone. Each of those needs a record whose subject is a rule rather than an artifact, and needs a verifier to decide what a change to a rule does to the artifacts issued under the previous rule. Nothing here specifies either. Entry would need a family that exercises a rule change against the artifacts under it, which no family in the corpus does.¶
This section records the open-source implementations maintained by this document's author, as of 24 September 2026. It is informative and does not define APS conformance. The results below record consistency among artifacts maintained by this document's author and do not establish independent implementation or adoption. No conformance run was performed for this revision beyond the one recorded under Section 4.5.2.¶
What the lines below rest on. Every Implemented line in this appendix, and every yes in the implementation columns of Appendix D, comes from reading the sources of agent-passport-system 7.2.0 on npm and agent-passport-system 4.2.0 on PyPI. No run backs any of them except the authority-revocation-record run recorded under Section 4.5.2. A vector named anywhere in this document under an identifier that Appendix D marks specified and not exercised carries no assertion keyed to that identifier, and is named because the family reaches the same subject matter.¶
The releases described here are the TypeScript package "agent-passport-system" 7.2.0 (npm), the Python package "agent-passport-system" 4.2.0 (PyPI), the npm package "agent-passport-system-mcp" 6.1.0, and the Go repository at https://github.com/aeoess/agent-passport-go at v0.7.0. The TypeScript and Python packages carry both a pre-draft record line and a draft-native line, and only the draft-native line implements the wire formats of Section 3.1, Section 3.3 and Section 4.1. The Go repository implements a subset centred on canonicalization, action-reference computation, verification and, since v0.7.0, issuance. The MCP package exposes protocol-layer tools. The enforcement boundary described in Section 12 is a separate deployment component and is not part of the published packages. The description in that section was read from the Agent Passport Gateway repository at https://github.com/aeoess/agent-passport-gateway, at commit 05a6aac8f7261d1866316fe03bd91fe0613dfaf5 of 22 September 2026. No A2A binding is specified by this document, and the released A2A adapter code is experimental.¶
The lifecycle modules of Section 8 ship in both packages as experimental and opt-in surfaces: activation, bounds, capability-binding, authority-state, chain-selection, lifecycle-state, status-coverage and suspension. Opt-in means an application that does not import them gets none of their behavior, and experimental means the packages' own changelogs decline to promise their surfaces are stable.¶
These mechanisms are implemented in the releases above and are covered by those packages' own test suites.¶
A conformance fixture set is published at https://github.com/Agent-Authority-Conformance/aps-conformance-suite. Current versions and results are maintained at https://github.com/aeoess/agent-passport-system.¶
The following mechanisms are specified by this document and implemented by no released package. The mechanism list is followed by the identifier list generated from the implementation columns of Appendix D, which is exhaustive for identified requirements and is the authority where the two disagree.¶
Identifier list. Appendix D marks 49 of its 99 identifiers no in both implementation columns, meaning neither agent-passport-system 7.2.0 on npm nor agent-passport-system 4.2.0 on PyPI has a surface that implements the requirement, read from source. A no in both columns is not a statement that the requirement is wrong or unreachable, only that no released package carries it. They are:¶
APS-EVID-NO-RETROACTIVE-REWRITE, APS-EVID-DIGEST-MISMATCH-NOT-ESTABLISHED, APS-ENF-NO-ABSENCE-INFERENCE, APS-PROF-REQUIRED-CONTENT, APS-PROF-SEMANTIC-PRESERVATION, APS-PROF-NO-WIDENING, APS-PROF-UNKNOWN-NOT-VALID, APS-LC-ISSUER-VS-LIFECYCLE-STANDING, APS-LC-SUCCESSOR-NO-INHERITANCE, APS-LC-RECHECK-AT-ADMISSION, APS-LC-CACHED-DECISION-FRESHNESS, APS-LC-UNKNOWN-DENIAL-SAYS-NOT-ESTABLISHED, APS-LC-COMPLETENESS-BASIS, APS-LC-POLICY-VERSION-IDENTIFIED, APS-LC-POLICY-TIGHTENING-RESTRICTS, APS-LC-EPOCH-FEATURE-DEFINITION, APS-LC-OFFLINE-DECLARED-IN-ADVANCE, APS-LC-BINDING-MODE-NO-DEFAULT, APS-LC-VACANCY-NOT-ESTABLISHED, APS-PRIN-TWO-FINDINGS, APS-PRIN-ROLE-NOT-FROM-BODY, APS-PRIN-SILENCE-NOT-CONSENT, APS-PRIN-ACCOUNTABILITY-SEPARATE, APS-EVID-RELATIONS-NOT-TRANSITIVE, APS-ENF-EXACT-ACTION-MATCH, APS-ENF-NO-COVERAGE-NO-BYPASS-CLAIM, APS-ENF-COVERAGE-PREMISE-SCOPED, APS-ENF-COVERAGE-RESOLVES-TO-ADMISSION, APS-EVID-EFFECT-NOT-FROM-RESULT, APS-EVID-READBACK-OUTCOMES, APS-EVID-MISSING-NAMED, APS-EVID-STATES-NOT-SYNONYMS, APS-ENF-RETRY-NEW-DECISION, APS-ENF-COMPENSATION-NEW-RECORD, APS-ENF-RESERVE-AT-APPROVAL, APS-ENF-COMPLETE-AT-ADMISSION, APS-ENF-SETTLE-AFTER-RESULT, APS-ENF-RELEASE-PRE-DISPATCH-ONLY, APS-ENF-CONFLICTING-REUSE-REJECTED, APS-ADAPT-NO-WIDENING, APS-ADAPT-NO-SILENT-SEMANTIC-LOSS, APS-ADAPT-STAGE-COMMITMENT, APS-ADAPT-CANONICALIZATION-STATED, APS-ADAPT-MCP-EXTENSION-DECLARED, APS-CONF-CLASS-NAMED, APS-CONF-CLAIM-CONTENT, APS-CONF-CLAIM-NOT-VERDICT, APS-CONF-THREE-RESULTS, APS-CONF-NOT-SUPPORTED-NOT-SCORE.¶
The remaining identifiers are marked yes in at least one column and are outside this subsection. Where a mechanism named above covers an identifier not on this list, the mechanism is partly implemented and the implementation columns say which part.¶
The following items are implementation choices where this document leaves a construction to a profile or to a deployment.¶
This section is informative. It summarizes the principal changes between draft-pidlisnyi-aps-03 and this revision. It is a history and not a specification, and where it disagrees with a section of this document the section governs.¶
The comprehensive integration did not rewrite the stabilized core beyond the -04 repairs summarized in Appendix B.2 and the edits logged under ruling R-A. The carried sections are Section 1, Section 3, Section 4, Section 5, Section 7, Section 11 and Section 14, which carry the -03 rules as revised below. Section 2 and Section 6 sit inside that range and are new. Every literal cross-reference in that text was converted to a cross-reference by anchor, because this revision renumbers the document. The R-A edits are two. In Section 3.1, "principal authority is carried by the separate record" became "the principal relationship is carried by the separate record", because a binding is not a grant. In Section 15, "outside the protocol guarantees" became "outside what this document specifies".¶
This appendix is informative. It is the provenance index for the lifecycle material in this document. It has two parts: an index from each rule to the case that is the hardest adversarial instance of it, and eighteen cases given in full. The corpus itself stays where it is maintained, in [APS-LIFECYCLE], pinned at the commit that reference names, and this appendix reproduces no full listing of it.¶
How the sources are used. The cases are drawn from law, corporate governance, aviation, medicine, banking, insolvency, government succession, military command, distributed systems, cryptographic infrastructure and published security incidents. Every one of those sources is used as a source of a case shape or of a counterexample. None of them says anything about AI agents. Nothing in this appendix states that a legal doctrine, a statute, a regulation or an institutional rule applies to an AI agent, and no such reading is intended or supported. A precedent here answers the question "what shapes does authority actually take", not the question "what rule governs an agent".¶
Status values. "verified" means the case has a source that was fetched and quoted. "reviewed hypothetical" means the case was written and reviewed with no external precedent claimed. "candidate" means the case names a gap and is held as a candidate rather than a settled shape. "boundary" means the case is sound and resolves to something other than an authority state a verifier returns from records, which is why it is listed separately. A status is a statement about the case, not about any implementation.¶
Family names are the fixture families of the conformance suite [APS-CONFORMANCE]. Naming a family records that vectors for that shape exist. It is not a conformance result and not a claim that any implementation passes them.¶
What this appendix does not establish. It does not establish that the corpus is complete, that the cases are independent of each other, or that any case has been tested. It does not establish that this document specifies a rule for every case listed, and several cases exist precisely because it does not.¶
Each entry names one rule of this document, the case that is the hardest adversarial instance of it found in the corpus, the fixture families that carry cases of that shape, and the status of the canonical case. Status values are those defined above. Where the canonical case is given in full below, the entry says so.¶
What this index does not establish. It does not establish that the canonical case named for a rule is the only adversarial case for it, that the families named exercise the rule at the level this document states it, or that a rule with a canonical case is better covered than a rule without one. Coverage is recorded in Appendix D and nowhere else.¶
Twelve of these are the cases the lifecycle document and its candidate statements cite most. Nine of the twelve are cited eight times or more across those two documents, and the other three are cited seven times and are also used by the worked examples in Section 9.11. The remaining six are the cases the worked examples and the open questions of this document turn on directly.¶
Each case carries five fields. Situation is what happened. Authority question is what a verifier has to answer. Rule exercised names the rule in this document the case bears on. Disposition in this document says what this revision does with the case, and every case carries one. What the rule does not establish is the boundary of that rule. Two further lines are kept where they exist: the source the case was drawn from, and the failure a naive implementation reaches, which is what makes the case adversarial rather than illustrative.¶
Where the corpus recorded a proposed outcome, that line is kept as the pressure the case puts on an authority model and not as a rule. A case from another domain is a source of the question and never a source of the rule, and the disposition line is where this document answers.¶
LC-C-008. A missing successor designation should fail open to a named statutory fallback, not fail closed like an unknown revocation¶
Status verified. Family lifecycle-time-and-scheduling. Domain government.¶
Situation. A role becomes vacant and the organization never issued an explicit order naming who acts in the meantime. A verifier looking for a successor designation finds none recorded.¶
Source. The Federal Vacancies Reform Act's default rule that the first assistant to a vacant Senate-confirmed office automatically becomes the acting officer, subject to a prior-service requirement and disqualification if the President has nominated that person. US Government Accountability Office, GAO-02-272R (https://www.gao.gov/products/gao-02-272r): "the first assistant to the office of such officer shall perform the functions and duties of the office temporarily in an acting capacity."¶
Authority question. Does an unrecorded successor designation leave the office authority not established, or does the authority model supply a named default that the verifier must apply?¶
Pressure this case puts on an authority model. A model that treats every unknown the same way answers this one badly. The corpus records that the domain solved it with a named default holder, resolved outside the record and checkable against its own eligibility conditions, which puts the question of whether an authority model can carry a pre-committed default at all.¶
What a naive implementation gets wrong. A framework modeled only on L7's fail-closed rule for unknown revocation state will wrongly fail closed here too, and block a routine, lawful vacancy that the statute already solved with an affirmative default.¶
Rule exercised. Invariants L7. L7 is about an unknown or stale revocation answer, which fails closed. An unknown successor designation is a different unknown, and in the source domain it resolves to a named fallback holder with its own eligibility gate rather than to a refusal. The two unknowns are not one.¶
Disposition in this document. A statutory fallback is a pre-committed instrument in the sense of Section 8.3.7, and this document defines no such instrument and no default holder. Without one the vacancy is not established, with the coverage limb named, and a verifier supplies no default in either direction.¶
What the rule does not establish. It does not establish that a named default holder exists in any deployment, and it does not establish which unknowns should resolve to a default. It establishes that an unknown successor designation and an unknown revocation answer are two different unknowns.¶
LC-C-006. A tainted ancestor invalidates dependents only from the moment the taint is found, not retroactively¶
Status verified. Family lifecycle-multiple-principals-and-conflict. Domain government.¶
Situation. A chain of appointments rests on a person's authority to make them. Eighteen months later, an independent investigator finds that person's own appointment was never valid, not revoked, never valid in the first place, and by then the downstream appointees have signed many orders that already took effect.¶
Source. The GAO's August 2020 finding that DHS acting secretary Chad Wolf's and acting deputy secretary Ken Cuccinelli's appointments were invalid, because Kevin McAleenan, who named them, had himself been installed outside the statutory order of succession and had no authority to amend that order. GAO finding, reported by GovExec (https://www.govexec.com/management/2020/08/top-two-homeland-security-officials-are-serving-illegally-gao-rules/167714/): "McAleenan's subsequent appointments of Wolf and Cuccinelli were therefore invalid, GAO said, as he was not eligible to make them."¶
Authority question. What does a verifier report about an ancestor established to have been invalid from issuance rather than revoked, and about the decisions taken while it looked valid?¶
Pressure this case puts on an authority model. An ancestor invalid from issuance and discovered late is not a revocation event, and a model with only a revocation event has nothing to record. The corpus also separates what a finding does going forward from what it does to effects already taken, which the finding itself does not answer.¶
What a naive implementation gets wrong. A revocation-only model finds nothing wrong here, because no one ever revoked anything. It has no way to represent "this grant was void from issuance" discovered after the fact, and no way to backdate that discovery without either pretending nothing happened or silently erasing evidence of effects already taken.¶
Rule exercised. Invariants L1, L12. Open question: work in flight. L1 (revoking an ancestor invalidates dependents) assumes the ancestor was once valid and was later revoked. This case is the harder one L1 does not cover, an ancestor invalid from the start, discovered long after the fact. Also touches the "work in flight" open question and L12 (completeness), since the orders executed under the tainted chain are exactly the evidence a completeness claim needs to account for.¶
Disposition in this document. Void from issuance is the artifact verdict invalid, carrying its own reason code and separated from revoked by that code, under Section 2.3. The finding reaches the chain from the moment a verifier establishes it. What becomes of effects already taken is a different question, open at Section 19.2.2.¶
What the rule does not establish. It does not establish what becomes of effects already taken under the chain while the chain looked valid, and it does not establish a moment at which the invalidity began for a relying party.¶
LC-F-018. Multiple regional enforcement points are physically distinct copies of authority state, and can briefly disagree¶
Status verified. Family lifecycle-infrastructure-failure. Domain distributed-systems.¶
Situation. An APS deployment runs multiple regional gateways sharing a globally-replicated authority store. A principal revokes a delegation. The gateway in the same region as the write enforces the revocation immediately. A gateway in a different region still serves the pre-revocation decision for some seconds to minutes.¶
Source. AWS documents IAM's own distributed, eventually-consistent propagation path. AWS IAM troubleshooting guide (https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html): "Any changes that you make in IAM (or other AWS services)... take time to become visible from all possible endpoints. Some delay results from the time it takes to send data from server to server, replication zone to replication zone, and Region to Region."¶
Authority question. When two enforcement points hold separate copies of authority state and disagree, which answer does a verifier treat as the state of the authority?¶
Pressure this case puts on an authority model. A deployment with more than one enforcement point holds more than one copy of authority state, so a model has to say what a lagging copy does to an answer and what an answer outside any declared bound is worth. The corpus records propagation lag as a bound a deployment declares and tests, and the case is what forces the question rather than the answer to it.¶
What a naive implementation gets wrong. Assuming a single "the" authority store with one true current state, when a multi-region deployment has physically distinct copies that can each individually be asked whether something is revoked and briefly disagree.¶
Rule exercised. Invariants L7. None of L1-L12 model multiple enforcement points each holding their own view of a replicated authority store. The L7 shape, "the authority is unreachable," doesn't capture "reachable but behind."¶
Disposition in this document. A result is what one verifier established from the sources it read at one moment. Section 8.3.6 makes freshness and coverage properties of the source rather than of the authority, and Section 4.3 makes a stale or unavailable revocation answer indeterminate and never active. This document states no propagation bound.¶
What the rule does not establish. It does not establish a propagation bound for any deployment. It establishes that a deployment with more than one enforcement point holds more than one copy of authority state.¶
LC-C-022. A pending-ratification state is neither "revoked" nor "not revoked," and if ratification is denied, the record has to say the action was provisional throughout, not that a final revocation was later reversed¶
Status verified. Family lifecycle-multiple-principals-and-conflict. Domain military.¶
Situation. A commander relieves a subordinate of command. The required written approval from a higher general officer has not yet arrived. Until it does, the relief has a lesser, provisional effect. If the approval never comes, the action is retroactively recharacterized as having only ever been the lesser effect, not undone from a final state.¶
Source. US Army relief-for-cause procedure. Fort Carson command policy memo, quoting AR 600-20 (https://home.army.mil/carson/6116/5089/9699/relief-for-cause.pdf): "Any commander may temporarily suspend a subordinate from command, but the final action to relieve an officer from any command position will not be taken until after written approval by the first general officer in the chain of command."¶
Authority question. How does a verifier report a change that has been initiated, has partial effect, and becomes final only on a separate approval that may never arrive?¶
Pressure this case puts on an authority model. A change that has partial effect and becomes final only on a separate approval fits neither revoked nor not revoked. The corpus records the domain treating the interval as provisional throughout, so a model that only has a final state has to recharacterize the earlier record afterwards, which is the move this document does not allow.¶
What a naive implementation gets wrong. Conflating this with an ordinary self-declared, self-terminated suspension. This is a different shape, an external, unilateral suspension by a superior that only becomes a final revocation with a specific separate approval. Treating the two the same either finalizes a revocation that legally never became final, or fails to suspend the subordinate while waiting on paperwork.¶
Rule exercised. Invariants L8. Open question: release from suspension. Adds a ratification-pending intermediate state with retroactive recharacterization on denial, a shape not present in L8's plain suspension and revocation split, and directly relevant to release from suspension, Section 19.2.3.¶
Disposition in this document. A pending ratification is a suspension cause under Section 8.3.5. Authority is inactive while the cause stands, the cause is released only by a party with standing over it, and a release creates no new authority. No verdict for a revocation that is not yet final is defined here.¶
What the rule does not establish. It does not establish who may ratify, and it does not establish how long a pending state may stand before something else has to happen.¶
LC-A-001. A principal's death ends actual authority regardless of durability, effective on the agent's notice, not at the instant of death¶
Status verified. Family lifecycle-principal-events. Domain agency-law.¶
Situation. A principal dies. An agent holding a delegation from that principal, durable or not, keeps trying to act on the principal's accounts. Nobody has processed a revocation record.¶
Source. Restatement (Third) of Agency §3.07: reproduced text, staff.washington.edu (https://staff.washington.edu/djdrake/RESt-Agency.doc): "The death of an individual principal terminates the agent's actual authority. The termination is effective only when the agent has notice of the principal's death." Durability does not change this: Uniform Power of Attorney Act (2006) §110(a), as enacted at N.H. RSA 564-E:110 (https://gc.nh.gov/rsa/html/LVI/564-E/564-E-110.htm): a power of attorney terminates when "(1) the principal dies; (2) the principal becomes incapacitated, if the power of attorney is not durable."¶
Authority question. Does authority end at the event, or at the moment the acting party has notice of it, and which of the two does a verifier hold evidence for?¶
Pressure this case puts on an authority model. In the source domain authority ends at the principal's death whatever the instrument says, and takes effect for a party on that party's notice rather than at the instant of the event. A model that records only a manual revocation has no place for either the event or the notice, and recording a transition and observing it are two events with two times.¶
What a naive implementation gets wrong. A revoke-only system waits for an explicit revocation record and misses that death is a self-executing terminating event. A system can also over-read "durable" as blanket death-immunity, when durability is scoped only to surviving incapacity, not death. Every power of attorney, durable or not, ends at death.¶
Rule exercised. Invariants L1, L10. L1, L10. Termination happens at a factual moment (death) under a notice-effective rule, not an ancestor-revocation record. The scope of "durable" (incapacity-survival only, never death-survival) is a distinction no invariant states, and a naive system easily over-generalizes it.¶
Disposition in this document. An external event changes a verifier's answer only through a record from a party in a role the authority model accepts, which is Section 8.4.1 and Section 8.3.8. The death itself reaches no verifier. A record of the event decides nothing without that accepted role, and where the role cannot be resolved the continuation of authority is not established.¶
What the rule does not establish. It does not establish that any rule about human agents applies to an AI agent. It does not establish how notice is evidenced, or who carries the burden of showing it.¶
LC-B-029. A receiving bank's acceptance is the hard boundary after which a mid-flight authority change no longer stops the order¶
Status verified. Family lifecycle-organization-events. Domain banking-payments.¶
Situation. A treasury agent submits a payment order under a valid delegation. The authorizing principal's authority is revoked minutes later. If the receiving bank has not yet accepted the payment order, the revocation stops it from settling. If the bank already accepted it, the order proceeds regardless of the revocation, unless the bank itself agrees to unwind it.¶
Source. UCC 4A-211's acceptance boundary. Cornell LII (https://www.law.cornell.edu/ucc/4A/4A-211): "After a payment order has been accepted, cancellation or amendment of the order is not effective unless the receiving bank agrees or a funds-transfer system rule allows cancellation or amendment without agreement of the bank."¶
Authority question. Once an operation has passed a boundary after which no further authorization decision occurs, does a later authority change reach it?¶
Pressure this case puts on an authority model. The corpus leaves work in flight open. In this document that is Section 19.2.2: the old grant cannot authorize a new effect at the next authorization boundary, and what happens to the operation itself is unsettled. This supplies a concrete resolution for one instrument type: the receiving institution's acceptance is the hard boundary. Before it, revoking the authorizing delegation stops the order. After it, the order proceeds independent of what the delegation graph says.¶
What a naive implementation gets wrong. Assuming revocation automatically halts any payment order already submitted under it ignores that acceptance gives the order a revocation-proof effect. Assuming revocation never matters for in-flight orders ignores that unaccepted orders remain fully stoppable.¶
Rule exercised. Invariants L6. Distinct from the already-verified LC-B-028 (stop-payment), which is a customer-initiated cancellation decision under L6's recheck principle. This is the underlying delegated authority itself changing mid-flight, the specific question left open under work in flight, Section 19.2.2.¶
Disposition in this document. The old grant admits no new effect at the next authorization boundary, under APS-LC-RECHECK-AT-ADMISSION. What happens to an operation already under way is open at Section 19.2.2, and this document defines no acceptance boundary inside a target system.¶
What the rule does not establish. It does not establish a boundary for any instrument other than the one it names, and it does not establish what the operation should do once that boundary has passed.¶
LC-B-026. A third party outside the principal-agent relationship can inject a new approval gate into an otherwise unmodified, valid chain¶
Status verified. Family lifecycle-legal-regulatory-events. Domain regulatory.¶
Situation. A company settles a regulatory action. The consent decree does not touch any existing delegation. It adds a new, externally-imposed requirement that a named "responsible employee or official" personally certify a defined category of future reports, for the life of the decree.¶
Source. Consent decree practice requiring a named responsible official to certify compliance reports under penalty of law. SEC EDGAR filing (https://www.sec.gov/Archives/edgar/data/1397516/000119312507093837/dex105.htm): "...which makes any representation concerning the Defendants' compliance or noncompliance with any requirement of this Consent Decree shall be certified by a 'responsible employee or official' of the Defendants."¶
Authority question. How does a verifier report an approval gate added from outside the delegation chain, when no artifact in the chain changed?¶
Pressure this case puts on an authority model. The original delegation chain is untouched and still valid, and a transaction in the decree's scope is no longer sufficient on that chain alone. It also needs the named official's separate certification, until the decree's own sunset date.¶
What a naive implementation gets wrong. A gateway that only re-verifies the original chain has no slot for a chain-external approval requirement injected by an outside party. It keeps authorizing exactly the transactions the decree was meant to catch, because nothing in the delegation itself changed.¶
Rule exercised. Structurally close to a dual-control policy, but the source of the added gate is external (a court-approved settlement, not internal risk policy), which none of L1-L12 name as a category. Also the strongest sourced instance found of "policy change" as a family.¶
Disposition in this document. The chain stays valid and the added gate denies the action at the boundary, which is the restricted state of Section 2.3. No record defined here carries the gate, and a deployment that needs one states it in its profile.¶
What the rule does not establish. It does not establish how an externally added gate is carried in a record, and it does not establish that the added gate narrows the underlying grant.¶
LC-B-008. Authority can end completely, instantly, and outside the delegation system entirely¶
Status verified. Family lifecycle-legal-regulatory-events. Domain regulatory.¶
Situation. A bank's officer authority does not merely get revoked. A federal receiver is appointed and by statute steps into every power that officer held, the instant the appointment takes effect, with zero notice to the delegation system that was relying on that officer's authority.¶
Source. 12 U.S.C. § 1821(d), under which the FDIC as receiver of a failed bank succeeds by operation of law to all rights and powers of the institution and its officers. Cornell LII (https://www.law.cornell.edu/uscode/text/12/1821): "The Corporation shall, as conservator or receiver, and by operation of law, succeed to all rights, titles, powers, and privileges of the insured depository institution."¶
Authority question. What does a verifier do when the authority at the head of a chain ends through an external fact that produces no artifact anywhere in the delegation graph?¶
Pressure this case puts on an authority model. In the source domain every delegation rooted in the former officer's authority ends when the receiver is appointed, whether or not any system recorded a revocation, and no replacement authority exists until the new principal issues one. A model in which authority ends only through a record it holds has nothing to read here, which is what makes the case adversarial.¶
What a naive implementation gets wrong. A system that expects the terminating event to show up as a revocation record in the infrastructure it monitors sees nothing, because the ancestor authority ended through an external legal fact with no corresponding artifact anywhere in the delegation graph.¶
Rule exercised. Invariants L1, L2. A harder-edged instance of L1 and L2, where the "ancestor" whose end triggers invalidation is not an APS artifact or even a company-internal record, but a statute taking effect the instant a regulator acts.¶
Disposition in this document. An external event changes a verifier's answer only through a record from a party in a role the authority model accepts, which is Section 8.4.1 and Section 8.3.8. The appointment reaches no verifier by itself. Replacement authority is a new grant from a party that currently holds the authority granted, under Section 8.3.7.¶
What the rule does not establish. It does not establish that an external legal fact is observable to a verifier, and it does not establish the moment at which a verifier could establish one.¶
LC-A-016. Some replacement authority is pre-committed at issuance time, not issued fresh after the fact¶
Status verified. Family lifecycle-principal-events. Domain agency-law.¶
Situation. A single delegation instrument names a primary delegate and an ordered list of successors. The primary exits: dies, resigns, becomes incapacitated. The next-in-line successor should be able to act under the same original grant, with no new document and no action required from the principal at the moment of handoff.¶
Source. The Uniform Power of Attorney Act's successor-agent provision. UPOAA (2006) §111, hosted by the Mississippi Secretary of State (https://www.sos.ms.gov/content/documents/pol_res/power%20of%20attorney/5upoaa_final_may08.pdf): "A principal may designate one or more successor agents to act if an agent resigns, dies, becomes incapacitated, is not qualified to serve, or declines to serve."¶
Authority question. Where replacement authority was pre-committed inside the original instrument, does the successor act under that instrument or need a fresh grant?¶
Pressure this case puts on an authority model. In the source instrument the successor's authority comes from the original grant, at the scope and terms that grant already set, and becomes exercisable on the primary's exit with nothing issued at handoff time. A model in which replacement authority is always issued fresh after the fact has no shape for a grant that was pre-committed at issuance.¶
What a naive implementation gets wrong. A system built around "replacement authority always means a fresh grant from a currently-authorized principal" (the L3/L4 pattern) has no slot for succession pre-committed inside a single instrument. It either treats the successor as unauthorized until a new grant appears, or wrongly treats the successor as inheriting the primary's entire personal delegation tree rather than just this one instrument.¶
Rule exercised. Invariants L3, L4. L3 and L4 assume replacement authority is issued fresh, after the fact, by whoever currently holds authority. This is a third pattern, authority pre-committed at issuance for a defined contingency, that neither invariant names.¶
Disposition in this document. Pre-commitment is named at Section 8.3.7 and no released package implements it. Where the terms declare no binding mode and the actor is not the named subject, the mode is not established and a verifier supplies no default.¶
What the rule does not establish. It does not establish that a pre-committed successor is exercisable, and it does not establish what the successor may do before its activating condition is established.¶
LC-E-034. A queued action that outlasts a suspension needs a live check at fire time, not just at the moment it was queued¶
Status reviewed hypothetical. Family lifecycle-time-and-scheduling. Domain agent-native.¶
Situation. An agent's authority is suspended pending an investigation. It already had a recurring action queued to fire later. The suspension is lifted before the queued action's scheduled fire time. The scheduler holding the queued action has no visibility into suspension state at all, it only knows the schedule, and fires the action exactly as originally planned.¶
Source. No external precedent claimed.¶
Authority question. Does a queued action carry the authority state it was queued under, or the state live at the moment it fires?¶
Pressure this case puts on an authority model. This particular timeline is benign under L8's own logic, since the suspension was already lifted before the action fired, so denying it would be wrong. The case is worth naming because the scheduler got the right answer by accident, having never checked live suspension state at all. The same scheduler would fire the action identically even if the suspension were still active at fire time, which is the actual failure this case points at.¶
What a naive implementation gets wrong. A scheduler that only checks authority state at the moment an action was queued, not at fire time, produces the correct result in this timeline purely by luck. Change nothing about the scheduler and only change the timeline so the suspension is still active at fire time, and it fires an action that should have been paused, because dormant queued work was never something L8's stated mechanism has a hook to act on until the scheduler itself checks live state at fire time.¶
Rule exercised. Invariants L8. L8 is specified only in terms of pausing the use of authority and everything that depends on it, which implicitly assumes a live dependency to pause. A queued-but-not-yet-executing action is dormant, not in use, so L8's text does not make explicit that the scheduler must check live state at fire time for the scheduled-action case specifically.¶
Disposition in this document. The recheck at the moment of consumption is APS-LC-RECHECK-AT-ADMISSION. A scheduler is not an enforcement boundary in this document, and a queued action reaches an authority answer only at the next authorization boundary.¶
What the rule does not establish. It claims no external precedent. It does not establish that any scheduler behaves this way, and the timeline it names is benign. Its value is the failure next to it, a scheduler that would fire identically with the suspension still standing.¶
LC-F-027. An empty audit window can mean the record hasn't arrived yet, not that nothing happened¶
Status verified. Family lifecycle-infrastructure-failure. Domain distributed-systems.¶
Situation. An APS deployment's audit pipeline batches evidence records for delivery rather than writing them synchronously. A revocation is enforced immediately at the gateway, but the durable audit record proving the decision happened does not land in the evidence store for some minutes afterward.¶
Source. AWS documents that CloudTrail log delivery is not instantaneous. AWS CloudTrail FAQs (https://aws.amazon.com/cloudtrail/faqs/): "Typically, CloudTrail delivers an event within 5 minutes of the API call."¶
Authority question. Can a verifier read an empty window in an evidence store as a finding that nothing happened in that window?¶
Pressure this case puts on an authority model. An evidence store read inside its own delivery lag is not a complete account of the interval asked about, so a model that reconstructs authority state at a past instant has to say what an empty window is worth. The corpus records delivery lag as a bound a deployment declares and monitors, and it does not follow that an enforcement decision waits on its own audit record.¶
What a naive implementation gets wrong. Treating an empty audit-log window as proof nothing happened during that window, when it may only mean the batched delivery hasn't caught up yet, exactly the wrong conclusion for an investigation happening in near-real-time.¶
Rule exercised. Invariants L12. L12 (completeness is a separate and stronger claim). This is the delivery-lag instance: a record that hasn't arrived yet is not evidence of absence.¶
Disposition in this document. A verifier does not read absence from silence. APS-LC-COMPLETENESS-BASIS makes a completeness claim state its basis and reports not established with the coverage limb where that basis cannot be established, and Section 19.1 carries no proof of absence as a limit of this document.¶
What the rule does not establish. It does not establish a delivery bound, and it does not establish that a record which has not arrived will arrive.¶
LC-D-025. "Authority is currently valid" and "a complete record exists of what was done under it" are different claims a verifier answers separately¶
Status verified. Family lifecycle-credential-events. Domain security-incident.¶
Situation. An outsourced support role is legitimately scoped to view sensitive customer data as part of its ordinary function. Some holders of that access are bribed to misuse it within that same valid scope. The org detects and terminates the involved principals before an extortion attempt surfaces, but the data already copied out cannot be recovered by the termination.¶
Source. Coinbase's May 2025 disclosure that criminals bribed a number of its outsourced, India-based customer support contractors to copy customer data, which was then used in a $20 million extortion attempt. The Hacker News (https://thehackernews.com/2025/05/coinbase-agents-bribed-data-of-1-users.html): "What these attackers were doing was finding Coinbase employees and contractors based in India who were associated with our business process outsourcing or support operations, that kind of thing, and bribing them in order to obtain customer data."¶
Authority question. Does establishing that authority is no longer valid establish anything about what was done under it while it was valid?¶
Pressure this case puts on an authority model. Revoking a misbehaving principal's authority answers whether it can still act and answers nothing about what it already did while the authority was valid. The second question needs its own account, built from evidence of exercised authority inside the valid window, and a model that reports only the first has no way to say that the second is unanswered.¶
What a naive implementation gets wrong. Treating "we revoked their access" as having closed the incident conflates stopping future authorized action with establishing what happened during the entire window the authority was, by every technical measure, valid and properly scoped. A validly scoped grant misused for its whole active duration leaves a gap no revocation, however prompt, can retroactively close.¶
Rule exercised. Invariants L12. Distinct from L12's teardown-completeness framing, which is about whether a descendant list was complete at a boundary. This is about whether the record of what a still-valid grant was actually used for is complete, a related but separate completeness claim about exercised authority rather than about descendant enumeration.¶
Disposition in this document. Chain validity and an account of what was done under a grant are two findings. APS-LC-COMPLETENESS-BASIS governs the second, and this document defines no basis on which such an account is complete.¶
What the rule does not establish. It does not establish what a complete record of exercised authority would contain, and it does not establish that the revocation was late.¶
LC-C-012. Independently rooted chains can commit to a shared objective without unioning their scopes¶
Status verified. Family lifecycle-multiple-principals-and-conflict.¶
Situation. One agent holds two chains from two unrelated roots. It proposes an action whose amount is above the ceiling of either chain on its own and below the two ceilings added together, and presents both chains for the one action.¶
Authority question. Does holding two valid chains give an agent authority that neither chain gives it, and is coordinating on one objective the same thing as combining two authorities?¶
Rule exercised. APS-AUTH-CHAIN-NO-UNION and APS-AUTH-CHAIN-SET-NOT-A-SELECTION, at Section 8.2.5. Each action is decided against one root-to-leaf chain. A concatenated presentation is not a selection of one chain and no action is decided against it. Independently rooted chains may coordinate on a shared objective while each keeps its own scope.¶
Disposition in this document. APS-AUTH-CHAIN-NO-UNION decides it. One chain per action, no union of scope grants or spend ceilings, and cross-principal composition needs a profile this document does not supply.¶
What a naive implementation gets wrong. A verifier that unions the two ceilings admits an amount neither principal granted, and reports a single result for a decision it made against a set.¶
What the rule does not establish. It does not establish how an action selects its chain, which is an implementation choice. It does not establish that cross-principal composition is impossible, only that it needs a profile this document does not supply.¶
LC-E-006. Holding a scope does not carry authority to hand it to something you spawn¶
Status verified. Family lifecycle-agent-side-events.¶
Situation. An agent holding a scope spawns a child process and passes the scope to it, with nothing in the authority model declaring that the agent may confer authority.¶
Authority question. Is authority to exercise a scope the same authority as authority to confer that scope on another party?¶
Rule exercised. Nothing normative in this revision. The question is carried at Section 19.2.13 because the counterexample against the drafted rule is unresolved. Monotonic narrowing bounds what a child may receive and says nothing about who may create one.¶
Disposition in this document. Nothing normative in this revision. The question is carried at Section 19.2.13, and until it is settled a verifier that cannot establish conferral authority reports it as not established rather than reading it out of possession.¶
What a naive implementation gets wrong. A framework that reads conferral out of possession creates authority for a party the principal never named, and a framework that forbids it outright denies authority in models where a platform default supplies it.¶
What the rule does not establish. It does not establish that conferral always needs a fresh act of the principal, and it does not decide what happens to children already issued without declared conferral authority.¶
LC-C-014. A handover can require the incoming holder's acknowledgment, with authority staying put until it arrives¶
Status verified. Family lifecycle-time-and-scheduling.¶
Situation. Responsibility for an agent moves from one holder to another. The instrument governing the handover makes the move effective on the incoming holder acknowledging it rather than at a stated instant.¶
Authority question. Is a handover an instant at which one party authority ends and another begins, or an interval with a condition at its end?¶
Rule exercised. APS-LC-SUCCESSION-NEW-GRANT and the handover rules at Section 8.3.7. The agent keeps its identity, its old authority does not survive revocation of the ancestor it depended on, and the replacement chain stands on its own because it was independently issued. Ordering is a deployment choice: a planned handover may accept an overlap and a compromised holder may call for a gap.¶
Disposition in this document. The acknowledgment-gated handover is described at Section 8.3.7 and no released package implements it. Where the terms declare no binding mode, the mode is not established and a verifier supplies no default.¶
What a naive implementation gets wrong. A framework that models a handover as an instant has no state for the interval, and either grants the incoming holder authority before the acknowledgment or leaves the outgoing holder with none after the announcement.¶
What the rule does not establish. It does not decide the cutover order for any deployment, and it does not establish what covers the agent work during the interval.¶
LC-B-024. Multiple independent suspensions on the same principal have to be released independently, not cleared by any one of them lapsing¶
Status verified. Family lifecycle-legal-regulatory-events.¶
Situation. Two parties, acting for unrelated reasons, each impose a suspension on one grant. One of the two releases its own.¶
Authority question. Does a release from one source reach a cause imposed by another, and what is the state of the grant while one cause remains?¶
Rule exercised. APS-LC-CAUSE-SET-NOT-FLAG, APS-LC-RELEASE-PER-CAUSE and APS-LC-RELEASE-STANDING-EXTERNAL, at Section 8.3.5. Causes are a set, each named cause is decided independently, standing over a cause is resolved outside the record, and a party holding standing over a cause it did not impose can release it.¶
Disposition in this document. APS-LC-CAUSE-SET-NOT-FLAG and APS-LC-RELEASE-PER-CAUSE decide it, and Section 8.3.5 defines no precedence order among causes.¶
What a naive implementation gets wrong. A framework holding one suspension flag clears the whole pause on the first release, and a framework that reads standing from the release record lets any genuine signature clear any cause.¶
What the rule does not establish. It does not define a precedence order among causes, and it does not establish that a release returns authority to the shape it had before the cause was imposed.¶
LC-E-002. A valid, non-expired, non-revoked grant can become unexecutable, and that is a fourth state, not a variant of the other three¶
Status verified. Family lifecycle-agent-side-events.¶
Situation. A grant names a target, an executor or a capability that no longer resolves. Nothing in the grant has changed and no lifecycle event has occurred.¶
Authority question. Does a referent that has vanished change the verdict on the artifact, or does it change only what happens at execution?¶
Rule exercised. The unexecutable statement at Section 9.10, which is informative because no family exercises it. The artifact verdict is unchanged, the execution attempt fails, and the record carries the referent that could not be resolved. Unexecutable is an execution outcome and not an artifact verdict.¶
Disposition in this document. Section 9.10, which is informative. The artifact verdict is unchanged, the execution attempt fails, and the record carries the referent that could not be resolved.¶
What a naive implementation gets wrong. A framework that reports such an artifact invalid, expired, revoked or suspended reports a lifecycle event that did not happen, and loses the distinction between an authority that ended and a target that vanished.¶
What the rule does not establish. It does not prescribe which party re-points a grant whose referent is gone, or whether that party may. It does not cover a referent that changed rather than vanished.¶
LC-E-013. A long job's own logic must expect authority invalidation to arrive silently mid-run, not only at its next gateway check¶
Status verified. Family lifecycle-agent-side-events.¶
Situation. An agent is part way through a long operation when the authority it is running under is revoked. The next authorization boundary is some distance away.¶
Authority question. What does the agent do between the revocation and the next boundary, and does the revocation reach the work already under way?¶
Rule exercised. APS-LC-RECHECK-AT-ADMISSION at Section 8.2.6, and CAND-12 at Section 8.4.7. The old grant authorizes no new effect at the next authorization boundary. Effects already completed stand, and ending authority does not by itself end sessions or derived credentials already issued.¶
Disposition in this document. APS-LC-RECHECK-AT-ADMISSION decides the next authorization boundary. Whether the operation resumes, restarts, compensates or stops is open at Section 19.2.2.¶
What a naive implementation gets wrong. A framework that checks authority only at a gateway treats the interval between boundaries as covered by the last check, and an implementation that assumes revocation halts a running operation assumes a control this document does not require.¶
What the rule does not establish. It does not say whether the operation resumes, restarts, compensates or stops, which is the question at Section 19.2.2.¶
These 36 cases came out of the same research as the cases above and each one is sound. What each lacks is a lifecycle verdict. Each resolves to a liability outcome, a detection-surface gap, an operational practice or an evidence question rather than to an authority state a verifier returns from records. They are listed because they bound the model. They mark where the authority question stops and a different question starts, and a design that answers one of them by extending the authority model is answering a different question from the one it looks like.¶
Grouped by the reason each is outside the authority question, with the count in each group: execution and scheduler mechanics, 5. Implementation or configuration defect, 2. Liability or legal consequence, 5. No authority transition in the scenario, 2. No verifier in the scenario, 3. Security control, 19. The full list is held in [APS-LIFECYCLE] and is not reproduced here.¶
Eight of the thirty-six are named elsewhere in this document and are given here so that those references resolve. LC-E-010, an idempotency-key retry returning the original result instead of re-executing, and LC-E-011, a reused key with changed parameters erroring outright, both under execution and scheduler mechanics, and both behind the statement at Section 9.7 that deduplication is execution behavior rather than an authority finding. LC-E-022, at-least-once delivery making the target rather than the scheduler responsible for preventing duplicate execution, same group. LC-F-036, a cache whose configured lifetime drifts past its declared freshness policy, under implementation or configuration defect, which the stale-revocation failure class names as a configuration defect rather than an authority finding. LC-D-016, a substituted cryptographic constant defeating structural verification, under security control, which the trust-root substitution class names as the build-integrity half with no fixture family. LC-D-023 and LC-D-019, an admin credential on a readable share and harvested credentials remaining sufficient, both under security control, behind the ambient bypass class. LC-D-027, a narrowly granted vendor credential reaching unrelated systems because nothing enforced the boundary, same group and same class.¶
Several of these are published security incidents. They are listed as sources of case shapes. Nothing here attributes fault to any named organization, and nothing here states that any incident would have gone differently under this document.¶
This list does not establish that a boundary case is unimportant, and it does not establish that the six reasons are the only reasons a case could fall outside the authority question. It establishes which cases were read and set aside, and why.¶
This appendix is informative. It records every normative requirement this revision states outside the closed core, under the stable semantic identifier that requirement carries, with the section that states it, the feature it belongs to, the vectors that exercise it, and whether each reference implementation covers it.¶
Identifiers have the form APS-<AREA>-<SEMANTIC-SLUG> defined in Section 13.2. The areas are fixed: ID, PRIN, AUTH, LC, POL, ENF, REC, EVID, PROF, ADAPT, GOV and CONF. An identifier never changes because a section moves and is never reused. Renumbering this document moves no identifier.¶
Feature values. Core means a requirement of APS Core conformance, mandatory for an implementation claiming the class the requirement's area maps to in Section 13.1. Core, restated means the requirement is stated in the closed core and the named section restates it without adding to it, so citing either place cites one requirement. Lifecycle Core is an informative grouping name for the six identifiers in Section 8 that restate the closed core, one from each of six of the twelve continuity rules, and it is not a claimable base. Core, document requirement means a requirement of APS Core conformance that binds a document a party writes rather than a runtime check a verifier performs, so no runtime vector can reach it. Every other value names one Candidate feature an implementation can claim.¶
Vector columns. A requirement is recorded as exercised only where a named vector carries an assertion that fails when the requirement is violated. A related family is not coverage, and a family named in a status block is not coverage on its own. Where both vector fields read none, the requirement is specified and not exercised. Of the 99 requirements below, 14 are exercised by a named vector and 85 are specified and not exercised.¶
Implementation columns. TypeScript is agent-passport-system 7.2.0 on npm and Python is agent-passport-system 4.2.0 on PyPI. A value of yes means the named package has a surface that implements the requirement, read from its source, not that a run was observed. The one run this document records is the authority-revocation-record run at Section 4.5.2, and no other run backs a value in these columns.¶
Corpus pin. Every vector named below is present in the APS conformance suite [APS-CONFORMANCE] at merge commit 5829e2ff00d75f49ce21e9d87e756658deb1ef33, dated 24 September 2026, which includes the authority-revocation-record family. Vectors were read from the working tree at commit 04c2e334395c55c029f061ae0ca55f80aeb6ee9e plus that family, and no vector changed between the two commits.¶
The implementation values below come from reading the sources of agent-passport-system 7.2.0 on npm and agent-passport-system 4.2.0 on PyPI, on the same basis as Appendix A. No run backs any of them except the authority-revocation-record run recorded under Section 4.5.2. A vector named under an identifier marked specified and not exercised carries no assertion keyed to that identifier. Where a status block elsewhere in this document lists implemented requirements, it lists the identifiers this list marks yes for at least one of the two packages.¶
What this list does not establish. It does not establish that any implementation ran any vector, that an exercised requirement is correctly implemented anywhere, or that the requirements listed are every obligation this document places on an implementation. An obligation stated across two sentences, or stated without a BCP 14 keyword, carries no identifier and does not appear here.¶
The rows below are every requirement the inventory records against a named fixture. The 43 requirements the inventory records as not exercised with no fixture at all are not reproduced here and are listed in the inventory itself.¶
| REQ id | Sec | Family | Vec | Impl | Result |
|---|---|---|---|---|---|
| REQ-2.2-1 | 2.2 | cross-stack/receipts-amdal | 6 | PY | partial |
| REQ-2.2-4 | 2.2 | cross-stack/receipts-amdal | 6 | PY | partial |
| REQ-2.4-2 | 2.4 | cross-stack/oracle-safety-check | 13 | TS, PKG | partial |
| REQ-2.5-4 | 2.5 | cross-stack/oracle-safety-check | 13 | TS, PKG | partial |
| REQ-2.6-1 | 2.6 | instruction-provenance | 10 | TS | partial |
| REQ-3.2-1 | 3.2 | cross-stack/oracle-safety-check | 13 | none | not exercised |
| REQ-3.2-2 | 3.2 | cross-stack/oracle-safety-check | 13 | TS | exercised |
| REQ-3.2-3 | 3.2 | cross-stack/oracle-safety-check | 13 | TS | partial |
| REQ-3.2-4 | 3.2 | cross-stack/oracle-safety-check | 13 | TS | exercised |
| REQ-3.2-5 | 3.2 | cross-stack/oracle-safety-check | 13 | TS | partial |
| REQ-3.2-7 | 3.2 | cross-stack/oracle-safety-check | 13 | TS | exercised |
| REQ-3.2-8 | 3.2 | cross-stack/oracle-safety-check | 13 | TS | partial |
| REQ-3.2-9 | 3.2 | cross-stack/oracle-safety-check | 13 | TS | exercised |
| REQ-3.3-1 | 3.3 | cross-stack/oracle-safety-check | 13 | TS | partial |
| REQ-3.5-1 | 3.5 | cross-stack/oracle-safety-check | 13 | TS | partial |
| REQ-3.5-2 | 3.5 | interop/aae-envelope | 4 | TS | partial |
| REQ-4-1 | 4 | cross-stack/oracle-safety-check | 13 | none | not exercised |
| REQ-4-2 | 4 | cross-stack/oracle-safety-check | 13 | none | partial |
| REQ-4.1-1 | 4.1 | actionref-canonical | 6 | none | not exercised |
| REQ-4.1-2 | 4.1 | actionref-canonical | 6 | none | not exercised |
| REQ-4.1-3 | 4.1 | actionref-canonical | 6 | TS | partial |
| REQ-4.1-7 | 4.1 | cross-stack/action-ref-v1-negatives | 14 | NODE | partial |
| REQ-4.1-8 | 4.1 | cross-stack/action-ref-v1-negatives | 14 | NODE | partial |
| REQ-4.2-1 | 4.2 | cross-stack/argentum-action-ref-v1v2 | 10 | PY | exercised |
| REQ-5.1-1 | 5.1 | cross-stack/receipts-aeoess | 2 | PY, PKG | partial |
| REQ-5.1-2 | 5.1 | cross-stack/receipts-aeoess, cross-stack/oracle-safety-check | 2, 13 | PY, TS | partial |
| REQ-5.1-3 | 5.1 | cross-stack/receipts-aeoess | 2 | PY, PKG | partial |
| REQ-5.2-1 | 5.2 | cross-stack/receipts-aeoess | 2 | PY | partial |
| REQ-5.3.1-1 | 5.3.1 | cross-stack/receipts-aeoess | 2 | none | partial |
| REQ-5.3.2-3 | 5.3.2 | cross-stack/oracle-safety-check | 13 | none | not exercised |
| REQ-5.4-1 | 5.4 | receipt-decision-relation | 7 | TS | partial |
| REQ-5.4-2 | 5.4 | receipt-decision-relation | 7 | none | not exercised |
| REQ-5.5-1 | 5.5 | cross-stack/oracle-safety-check | 13 | TS | partial |
| REQ-5.6-1 | 5.6 | cross-stack/oracle-safety-check | 13 | TS | partial |
| REQ-7.3-3 | 7.3 | cross-stack/token-exchange-attenuation-v0 | 12 | TS | partial |
| REQ-9-3 | 9 | cross-stack/aat-amdal | 5 | PY | partial |
| REQ-9-4 | 9 | cross-stack/action-ref-v1-negatives | 14 | NODE | partial |
| REQ-9-6 | 9 | interop/scitt-cose-vectors-ietf126 | not run | TS | partial |
| REQ-9-7 | 9 | composition/a2a-1496-negative-paths | 4 | TS | partial |
Reading the table. A vector count is the count for the file the inventory row names, not for every file in the family. Where a family carries dated files, the count is for the file cited. The oracle-safety-check rows share one 13-vector set and differ in which mutation of it the row reaches, so the counts do not add across rows. The scitt-cose row records a verifier that exists but needs an external test-vector checkout that is not in the tree, and the corpus records that run as skipped.¶
What this table does not establish. It does not establish that an exercised row means the requirement is correctly implemented anywhere, that a partial row is close to exercised, or that the ratio of the three results measures anything. It does not carry the 43 requirements with no fixture, so it is not a coverage summary.¶
The families below are named in the status blocks of Section 6 and Section 13. Five of them are named in Appendix D.1 as the vectors that exercise a requirement of this revision: accountability-record, authority-epoch-rollback, chain-selection-no-union, receipt-decision-relation and single-chain-selection. The rest carry no requirement identifier, because the inventory at Appendix D.2 covers the -03 text and these families were written against text proposed after it.¶
| Family | Vec | Counted from | Declared status |
|---|---|---|---|
| activation-not-established | 19 | cases | candidate_against_proposed |
| accountability-record | 12 | vectors | not declared in the vectors file |
| action-result-binding | 6 | cases | not declared in the vectors file |
| ancestor-revocation-chain | 4 | cases | not declared in the vectors file |
| approval-single-use | 9 | presentations | not declared in the vectors file |
| arap-binding | 27 | denial_binding_cases 12, approval_cases 10, pep_fallback_cases 5 | candidate |
| authority-epoch-rollback | 12 | cases | candidate |
| cached-authorization-revocation | 9 | cases | candidate |
| capability-binding-drift | 8 | presentations | candidate_against_proposed |
| chain-selection-no-union | 11 | cases | candidate_against_proposed |
| conflicting-status-sources | 14 | cases | candidate_against_proposed |
| instruction-provenance | 10 | vectors | not declared in the fixture file |
| issuance-refusal-expiry | 8 | part_a_issuance 5, part_b_verification 3 | not declared in the vectors file |
| key-rotation-historical | 5 | cases | not declared in the vectors file |
| lifecycle-conferral-without-authority | 10 | vectors | not declared in the vectors file |
| lifecycle-credential-events | 42 | cases | candidate_against_proposed |
| lifecycle-identifier-reuse-and-rename | 13 | presentations | candidate_against_proposed |
| lifecycle-legal-regulatory-events | 44 | vectors | not declared in the vectors file |
| lifecycle-multiple-principals-and-conflict | 92 | vectors | candidate_against_proposed |
| lifecycle-outside-the-chain-standing | 22 | vectors | candidate_against_proposed |
| lifecycle-principal-events | 32 | cases | candidate_against_proposed |
| merkle-root-parity | 6 | vectors | not declared in the vectors file |
| read-fidelity-receipt | 8 | vectors | not declared in the fixture file |
| receipt-decision-relation | 7 | one file per vector | not declared in a vectors file |
| revocation-resolution-forward-compat | 14 | cases | not declared in the vectors file |
| runtime-authority-denial-continuity | 9 | cases | not declared in the vectors file |
| single-chain-selection | 6 | cases | not declared in the vectors file |
| suspension-cause-composition | 16 | cases | candidate_against_proposed |
The cross-stack group named in the protocol adapter class is not one family. At the pinned commit it holds nine external-system families and two lab-authored regression families, each admitted under its own evidence document and each declaring its own verification split. They are not counted as a single number here for the same reason the corpus refuses a suite-wide support number.¶
Counted from. The Counted from column names the key in the family's vectors file that the count was taken from. The key differs by family because the unit differs, which is the same reason Section 13.5 gives for refusing a total. A count in this table is a count of entries under one named key and is not comparable across rows.¶
Declared status. The value is read from the family's vectors file, from its status member or its label member. Where a file carries both and they differ in spelling, the longer spelling is recorded, which is the reading the corpus itself states for the two families that do this. Not declared in the vectors file means the file carries neither member. That does not mean the family has no status, and several state one in the README only.¶
Every family in this table is run by the repository's own test entry point at the pinned commit, which is a fact about the package manifest at that commit rather than an observation of a run.¶
What this table does not establish. It does not establish that any family passed, that the families listed are a complete set for this document, or that vector counts measure the strength of a family. A family with 92 vectors is not four times the family with 22.¶