<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3"
     docName="draft-jackson-wimse-evaluation-04" category="info"
     ipr="trust200902" xml:lang="en">
  <front>
    <title abbrev="WIMSE Verifier Evaluation Semantics">Verifier-Side Evaluation Semantics for Delegated Authority Chains</title>
    <author fullname="Wes Jackson">
      <address>
        <email>c.wesjackson@gmail.com</email>
      </address>
    </author>
    <date day="10" month="October" year="2026"/>
    <area>sec</area>
    <workgroup>wimse</workgroup>
    <keyword>workload identity</keyword>
    <keyword>delegation</keyword>
    <keyword>verifier</keyword>
    <keyword>evaluation</keyword>
    <abstract>
      <t>Delegation chain specifications describe the shape of conveyed
      authority. They leave the verifier's half of the exchange
      underdetermined. Two verifiers can check the same chain, both report
      success, and enforce different policy. This document states what a
      verifier must do: the explicit inputs evaluation depends on, how those
      inputs behave when their sources are stale or unavailable, and four
      rules that keep evaluation fail-closed. The rules are drawn from the
      Grant &amp; Autonomy Lifecycle (GAL) and Provenance &amp; Trust Context
      (PTC) specifications and from a public reference implementation.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="sec-intro" numbered="true" toc="default">
      <name>Introduction</name>
      <t>A delegation chain is a claim about authority. A verifier turns that
      claim into a decision. Chain formats standardize the claim. This
      document standardizes the decision.</t>
      <t>The failure this prevents is silent divergence. A verifier that drops
      an authorization entry it cannot parse and still approves has enforced
      nothing while reporting success. A verifier that derives "now" from the
      records it is judging keeps expired authority alive during quiet
      periods. A verifier that lets one broken path poison a valid one hands
      any attacker a veto over legitimate authority. Each of these was
      observed in running code during WIMSE implementation work. Each is
      fixed here with a stated rule.</t>
      <t>This document does not define a chain format, a token envelope, or a
      policy language. It defines the evaluation function those formats are
      judged by. It is complementary to chain-format documents such as
      <xref target="DELEGATION-CHAIN"/> and <xref target="CONNECTED-FLIGHT"/>:
      those define what is conveyed, this defines how the receiver judges
      it.</t>
      <t>The verifier specified here is deterministic. Its decision is a
      function of the inputs in <xref target="sec-inputs"/>, with no model
      and no judgment of content anywhere in it. In the terms of
      <xref target="PTC"/> it is the receiving boundary, which that
      specification calls the airlock: one party's enforcement point
      presents to another party's airlock, and how the receiver classifies
      the sender is the receiver's own deterministic decision
      (<xref target="PTC"/> Section 6.1). It is never a claim carried in the
      message and never the sending agent's to make.</t>
      <t><xref target="CONNECTED-FLIGHT"/> Section 4.1 maps its credentials
      onto the inputs in <xref target="sec-inputs"/> and the rules in
      <xref target="sec-rules"/>. It records the consumption rule of
      <xref target="sec-consumption"/> as only partially addressed by those
      credentials, since scope and expiry bound a credential's validity
      without making it single-use. This document does not restate those
      profiles, which are that document's contribution.</t>
      <t>This document is the verifier-side counterpart to executor-side
      work. <xref target="AEB"/> defines the boundary at which an executor
      admits, consumes authority for, and classifies the outcome of a
      consequential action, and <xref target="CAID"/> defines how two
      representations of one action are compared. Where a rule here needs
      those mechanisms, it states the property and points to them rather
      than defining its own.</t>
      <t>Two of the rules in <xref target="sec-rules"/> are exercised in the
      public reference implementation <xref target="RI"/>: consumption keyed to
      the frozen call, and verification under role-separated keys. The other
      two are not. That implementation consumes no
      <xref target="RFC9396"/> authorization_details entries, and it has no
      derived-grant concept, so no call reaches it by a path; the lifecycle
      half of the per-path rule rests on GAL-39, which <xref target="GAL"/>
      marks normative and not yet implemented there. A rule's force comes from
      the specification that states it, and these notes record what has been
      exercised.</t>
      <t>Several requirements here are stated ahead of that implementation.
      Issuer standing (<xref target="sec-standing"/>), the direction in which
      clock skew is applied (<xref target="sec-instant"/>), and the as-of
      time and maximum age of a fetched input (<xref target="sec-inputs"/>)
      are clauses of <xref target="GAL"/> (GAL-41, GAL-42, GAL-43) and of
      <xref target="PTC"/> (PTC-49, PTC-50), and each is marked there as not
      yet implemented. So is the caller-facing classification of a refusal
      (<xref target="sec-security"/>, PTC-44). Of what this revision adds to
      the fourth rule (<xref target="sec-role-keys"/>), <xref target="GAL"/>
      marks continuity for records the issuer signs as not yet implemented.
      This document states each of these rules and makes no claim that the
      reference implementation demonstrates them. The key-bootstrapping
      mechanism discussed in <xref target="sec-security"/> is the known open
      item; it is named as a gap rather than specified.</t>
    </section>
    <section anchor="sec-terminology" numbered="true" toc="default">
      <name>Terminology</name>
      <t>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 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only
      when, they appear in all capitals, as shown here.</t>
      <t><em>Frozen call:</em> the exact action a human was shown and
      approved: capability, arguments, recipient, principal, and the
      authority the call was evaluated under, as presented at approval
      time.</t>
      <t><em>Authorization instance:</em> one approval bound to one frozen
      call, from the moment the call is held until a terminal disposition
      closes it.</t>
      <t><em>Refuse:</em> what a verifier does to a token or record that
      fails evaluation under <xref target="sec-rules"/>. A refusal is the
      verifier's decision and involves no human.</t>
      <t><em>Reject:</em> what an approver does to a held frozen call as a
      terminal disposition. A rejection closes the authorization instance
      without executing the call. The expiry of an approval is not a
      rejection (<xref target="sec-consumption"/>).</t>
      <t><em>Evaluation instant:</em> the instant against which validity,
      including expiry, is judged.</t>
      <t><em>On-behalf-of principal:</em> the principal the chain acts under,
      distinct from the agent acting at each hop.</t>
      <t><em>Principal:</em> the identity tuple a grant is issued to: agent
      identity, skill, user, and trust tier. The unit of authority is the
      (principal, action class) pair. Those four attributes and the action
      class together name who acts, in what capacity, on whose behalf, at what trust, and over what
      class of action. The semantics of the trust tier are
      deployment-defined; this document standardizes the tier's position in
      the tuple, not its values.</t>
      <t><em>Level:</em> the position a grant holds on an ordered scale of
      autonomy. <xref target="GAL"/> Section 4.1 defines one such scale.</t>
      <t><em>Record:</em> a signed statement of one write to a grant.</t>
      <t><em>Ledger:</em> the append-only sequence of records for one
      (principal, action class) pair.</t>
      <t><em>Issuer key:</em> the key that signs the records an issuing
      ceremony writes. Those records raise a level (issuance, promotion),
      lower it voluntarily (tightening), or re-issue a grant at the level it
      already holds (re-attestation). It is the only key under which a
      level is raised.</t>
      <t><em>Evaluator key:</em> the key that signs the records the
      automatic evaluator writes (demotion, lapse), which may only lower a
      level. It is held by a deliberately separate identity.</t>
      <t><em>As-of time:</em> the instant as of which a verifier established
      an input it fetched from a source. It is the instant the verifier
      obtained the input from the source, or, where the source states when
      the input was current, the earlier of that time and the instant the
      verifier obtained it. Taking the earlier of the two resolves doubt
      toward less authority: a replayed answer carries its old time and
      ages out, and a source whose clock runs fast cannot make its answer
      look fresher than the moment it was fetched. (GAL-43, PTC-50)</t>
      <t><em>Maximum age:</em> the longest interval after its as-of time for
      which a fetched input may be used, pinned by the relying party for
      each input. The as-of time plus the maximum age is the input's
      horizon.</t>
      <t><em>Delegation path:</em> one chain of delegations from a root of
      trust to the acting agent.</t>
      <t><em>Issuer standing:</em> whether the party an issuer key speaks
      for still holds the role it issued under.</t>
    </section>
    <section anchor="sec-inputs" numbered="true" toc="default">
      <name>Evaluation Inputs</name>
      <t>A verifier's decision MUST be a function of explicit inputs. Five
      inputs are required. Anything the verifier needs that is not in this
      list MUST be supplied explicitly; the verifier does not guess.</t>
      <t>Some inputs come from sources the verifier does not control:
      status, keys, and records. Each fails in a direction. An input that
      confers authority only while fresh, such as a short-lived grant, fails
      toward less authority when its source is unavailable, because nothing
      renews it. An input that removes authority, such as a revocation entry
      or a demotion record, fails toward more, because its absence reads the
      same as good news. That property is what makes a lease
      <xref target="LEASES"/> safe under failure. The requirements in this
      section are written so that every fetched input fails toward less
      authority.</t>
      <t>A verifier MUST NOT accept a status assertion, key set, or record
      set from a source after it has accepted a later one from the same
      source, where "later" is by that source's own ordering, such as a
      sequence number or an issuance time. Otherwise an attacker who can
      replay an earlier signed response restores a key or an issuer that the
      source has since withdrawn.</t>
      <t>Every fetched input also has an age. For each input a decision
      depended on that was fetched from a source, the verifier MUST record
      the input's as-of time. A verifier MUST NOT use a fetched input at an
      evaluation instant at or past its horizon, which is its as-of time plus
      the maximum age the relying party pins for it. Past the horizon the
      input is not established. The verifier obtains it again, or treats it
      as unavailable, and an evaluation that needs an unavailable input ends
      in a transient refusal (<xref target="sec-security"/>). Without a
      maximum age, an input that was true when fetched stays in force for as
      long as the process that fetched it keeps running, so a key withdrawn
      or a standing lost after the fetch is still honored. Without a
      recorded as-of time, a later reader of the decision cannot tell one
      made on current inputs from one made on stale ones. (GAL-43,
      <xref target="GAL"/> Section 6.15; PTC-50, <xref target="PTC"/>
      Section 6.13)</t>
      <t>Each input is judged on its own horizon. A decision that depended on
      several fetched inputs holds only while every one of them is inside
      its maximum age, and the as-of times are recorded per input, never as
      one time for the decision. The decision does have a horizon of its
      own, which is the earliest of its inputs' horizons: a decision is good
      no longer than its shortest-lived input. A verifier MUST record that
      instant, and a decision MUST NOT be relied on past it. A call held on
      the decision, or carried on from it to another party, is evaluated
      again. Otherwise a call is permitted and held, the key that verified
      its chain is withdrawn while it waits, and the hold is released on the
      strength of the earlier decision: every input was in date when it was
      read, and the action still runs on a withdrawn key. A record that keeps a resolved input
      without its horizon cannot separate a live admission from one that
      outlived its window. The horizon is a validity condition judged at the
      evaluation instant (<xref target="sec-instant"/>), in the way an
      expiry is. Passing it is not a refusal by the source and is not
      evidence that the input changed. The as-of time and the maximum age
      are properties of how the inputs below are held; they are not a sixth
      input. How a record encodes them belongs to the record format, for
      which see <xref target="AUDIT-RECORD"/>. This document defines no
      encoding.</t>
      <section anchor="sec-frozen-call" numbered="true" toc="default">
        <name>The Frozen Call</name>
        <t>The frozen call is the exact action the human was shown and
        approved. Evaluation and consumption bind to that call as presented,
        not to a re-serialization, a paraphrase, or an identifier that names
        it. (GAL-36, GAL Section 4.1)</t>
        <t>"As presented" needs a basis for comparison once the same action
        can arrive in more than one representation; otherwise two artifacts
        describing one action carry digests that cannot be compared without
        guessing. A verifier MUST compare a candidate call to the frozen call
        over the material fields declared for the action's type, under a
        canonicalization or mapping profile pinned by the relying party. It
        MUST NOT infer equivalence from field names, descriptions, or
        identifiers, and a comparison the pinned profile cannot make is a
        mismatch. <xref target="CAID"/> supplies both halves: action types
        that declare their material fields (Section 4.2), and an
        Action-Mapping Profile that the relying party pins and that yields
        INDETERMINATE, never a match, when the mapping would lose or cannot
        cover a material field (Section 8).
        This document requires the property and does not define a
        canonicalization of its own.</t>
        <t>The authority a call runs under is part of what the approver
        approved. An approval covers the visible coordinates of the call
        under the authority shown at approval time, so two calls with the
        same visible fields under different authority are different calls. A
        release that runs under a different delegation than the one shown
        breaks what-you-see-is-what-you-execute even when every other
        coordinate matches. A verifier MUST be able to verify that the
        authority under which a call is released is equivalent to the
        authority approved. This document does not prescribe whether that
        equivalence is carried explicitly with the approval or reconstructed
        from immutable records of the frozen call.</t>
      </section>
      <section anchor="sec-instant" numbered="true" toc="default">
        <name>The Evaluation Instant</name>
        <t>The instant against which validity, including expiry, is judged is
        an explicit input to evaluation. It MUST NOT be derived from the
        timestamps of the records under evaluation. Deriving "now" from the
        latest record keeps expired authority alive through quiet periods,
        because time passes without producing records. (GAL-34)</t>
        <t>The instant MUST come from a clock the verifier trusts and MUST NOT
        be taken from data the presenter controls. A presenter that supplies
        the instant chooses which grants are live. The verifier's own clock is
        also an attack surface: set back, it revives expired authority; set
        forward, it refuses everything. Authenticated time, such as Network
        Time Security <xref target="RFC8915"/>, narrows that attack.</t>
        <t>When the verifier compares the instant with a time asserted under
        another party's clock, it MUST apply the skew bound
        (<xref target="sec-security"/>) in the direction that confers less
        authority. An expiry or a term, and an authority-lowering record such
        as a demotion, a lapse, or a withdrawal of issuer standing, is
        treated as effective up to the bound earlier. An authority-raising
        record, and a not-before time, is treated as effective up to the
        bound later. A symmetric leeway lets skew extend authority past the
        point where it ended, and whoever benefits from a slow clock gets
        that window for nothing. (GAL-42, <xref target="GAL"/>
        Section 6.7.6; PTC-49, <xref target="PTC"/> Section 6.13)</t>
        <t>A record carries more than one time, so which one the verifier
        compares needs stating. A record's timestamp is the instant its
        writer appended it, and nothing else. The instant a transition took
        effect is taken from the record's own typed field for that instant
        where the record type has one, and never from the timestamp. A lapse
        is the case that matters. Authority fell when the grant's term
        expired, and the lapse record is written at or after that instant,
        possibly much later. The effective instant of a lapse is the expired
        term, which the grant carries and the lapse record may carry beside
        its timestamp. A verifier MUST NOT infer from a record's timestamp
        the time of any event the record does not carry as a field of its
        own. A verifier that reads a lapse record's timestamp as the moment
        of the lapse honors the grant for the interval between the term and
        the write, and a verifier that waits for the record honors it until
        somebody writes one. (GAL-34, GAL-40, <xref target="GAL"/>
        Section 5.2, <xref target="GAL"/> Section 6.7.6)</t>
        <t>Expiry is a validity condition judged at the evaluation instant:
        an approval, a grant, or a term has expired when the instant is at or
        after the time it states. Expiry is never a disposition, and it is
        never the approver's rejection (<xref target="sec-consumption"/>).</t>
      </section>
      <section anchor="sec-principal" numbered="true" toc="default">
        <name>The On-Behalf-Of Principal</name>
        <t>Conveyed evaluation material MUST include the on-behalf-of
        principal. A verifier that does not share the issuer's log cannot
        recover the principal from the action chain, so material that omits
        it authenticates an action without saying whom it was taken for.
        (<xref target="PTC"/> Section 6.6)</t>
        <t>Evaluation is against the whole tuple, never the agent identity
        alone: a verifier that matches on agent identity while ignoring
        skill, user, or tier has evaluated a different grant. (GAL-36, <xref target="GAL"/>
        Section 5.1)</t>
        <t>A party that assigns an identifier used in the tuple, or an
        identifier for an issuer, MUST NOT reassign it to a different subject.
        The relying party MUST pin, for each identifier namespace it joins on,
        an assigning party that meets this requirement. Standing,
        lapse, and audit records join to a chain by identifier. Where an
        identifier can be reassigned, a check of a departed issuer's standing
        returns the standing of whoever holds the identifier now. The subject
        identifier of <xref target="OIDC-CORE"/> Section 2 carries the same
        requirement.</t>
      </section>
      <section anchor="sec-keys" numbered="true" toc="default">
        <name>Issuer and Evaluator Keys</name>
        <t>Records are signed under one of two roles, and a record's type
        names its role. The issuer key signs the records an issuing ceremony
        writes: issuance and promotion, which raise a level; tightening,
        which lowers one voluntarily; and re-attestation, which re-issues a
        grant at the level it already holds after the declared bounds the
        grant is bound to have changed. The evaluator key signs the records
        the automatic evaluator writes, demotion and lapse, which may only
        lower a level. The evaluator is a deliberately separate identity. An
        identity MUST NOT hold both roles' signing keys. The separation is
        structural, not conventional: a grant-store write the agent can
        reach is a promotion bypass.</t>
        <t>The two roles divide records by who writes them, and the direction
        of the change does not decide the role. Every record that raises a
        level is signed by the issuer key. Two kinds of issuer-signed record
        raise nothing: a tightening lowers, and a re-attestation changes no
        level at all. (GAL-37, <xref target="GAL"/> Section 4.3,
        <xref target="GAL"/> Section 6.7.2, <xref target="GAL"/>
        Section 6.10)</t>
      </section>
      <section anchor="sec-standing" numbered="true" toc="default">
        <name>Issuer Standing</name>
        <t>Whether a chain was valid when issued and whether it is valid when
        evaluated are different questions. A chain whose root or intermediate
        issuer has been disabled, or has lost the role it issued under, can
        carry valid signatures and unexpired grants after its authority is
        gone.</t>
        <t>A verifier MUST establish the standing of every issuer on a path,
        at the evaluation instant, from a source the relying party pins and
        within a maximum age the relying party pins. A path through an issuer
        whose standing is withdrawn, or cannot be established within that
        age, is not fully valid, and <xref target="sec-fail-closed-path"/>
        decides the token. Standing carried only in the presented token MUST
        NOT be accepted as its own source.</t>
        <t>Standing is established by the verifier, at the evaluation
        instant, from sources the verifier holds and the relying party has
        pinned. The chain supplies the
        identities of the issuers on the path, and that is all the standing
        check takes from it. The check for each issuer is a lookup made
        beside the chain against those identities, and a lookup that cannot
        complete fails closed the way a timeout does. Standing therefore
        needs no claim surface in any chain format. A chain may name the
        actor at each hop, as the act claim of <xref target="RFC8693"/>
        Section 4.1 does. Those names are attribution: they tell the verifier
        which parties acted and confer no standing on any of them. A
        statement of standing that a chain does carry is not an input to
        this check.</t>
        <t>Attribution is attested at each hop and composed afterward. A
        verifier records the actor it was presented with and the as-of time
        of that observation. It establishes standing for every issuer on the
        path at its own evaluation instant. It does not re-derive the
        attribution that an upstream verifier attested, and it does not vouch
        for it. Reconstructing a chain across hops composes the per-hop
        records.</t>
        <t>The source is a deployment choice. A status list
        <xref target="STATUS-LIST"/> or a directory query satisfies it. So do
        grant lifetimes no longer than the pinned maximum age, where each
        renewal re-establishes the issuer's standing; that form needs no fetch
        at evaluation and fails toward less authority by construction.
        <xref target="DELEGATION-CHAIN"/> Section 9.5 describes the window
        between a withdrawal and a verifier's next fetch. The pinned maximum
        age is the bound on that window.</t>
        <t>Standing is the one input that can require a live source at
        evaluation time, which is why it is listed rather than left to
        deployment.</t>
        <t><xref target="GAL"/> Section 6.10 states the rule for a stored
        grant (GAL-41): a verifier establishes that the key which signed the
        record a grant's level rests on has not been withdrawn, and a grant
        whose issuer has lost standing is enforced at the fallback level the
        grant itself declares. That fall belongs to the enforcer inside the
        grant's own domain, where the fallback level is known. The same
        section states the other case: a verifier in another domain holds no
        such level for the grant, because a conveyed chain declares no
        fallback, so a path through an issuer without standing confers
        nothing.</t>
      </section>
    </section>
    <section anchor="sec-rules" numbered="true" toc="default">
      <name>Evaluation Rules</name>
      <section anchor="sec-every-entry" numbered="true" toc="default">
        <name>Process Every Entry or Refuse</name>
        <t>A verifier MUST process every authorization_details entry
        <xref target="RFC9396"/> presented or refuse the token. An entry of a type the verifier cannot
        evaluate is an entry it cannot process, and the token MUST be
        refused. A verifier that silently drops an entry enforces an
        incomplete policy while reporting success. That is fail-open.
        (A verifier advertises the types it supports with
        authorization_details_types_supported <xref target="RFC9728"/>.)</t>
        <t>Such a refusal is permanent for the presented token: no retry of
        the same token can succeed, because the caller cannot change which
        types the verifier supports. What the caller is told is stated in
        <xref target="sec-security"/>.</t>
      </section>
      <section anchor="sec-fail-closed-path" numbered="true" toc="default">
        <name>Fail Closed Per Path</name>
        <t>Where several delegation paths reach the same agent, the verifier
        MUST evaluate each path independently along its whole length. One
        fully valid path suffices for authority. A broken path MUST NOT
        neutralize a valid one, and a valid path MUST NOT excuse a broken
        one. Where no presented path is fully valid, the token confers no
        authority. Discovering which paths exist is the delegation
        mechanism's work; judging each presented path is the verifier's.</t>
        <t>The lifecycle half of this rule is stated normatively in
        <xref target="GAL"/> as GAL-39: a derived grant does not outlive or
        out-rank the grant it derives from, and where a grant is demoted or
        lapses, every derived grant descending from it ceases to confer
        authority from that evaluation instant, whether or not a record of the
        change has been written. <xref target="GAL"/> Section 1.3 separates
        that half, which the grant standard owns, from path resolution, which
        it does not. The scope half, that one fully valid path suffices and a
        broken path never neutralizes a valid one, is this document's.</t>
      </section>
      <section anchor="sec-consumption" numbered="true" toc="default">
        <name>Consumption Keyed to the Frozen Call</name>
        <t>An approval MUST be consumed only by release or rejection of the
        frozen call it binds, by the whole principal the call was frozen
        for. Consumption MUST NOT be inferred from the approval's identifier
        appearing in any record. Otherwise any party able to write a record
        can burn another party's approval without using it. The release
        executes the stored call and nothing re-sent. (GAL-36, <xref target="GAL"/>
        Section 4.1)</t>
        <t>Rejection here means the approver's terminal disposition, the one
        that closes the authorization instance. A non-terminal disposition,
        such as a deferral or a request for changes, is neither release nor
        rejection: the approval stays pending and nothing is consumed. Each
        authorization instance has at most one consumption event, and it is
        the release or the rejection of its frozen call.</t>
        <t>This document bounds release and does not bound pending. A held
        call confers no authority while it is pending, so an approval that
        stays pending without limit fails closed by construction. Where an
        approval carries an expiry, the expiry is a validity condition judged
        at the evaluation instant (<xref target="sec-instant"/>): a release
        presented at or after it is refused. Expiry is not a disposition. It
        consumes nothing, and it is not the approver's rejection, because
        the approver decided nothing. The verifier's record of an expired
        approval says that it expired (<xref target="PTC"/> Section 6.12
        states the record-side rule as PTC-53). Whether a pending instance
        is given a lifetime at all belongs to the lifecycle of the instance,
        at the authorization server or in the grant standard, and this
        document sets none. <xref target="sec-cases-expiry"/> gives the
        cases.</t>
        <t>Consumption keys on the closure of the authorization instance,
        never on the outcome of an execution. Whether a released call
        executed, failed, or ended in an indeterminate state is a separate
        dimension, which executor-side documents classify
        (<xref target="AEB"/> Section 5.13). Once a release has begun
        execution, an indeterminate outcome MUST NOT return the approval to
        pending, because a retry under it could duplicate an effect that did
        occur. <xref target="AEB"/> Section 5.11 describes the executor-side
        counterpart of this rule, an atomic consume-or-reserve before
        invocation.</t>
        <t>Where the verifier cannot establish that an approval is
        unconsumed, because its consumption state is unavailable, it MUST
        refuse. Restoring consumption state from an earlier point MUST NOT
        make a consumed approval presentable again. A deployment that restores
        either carries the consumed set forward from a source the restore did
        not roll back, or refuses every unexpired approval issued before the
        restore point. <xref target="AEB"/> Section 10 describes the same
        effect for a change of authority namespace, which makes consumed
        grants look unused.</t>
        <t>This document does not standardize approval interaction. It
        standardizes what the verifier must check about consumption.</t>
      </section>
      <section anchor="sec-role-keys" numbered="true" toc="default">
        <name>Verify Records Under Role-Separated Keys</name>
        <t>A verifier MUST select the acceptable signing keys from the record
        type, MUST refuse a record signed by the other role's key, and MUST
        refuse a key resolvable under both roles. The key that grants
        authority is never the key that judges it. (GAL-37)</t>
        <t>A signature under the right key says who wrote a record. It does
        not say the record is one that writer may write. Two further checks
        apply to a correctly signed record, and each closes a way of raising
        authority that the key check passes.</t>
        <t>Direction: a verifier MUST refuse a record signed under the
        evaluator role whose resulting level ranks above its starting level.
        The evaluator runs with no human in its path, and its key exists to
        lower. A demotion or a lapse that raises a level is authority minted
        by the side that must never mint it, and it verifies under the
        evaluator key exactly as an honest demotion does. An honest
        evaluator writes no such record, so this check only ever meets one
        that was planted in the store or written with a stolen evaluator
        key. (GAL-17, <xref target="GAL"/> Section 4.3)</t>
        <t>Continuity: a verifier that reads a grant's ledger MUST refuse a
        record, under either role, that does not start from the level the
        ledger held immediately before it. The first record of a ledger
        starts from no level. The direction check does not cover this. A
        demotion from the highest level to the middle one lowers on its own
        terms, and placed on a ledger that stood at the lowest level it
        leaves the derived level raised under the evaluator's signature. For
        the issuer's records, the ceremony reads the level it moves from, so
        a break in continuity marks a record that did not come through the
        ceremony, and a promotion that restates its starting level can hide
        a skipped step. (GAL-37, <xref target="GAL"/> Section 6.10)</t>
        <t>A re-attestation record changes no level. A verifier that derives
        a grant's level from its ledger, or that looks for the record a level
        rests on, MUST pass over a re-attestation record: the level and the
        record that earned it are the ones the ledger held immediately
        before it. Without this, two verifiers read one ledger and name
        different records as the one that earned the level. The one that
        names the re-attestation checks the standing of a different signer
        (<xref target="sec-standing"/>), and it finds no term on that record,
        where the promotion carries the term its ratifier agreed to.
        (<xref target="GAL"/> Section 4.3, <xref target="GAL"/>
        Section 6.6)</t>
        <t>A grant whose ledger contains a record refused under this section
        has no level the verifier can derive. A path through that grant is
        not fully valid, and <xref target="sec-fail-closed-path"/> decides
        the token.</t>
        <t>The level a verifier evaluates a grant at is the level its records
        derive. <xref target="GAL"/> Section 6.6 requires that no write to a
        grant go unrecorded and that a re-attestation always be signed under
        the issuer role (GAL-15), so grant state that no record accounts for
        is the trace of a write made outside the ceremony. It is not evidence
        of authority. A verifier that holds both a grant and its ledger MUST
        evaluate the grant at the lower of the level the grant states and
        the level its records derive, and MUST record the difference where
        there is one (<xref target="GAL"/> Section 6.11). Without this rule,
        one verifier trusts the stated level and another the derived one,
        and the two reach different decisions on the same evidence, which is
        the divergence this document exists to remove.</t>
      </section>
    </section>
    <section anchor="sec-security" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>Clock skew: the evaluation instant is supplied by the evaluating
      party as an explicit input. When two parties do not share a clock, the
      party evaluating supplies the instant. The clock source and the skew
      bound are deployment details, and a
      deployment MUST document which clock supplies the evaluation instant
      and the maximum skew it tolerates. This document sets no default
      bound; <xref target="sec-instant"/> fixes the direction in which the
      bound is applied.</t>
      <t>Key bootstrapping across boundaries: a receiving verifier needs the
      sending boundary's issuer key before any rule in <xref target="sec-rules"/>
      can run.</t>
      <t>Open issue: this document does not specify how the verifier comes to
      hold the sending boundary's issuer key. That is three questions, and
      they are separable:</t>
      <ol>
        <li>how candidate key material is obtained;</li>
        <li>how that material is bound to the organization it is claimed
        for; and</li>
        <li>whether the relying party chooses to trust that binding.</li>
      </ol>
      <t>A discovery mechanism can answer the first without answering the
      second, and a binding that answers the second still leaves the third
      to the relying party's own policy. The reference implementation
      answers all three at once by provisioning keys out of band, which
      requires a prior arrangement with each peer. This document requires
      only that the verifier hold a key it has decided to trust before any
      rule in <xref target="sec-rules"/> runs; the mechanism for each
      question is left for the working group.</t>
      <t>Refusals: a refusal is either permanent for the presented token or
      transient. It is permanent when no retry of the same token can
      succeed: an unsupported entry type (<xref target="sec-every-entry"/>),
      a signature that does not verify, an expired grant or approval, a
      record refused under <xref target="sec-role-keys"/>, an issuer whose
      standing is withdrawn. It is transient when the verifier could not
      evaluate because an input it needs was unavailable: a standing source,
      a key source, or consumption state. An input past its maximum age
      that the verifier could not obtain again is unavailable in the same
      sense (<xref target="sec-inputs"/>).</t>
      <t>Toward a caller the verifier authenticated before evaluating, and
      that it serves, a refusal MUST be distinguishable as permanent or
      transient. A transient refusal reported as permanent stops a caller
      whose token would succeed later, and a generic failure is retried at
      length. Toward any other caller the verifier MUST NOT make the two
      distinguishable. A refusal on the content of a message is not an
      outcome of evaluation under this document.</t>
      <t>The first requirement was a recommendation in earlier revisions. A
      recommendation is how a transient refusal comes to be reported as
      permanent in practice, and the harm of that misreport falls on a
      caller that did nothing wrong: it abandons a token that would have
      succeeded, or it retries a token that never will, which costs both
      parties availability. The second requirement exists because of who
      else can ask. To a party probing the verifier without being one of
      its callers, any difference between two refusals is a map of the
      verifier's configuration, and an answer of "transient" reports that
      an attack on a key source or a status source is working.
      <xref target="PTC"/> Section 6.1 states the same rule for the
      receiving boundary (PTC-44), together with the rule this document
      leaves to it: a refusal on content looks the same as acceptance to
      every sender.</t>
      <t>Where the transport already defines a code, that code is the
      one to use toward a caller the verifier serves. At the authorization
      server, <xref target="RFC9396"/>
      Section 5 defines invalid_authorization_details for an unknown
      authorization details type, and <xref target="RFC6749"/>
      Section 4.1.2.1 defines temporarily_unavailable. A resource server
      using bearer tokens has invalid_token <xref target="RFC6750"/> for a
      permanent refusal, and status code 503 with a Retry-After field
      <xref target="RFC9110"/> for a transient one. This document defines no
      new code and no response format.</t>
      <t>Whether a refusal is permanent or transient describes the
      verifier's state, not the caller's chain, so disclosing it to a caller
      the verifier serves is consistent with the rule below. The verifier's
      own record of a refusal
      MUST distinguish a token it evaluated and refused from a token it
      could not evaluate, and MUST name the input that was unavailable.
      Collapsing the two makes every missing input look like a policy
      decision to whoever reads the record later.</t>
      <t>The record member that carries this distinction is the evaluation
      member of <xref target="AUDIT-RECORD"/> Section 5.4, and this document
      uses that vocabulary and defines none of its own. A transient refusal
      is recorded with a status of not-evaluated and names each unavailable
      input from the closed set that document enumerates. A permanent
      refusal is recorded with a status of evaluated and a reported decision
      of deny. The names this section gives to unavailable inputs (standing
      source, key source, consumption state) are members of that set. The
      requirement in the preceding paragraph can be checked in a record
      only because that member exists: without it, the record of a verifier
      that lost an input and refused is identical to the record of a
      refusal it evaluated. <xref target="EVAL-STATE"/> states the same
      distinction as requirements independent of encoding, for agent
      protocol decisions beyond verifier evaluation.</t>
      <t>The refusal MUST NOT disclose which delegation path or grant failed
      evaluation, or the standing of any issuer. A verifier consumes tokens
      from another trust domain, and at that boundary an informative error
      is an oracle: naming the path that broke, or the parent grant that
      lapsed, lets the caller map the delegation graph and enumerate grant
      state it cannot otherwise see. The rule is to disclose properties of
      the verifier, which are public, and never the evaluated state of the
      caller's chain. The detail belongs in the verifier's audit record,
      where the operator reads it. A caller may still believe it holds
      authority after a grant above it has lapsed; the verifier does not owe
      it a correction.</t>
      <t>An unsupported entry is a different case. The entry types are in
      the caller's own token and the supported types are published
      (<xref target="sec-every-entry"/>), so whenever one entry carries a
      type the verifier does not advertise, the caller can already tell
      which entry it was. Naming that entry discloses nothing further, and
      this document neither requires nor forbids it.</t>
      <t>Timing carries the same information as content. A verifier that
      stops at the first broken path answers sooner for some chains than for
      others, and the difference can locate the break. Where chain state is
      sensitive, a verifier evaluates every path before it answers. The
      same holds for the difference between permanent and transient toward
      a caller that is not to learn it: a refusal that waited on a source
      answers later than one that did not.</t>
      <t>Dependency availability: every source a verifier fetches from is
      also a way to stop it. An attacker who can make a standing source, a
      key source, or consumption state unavailable turns fail-closed
      evaluation into a denial of service for every chain that depends on
      that source. This document does not relax fail-closed to avoid that.
      Whether an agent that cannot act is the safe outcome depends on what
      the agent does, so the response (redundant sources, caching within the
      pinned maximum age, alerting) is deployment policy.</t>
      <t>Audit availability: where the verifier cannot write its own record,
      the detail this section sends there is lost. A deployment MUST
      document whether a verifier that cannot write its record continues to
      admit.</t>
      <t>Standing and human presence: issuer standing establishes that an
      issuer still holds its role. It does not establish that a human was
      present when the issuer key signed; a signature establishes control of
      a key (<xref target="AEB"/> Section 10). A deployment that needs to
      know how the issuer authenticated carries that separately, for example
      as the acr and amr claims of <xref target="OIDC-CORE"/>
      Section 2.</t>
      <t>Key scope: a key the verifier knows is not thereby a key that may
      speak for every subject. Which party and which identities a key may
      sign for is the verifier's own configuration, established before
      evaluation and never taken from the chain. (PTC-46,
      <xref target="PTC"/> Section 6.7)</t>
      <t>Key custody: a signature shows that a key was used and does not
      show where the key is held. A chain looks the same whether or not the
      signer's agent can reach the signing key, so what a verifier knows
      about custody is a record in its own configuration, and a record its
      operator declared is not a check performed on the signer. (PTC-48,
      <xref target="PTC"/> Section 7.1)</t>
      <t>Structural separation: the agent MUST NOT hold signing keys and MUST NOT
      have write access to the grant store. Verification authenticates
      lineage; it does not clean taint and does not substitute for the
      receiver's own trust map. (<xref target="GAL"/> Section 6.7.2, <xref target="PTC"/> Section 6.6,
      <xref target="PTC"/> Section 6.7)</t>
      <t>Misconfigured verification, such as a configured but unusable key
      source, MUST fail closed loudly and MUST NOT silently degrade to no
      verification. (<xref target="PTC"/> Section 6.7)</t>
    </section>
    <section anchor="sec-iana" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>This document makes no request of IANA.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner"/>
            <date month="March" year="1997"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba"/>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9396">
          <front>
            <title>OAuth 2.0 Rich Authorization Requests</title>
            <author fullname="T. Lodderstedt"/>
            <author fullname="J. Richer"/>
            <author fullname="B. Campbell"/>
            <date month="September" year="2023"/>
          </front>
          <seriesInfo name="RFC" value="9396"/>
          <seriesInfo name="DOI" value="10.17487/RFC9396"/>
        </reference>
        <reference anchor="RFC9728">
          <front>
            <title>OAuth 2.0 Protected Resource Metadata</title>
            <author fullname="M. Jones"/>
            <author fullname="T. Lodderstedt"/>
            <date month="October" year="2024"/>
          </front>
          <seriesInfo name="RFC" value="9728"/>
          <seriesInfo name="DOI" value="10.17487/RFC9728"/>
        </reference>
        <reference anchor="AUDIT-RECORD">
          <front>
            <title>An Audit Record Format for AI Agent Authorization Decisions</title>
            <author fullname="S. Gilda"/>
            <date day="4" month="October" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-gilda-wimse-agent-audit-record-02"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="GAL" target="https://github.com/wjatx/ptc-gal-standards/blob/main/GAL-SPEC.md">
          <front>
            <title>GAL: Grant &amp; Autonomy Lifecycle, Specification</title>
            <author fullname="W. Jackson"/>
            <date year="2026"/>
          </front>
          <refcontent>version 0.6.1-draft</refcontent>
        </reference>
        <reference anchor="PTC" target="https://github.com/wjatx/ptc-gal-standards/blob/main/PTC-SPEC.md">
          <front>
            <title>PTC: Provenance &amp; Trust Context, Specification</title>
            <author fullname="W. Jackson"/>
            <date year="2026"/>
          </front>
          <refcontent>version 0.5.1-draft</refcontent>
        </reference>
        <reference anchor="RI" target="https://github.com/wjatx/ptc-gal-reference">
          <front>
            <title>ptc-gal-reference</title>
            <author>
              <organization>wjatx</organization>
            </author>
          </front>
          <refcontent>Public reference implementation of GAL and PTC; the code this document's rules are drawn from</refcontent>
        </reference>
        <reference anchor="DELEGATION-CHAIN">
          <front>
            <title>Verifiable Attenuated Delegation Chains for AI Agents</title>
            <author fullname="R. Asor"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-asor-wimse-agent-delegation-chain-01"/>
        </reference>
        <reference anchor="CONNECTED-FLIGHT">
          <front>
            <title>Zero Trust Fabric Layer Agent-to-Agent Chained Trust on a Connected Flight</title>
            <author fullname="E. Seymour"/>
            <date day="1" month="October" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-seymour-wimse-connected-flight-06"/>
        </reference>
        <reference anchor="AEB">
          <front>
            <title>The Action Evidence Boundary for Consequential Agent Effects</title>
            <author fullname="I. Schrock"/>
            <date day="25" month="September" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schrock-action-evidence-boundary-07"/>
        </reference>
        <reference anchor="CAID">
          <front>
            <title>The Canonical Action Identifier (CAID)</title>
            <author fullname="I. Schrock"/>
            <date day="2" month="October" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schrock-canonical-action-identifier-05"/>
        </reference>
        <reference anchor="EVAL-STATE">
          <front>
            <title>Preserving Evaluation State in Agent Protocol Decisions</title>
            <author fullname="G. Konda"/>
            <date day="10" month="October" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-konda-agentproto-evaluation-state-01"/>
        </reference>
        <reference anchor="RFC6750">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones"/>
            <author fullname="D. Hardt"/>
            <date month="October" year="2012"/>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </reference>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" role="editor"/>
            <date month="October" year="2012"/>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC8693">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author fullname="M. Jones"/>
            <author fullname="A. Nadalin"/>
            <author fullname="B. Campbell" role="editor"/>
            <author fullname="J. Bradley"/>
            <author fullname="C. Mortimore"/>
            <date month="January" year="2020"/>
          </front>
          <seriesInfo name="RFC" value="8693"/>
          <seriesInfo name="DOI" value="10.17487/RFC8693"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" role="editor"/>
            <author fullname="M. Nottingham" role="editor"/>
            <author fullname="J. Reschke" role="editor"/>
            <date month="June" year="2022"/>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC8915">
          <front>
            <title>Network Time Security for the Network Time Protocol</title>
            <author fullname="D. Franke"/>
            <author fullname="D. Sibold"/>
            <author fullname="K. Teichel"/>
            <author fullname="M. Dansarie"/>
            <author fullname="R. Sundblad"/>
            <date month="September" year="2020"/>
          </front>
          <seriesInfo name="RFC" value="8915"/>
          <seriesInfo name="DOI" value="10.17487/RFC8915"/>
        </reference>
        <reference anchor="OIDC-CORE" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID Connect Core 1.0</title>
            <author fullname="N. Sakimura"/>
            <author fullname="J. Bradley"/>
            <author fullname="M. Jones"/>
            <author fullname="B. de Medeiros"/>
            <author fullname="C. Mortimore"/>
            <author>
              <organization>OpenID Foundation</organization>
            </author>
          </front>
        </reference>
        <reference anchor="STATUS-LIST">
          <front>
            <title>Token Status List</title>
            <author fullname="T. Looker"/>
            <author fullname="P. Bastian"/>
            <author fullname="C. Bormann"/>
            <date day="21" month="June" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-status-list-21"/>
        </reference>
        <reference anchor="LEASES">
          <front>
            <title>Leases: An Efficient Fault-Tolerant Mechanism for Distributed File Cache Consistency</title>
            <author fullname="C. Gray"/>
            <author fullname="D. Cheriton"/>
            <date month="December" year="1989"/>
          </front>
          <refcontent>Proceedings of the Twelfth ACM Symposium on Operating Systems Principles (SOSP '89)</refcontent>
        </reference>
      </references>
    </references>
    <section anchor="sec-cases" numbered="true" toc="default">
      <name>Conformance Cases</name>
      <t>These cases restate requirements of Sections 3, 4 and 5 as checks.
      They add no requirement. Each gives the expected verdict and the
      expected reason, and a verifier that returns the verdict for a
      different reason has not passed the case: a verifier that refuses
      everything returns "refuse" wherever it is expected. The reason is
      what the verifier's own record carries
      (<xref target="sec-security"/>). The caller learns at most whether a
      refusal is permanent or transient. The reasons are written as prose;
      this document defines no reason codes.</t>
      <section anchor="sec-cases-expiry" numbered="true" toc="default">
        <name>An Approval at Its Expiry</name>
        <t>One held call is pending under an approval that expires at E.
        Every other input is valid. B is the pinned skew bound where E was
        asserted under another party's clock, and zero where it was asserted
        under the verifier's own. The evaluation instant t comes from the
        verifier's trusted clock and from nothing the presenter supplies
        (<xref target="sec-instant"/>). The same call is presented for
        release in each case.</t>
        <table anchor="tab-expiry">
          <name>Expiry cases</name>
          <thead>
            <tr><th>Case</th><th>Condition</th><th>Verdict</th><th>Reason the record carries</th></tr>
          </thead>
          <tbody>
            <tr><td>E1</td><td>t earlier than E minus B</td><td>release</td><td>The approval is valid at t and unconsumed. The release is the one consumption event of the instance.</td></tr>
            <tr><td>E2</td><td>t at or after E</td><td>refuse, permanent</td><td>The approval expired at the evaluation instant. Recorded as evaluated. Not a rejection: no approver disposition exists, and nothing is consumed.</td></tr>
            <tr><td>E3</td><td>B above zero; t at or after E minus B and earlier than E</td><td>refuse, permanent</td><td>As E2. The bound is applied toward less authority.</td></tr>
            <tr><td>E4</td><td>As E2; every timestamp in the presented records is earlier than E minus B</td><td>refuse, permanent</td><td>As E2. A verifier that releases derived the instant from the records.</td></tr>
            <tr><td>E5</td><td>As E2; the presenter asserts a current time earlier than E minus B</td><td>refuse, permanent</td><td>As E2. A verifier that releases took the instant from the presenter.</td></tr>
            <tr><td>E6</td><td>The E1 presentation repeated after the E1 release, t still earlier than E minus B</td><td>refuse, permanent</td><td>The approval was consumed by the release. Not expiry.</td></tr>
            <tr><td>E7</td><td>As E1; consumption state unavailable</td><td>refuse, transient</td><td>Could not evaluate; consumption state unavailable. Recorded as not-evaluated. Not expiry and not consumption.</td></tr>
          </tbody>
        </table>
        <t>E1 and E2 are the pair that matters: the same call, just before
        and just after its approval expires, against an instant supplied
        independently of the call. E4 and E5 hold the instant after expiry
        while everything the presenter controls says otherwise.</t>
      </section>
      <section anchor="sec-cases-records" numbered="true" toc="default">
        <name>Records Under a Valid Signature</name>
        <t>A grant has a ledger. Levels are written L1, L2 and L3, lowest
        first. Every record in these cases carries a signature that verifies
        under the key named. In R1 to R4 the grant has no level the verifier
        can derive, a path through it is not fully valid, and a refusal that
        follows is permanent (<xref target="sec-role-keys"/>).</t>
        <table anchor="tab-records">
          <name>Record cases</name>
          <thead>
            <tr><th>Case</th><th>Record</th><th>Verdict</th><th>Reason the record carries</th></tr>
          </thead>
          <tbody>
            <tr><td>R1</td><td>A demotion from L1 to L2, signed by the evaluator key</td><td>refuse the record</td><td>Direction: a record under the evaluator role raises a level. Not a signature failure.</td></tr>
            <tr><td>R2</td><td>The ledger stands at L1. A demotion from L3 to L2, signed by the evaluator key</td><td>refuse the record</td><td>Continuity: the record does not start from the level the ledger held. Not direction, since the record lowers on its own terms.</td></tr>
            <tr><td>R3</td><td>The ledger stands at L1. A promotion from L2 to L3, signed by the issuer key</td><td>refuse the record</td><td>Continuity, as R2.</td></tr>
            <tr><td>R4</td><td>A promotion signed by the evaluator key</td><td>refuse the record</td><td>The record is signed by the other role's key.</td></tr>
            <tr><td>R5</td><td>The ledger holds a promotion to L2, then a re-attestation at L2 by a different signer</td><td>level L2</td><td>The record the level rests on is the promotion. The re-attestation is passed over. A verifier that names the re-attestation fails the case although it reports L2.</td></tr>
            <tr><td>R6</td><td>The grant states L3. Its records derive L2, and none is refused</td><td>evaluate at L2</td><td>No record accounts for L3. The difference is recorded.</td></tr>
          </tbody>
        </table>
      </section>
      <section anchor="sec-cases-age" numbered="true" toc="default">
        <name>The Age of a Fetched Input</name>
        <t>The standing of one issuer was fetched from a pinned source with
        an as-of time of A. The pinned maximum age is M, so the horizon is A
        plus M. Every other input is valid.</t>
        <table anchor="tab-age">
          <name>Input age cases</name>
          <thead>
            <tr><th>Case</th><th>Condition</th><th>Verdict</th><th>Reason the record carries</th></tr>
          </thead>
          <tbody>
            <tr><td>G1</td><td>t earlier than A plus M; standing held</td><td>admit</td><td>Standing established as of A. The record carries A for this input.</td></tr>
            <tr><td>G2</td><td>t at or after A plus M; the source answers, standing held</td><td>admit</td><td>Standing established as of the new fetch. The record carries the new as-of time, not A.</td></tr>
            <tr><td>G3</td><td>t at or after A plus M; the source does not answer</td><td>refuse, transient</td><td>Could not evaluate; standing source unavailable. Recorded as not-evaluated. Not a withdrawal of standing.</td></tr>
            <tr><td>G4</td><td>t earlier than A plus M; standing withdrawn as of A</td><td>refuse, permanent</td><td>Issuer standing withdrawn. Recorded as evaluated.</td></tr>
            <tr><td>G5</td><td>The source's answer is earlier, by the source's own ordering, than one already accepted from it</td><td>answer not accepted</td><td>Earlier than an accepted answer from the same source. The accepted answer stays in force until its own horizon.</td></tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="acknowledgements" numbered="false" toc="default">
      <name>Acknowledgements</name>
      <t>Theo Adam contributed the test vector for the consumption rule and
      the argument that the authority a call runs under belongs in the
      frozen call, and separated closure of an authorization instance from
      the outcome of its execution. Iman Schrock raised the terminal
      meaning of rejection, the comparison basis for "as presented", and
      the three-way split of key bootstrapping. Girish Konda raised what a
      refused caller is told, the collision between refusal and rejection,
      and the difference between disclosing a failed entry and disclosing a
      failed path. Cliff Singletary raised issuer standing as an evaluation
      input, the difference between a denial and an evaluation that could
      not complete, and identifiers that survive re-provisioning.</t>
      <t>For this revision: Errol Seymour raised whether a pending approval
      is bounded and whether issuer standing needs a claim surface in the
      chain. Iman Schrock raised that expiry is never the approver's
      rejection, and the review case of one held call presented on either
      side of its approval's expiry. Girish Konda raised that the
      caller-facing classification of a refusal should be a requirement,
      and that the protocol side and the record side of a decision with unresolved inputs have to change together, and the horizon for which a resolved input is good. Sankalp Gilda defined the evaluation member of the
      audit record, on a construction Cliff Singletary proposed. Kieran
      Sweeney raised the boundary between attribution carried in a chain
      and authority. Jijie Wei raised a third outcome for a decision with unresolved inputs, and an as-of time for each input established at a different time, and that a decision has a horizon of its own, no later than that of its shortest-lived input.</t>
      <t>This document was prepared with AI assistance for drafting, source
      verification and editorial review. The technical positions are the
      author's.</t>
    </section>
  </back>
</rfc>
