Access docs

suiss Access · Docs

Decision codes

Draft reference for outcomes, blocker classes, positions, resolvers, remediation codes, unmet requirements and rejections.

This is a draft reference and may change before release.

Outcomes

OutcomeEncoded asCarries
ALLOWallowrelied_on: the IDs of the proofs the decision relied on, when any
DENYdenyblockers; in commit and continue also unmet when there are unmet terms
REQUIRE_ACTIONrequire_actionunmet

There is no fourth outcome. Only allow permits an effect; a party that maps a decision to a boolean must map deny and require_action to false.

How the outcome is combined

For one basis, the blockers come from its hops, its capacity check, the Mandate, restriction results and requirement resolution. Then:

  1. if there is any blocker, the outcome is deny, and unmet terms are listed as well;
  2. otherwise, if any requirement term is unmet, the outcome is require_action;
  3. otherwise the outcome is allow.

In check mode several candidate bases can be evaluated in order. The first allow wins; otherwise the first require_action; otherwise deny with the union of all candidates' blockers and no unmet terms. With no candidate basis, check returns deny with a single no-covering-authority blocker at hop 0.

Blockers

Each blocker carries a class, an optional subcode, a position, a resolver class and a remediation code.

Classes

ClassMeaning
no-covering-authorityA hop of the basis does not cover the intent, or was not understood
outside-instance-limitsThe actor Instance's Mandate does not cover the intent
restrictedA restriction policy denies
budget-exhaustedA budget along the lineage is short
endedA hop expired, has not started, was revoked or lapsed
capacity-mismatchThe declared capacity is not allowed by the basis
source-not-acceptedA proof would match, except that its issuer is outside the accepted source
schema-not-acceptedThe action's schema version is not accepted in the domain
nonce-closedThe nonce cannot be used
foreign-status-unavailableThe status of foreign authority cannot be obtained

The class set is closed. A new top-level class requires protocol governance. A reader that meets an unknown subcode reads the blocker as its class.

Subcodes

SubcodeMeaning
ended/expiredThe hop's validity window has passed or not started
ended/revokedThe hop was revoked
ended/lapsedThe hop lapsed, or a while-condition no longer holds
restricted/policy:<ref>The denying policy, as unpadded base64url of its 16-byte reference
nonce-closed/pre-recoveryThe request's statement predates a forced recovery and its nonce is not in the continuing lineage
budget-exhausted/release-exceeds-drawA release would exceed what the exercise drew

Positions

PositionWhere the blocker sits
hop(k)The k-th Grant from the requester's own (hop 0) toward the root
instanceThe actor's Mandate or Instance restrictions
anchorThe anchor's root terms
domain-policyA restriction policy
foreignA foreign domain
actor-sideThe proofs the actor presented

The identity of a hop (Grant ID, grantor) is revealed only as far as the requester may see; otherwise only hop(k) is returned.

Resolvers

The resolver says which class of party can remove the blocker, not which person: grantor_of_hop(k), root, restriction-owner, issuer, domain-admin, actor, actor-party, time.

Remediation codes

CodeMeaning
route-to-coordinatorSomeone else must act; route the request to the coordinator
refresh-claimObtain a fresh or accepted claim
self-authenticateThe actor can satisfy it by authenticating
wait_until(T)Wait until the given trusted time, for example a budget window reset
not-satisfiable-by-actorThe actor cannot resolve it
new-request-requiredA new request with a new nonce is needed

Remediation codes are planning data, not instructions. There is no free-text field.

Blocker table

ConditionClass / subcodePositionResolverRemediation
Hop does not cover the intent, or is not understoodno-covering-authorityhop(k)grantor_of_hop(k)route-to-coordinator
Mandate does not cover the intentoutside-instance-limitsinstanceactor-partyroute-to-coordinator
Restriction DENYrestricted, restricted/policy:<ref>domain-policyrestriction-ownernot-satisfiable-by-actor
Budget short, rolling windowbudget-exhaustedhop(k)timewait_until(resets_at)
Budget short, total windowbudget-exhaustedhop(k)grantor_of_hop(k)route-to-coordinator
Hop expiredended/expiredhop(k)grantor_of_hop(k)new-request-required
Hop not yet startedended/expiredhop(k)timewait_until(from)
Hop revokedended/revokedhop(k)grantor_of_hop(k)new-request-required
While-condition failed, or lapsedended/lapsedhop(k)grantor_of_hop(k)new-request-required
Capacity not allowed by the basiscapacity-mismatchhop(0)actornew-request-required
Proof issuer outside the accepted sourcesource-not-acceptedactor-sideissuerrefresh-claim
Statement predates a forced recoverynonce-closed/pre-recovery—actornew-request-required
Release exceeds drawbudget-exhausted/release-exceeds-draw—actor or issuernot-satisfiable-by-actor or refresh-claim

blockers is a set: sorted by the bytes of each blocker's canonical encoding, with duplicates removed.

Unmet requirements

Each element of unmet describes one requirement term that no acceptable set of proofs satisfied:

FieldMeaning
proofKindclaim, contribution, authentication or foreign_authority
classThe claim or contribution class
countHow many proofs are still missing
bindingNone, actor Instance, intent digest or resource
freshnessMaximum age
independenceDistinct Party, Instance or issuer
consumptionReusable or single-use
sourceAccepted issuers for a claim; for a contribution, the eligible set as far as the requester may see
positionWhich hop or policy the requirement came from
satisfiable_by_actorfalse when the term needs human presence and the actor is an agent

Identical terms from several hops, the Mandate or restrictions count once, at the position of their first occurrence (hops from 0 upward, then instance, then domain-policy).

Rejections

A rejection is a reasoned refusal to evaluate. It is not a decision: it produces no record and consumes neither the nonce nor any proof. To an enforcement point it means only "there is no ALLOW".

KindCauses
inputNon-canonical encoding; a mismatch with the data model; an unknown field or choice; an assurance dimension or level outside the closed list; an exceeded limit; a selector with too many conditions; an inverted time window; a cyclic purpose order; a duplicate catalog, purpose entry or proof ID; a wrong number of bases in commit or continue; a restriction DENY naming another policy or version; an exhausted rolling budget without a reset time; the current time outside the intent's validity
fuelThe evaluation cost budget is exhausted

The evaluator is given a fuel budget and spends one unit per hop checked, per restriction result and per comparison of one proof with one requirement term. Running out of fuel is never a decision.

Evaluation input

The evaluator is a pure function of its input and fuel. Two conformant evaluators given the same input bytes return the same decision bytes. The input is prepared outside the evaluator:

FieldMeaning
modecommit, continue or check
intent, intent_digestThe intent envelope and its digest, computed by the preparing layer, never copied from the requester
nowTrusted evaluation time
actor_instanceThe authenticated actor Instance, if any
actor_is_agenttrue when the actor Instance is a software agent
mandateThe actor Instance's own limits, if any
capacityown, or for a Party
basesCandidate bases, each a list of hops from hop 0 toward the root, plus the capacities it permits. Exactly one in commit and continue
restrictionsThe result of each applicable restriction policy: no_objection, deny or require
proofsThe proofs presented with the request
catalogPinned action catalogs, reserved actions and the declared purpose order

Each hop carries the Grant's authority, its status if revoked or lapsed, whether its while-conditions fail, and the state of each budget it draws from. A hop whose stored Grant the reading layer did not understand is written as {not_understood: true} and covers nothing; it is never dropped.