| Internet-Draft | EP Bounded Capabilities | September 2026 |
| Schrock | Expires 13 March 2027 | [Page] |
Agents sometimes need bounded authority to perform more than one consequential action without obtaining a new human approval for every operation. A signed token alone cannot enforce a shared budget across replicas, survive retries safely, or distinguish an operation that never crossed an effect boundary from one whose outcome is unknown.¶
This document defines a bounded capability receipt and a durable reserve-admit-reconcile protocol. The receipt binds an issuance authorization, a closed action scope, a budget with explicit units, a holder proof, an expiry, and any parent capability. The state protocol atomically refuses overspend and operation-key replay, fences concurrent owners, and charges an indeterminate operation when an external effect may have occurred. Delegation transfers rather than copies authority: all direct child allocations are funded by committed parent operations before child registration, and their aggregate cannot exceed the parent balance within one authoritative atomic state domain. It also defines narrowing-only delegation, explicit revocation inheritance for delegated authority, an optional admission-control epoch that can freeze new consequence admission, and evidence interfaces. It does not make a bearer token into human approval, does not provide cross-domain or offline global double-spend prevention, and does not claim that an authorized action was safe, lawful, or successfully executed.¶
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 13 March 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.¶
A single-action authorization receipt is intentionally narrow: it records approval of one exact action and can be accepted at most once within its atomic consumption domain. Some agent deployments also need a different primitive. For example, an operator may authorize an agent to purchase a bounded class of supplies, subject to an aggregate monetary ceiling and an expiry, without asking a human to approve each conforming purchase.¶
That primitive has two inseparable parts:¶
The signed object without the state machine is replayable budget metadata. The state machine without a signed, scoped grant has no portable statement of authority. This document specifies their composition.¶
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.¶
This document defines issuance binding, action-scope evaluation, budget accounting, holder proof, durable reservation and commitment, narrowing delegation, and an optional admission-control epoch inside the authoritative state domain. It does not define user authentication, human-approval presentation, general policy syntax, payment clearing, settlement, currency conversion, revocation distribution, or the external effect adapter.¶
A capability receipt is machine authority evidence. It is not, merely by being signed, evidence that a human reviewed each later action. Deployments that require per-action human authorization continue to require a per-action authorization artifact.¶
When a capability may be exercised by more than one executor, every executor MUST use the same relying-party-pinned authoritative atomic state domain. A deployment that cannot enforce that binding MUST restrict the capability to one executor or state only a per-executor budget guarantee.¶
active or frozen status and a monotonically increasing
admission epoch. This term is local execution-control state. It is not
the organizational-independence use of "control domain" in evidence
or witness profiles.¶
The relying party selects capability-issuer keys, accepted issuance authorization profiles, scope profiles, state-store domain, and local authorization policy. A key embedded in a presented capability receipt MUST NOT, by itself, become a trust anchor. An empty trust configuration MUST fail closed.¶
The capability store is trusted to serialize state transitions and retain committed operation records. The effect adapter is trusted to place the effect boundary correctly and to report outcomes honestly. This protocol makes those trust dependencies explicit; it does not remove them.¶
All capability-store participants that can authorize a capability or allocate, register, reserve, commit, reconcile, revoke, or report any ancestor or descendant drawing on that capability's authority MUST use one shared authoritative atomic state domain. Independent stores cannot prevent each other from accepting or reallocating the same remaining authority. Conservation claims in this document apply only inside that one domain.¶
A deployment may have multiple executor instances, settlement adapters, or process replicas. If they can exercise the same capability, each MUST resolve the same state domain before admission and use that domain for the budget transition. An executor's local record of prior spending is not an authoritative aggregate record. If the deployment cannot make the shared-domain guarantee, it MUST either name exactly one executor in the applicable scope or describe the limit as per-executor and MUST NOT claim aggregate conservation across executors.¶
When the admission-control epoch profile in this document is used, the domain status, epoch, capability state, applicable allowance status, and operation state MUST be serialized in the same authoritative transaction domain. A cached or freshness-bounded status check outside that transaction cannot establish immediate freeze behavior.¶
The receipt is a JSON object serialized using the JSON Canonicalization Scheme (JCS) [RFC8785] before signing. The following is illustrative:¶
{
"@version": "EP-BOUNDED-CAPABILITY-v1",
"capability": {
"capability_id": "cap_01J...",
"issuer": "https://operator.example",
"subject": "agent:procurement-7",
"authorization": {
"receipt_id": "rcpt_01J...",
"receipt_digest": "sha256:4c..."
},
"scope": {
"profile": "urn:emilia:scope:caid-set-v1",
"value": {
"caids": ["caid1:sha256:..."]
},
"digest": "sha256:8a..."
},
"budget": {
"amount": 250000,
"unit": "iso4217:USD",
"scale": 2
},
"holder": {
"method": "sha-256-preimage",
"commitment": "sha256:91..."
},
"threshold": {"m": 2, "n": 3},
"revocation_mode": "cascade",
"parent": null,
"not_before": "2026-07-18T20:00:00Z",
"expires_at": "2026-07-19T20:00:00Z"
},
"capability_signature": {
"algorithm": "Ed25519",
"public_key": "base64url...",
"value": "base64url..."
}
}
¶
@version:EP-BOUNDED-CAPABILITY-v1.¶
capability_id:issuer:subject:authorization:scope:profile and value.¶
budget:iso4217:USD with scale 2, an amount of
250000 denotes USD 2500.00. Implementations MUST NOT
infer a scale from display conventions. The represented value is
amount * 10^-scale; increasing scale therefore reduces the
maximum representable major-unit value. A profile
MUST refuse an amount-and-scale combination that
cannot represent its declared operating range. This version does not
encode arbitrary-precision decimal values.¶
holder:threshold:m and n satisfying
1 <= m <= n <= 255. This field describes custody of the
holder credential; it does not assert approval by distinct humans.¶
revocation_mode:direct or cascade. A direct revocation
affects the named capability but does not withdraw authority already
transferred to a registered child. A cascade revocation also blocks
new authority claims by every descendant. The value is signed and
MUST NOT be inferred from the issuer, holder, lineage
depth, or a presenter-selected default. A missing or unknown value
MUST be rejected.¶
parent:null for a root capability. For a child capability,
an object containing the parent capability ID, the digest of the
complete signed parent receipt, and the identifier of an
authenticated parent delegation operation. That operation
MUST bind the child receipt digest and the delegated
amount, unit, scale, scope, validity interval, and revocation mode.
A parent identifier without digest-bound parent and delegation evidence is
insufficient.¶
not_before and expires_at:The issuer signature input is the JCS serialization of the object
containing exactly @version and capability. The
signature algorithm for this version is Ed25519
[RFC8032]. The receipt digest is:¶
SHA-256(JCS({
"@version": receipt["@version"],
"capability": receipt.capability,
"capability_signature": receipt.capability_signature
}))
¶
The issuance authorization is bound by both its identifier and digest. Binding only a caller-selected receipt identifier is insufficient because two different artifacts can carry the same identifier.¶
A verifier MUST perform all of the following and fail closed on any error:¶
Receipt verification returns VERIFIED. It does not return
AUTHORIZED, prove remaining budget, or prove that a proposed
operation is in scope.¶
The issuance authorization MUST authorize the act of creating the capability, including the immutable digest of its subject, scope, budget, holder commitment, revocation mode, parent, and validity interval. It MUST NOT be reused as though it were a per-operation authorization for later spends.¶
When the issuance artifact is an EMILIA Authorization Receipt, its exact action is capability issuance and its one-time consumption occurs when the capability is registered. Later capability-funded operations are governed by this document's scope and durable state protocol.¶
Before reserving budget, the enforcement point MUST
compute the proposed material action independently of presenter-supplied
labels and invoke the pinned verifier for scope.profile. A
missing profile, unknown action representation, lossy mapping, or
undecided comparison MUST refuse.¶
The mandatory-to-implement
urn:emilia:scope:caid-set-v1 profile contains a non-empty,
duplicate-free array of Canonical Action IDentifiers. It matches only
exact identifier equality. For delegation, a child CAID set is no
broader than its parent only when every child identifier is an exact
member of the parent set. Equality of the complete sets is allowed.
This non-strict subset relation is reflexive and transitive. Possession
of a CAID authorizes nothing outside this verified capability
context.¶
Application profiles can define closed constraints over typed action
fields. Such a profile MUST specify canonicalization,
exact value equality, comparison, unknown-field handling, numerical
units, and an algorithm for deciding whether a delegated scope is no
broader than its parent. The profile MUST state whether
that attenuation relation is reflexive and whether it is transitive.
It MUST classify the basis for any transitivity claim as
one of: definition-derived, mechanically-checkable, or
asserted. A mechanically checkable claim
MUST define a finite domain and deterministic procedure
by which a verifier or conformance suite can enumerate the required
triples. An asserted claim is profile-author testimony, not a
demonstrated algebraic property.¶
Every profile identifier used in a signed scope MUST identify immutable comparison semantics. An identifier fixed by immutable standards text satisfies this requirement. Any other application-profile identifier MUST be content-addressed. A mutable alias or version label alone is insufficient. The relying party MUST pin the exact profile definition selected by that identifier and refuse if the definition cannot be resolved without ambiguity or has changed.¶
Action membership and attenuation are separate decisions. Membership
returns IN_SCOPE, OUT_OF_SCOPE, or
UNDECIDED. Attenuation returns NO_BROADER,
BROADER, or UNDECIDED. A composite scope is no
broader only when every mandatory component returns
NO_BROADER. Any BROADER component makes the composite
broader; otherwise any UNDECIDED component makes the composite
UNDECIDED. Each component's result MUST
remain visible even when a decided negative component determines the
composite result. Missing components MUST NOT be treated
as successful comparisons.¶
An UNDECIDED comparison MUST state why
the deciding verifier could not establish a result. In particular, the
report MUST distinguish these two reasons:¶
NO_COMPARISON_RELATION:PROFILE_NOT_HELD:These two reasons do not exhaust possible evaluation failures.
Other causes of UNDECIDED MUST be stated
without mislabeling them as either reason above. A remedied comparison
MUST use the required exact inputs and relying-party
trust policy and produce a new result distinct from the earlier
UNDECIDED report. Substituting another profile does not repair
the original comparison. Until the required current comparison
succeeds, registration or admission MUST refuse.¶
LOCAL_ONLY is a composition status for a decided
current-hop comparison, separate from its NO_BROADER or
BROADER result. It is not a fourth attenuation result or a
substitute for UNDECIDED. An unavailable current comparison
MUST NOT be labeled LOCAL_ONLY merely
because a prior comparison or transitivity record exists. A negative
local result remains negative regardless of its composition status.¶
A verifier MUST NOT promote per-hop comparisons into a
chain-wide non-widening claim unless transitivity is either derived
from the relation definition or mechanically established over the
profile's complete declared finite domain. A decided comparison under a
non-transitive, asserted-transitive, or unknown-transitivity relation
is LOCAL_ONLY to the reported hop. It can be useful evidence,
but it does not compose by induction across a delegation chain.¶
A definition-derived classification is permitted only when
the immutable profile definition specifies a relation whose
transitivity follows by construction. Merely labeling a relation
transitive, including in authenticated profile metadata, is an
asserted basis. For a mechanically established classification,
every scope value used in the composed chain MUST be a
member of the exact finite domain covered by the establishment record.
A value outside that domain makes the mechanical result inapplicable to
that chain.¶
For a mechanically established result, the verifier
MUST disclose whether it performed the complete
enumeration itself or relied on a prior conformance run. The
establishment record MUST identify the runner, completion
time, immutable profile and relation-rule identifiers and content
digests, the canonical encoding, digest algorithm, digest, and
cardinality of the complete declared finite domain, the deterministic
procedure identifier, version, and content digest, and the result.
A verifier relying on a prior run MUST authenticate and
integrity-check that record and MUST accept the runner
under relying-party-pinned trust policy. A self-authenticated or
otherwise untrusted runner is insufficient. If the record is
unavailable, invalid, untrusted, or
does not cover the pinned profile's complete declared finite domain, the
verifier MUST NOT use it for chain composition. A separately performed, decided current
per-hop comparison may still be reported LOCAL_ONLY. If the
current comparison is unavailable, the verifier MUST
report UNDECIDED and refuse registration or admission. This
requirement does not require enumeration at admission time.¶
A verifier relying on a prior run MUST compare the
establishment record's profile and relation-rule content digests,
complete-domain encoding, digest algorithm, digest, and cardinality,
and deterministic procedure identifier, version, and content digest
with the exact profile, rule, domain, and procedure selected for the
current evaluation. A mutable version label without an immutable content
binding is not an exact match. A mismatch, or an inability to perform that
comparison, makes the record stale for this evaluation. Authenticated
integrity proves what the earlier run reported; it does not establish
that the earlier result remains applicable after a profile, rule,
domain, or procedure revision. A stale record MUST NOT
support a chain-wide non-widening claim and contributes no current
comparison result. A verifier may report LOCAL_ONLY only after
it separately performs the current per-hop comparison; if it cannot do
so, it MUST report UNDECIDED.¶
Reliance on an authenticated, matching prior conformance run is deliberately permitted. This document assigns no automatic trust rank to verifier-performed enumeration and relied-on enumeration; the disclosed reliance mode lets the relying party apply its own policy. Implementations SHOULD NOT repeat an otherwise acceptable complete enumeration solely to avoid reporting the relied-on mode.¶
For each mandatory component of a delegation path containing more
than one edge, every adjacent comparison used for a chain-wide claim
MUST use the same immutable profile definition,
relation-rule definition, finite-domain identity where applicable, and
transitivity basis. Transitivity established separately for two
different relations does not prove that those relations compose. This
document defines no cross-relation composition rule. When a path changes
any of those relation inputs, its decided adjacent results remain
LOCAL_ONLY across that boundary; an unavailable current
comparison remains UNDECIDED.¶
A LOCAL_ONLY report may be retained as diagnostic
evidence, but it MUST NOT establish descendant authority
across a path of more than one delegation edge. Registration or
admission of that descendant MUST refuse when a required
current comparison is BROADER or UNDECIDED, or
when chain composition cannot be established. Failure to establish
composition does not turn a decided local result into
UNDECIDED; the report retains its LOCAL_ONLY
composition limit and the descendant request is refused. A single
delegation edge requires a current NO_BROADER comparison but
does not require transitive induction. Neither result replaces the
other authorization and state checks required by this document.¶
Scope comparison is evaluated per component and relative to the
verifier that produced it. A comparison report MUST
record each component, the deciding verifier, the required immutable
profile identity, the values compared, and the local result. The report
MUST also record the pinned rule, relation reflexivity,
transitivity classification and basis, and any mechanical-establishment
record and reliance mode, or explicitly identify unavailable or
undefined profile-derived information instead of fabricating it.
For PROFILE_NOT_HELD, profile-derived information that the
verifier cannot establish MUST be identified as
unavailable. For NO_COMPARISON_RELATION, the applicable
component relation MUST be identified as not defined
under the governing profile; its reflexivity or transitivity
MUST NOT be invented.¶
A decided attenuation result MUST record whether its
composition status is LOCAL_ONLY or chain-composable. An
UNDECIDED report MUST NOT assert either
composition status and MUST record its reason,
including the distinction between NO_COMPARISON_RELATION
under the governing profile and PROFILE_NOT_HELD by the
deciding verifier. Mandatory-profile components MUST
be reported rather than assumed. A structural chain result and a scope
comparison result MUST NOT be combined into an overall
validity claim unless both reports, including their decidability and
composition limits, travel with the claim.¶
Profiles that intentionally use a non-reflexive relation
MUST state that an unchanged scope will be refused.
Profiles that cannot decide either action membership or attenuation
MUST return UNDECIDED.¶
The following examples illustrate the result and composition distinctions. They do not define a new wire format or establish implementation or interoperability evidence.¶
No relation under the governing profile.
A pinned profile defines action membership for its purpose labels
but supplies no attenuation relation between the distinct labels
research and marketing. A verifier holding that
definition reports attenuation UNDECIDED with reason
NO_COMPARISON_RELATION for that component. It does not
invent a broader/narrower ordering or claim that no other profile
could define one. The required delegation comparison has not
succeeded, so registration or admission is refused.¶
Exact profile not held. A signed scope
identifies an immutable profile whose exact definition the verifier
lacks. The verifier reports UNDECIDED with reason
PROFILE_NOT_HELD, not
NO_COMPARISON_RELATION. Obtaining and validating the
exact definition under relying-party policy permits a new
evaluation; it does not predetermine NO_BROADER or
IN_SCOPE. Execution still requires every applicable
authorization and state check.¶
Decided hops without composition. A
profile over the complete domain {A, B, C} defines
reflexive attenuation and permits B under A
and C under B, but not C under
A. The two current adjacent comparisons each return
NO_BROADER with composition status
LOCAL_ONLY; the relation is non-transitive and cannot
justify the root-to-grandchild claim. Descendant registration or
admission is refused. If a current adjacent comparison cannot be
performed, that comparison is instead UNDECIDED; an
earlier or stale record does not supply a local result.¶
The mandatory-to-implement holder method is
sha-256-preimage. The holder presents exactly 32 bytes over a
confidential, integrity-protected channel, and the enforcement point
compares SHA-256(preimage) with the signed commitment using a
constant-time comparison. The preimage MUST NOT be
logged, stored with the receipt, or included in portable evidence.¶
This method is intentionally a bearer-equivalent interoperability baseline. Any party that learns the preimage can exercise the remaining capability subject to its scope, budget, status, and validity. A deployment whose threat model requires non-exportable holder custody or per-operation proof of possession SHOULD select an operation-bound signature method, such as the method below, or an application profile defining a hardware-bound holder method. Those stronger properties MUST NOT be inferred from the preimage method.¶
This version additionally defines
ed25519-operation-proof. For that method,
holder.commitment is the lowercase
sha256:<64-hex> digest of the 32-byte Ed25519 public key.
The exercise proof carries that raw public key and a 64-byte Ed25519
signature, each encoded as unpadded base64url
[RFC4648]. The verifier MUST decode both
values strictly, compare the public key digest with the signed holder
commitment, and verify the signature over the UTF-8 JCS serialization of
this closed object:¶
{
"@version": "EP-BOUNDED-CAPABILITY-HOLDER-PROOF-v1",
"capability_receipt_digest": "sha256:<64-hex>",
"operation_id": "<operation identifier>",
"exercise_action_digest": "sha256:<64-hex>",
"amount": 1,
"unit": "<signed budget unit>",
"scale": 0,
"audience": "<relying-party-pinned executor audience>",
"state_domain_digest": "sha256:<64-hex>"
}
¶
Every value in that object MUST be taken from the independently verified receipt, immutable exercise snapshot, and relying-party configuration used by the reservation. Presenter-supplied replacements MUST NOT be accepted. Replaying the same signed request is refused by the capability-scoped operation key; changing the operation ID, action, amount, unit, scale, audience, or state domain requires a new signature. This proof establishes control of the committed key for that reservation request. It does not establish a human gesture, comprehension, or approval ceremony.¶
For ed25519-operation-proof, the portable
threshold value MUST be m=1, n=1.
Threshold or hardware custody behind the committed Ed25519 public key is
an implementation property and does not become a portable multi-party or
human-approval claim.¶
The preimage may be divided using a threshold secret-sharing scheme
before presentation. Share format, participant authentication,
confidentiality, recovery, and distribution are outside this document.
Reconstructing m shares proves control of the holder secret; it
does not prove that m distinct humans reviewed or approved the
action. Human multi-party approval requires a protocol such as
[EP-QUORUM].¶
After receipt verification and one-time consumption of the issuance
authorization, the issuer registers the capability in the authoritative
store. Registration MUST atomically create immutable
fields for capability ID, receipt digest, unit, scale, total budget,
scope digest, validity interval, revocation mode, and parent. It
MUST initialize consumed and
reserved to zero.¶
A second registration of the same capability ID MUST succeed only when every immutable field and receipt digest is identical. Any mismatch is a collision and MUST refuse.¶
Consumption of the issuance authorization and registration of its exact capability receipt MUST form one idempotent logical operation bound to the capability receipt digest. If both transitions cannot share one atomic state transaction, the issuance-authorization consumption record MUST identify the registration operation and exact capability receipt digest, and both domains MUST retain enough state to query and reconcile an ambiguous result. A crash after consumption MUST NOT permit the authorization to issue a different capability or to be silently restored.¶
A deployment using separate domains for those two transitions MUST identify a concrete reconciliation profile that defines its durable states, authenticated queries, exact-digest join, retry behavior, and terminal ambiguous result. In the absence of such a profile, consumption and registration MUST occur in one authoritative atomic state transaction.¶
Retry of that registration may return the existing identical
capability only after verifying the same issuance-consumption record.
An absent or conflicting record MUST refuse or return
INDETERMINATE; it MUST NOT create a second root
capability from uncertain issuance state.¶
Mutable counters in a presented receipt are not authoritative. Remaining budget is computed only from the shared store:¶
remaining = total - consumed - reserved¶
The authoritative state MUST maintain the invariant
reserved + consumed <= total for every capability. For a
parent capability, each registered child allocation
MUST be covered by one or more distinct terminal
delegated operation committed against that parent before child
registration. The aggregate amount of registered direct children
MUST NOT exceed the amount committed by those distinct
parent delegation operations, and each operation identifier
MUST NOT fund more than one child receipt digest.¶
A reservation request contains the capability ID, capability
receipt digest, operation ID unique under that capability, the
immutable canonical exercise-action digest and CAID where used,
positive integer amount,
unit, scale, and authenticated holder proof. The same immutable action
snapshot MUST be used for scope evaluation,
authorization, reservation accounting, and the effect callback; a
mutable caller object MUST NOT cross those boundaries.
Validity and expiry MUST be evaluated from one
authoritative time sample obtained inside the same state transaction;
caller-supplied time is not authoritative.
The relying party MUST pin a positive maximum
pre-entry reservation interval. The store MUST derive
and record a provider-entry deadline equal to the earlier of capability
expiry and that authoritative transaction time plus the pinned
interval.
When the admission-control epoch profile is enabled, the store
MUST first load and lock the selected
admission-control domain, require status active, and capture
its current epoch in the operation record. In one serializable
transaction, or while holding an equivalent row
lock, the store MUST:¶
revocation_mode equal to cascade;¶
total - consumed - reserved;¶
reserved by the amount; and¶
reserved with an
unguessable reservation token, exercise-action digest, amount, and
provider-entry deadline, plus the admission-control domain and
captured epoch when that profile is enabled, and return the token
only to the owner.¶
Scope evaluation and local authorization policy MUST succeed before the effect adapter is entered. Deployments SHOULD perform them before reserving to reduce abandoned reservations.¶
The enforcement point enters the effect adapter only after a successful reservation. It MUST NOT expose an alternate path to the same effect that bypasses capability enforcement when the action requires this profile.¶
Immediately before provider entry, the store
MUST atomically verify reservation ownership, verify that
its authoritative transaction time is earlier than the recorded
provider-entry deadline, and recheck current capability and applicable
allowance state. This check MUST recheck direct revocation
and every authority-bearing cascade-mode ancestor in the same atomic
state domain, as specified in Section 12.1.
A reservation does not freeze revocation status. When the
admission-control epoch profile is enabled,
the same transaction MUST require domain status
active and equality between the current epoch and the epoch
captured at reservation. On success, that transaction
MUST record that provider entry has begun, decrease
reserved, and increase consumed by the same amount
before the effect adapter is invoked. A
reservation that has reached its deadline MUST NOT enter
the effect adapter. A serialized absence of the provider-entry marker
after the deadline is authoritative proof of non-entry and may drive the
not_entered transition in
Section 10.4.¶
A frozen domain, epoch mismatch, capability revocation, or current
allowance refusal can establish not_entered only when the same
transaction authenticates the reservation owner and proves that the
operation remains reserved. It then decreases
reserved without increasing consumed and retains the
operation as a replay tombstone. A wrong holder, missing authoritative
state, or conflicting operation state MUST NOT release
another owner's reservation or assert non-entry. It must refuse provider
entry and retain the operation for authenticated recovery.¶
For an external effect, a commit request contains the operation ID,
reservation token, and outcome executed or
indeterminate. In one atomic transaction, the store
MUST verify ownership and state
provider_entered and make the operation terminal. It
MUST NOT debit the budget again; the reserved amount
became consumed at provider entry.¶
A delegated operation does not enter an external effect
adapter. Its atomic terminal transition verifies ownership and state
reserved, rechecks the funding capability's direct revocation
and every authority-bearing cascade-mode ancestor, decreases
reserved, increases
consumed by the same amount, and binds the child registration
described in Section 12. This funding commitment is
the authority-transfer cutoff for a delegated operation. If applicable
revocation commits first, the store MUST refuse the
transfer and may release the reservation only after authenticating
its owner and proving that no child authority was committed. If the
funding commitment commits first, its debit remains consumed;
subsequent child use follows the signed direct or cascade mode.
Retrying child registration for that same committed transfer does
not create another allocation or reopen the parent debit.¶
A repeated commit, wrong reservation token, or external-effect
commit against an operation not in provider_entered
MUST refuse. A caller timeout
does not justify retrying with a new operation ID; the caller
MUST query the original operation or reconcile it.¶
If the executor cannot prove that the effect boundary was not
crossed, it MUST commit
indeterminate. The budget remains consumed from provider
entry. Availability loss is
safer than allowing the same authority to be spent again after an
unobserved external effect.¶
Capability expiry or the provider-entry deadline prevents a new provider entry; it does not invalidate accounting for an operation that entered the provider beforehand. Such an operation MUST remain committable or reconcilable after those instants. This closes an already admitted attempt and does not extend authority to begin another effect.¶
Reservations survive process and replica failure. A deployment
MUST define a reconciler for non-terminal operations.
The reconciler may commit executed only with authenticated
effect evidence. It may restore budget only when it can prove the
effect boundary was never crossed while the operation remains
reserved. An operation in provider_entered has already
consumed its budget and MUST NOT restore it merely
because outcome evidence is unavailable. In every other case it
MUST commit indeterminate.¶
When non-entry is proved, the store MUST use one
atomic transition to verify the reservation owner and exact action,
decrease reserved without increasing consumed, and
make the operation terminal with outcome not_entered. The
operation key and its action binding MUST remain as a
replay tombstone after budget restoration. A later presentation of
that operation key MUST NOT create a new reservation.
Repeated reconciliation is idempotent only for the same terminal
outcome and authenticated evidence binding.¶
The state domain is a relying-party trust input. A portable capability receipt need not embed a globally meaningful domain identifier, but the registration and operation records SHOULD identify the domain and executor participant used for each admission so that a relying party can detect an unsupported state fork.¶
When multiple executors are authorized to present one capability, the store MUST serialize their reservations and commitments in one domain. Merely replicating a signed receipt, copying a remaining counter, or exchanging eventual spending logs does not satisfy this requirement. A deployment that uses independent stores may still use signed receipts, but it MUST NOT describe the resulting behavior as one aggregate budget.¶
A scope that names one executor is a valid narrower deployment choice. The applicable scope profile MUST define how that executor participant is identified and compared at admission. This removes the cross-executor guarantee requirement; it does not turn a local record into a global budget or provide offline double-spend prevention.¶
A deployment MAY partition one authoritative state domain into
admission-control domains. A freeze is an exact-action-authorized,
idempotent transition that changes one domain from active to
frozen and advances its admission epoch. The transition
MUST serialize against both reservation and provider
entry. A freeze that commits before reservation refuses that
reservation. A reservation that commits first remains owned, but a
freeze that commits before its provider entry causes authenticated
non-entry and budget release. Provider entry that commits first has
consumed the authority and cannot be relabeled by the freeze.¶
An idempotent freeze retry MUST authenticate the request before revealing a prior result and MUST match the admission-control domain, event type, exact action digest, operation identifier, and authority-instance digest of the committed transition. The operation identifier is not a bearer token. A conflicting authority instance or action under the same identifier MUST refuse without returning the prior result.¶
For an exact retry, authentication means verifying the same signed
authority instance and exact control action that the committed record
names. The retry remains resolvable after that authority instance has
been consumed or has expired; it does not require unused budget and
MUST NOT consume again. A new freeze transition requires
currently valid authority and atomically consumes its configured unit
in the same state-domain transaction that advances the epoch. A
distinct authorized request received while the domain is already
frozen reports already_frozen without advancing the epoch or
appending another transition event.¶
When an automated detector uses a bounded capability to request a freeze, its scope MUST identify the admission-control domains it can freeze, its action scope MUST be limited to the freeze transition, and its budget and validity MUST be finite. That capability MUST NOT authorize restoration. Exhaustion refuses a new automatic freeze; paging or escalation is a separate operational action whose delivery and human acknowledgment must not be inferred from transport acceptance.¶
Restoration is a separately authorized transition from
frozen to active that advances the epoch again. It
MUST NOT revive a reservation captured under an earlier
epoch or automatically recreate credentials revoked during the
freeze. Evidence bound to an operation that entered before the freeze
remains usable only to reconcile that immutable operation.¶
This profile stops new admission inside the owning atomic state domain. It does not stop computation, undo an external effect, or provide instant freeze across a disconnected state domain. A leased edge profile must state the maximum stale-admission window as the remaining lease lifetime plus the declared relative clock uncertainty and local enforcement delay.¶
A child capability MUST NOT outlive its parent, exceed the authenticated amount delegated from the parent, change unit or scale, or broaden the parent's scope. Its delegation chain MUST be bounded by deployment policy and MUST include the parent receipt digest.¶
Before registering a child, the verifier MUST validate complete digest-linked ancestry to a trusted root within the configured depth bound, or enforce equivalent authenticated parent-edge constraints in one authoritative store. The verified lineage MUST form a simple path. The verifier MUST reject a repeated capability identifier or receipt digest, a missing or inconsistent parent, a substituted or reordered edge, or a chain whose trusted root cannot be established. A cycle, truncated lineage, or over-depth chain MUST fail closed. Per-receipt identifier uniqueness or a self-declared list of ancestors does not establish graph-wide acyclicity. An implementation MUST NOT infer acyclicity merely because its ordinary issuance path constructs children from known parents; verification applies the same check to imported and reconstructed chains.¶
Creating a child is itself a parent-funded operation. Before
registering the child, the issuer MUST reserve the
delegated amount from the parent and MUST commit that
exact reservation once with outcome delegated. The
authenticated terminal operation record MUST bind the
exact child receipt digest, delegated amount, unit, scale, scope,
validity interval, and revocation mode before the child is
registered; otherwise a valid parent spend could be paired with a
different child. A shared store
SHOULD perform parent commitment and child registration
atomically. If that is impossible and child registration fails after
the parent is committed, the parent budget remains consumed and the
orphaned delegation MUST be retained for reconciliation.
The system MUST NOT silently refund it.¶
Delegation transfers bounded authority rather than leaving every
child as a live reference to its parent. Direct revocation of an
ancestor therefore does not, by itself, determine whether authority
already transferred to registered descendants survives. The signed
revocation_mode field makes that choice explicit.¶
When a capability's revocation_mode is
direct, revoking that capability MUST prevent
new reservations and child allocations funded by that capability. It
MUST NOT, solely because of that revocation, invalidate
a child registered before the revocation committed. The child remains
subject to its own validity, scope, budget, direct revocation, and any
cascade-mode ancestor.¶
When a capability's revocation_mode is
cascade, revoking that capability MUST prevent
every descendant from making a new reservation or funding a new child.
The enforcement point MUST establish the current
revocation state of every authority-bearing cascade-mode ancestor in
the same authoritative atomic state domain used for the descendant
reservation. A cached status value or eventually consistent
notification does not establish immediate cascade revocation.¶
Direct revocation of the exercised capability and revocation of
every authority-bearing cascade-mode ancestor MUST
serialize with both reservation and provider entry in that state
domain. Revocation that commits first prevents a new reservation.
Revocation that commits after reservation but before provider entry
MUST prevent entry. Only the authenticated reservation
owner may establish not_entered, release the held amount,
and retain the replay tombstone under Section 10.2.
If provider entry commits first, later revocation prevents new
authority claims but MUST NOT release consumed
authority, relabel an effect, or authorize a retry. An unresolved
effect remains subject to Section 10.4.¶
This entry-time rule does not change direct-mode descendant independence. Revocation of a direct-mode ancestor alone does not invalidate a previously registered descendant; the descendant's own revocation and every cascade-mode ancestor still apply.¶
If complete current ancestor state cannot be established before reservation or provider entry, the request MUST refuse without entering the effect adapter. Missing status alone does not authorize release of an existing reservation; retain it for authenticated recovery unless the store separately proves non-entry. This is a pre-effect status failure, not evidence that an external effect is indeterminate. A deployment using separate state domains or freshness-bounded status distribution MUST NOT claim immediate cascade revocation across those domains.¶
Neither mode grants a grace period after revocation. Continued or wind-down authority MUST be established by a separate authorization with its own exact scope, budget, holder, and validity interval; it MUST NOT be inferred from an in-flight delegation. This document defines the consequence of an authenticated revocation within one state domain. It does not define who is entitled to revoke, how revocation is distributed, or how independently operated domains transfer exclusive admission ownership.¶
A capability receipt can be VERIFIED. A scope verifier can
return the profile-local result IN_SCOPE,
OUT_OF_SCOPE, or UNDECIDED. This containment
result is not the architecture's MATCH state, which is reserved
for correlation of exact material actions. A relying-party evidence
requirement can be SATISFIED. Successful local policy and an
atomic reservation together can establish AUTHORIZED for one
exercise. Separately authenticated effect evidence can establish
EXECUTED. No earlier state implies a later one.¶
UNDECIDED describes an unavailable scope-comparison
decision. It does not replace runtime execution
INDETERMINATE or the indeterminate operation
outcome after possible provider entry. That outcome retains the
accounting and reconciliation rules in
Section 10. Neither label is an authorization.¶
Portable evidence for a capability-funded operation SHOULD include the capability receipt digest, issuance authorization digest, scope profile and digest, operation ID, the exact exercise action digest and CAID where used, amount, unit, scale, reservation timestamp, terminal outcome, and any authenticated effect statement. The integrity-protected operation record MUST bind the exercise action and the capability receipt digest. Holder secrets and reservation tokens MUST NOT be included.¶
An Authorization Evidence Chain may carry that operation record as a native component whose verifier recursively verifies the capability receipt, issuance authorization, scope result, and operation-record integrity. The static grant is not a same-action component for every later exercise. Evidence satisfaction does not query or reserve current budget; that state transition remains at the enforcement point.¶
Implementations SHOULD expose stable, non-authorizing failure codes including:¶
capability_untrusted_issuer¶
capability_authorization_mismatch¶
capability_scope_mismatch¶
capability_scope_indeterminate¶
capability_holder_proof_invalid¶
capability_not_active¶
capability_expired¶
capability_revoked¶
capability_revocation_mode_invalid¶
capability_ancestor_revoked¶
capability_ancestor_status_unavailable¶
capability_budget_exceeded¶
capability_delegation_lineage_invalid¶
capability_delegation_not_narrowed¶
capability_operation_replay¶
capability_reservation_owner_mismatch¶
capability_reservation_expired¶
capability_commit_indeterminate¶
A failure code is diagnostic output, not an authorization artifact. Responses SHOULD avoid revealing secret, budget, or scope details to an unauthenticated caller.¶
A conforming implementation MUST pass positive and adversarial vectors for receipt canonicalization and signature, authorization-digest substitution, untrusted issuer, unknown scope profile, action mismatch, holder-proof failure, duplicate registration, concurrent overspend, operation replay, wrong reservation token, double commit, expiry, a cycle spread across separately signed receipts, repeated ancestors, leaf-as-ancestor, missing or truncated lineage, reordered or substituted parent links, parent-receipt and delegation-operation substitution, a single-hop child exceeding the authenticated delegated amount, unit or scale changes, scope or validity widening at every hop, over-depth chains, parent over-allocation, crash recovery, and indeterminate-effect charging.¶
The conformance set MUST exercise revocation
inheritance over a root, child, and grandchild. It
MUST show that direct-mode revocation leaves previously
registered descendant authority independently usable, while cascade-mode
revocation refuses every later descendant reservation and child
allocation. It MUST reject a missing or unknown
revocation_mode, refuse when required ancestor state is
unavailable, and cover a race between ancestor revocation and descendant
reservation in which exactly one transition commits first. A
reservation that commits first remains owned pending the separate
provider-entry decision; a revocation that commits first prevents the
reservation.¶
The conformance set
MUST test reserve, revoke, then provider entry for both
direct leaf revocation and inherited cascade revocation. Both cases
MUST refuse entry and permit budget release only through
authenticated not_entered with a retained replay tombstone.
It MUST also test provider entry before revocation:
the amount remains consumed and outcome reconciliation remains
available without re-execution. A direct-mode ancestor revocation
alone MUST NOT refuse an otherwise valid descendant's
entry. Missing ancestor status and wrong-holder recovery attempts
MUST NOT silently release another owner's reservation.¶
The conformance set MUST also serialize applicable
revocation against a delegated funding commitment after
reservation. Revocation first refuses the new allocation; commitment
first preserves the parent debit and applies the signed revocation mode
to subsequent child use. Neither registration retries nor revoked
child use restore or duplicate the parent allocation.¶
The conformance set MUST also include multiple executor participants sharing one domain, an independent-store state fork, and a scope restricted to one executor; only the shared-domain case may claim one aggregate budget.¶
The scope-profile conformance set MUST show exact CAID equality and non-strict subset attenuation, including unchanged parent and child sets. For a profile whose relation is mechanically checkable, it MUST enumerate the complete declared finite domain and test reflexivity and transitivity. It MUST also include a relation that passes every adjacent hop but fails transitivity, and demonstrate that the verifier labels those hop results local-only and refuses to claim chain-wide non-widening. An asserted-transitive profile MUST NOT be reported as demonstrably transitive. The set MUST cover both a verifier-performed enumeration and reliance on an authenticated prior conformance run, and MUST refuse chain-wide promotion when that prior record is unavailable, invalid, or does not cover the complete declared finite domain.¶
The conformance set MUST include an authenticated prior record that differs from the current evaluation in the profile or rule content digest, complete-domain encoding, digest algorithm, digest or cardinality, or deterministic procedure identifier, version or content digest, and demonstrate that every such mismatch prevents chain-wide promotion. It MUST show that a stale record contributes no current local result, while a separately executed current comparison can still be reported local-only. It MUST also demonstrate that a matching prior record can support chain composition without repeating the enumeration, subject to relying-party policy.¶
The conformance set MUST reject an establishment record from an authenticated but untrusted runner, a record using the same mutable version label over different profile or rule content, a chain value outside the mechanically enumerated domain, and a multi-hop chain whose adjacent comparisons use different relations that are each independently transitive. It MUST demonstrate that a local-only multi-hop result cannot establish descendant authority.¶
The scope-profile conformance set MUST exercise
the three cases in Section 7.1. It
MUST distinguish a held profile without an applicable
component relation (NO_COMPARISON_RELATION) from a missing
exact profile definition (PROFILE_NOT_HELD), preserving
UNDECIDED and refusal in both cases. It
MUST show that profile retrieval alone does not authorize
execution, and that an accepted exact definition can yield a new
evaluation without treating the original report as a decided result.¶
The conformance set MUST demonstrate a decided
NO_BROADER hop with LOCAL_ONLY composition status,
refusal of a multi-edge descendant claim that lacks composition, and
refusal to substitute LOCAL_ONLY for an unavailable current
comparison. It MUST retain each mandatory component's
result when a BROADER component determines a composite result
beside another component's UNDECIDED. Membership
OUT_OF_SCOPE and attenuation BROADER
MUST NOT be conflated with UNDECIDED.
A scope-comparison failure MUST NOT relabel a recorded
execution outcome or restore budget consumed at provider entry.¶
The conformance set MUST cover a crash between issuance-authorization consumption and root-capability registration, an exact retry that resolves to the existing capability, and a conflicting retry that refuses. It MUST also show that authenticated proof of provider non-entry restores reserved budget while retaining a terminal replay tombstone, and that the same raw operation ID under a different capability is not by itself a replay. Reservation-lifetime cases MUST show refusal of provider entry at the deadline, recovery of an abandoned pre-entry reservation after the deadline, and successful terminal accounting after capability expiry for an operation whose provider entry was recorded beforehand. A split-domain root registration case MUST identify and exercise its concrete reconciliation profile; without one, the case MUST refuse the split deployment.¶
When the admission-control epoch profile is supported, the conformance set MUST exercise freeze-before-reservation, reservation-before-freeze with provider-entry refusal, provider-entry-before-freeze, epoch advance on restoration, wrong-holder refusal without release, and reconciliation of an operation admitted before freeze. It MUST demonstrate that provider entry moves one amount from reserved to consumed exactly once, outcome commit does not debit it again, and authenticated non-entry releases the held amount exactly once. An idempotency case MUST refuse a retry whose operation identifier matches but whose action or authority instance differs. It MUST also demonstrate that an exact retry returns the original result without a second budget consumption after the named authority has been consumed, while a new request requires current valid authority.¶
The conformance set MUST reject a holder preimage of the
wrong length or digest, and MUST demonstrate that a
captured valid preimage does not bypass scope, budget, status, validity,
operation replay, or provider-entry-deadline checks. It
MUST also reject an amount-and-scale combination outside
the operating range declared by the selected profile. For
ed25519-operation-proof, it MUST include a valid
proof and mutations of the public key, capability digest, operation ID,
action digest, amount, unit, scale, audience, and state-domain digest;
every mutation MUST refuse. It
MUST also refuse a portable threshold other than
m=1, n=1 for that method.¶
The parent-over-allocation case MUST include at least three sibling child-creation attempts whose individually valid amounts collectively exceed the parent's available balance, with concurrent reservation ordering chosen by the implementation. At most a balance-preserving subset may commit. The case MUST also cover one operation identifier presented for two different child receipt digests and an orphaned child-registration failure after parent commitment. The former refuses as operation replay; the latter leaves the committed parent amount consumed pending reconciliation.¶
A wire-format implementation that does not implement one shared atomic store is a receipt verifier, not a conforming spend-control implementation. A store implementation that accepts a capability without pinned issuer verification, issuance authorization, and scope matching is not conforming.¶
Rich Authorization Requests [RFC9396] carries fine-grained authorization details but deliberately leaves comparison semantics for arbitrary detail types to their specifications. This document defines an executor-side durable spend state machine and requires a named closed scope profile.¶
OAuth Transaction Tokens [TXN-TOKENS] propagate transaction-specific authorization context through a call chain. Bounded Capability Receipts instead address an aggregate budget shared across multiple operations and the reserve/commit boundary at the executor. A deployment can use both.¶
The Delegation Receipt Protocol for AI Agent Authorization [DRP] records delegation and narrowing. This document requires narrowing for child capabilities and additionally accounts delegated budget as a terminal parent spend.¶
Attenuating Authorization Tokens for Agentic Delegation Chains [ATTENUATING] describes constrained, attenuable agent tokens. This document's distinct contribution is not the existence of constrained tokens; it is the composition of a signed grant with shared reservation ownership, committed budget accounting, and conservative treatment of indeterminate external effects.¶
The Agent Identity Protocol [AIP] defines per-token budget ceilings and explicitly assigns cumulative spending enforcement to the orchestration runtime. A bounded capability budget is instead a balance-valued authority in one authoritative store: reservation and consumption reduce the amount available to every sibling allocation in that domain.¶
PEDIGREE [PEDIGREE] defines cryptographic delegation, mandate narrowing, and an operator-controlled ceiling. This document preserves that identity and policy role and addresses the adjacent runtime question of how one parent balance funds multiple children without multiplying aggregate authority.¶
The Credential Broker for Agents [CB4A] defines proxy and short-lived-token delivery patterns that keep long-lived provider credentials away from agents. A deployment can use such a broker as the credential-owning effect adapter after this protocol grants one valid reservation; this document does not duplicate credential brokering.¶
Condition-Bounded Credentials [CBC] binds workload-key use to live, verifier-appraised conditions. That property composes with holder proof and provider entry, especially for stable attestable workloads. It does not replace aggregate balance accounting, and this document does not extend its hardware assumptions to hardware-less or cross-domain swarms.¶
The affine Token Budgets work [TOKEN-BUDGETS] studies LLM cost overruns and uses Rust ownership to prevent cloning and use-after-delegation in one process. It is adjacent prior art. This document instead binds human- or policy-authorized consequential authority, exact exercise actions, durable provider-entry reservations, and conservative post-entry uncertainty across a transactional runtime. It does not claim that balance-valued budgets or affine ownership were invented here.¶
The Attested Payment Authorization for Autonomous Agents [HAWKINS] binds an attested payment key and endorsed software identity to a payment authorization scope and requires verification before settlement. It is adjacent and complementary work: this document does not define hardware attestation or transparency registration, while that document does not specify the authoritative shared-state, reserve-and-commit, parent-funded delegation, and post-entry uncertainty machinery defined here. A deployment can compose the two by binding their decisions to the same exact exercise-action digest without making either verifier consume the other's evidence as a trust anchor.¶
Identifier substitution. Capability signatures bind the full issuance authorization digest, not only an identifier. Scope, budget units, parent, holder commitment, and validity are all inside the issuer signature.¶
State forks. Two stores accepting the same capability lineage can each spend or delegate its full budget. Global offline or cross-domain double-spend prevention is therefore not provided. Deployments that cannot name one authoritative atomic state domain for a capability and every authority-bearing ancestor and descendant MUST NOT claim aggregate sibling conservation or an enforced aggregate budget.¶
Executor federation. A multi-rail or multi-process deployment does not, by itself, establish a shared budget. Every executor that can admit an exercise must be bound to the same state domain, or the scope must be restricted to one executor and the claim must be stated as per-executor. Eventual reconciliation after independent admissions cannot retroactively prevent overspend.¶
Crash ambiguity. Restoring budget after a timeout can
authorize duplicate external effects. Once the effect boundary may have
been crossed, uncertainty is charged as indeterminate.¶
Reservation lifetime and expiry. An unbounded pre-entry reservation permits durable capacity denial and creates ambiguous expiry behavior. The provider-entry deadline bounds that state. Expiry prevents new provider entry but does not erase or reopen an attempt that entered before expiry; that attempt remains terminally accounted. A store that cannot serialize deadline recovery against provider entry MUST NOT restore the budget.¶
Freeze and provider-entry races. A freeze result is meaningful only when domain status, admission epoch, capability state, applicable allowance state, and operation state are serialized in the same authoritative transaction domain. A freshness-bounded callback or asynchronously replicated status cannot support an immediate-freeze claim. The implementation MUST NOT release a reservation on a wrong-holder request or relabel an operation after provider entry. An unavailable domain row or conflicting state fails closed and retains the reservation for authenticated recovery.¶
Freeze idempotency. Returning a cached transition result before authenticating the request turns the idempotency key into a disclosure token. Exact retries must match the same authority instance and exact control action. A different principal, a different capability held by the same principal, or a different action under the same operation identifier is not an idempotent retry.¶
External predicate freshness. Reservation protects
the bounded budget; it does not make mutable world facts current. If an
action depends on a record, counterparty status, market condition, or
other external predicate that can change after scope evaluation, the
deployment MUST require freshness-bound live evidence or
re-evaluate that predicate in boundary policy before provider entry. A
short reserve-to-effect interval reduces exposure but is not a
correctness mechanism. If the re-evaluation refuses before provider
entry, budget may be restored only through the authenticated
not_entered transition in
Section 10.4.¶
Operation-key scope. Operation IDs are unique under one capability receipt rather than globally attacker-reserved across the state domain. The store MUST bind the capability receipt digest and operation ID as one operation key. Preventing the same material action from being admitted under two independently valid capabilities is a separate relying-party policy and action-fencing concern. Replay refusal in this document means refusal of an already-seen operation key. It does not prohibit two otherwise authorized operations with different operation IDs from carrying the same action digest. A deployment requiring one occurrence per material action MUST add a durable action fence or bind a unique occurrence identifier into the material action.¶
Bearer and share theft. A raw holder secret or enough
unauthenticated shares can authorize possession and every remaining
in-scope operation. Confidential transport does not protect against an
enforcement point, endpoint, or log that leaks the reusable preimage.
Secret shares require confidential distribution, authenticated
participants, compromise response, and rate limiting. Deployments that
require non-exportable custody need a separately defined signature- or
hardware-bound holder profile. The built-in
ed25519-operation-proof prevents a reusable bearer secret from
crossing the boundary, but protection of the signing key and resistance
to signing-oracle abuse remain deployment responsibilities. Threshold
custody is not human quorum.¶
Revocation. Expiry and exhausted budget are not revocation. A deployment that requires early invalidation MUST consult a separately authenticated revocation or status source before reservation and at provider entry and define its freshness policy. Revocation inheritance is not inferred from lineage alone: the signed mode determines whether already transferred descendant authority survives. An immediate cascade claim requires the ancestor revocation transition, descendant reservation, and provider entry to be serialized in the same authoritative atomic state domain. Notification or eventual cache refresh cannot supply that guarantee. Full-lineage locking can make a high-fan-out ancestor a contention and denial-of-service hot spot; deployments MUST bound lineage depth, admission work, and lock acquisition time without weakening the fail-closed result.¶
Units and arithmetic. All accounting uses integers with signed unit and scale. Floating-point arithmetic, implicit currency conversion, and caller-selected rounding MUST NOT occur in the authoritative budget path. The safe-integer ceiling and decimal scale jointly limit range; a high scale does not provide both arbitrary precision and arbitrary major-unit magnitude.¶
Database authority. The capability tables contain authorization state. Deployments MUST restrict writes to the enforcement service, use least-privilege credentials, protect backups, and audit administrative changes.¶
Delegation lineage. Local uniqueness checks over one presented receipt do not establish graph-wide acyclicity or complete ancestry. Separately presented receipts can omit links, substitute a parent operation, or form a cycle unless each parent edge is authenticated and resolved by digest, or an authoritative store enforces equivalent edge constraints. Implementations MUST fail closed on incomplete, cyclic, substituted, or non-narrowing lineage. Verifiers apply the complete traversal and refusal rules in Section 12 to imported chains and chains reconstructed from storage.¶
Comparison-proof substitution and exhaustion. A signed conformance record from an untrusted runner does not establish a relation property. Profiles that permit mechanical establishment MUST bound domain cardinality and procedure work, define one canonical domain encoding, and reject values outside the established domain for chain-composition purposes. Implementations MUST apply bounded parsing before processing a presented record and MUST NOT perform attacker-sized enumeration on the admission path.¶
Semantic limits. A valid capability does not prove that an action is safe, lawful, beneficial, or correctly executed. Local policy and domain controls remain necessary.¶
Evidence limits. Absence of a receipt proves only that no matching receipt was found in the examined evidence domain. It does not prove that no authorization existed. A committed operational event is not independently verifiable cryptographic evidence unless a separately specified signed artifact covers that event and the relying party verifies it under pinned trust policy.¶
Cryptographic scope. This version uses SHA-256 and Ed25519. It does not provide a post-quantum signature profile or a zero-knowledge receipt. Algorithm agility and long-term preservation are separate concerns.¶
Capability receipts and operation records can reveal spending limits, organizational roles, intended action classes, counterparties, and timing. Profiles SHOULD minimize identifiers, separate portable evidence from operational secrets, and define retention and access controls. Hashing a low-entropy scope or identifier does not make it confidential.¶
The Apache-2.0 TypeScript reference implementation includes a
signed pre-standard capability envelope, holder-secret commitment,
optional threshold secret reconstruction, and a durable PostgreSQL
reservation and commitment store. Its issuer-controlled delegation API,
when used with one shared capability store, reserves and commits a child
amount from the immediate parent before registering the child. Both the
in-memory and PostgreSQL stores record a provider-entry deadline bounded
by capability expiry, refuse late provider entry, retain an explicit
provider-entry marker, and recover a timed-out pre-entry reservation as
not_entered without deleting its operation record.
The store has adversarial tests for overspend, replay, ownership fencing,
expiry, terminal commitment, concurrent N-sibling aggregate
over-allocation, one operation identifier paired with different child
digests, orphaned registration after parent commitment, and an explicit
two-store state-fork counterexample. These are same-team implementation
and regression results, not independent implementation or production
deployment evidence.¶
The reference stores move an operation amount from
reserved_amount to consumed_amount in the same
transaction that records provider entry, and later outcome commit does
not debit the budget again. The in-memory and PostgreSQL reference stores
implement the -05 admission-control domain status and monotonic epoch on
explicitly covered operations. Reservation captures the current epoch;
provider entry locks and rechecks the same domain before changing held
budget to consumed budget; freeze and restore each advance the epoch; and
a pre-freeze reservation that has not entered is released as
not_entered only under its reservation-owner check. Same-team
hostile tests exercise both serializations of freeze versus provider
entry against an ephemeral live PostgreSQL 17 instance, wrong-holder
release refusal, restore non-revival, idempotent authenticated freeze
retry, and the no-second-debit rule. This is local implementation
experience, not independent interoperability or production evidence.
There is no disconnected-edge lease implementation and no signed
freeze-event artifact. Control transitions use a trusted verifier
callback; the reference store does not yet atomically consume a portable
detector capability in the same transaction.¶
The prototype wire format predates this document and does not yet
implement all mandatory fields in this version, including full issuance
authorization digest binding, an explicit action-scope profile, and
explicit budget unit scale, digest-linked parent lineage, authenticated
parent-delegation binding, not_before, and complete ingest-time
cycle validation. It is therefore implementation experience, not a claim
of conformance. There is no independent implementation, interoperability
event, production transaction history, post-quantum profile, or
zero-knowledge implementation. The executor-domain participant binding
and per-action human-authorization composition added in -02 are protocol
requirements and composition rules. The reference execution path now
implements those two integrations: an aggregate budget claim requires an
exact match to a relying-party-pinned atomic state-domain digest; a
mismatch may fall back only to an explicitly pinned single executor; and
a required per-action human authorization must pass a native verifier
under relying-party pins and bind the exact exercise-action digest. Calls
without an executor-domain binding are labeled local_store_only and do
not claim aggregate enforcement. A configured state-domain digest is a
deployment trust binding; the code cannot by itself prove that two
processes connect to the same physical database.¶
The reference implementation now signs and requires
revocation_mode, records each capability's immediate parent, and
implements direct and cascade revocation in both the in-memory test store
and PostgreSQL store. A descendant reservation resolves the complete
registered ancestor lineage. The PostgreSQL path locks those state rows
in the reservation transaction, so an ancestor revocation that commits
first refuses the reservation, while a reservation that commits first
remains owned and reconcilable. Missing, malformed, or migration-incomplete
ancestor state refuses at reservation. The tracked migration
quarantines legacy rows without an explicit mode rather than inferring
direct or cascade. Regression cases cover the signed closed field, direct
descendant survival, cascade refusal, unavailable ancestor state, child
allocation after revocation, and both orderings of the revocation race.
This is same-team implementation evidence inside one authoritative atomic
state domain; it is not independent interoperability, revocation
distribution, or cross-domain cascade enforcement.¶
Entry-time direct and inherited revocation revalidation is not yet implemented in these reference stores. They recheck the admission-control epoch, applicable allowance state, ownership, and deadline at provider entry, but currently resolve direct and ancestor revocation at reservation. Those results do not establish the entry-time revocation rule or its new ordering cases in Section 15, Paragraph 3. The implementation and bounded revocation model therefore provide partial experience, not conformance to that part of this revision. The delegated-commit revocation recheck is also a protocol requirement, not an implementation claim for the existing reservation-time revocation path.¶
The -04 scope-profile contract and comparison-reporting rules are not
yet implemented. In particular, the reference implementation does not
yet emit per-component decidability records, relation reflexivity,
transitivity classification or basis, mechanical-establishment
provenance, or the local-only versus chain-composable result. No
implementation or conformance claim is made for those additions. The
-04 atomic root-issuance registration rule is also not implemented as a
conforming protocol operation because the prototype does not yet bind
and consume the full issuance authorization described here. The
capability-scoped operation key and terminal budget-restoring
not_entered behavior are implemented in the reference stores,
but that implementation evidence does not close the other -04 gaps. The
ed25519-operation-proof holder method is not yet implemented by
the reference capability API; no implementation claim is made for it.¶
The -06 comparison vocabulary, named UNDECIDED reasons,
LOCAL_ONLY distinction, and associated comparison-report
conformance cases remain UNIMPLEMENTED. The illustrative
examples are protocol requirements and editorial examples, not
executable verifier, conformance, or interoperability results.¶
The reference implementation does reject repeated delegation identifiers, repeated parent capability identifiers, a leaf named as its own parent, and increasing amounts within the delegation chain presented at mint or verification time. Those checks provide local simple-path and monotonic amount enforcement. They do not discover omitted parents or establish the digest-linked, graph-wide lineage required by Section 12, so they do not close the remaining conformance gap.¶
The public repository contains two CI-gated bounded TLA+ models relevant here. The capability-accounting model covers registration, reservation, commitment, delegation, replay refusal, parent-funded child registration, and aggregate sibling conservation. A separate -03 revocation-inheritance model covers every direct/cascade assignment over a root, child, and grandchild; complete ancestor-state availability; future child allocation; and both serialized orderings of revocation and reservation. Exact state and obligation counts are emitted by governed proof-status artifacts. These are bounded results about the models, not refinement proofs of the TypeScript, SQL, transaction adapter, cryptography, lineage verification, or complete protocol defined here. Arbitrary implementation inputs still require the runtime traversal and refusal rules in Section 12.¶
The main branch also runs a fixed-seed adversarial harness in
per-push CI over the actual JavaScript in-memory capability and
consumption stores. It includes a true-concurrency
Promise.all race target and a deliberately non-atomic
comparison store that demonstrates the race detector can expose
over-commitment. Additional targets exercise accounting and ownership
invariants at whole-method boundaries. This is regression evidence for
those in-process stores, not complete protocol conformance: it does not
fuzz the PostgreSQL capability transaction path, the atomic handshake
RPC, replica or connection failures, and no deeper nightly sweep is
scheduled.¶
UNDECIDED for undecided action membership and
attenuation without changing runtime execution
INDETERMINATE or indeterminate-effect accounting.¶
NO_COMPARISON_RELATION under the exact governing
profile separately from PROFILE_NOT_HELD by the deciding
verifier, without asserting global impossibility.¶
LOCAL_ONLY composition status from a decided
current-hop result and retained refusal when the current comparison
or required chain composition is unavailable.¶
The author thanks Sumit P. Ahuja for the scope-comparison analysis that led to the transitivity-basis, mechanical-establishment provenance, and chain-composition requirements in Section 7.¶
This document has no IANA actions. A future revision may request a media type and registries for receipt versions, scope profiles, holder methods, and failure codes after implementation experience stabilizes the protocol.¶