<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by xml2rfc v3 -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     docName="draft-jiang-wimse-heterogeneous-credential-00"
     ipr="trust200902"
     obsoletes=""
     updates=""
     submissionType="IETF"
     xml:lang="en"
     version="3"
     consensus="true">

  <front>
    <title abbrev="Heterogeneous Credential Verification">Heterogeneous Credential Verification for Workload and Agentic Systems</title>
    <seriesInfo name="Internet-Draft" value="draft-jiang-wimse-heterogeneous-credential-00"/>

        <author initials="Y." surname="Jiang" fullname="Yuning Jiang">
        <organization>Huawei</organization>
        <address>
          <email>jiangyuning2@h-partners.com</email>
        </address>
      </author>

    <author initials="D." surname="Wang" fullname="Donghui Wang">
        <organization>Huawei</organization>
        <address>
          <email>wangdonghui124@huawei.com</email>
        </address>
      </author>

    <author initials="Y." surname="Song" fullname="Yurong Song">
        <organization>Huawei</organization>
        <address>
          <email>songyurong1@huawei.com</email>
        </address>
      </author>  

     <author initials="F." surname="Liu" fullname="Faye Liu">
        <organization>Huawei</organization>
        <address>
          <email>liufei19@huawei.com</email>
        </address>
      </author>


    <date year="2026" month="06" day="23"/>

    <area>Security</area>
    <workgroup>WIMSE</workgroup>

    <keyword>Workload Identity</keyword>
    <keyword>AI Agent</keyword>
    <keyword>Credential</keyword>
    <keyword>Verifier</keyword>
    <keyword>Authorization</keyword>

    <abstract>
      <t>
        Workloads in multi-system environments, including AI agents
        acting on behalf of users and organizations, increasingly
        present multiple credentials of heterogeneous types within a
        single request: workload identity tokens, user-delegated OAuth
        access tokens, W3C Verifiable Presentations, X.509
        certificates, platform-specific API keys, and security context
        artifacts such as attestation results.  These are issued by
        different authorities, follow different formats, are verified
        by different verifiers, and carry different assurance
        semantics.  A relying party that receives such a heterogeneous
        credential set has no common way to represent the set,
        identify each credential's type, determine the authoritative
        verifier for it, interpret verification results consistently,
        or combine multiple results into a single handling decision.
      </t>
      <t>
        This document defines a mechanism for processing a
        heterogeneous credential set on receipt.  It specifies a
        representation of the credential set, a procedure for
        identifying each credential's type and determining its
        verifier, a minimal common model for verification results that
        lets results from different verifiers be compared, and a
        policy model that combines multiple results into one handling
        decision.  The mechanism is transport-agnostic and does not
        constrain where the processing functions are deployed.
      </t>
    </abstract>

  </front>

  <middle>

    <section anchor="introduction">
      <name>Introduction</name>
      <t>
        The WIMSE Working Group addresses the representation,
        propagation, and processing of workload identity in
        multi-system environments <xref target="I-D.ietf-wimse-arch"/>,
        including workload identity credentials <xref
        target="I-D.ietf-wimse-workload-creds"/> and proof-of-possession
        mechanisms <xref target="I-D.ietf-wimse-wpt"/> for
        service-to-service interactions.  In deployed systems,
        however, a workload identity credential rarely travels alone.
        A single inbound request frequently carries several credentials
        of different kinds, and the receiving side must make sense of
        all of them before the request can be handled.
      </t>
      <t>
        This situation is the norm, not the exception, in agentic
        deployments.  An AI agent invoking a tool, a service, or
        another agent may simultaneously present (a) a workload or
        agent identity credential attesting to the identity of the
        agent software itself, (b) a delegation credential conveying
        the authority of the human or organizational principal on whose
        behalf the agent acts, and (c) capability or scope tokens
        bounding what the agent may do; in some deployments the set
        also includes attestation results describing the integrity
        state of the platform executing the agent.  These credentials
        are issued by different authorities and follow different
        formats: WIMSE Workload Identity Tokens <xref
        target="I-D.ietf-wimse-workload-creds"/>, OAuth 2.0 access
        tokens <xref target="RFC6749"/>, JWTs <xref target="RFC7519"/>,
        X.509 certificates <xref target="RFC5280"/>, W3C Verifiable
        Credentials and Presentations <xref target="W3C.VC"/>, and
        further token or context formats such as Entity Attestation
        Tokens <xref target="RFC9711"/> or proprietary API keys.  Each
        is verifiable only by a particular verifier or class of
        verifiers, and each carries its own assurance semantics,
        validity model, and freshness behavior.
      </t>
      <t>
        Existing specifications generally address these credential
        families one at a time.  They do not provide a common
        cross-credential model for a relying party that receives
        several of them together: how the credential set is
        represented and bound to the request, how each credential's
        type is identified, how the authoritative verifier or verifier
        class for each credential is determined, how verification
        results expressed in different vocabularies are interpreted
        consistently, and how multiple results, possibly partial or
        conflicting, are combined into a single decision on the
        handling of the request.
      </t>
      <t>
        In the absence of common answers, every gateway, agent
        platform, relying party, or domain-specific exposure function
        implements its own ad hoc verification pipeline.  The observable consequences include
        inconsistent security posture across deployments, silent
        acceptance of credentials that could not actually be verified,
        and the inability to express or audit cross-credential
        policies such as "a high-risk action requires both a fresh
        attestation result and a valid user delegation token".
      </t>
      <t>
        This document defines a mechanism that supplies these common
        answers.  After stating the problem (<xref target="problem"/>),
        it specifies how a heterogeneous credential set is represented
        (<xref target="m-representation"/>), how each credential's type
        is identified and its verifier determined (<xref
        target="m-resolution"/>), a minimal common model for
        verification results (<xref target="m-results"/>), and a policy
        model for combining results into a handling decision (<xref
        target="m-decision"/>).  The mechanism is described in terms of
        the information exchanged and the processing applied, not in
        terms of a particular deployment topology: the same functions
        may run within a relying party, within a gateway serving
        several relying parties, or in a dedicated service (<xref
        target="m-placement"/>).
      </t>
    </section>

    <section anchor="conventions">
      <name>Terminology</name>
      <t>
        The terms "workload" and "trust domain" are used as defined in
        <xref target="I-D.ietf-wimse-arch"/>.  The following additional
        terms are used:
      </t>
      <dl spacing="normal">
        <dt>Presenting Entity:</dt>
        <dd>
          The entity (typically a workload, an AI agent, or a
          user-delegated client) that originates a request and presents
          one or more credentials with it.
        </dd>
        <dt>Credential:</dt>
        <dd>
          A verifiable artifact binding claims to the Presenting Entity
          or its execution context.  A credential may be carried by
          value, or by reference (information sufficient to retrieve or
          reconstruct the credential).
        </dd>
        <dt>Credential Set:</dt>
        <dd>
          The collection of credentials presented with a single
          request.
        </dd>
        <dt>Credential Type:</dt>
        <dd>
          A classification of a credential that determines which
          verifier or class of verifiers is competent to verify it.
          Examples: WIMSE Workload Identity Token, OAuth 2.0 access
          token, JWT bearer assertion, X.509 certificate, W3C
          Verifiable Presentation, EAT attestation evidence, platform
          API key.
        </dd>
        <dt>Verifier:</dt>
        <dd>
          An entity capable of producing a verification result for one
          or more credential types.  Examples: an OAuth authorization
          server's introspection endpoint <xref target="RFC7662"/>, a
          RATS Verifier <xref target="RFC9334"/>, a PKI validation
          service, a Verifiable Credential verifier.
        </dd>
        <dt>Verifier Class:</dt>
        <dd>
          A class of verifiers sharing a verification capability (e.g.,
          "token introspection endpoint", "attestation verifier"),
          as distinct from a concrete verifier instance.
        </dd>
        <dt>Relying Party (RP):</dt>
        <dd>
          The function that receives the original request from the
          Presenting Entity and must decide how to handle it.
        </dd>
        <dt>Verification Result:</dt>
        <dd>
          The outcome of verifying a single credential, including at
          minimum a status (such as valid, invalid, or indeterminate),
          and possibly assurance level, verified claims, freshness
          information, and verifier identity.
        </dd>
        <dt>Decision Policy:</dt>
        <dd>
          A rule set that maps a tuple of verification results,
          together with attributes of the request, to a handling
          decision for the request.
        </dd>
      </dl>
    </section>

    <section anchor="usecases">
      <name>Use Cases</name>

      <section anchor="uc-s2s">
        <name>Service-to-Service Calls in Multi-System Environments</name>
        <t>
          A workload in one trust domain calls a service in another.
          The request carries the caller's workload identity
          credential together with an end-user OAuth access token
          propagated from an earlier hop, and possibly further context
          such as a platform attestation result in regulated
          deployments.  The receiving service must verify the workload
          identity against its issuer and introspect the access token
          against a different authorization server, each by a different
          verifier, before deciding whether the combination is
          sufficient for the requested operation.  The workload
          identity credential is one element of the credential set,
          not the whole story.
        </t>
      </section>

      <section anchor="uc-a2a">
        <name>Agent-to-Agent Task Delegation</name>
        <t>
          An AI agent delegates a task to another agent across the
          Internet.  The callee agent (or a gateway in front of it)
          receives the caller agent's identity credential, the
          delegation chain of the originating human or organizational
          principal, one or more task-scoped capability tokens, and
          possibly runtime assurance context about the caller's
          execution environment.  These artifacts originate in
          different trust domains and formats, and the callee must
          evaluate them together before accepting the delegated task.  This need is
          independent of which agent communication protocol carries
          the request.
        </t>
      </section>

      <section anchor="uc-exposure">
        <name>Device-Hosted Agents and Domain-Specific Exposure</name>
        <t>
          An agent hosted on a user device interacts with
          domain-specific services through an exposure interface.
          Credentials anchored in different trust domains accompany
          the request: subscription-related credentials anchored in
          the service operator's domain, application-layer tokens
          anchored in a third-party identity provider, and device or
          platform assurance context anchored in another trust domain.
          The receiving side must route each credential to the
          verifier that is authoritative for it and combine the
          outcomes under operator policy.
        </t>
      </section>
    </section>

    <section anchor="problem">
      <name>Problem Statement</name>
      <t>
        The use cases share five recurring gaps, summarized here and
        addressed by the mechanism in <xref target="mechanism"/>.
      </t>
      <ul spacing="normal">
        <li anchor="p-representation">
          <strong>Credential set representation.</strong> There is no
          common way to convey a set of heterogeneous credentials with
          a request so that the receiver can enumerate the set,
          distinguish credentials carried by value from those carried
          by reference, and detect tampering.  Each credential tends to
          occupy its own protocol slot, making the set as a whole
          invisible: a relying party cannot tell whether a credential
          is absent because it was never presented or because it was
          stripped in transit.
        </li>
        <li anchor="p-identification">
          <strong>Credential type identification.</strong> A credential
          cannot be acted on until its type is known.  Some formats are
          self-describing, some are recognizable structurally, and some
          (opaque tokens, API keys) are indistinguishable without
          out-of-band context.  There is no shared vocabulary of
          credential type identifiers and no convention for declaring a
          type alongside a credential whose format is not
          self-describing.
        </li>
        <li anchor="p-determination">
          <strong>Verifier determination.</strong> Given a typed
          credential, some party must determine which verifier is
          authoritative for it.  This association has no standard
          expression, and there is no defined behavior when no
          authoritative verifier is known, the silent default,
          ignoring the credential, being the most dangerous.
        </li>
        <li anchor="p-normalization">
          <strong>Verification result normalization.</strong> An OAuth
          introspection response <xref target="RFC7662"/>, a RATS
          attestation result <xref target="RFC9334"/>, a certificate
          path validation outcome, and a Verifiable Presentation report
          differ in structure, status granularity, assurance, and
          freshness.  Reasoning over several at once needs a common
          minimal model, and a defined treatment of the indeterminate
          outcome, which fails open if read as valid and fails closed
          if read as invalid.
        </li>
        <li anchor="p-decision">
          <strong>Multi-result decision policy.</strong> Multiple
          results must be combined into one handling decision,
          conditioned on attributes such as operation type, request
          content, risk, credential precedence, and result freshness,
          with outcomes beyond allow and deny.  Such policies today are
          locked in proprietary configuration and cannot be exchanged
          or audited.
        </li>
      </ul>
    </section>

    <section anchor="mechanism">
      <name>Heterogeneous Credential Verification Mechanism</name>
      <t>
        This section defines the mechanism.  It is described in terms
        of five processing functions and the information each consumes
        and produces.  The functions are presented in a natural order,
        but an implementation may interleave, parallelize, or
        short-circuit them as long as the externally observable result
        is equivalent; <xref target="m-placement"/> discusses where the
        functions run.
      </t>

      <figure anchor="fig-overview">
        <name>Processing of a Heterogeneous Credential Set</name>
        <artwork type="ascii-art"><![CDATA[
+------------+  request +       +------------------------------+
| Presenting |  credential set  | Receiving side               |
| Entity     |----------------->| (RP, gateway, platform,      |
| (workload/ |                  |  or helper service)          |
|  AI agent) |                  |                              |
+------------+                  | (1) set enumeration          |
                                | (2) type identification      |
                                | (3) verifier determination   |
                                | (4) result normalization     |
                                | (5) decision policy          |
                                +---------------+--------------+
                                                |
                                                | per-credential
                                                | verification
                                                v
                            +----------+ +----------+ +----------+
                            | Verifier | | Verifier | | Verifier |
                            | (OAuth)  | | (RATS)   | | (VC/PKI) |
                            +----------+ +----------+ +----------+
]]></artwork>
      </figure>

      <section anchor="m-representation">
        <name>Credential Set Representation</name>
        <t>
          A request is accompanied by a Credential Set: an ordered list
          of Credential Entries together with a binding to the request.
          The mechanism defines the following information for the set
          and for each entry; the concrete encoding (for example, a
          JSON object, a CBOR map, or a structured HTTP field) is left
          for working group discussion, and the field names below are
          descriptive.
        </t>
        <t>
          The Credential Set carries:
        </t>
        <dl spacing="normal">
          <dt>request-binding:</dt>
          <dd>
            A value that ties the set to the specific request, for
            example a digest of the request's method, target, and
            security-relevant headers.  It lets a receiver detect a
            set replayed against a different request.
          </dd>
          <dt>set-digest:</dt>
          <dd>
            A digest computed over the ordered enumeration of entries
            (specifically over each entry's type and a stable
            identifier of its credential).  Together with
            request-binding, it lets a receiver detect that an entry
            has been added, removed, or substituted in transit.  When
            the Presenting Entity can sign, signing set-digest binds
            the membership of the set to the Presenting Entity; this
            is the property that distinguishes a credential that was
            never presented from one that was stripped.
          </dd>
          <dt>entries:</dt>
          <dd>
            The ordered list of Credential Entries.
          </dd>
        </dl>
        <t>
          Each Credential Entry carries:
        </t>
        <dl spacing="normal">
          <dt>type:</dt>
          <dd>
            The credential type (<xref target="m-resolution"/>), if
            known to the Presenting Entity; otherwise absent, to be
            determined by the receiver.
          </dd>
          <dt>conveyance:</dt>
          <dd>
            Either "value" or "reference".
          </dd>
          <dt>credential:</dt>
          <dd>
            Present when conveyance is "value": the credential itself.
          </dd>
          <dt>reference:</dt>
          <dd>
            Present when conveyance is "reference": information
            sufficient for an authorized party to retrieve or verify
            the credential without the credential being carried inline,
            for example an introspection hint together with an issuer
            hint, a certificate digest with a retrieval locator, or an
            opaque evidence handle.
          </dd>
        </dl>
        <t>
          A receiver enumerates the entries, recomputes set-digest over
          them, and checks it against the value carried in the set and,
          where present, against the Presenting Entity's signature.  A
          mismatch, or an absent expected entry (<xref
          target="m-decision"/>), is carried forward as an input to the
          decision rather than silently ignored.
        </t>
      </section>

      <section anchor="m-resolution">
        <name>Type Identification and Verifier Determination</name>
        <t>
          For each entry whose type is not already supplied, the
          receiver determines a Credential Type.  Type is taken, in
          order of preference, from an explicit, integrity-protected
          declaration (such as a media type or a "typ" header parameter
          <xref target="RFC7519"/>); from the structural framing of a
          credential carried by value (JOSE or COSE framing, X.690 DER,
          JSON-LD presentation framing); or from deployment context for
          credentials that are otherwise opaque.  How the type was
          determined is retained, because it bounds the assurance that
          can be attached to the eventual result: a type taken from an
          integrity-protected declaration supports a stronger result
          than one inferred heuristically.
        </t>
        <t>
          The receiver then determines a Verifier for the credential
          using a Verifier Resolution Map, which associates a
          Credential Type with one of:
        </t>
        <dl spacing="normal">
          <dt>a Verifier instance:</dt>
          <dd>
            a concrete endpoint and the identity expected of it.  This
            is the direct association.
          </dd>
          <dt>a Verifier Class:</dt>
          <dd>
            a category of verifier (for example, "OAuth introspection
            endpoint", "attestation verifier", "PKIX path validator")
            that is resolved to a concrete instance by configuration,
            by discovery such as authorization server metadata <xref
            target="RFC8414"/>, or by association with the trust anchor
            under which the credential was issued.  This is the
            indirect association, and it is what allows the
            authoritative verifier to follow the credential's origin
            rather than being fixed by the receiver, which matters when
            the set spans trust domains.
          </dd>
        </dl>
        <t>
          When the map yields no association for a Credential Type, the
          credential is treated as unverifiable: the receiver records a
          result with status "indeterminate" and a reason of
          "no-verifier" (<xref target="m-results"/>) and carries it
          into the decision.  The credential is not dropped.
        </t>
      </section>

      <section anchor="m-results">
        <name>Verification Result Model</name>
        <t>
          Each credential is verified by its determined Verifier using
          that verifier's native protocol (OAuth introspection <xref
          target="RFC7662"/>, RATS appraisal <xref target="RFC9334"/>,
          PKIX path validation, Verifiable Presentation verification,
          and so on).  The native outcome is projected onto a common
          Verification Result so that results from different verifiers
          can be compared.  A Verification Result carries:
        </t>
        <dl spacing="normal">
          <dt>credential-type:</dt>
          <dd>
            The type of the credential this result pertains to.
          </dd>
          <dt>status:</dt>
          <dd>
            One of "valid", "invalid", or "indeterminate".  An
            unreachable verifier, an unresolved verifier, or an
            unidentifiable credential yields "indeterminate", not
            "valid" and not "invalid".
          </dd>
          <dt>reason:</dt>
          <dd>
            Optional, refining a status (for example "expired",
            "verifier-unreachable", "no-verifier").
          </dd>
          <dt>verifier:</dt>
          <dd>
            The identity of the verifier that produced the result.
          </dd>
          <dt>produced-at:</dt>
          <dd>
            The time the result was produced.
          </dd>
          <dt>fresh-until:</dt>
          <dd>
            The time after which the result is to be treated as
            "indeterminate".  Defaulted per credential type when the
            verifier does not state one; attestation results typically
            carry a short bound, introspection results a longer one.
          </dd>
        </dl>
        <t>
          Additional, type-specific information (an assurance level, a
          set of verified claims) may accompany a result; whether and
          how such information is normalized further is left for
          working group discussion.  The four-field core (status,
          verifier, produced-at, fresh-until) is what the decision
          function relies on.
        </t>
      </section>

      <section anchor="m-decision">
        <name>Decision Policy</name>
        <t>
          The decision function consumes the Verification Results for
          the set together with a Decision Context describing the
          request, and produces a single Handling Decision.  The
          Decision Context carries request attributes against which
          policy is evaluated:
        </t>
        <dl spacing="normal">
          <dt>request-type:</dt>
          <dd>
            The class of operation (for example read, write,
            tool-invocation, task-delegation).
          </dd>
          <dt>request-content:</dt>
          <dd>
            Attributes derived from the request (for example target
            resource, parameter sensitivity).
          </dd>
          <dt>risk-level:</dt>
          <dd>
            A risk classification assigned by the receiver or an
            upstream risk function.
          </dd>
          <dt>expected-types:</dt>
          <dd>
            The credential types expected for this request class, so
            that an expected-but-absent type becomes an explicit
            "indeterminate" input rather than being overlooked.
          </dd>
        </dl>
        <t>
          A policy maps the tuple of results and the Decision Context
          to one of the following Handling Decisions: "allow"; "deny";
          "allow-with-constraints" (for example reduced scope, rate
          limiting, sandboxed execution); "step-up" (request
          additional or re-presented credentials); or "quarantine"
          (hold for review).  Deployments may define additional
          outcomes.
        </t>
        <t>
          The mechanism does not fix a single policy language; it fixes
          the inputs (the result tuple and the Decision Context) and
          the outcome vocabulary, leaving the policy expression itself
          to deployment or to future work.  Two rules constrain any
          policy, because they capture the failure modes the mechanism
          exists to prevent: a result that is "indeterminate", or
          stale per its fresh-until bound, is not treated as "valid";
          and for a request classified as high risk, the default
          decision in the presence of any "indeterminate" result is
          not "allow".
        </t>
        <t>
          Policies typically also express a precedence among results
          (for example, an "invalid" attestation result overriding an
          otherwise "valid" bearer-token result) and joint
          requirements (for example, requiring two specific types to
          be jointly "valid" for a high-risk operation).  The
          information needed to express these, result status per type
          and the Decision Context, is available to the policy by
          construction.
        </t>
      </section>

      <section anchor="m-placement">
        <name>Function Placement</name>
        <t>
          The five functions can be performed entirely within the
          relying party; by a gateway or agent platform on behalf of
          several relying parties; or partly by a dedicated service,
          for example one that performs only type identification and
          verifier determination and returns the determinations to the
          relying party, or one that also performs verification and
          returns Verification Results.  These are deployment choices.
          Wherever a function is performed by a party other than the
          relying party, the relying party relies on that party's
          output, and the granularity of that output (a verifier
          determination, a set of results, or a final decision)
          determines how much authority is delegated; the interface
          between them carries the same information defined in this
          section.
        </t>
      </section>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>
        A credential set reveals the Presenting Entity's relationships
        across trust domains: which issuers it has credentials from,
        which tenants and devices are involved.  Carrying a credential
        by value exposes its contents to every party that processes the
        set, while carrying it by reference (<xref
        target="m-representation"/>) exposes only metadata, at the cost
        of an additional retrieval interaction; the reference form is
        preferable when a processing party other than the relying party
        need not see credential contents.  A verifier generally does
        not need the full request context to verify a single
        credential, and the Decision Context (<xref
        target="m-decision"/>) is therefore kept separate from the
        material handed to individual verifiers.
      </t>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>
        The considerations below identify the security properties on
        which the mechanism depends.
      </t>
      <t>
        <strong>Credential stripping and downgrade.</strong> An
        on-path party may remove high-assurance credentials from a
        credential set so that the decision is made on weaker
        credentials alone.  Without a tamper-evident enumeration of
        the presented set (<xref target="p-representation"/>), a
        relying party cannot distinguish "not presented" from
        "stripped".
      </t>
      <t>
        <strong>Verifier misrouting.</strong> Redirecting a credential
        type to an attacker-controlled verifier defeats all downstream
        policy; where verifier determination relies on dynamic
        discovery, the discovered verifier needs to be authenticated
        against trust anchors appropriate to its class, not merely at
        the transport layer.
      </t>
      <t>
        <strong>Trust in delegated functions.</strong> Wherever a
        function of <xref target="m-placement"/> is performed by
        a party other than the relying party, that party's output
        becomes an attack target, and its binding to the specific
        request determines exposure to replay.
      </t>
      <t>
        <strong>Indeterminate results.</strong> Collapsing
        indeterminate outcomes into "valid" is the most likely failure
        mode in multi-credential systems, and the consequences scale
        with the risk of the request.  Privacy properties of the
        credential set are discussed in <xref target="privacy"/>.
      </t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>
        This version requests no IANA actions.  A future version may
        request a registry of credential type identifiers (used in the
        type field of a Credential Entry and the credential-type field
        of a Verification Result) and a registry of handling decision
        outcomes, should the working group find a common vocabulary for
        these useful for interoperability.  Whether these registries
        are warranted, and their allocation policies, are open
        questions for the working group.
      </t>
    </section>

  </middle>

  <back>
    <references>
      <name>Informative References</name>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6749.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7519.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7662.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8414.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9334.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9711.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-wimse-arch.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-wimse-workload-creds.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-wimse-wpt.xml"/>
      <reference anchor="W3C.VC" target="https://www.w3.org/TR/vc-data-model-2.0/">
        <front>
          <title>Verifiable Credentials Data Model v2.0</title>
          <author>
            <organization>W3C</organization>
          </author>
          <date year="2025"/>
        </front>
      </reference>
    </references>

    <section anchor="example">
      <name>Worked Example</name>
      <t>
        This appendix walks through one concrete scenario to show how
        the information defined in <xref target="mechanism"/> fits
        together.  The JSON-like encodings below illustrate the
        information carried; the concrete wire encoding and field names
        are left for working group discussion (<xref
        target="m-representation"/>).
      </t>
      <t>
        An AI agent invokes a high-risk tool through a gateway.  The
        request carries three artifacts: a WIMSE Workload Identity
        Token <xref target="I-D.ietf-wimse-workload-creds"/>
        identifying the agent workload (by value), a user-delegated
        OAuth 2.0 access token (by reference, suitable for
        introspection), and platform attestation evidence carried as
        an Entity Attestation Token <xref target="RFC9711"/> for the
        agent's execution environment (by reference).
      </t>
      <t>
        The credential set, enumerated and bound to the request:
      </t>
      <sourcecode type="json"><![CDATA[
{
  "request-binding": "sha-256:5b41f0...",
  "set-digest": "sha-256:9d80c2...",
  "entries": [
    {
      "type": "wimse-wit",
      "conveyance": "value",
      "credential": "eyJhbGciOiJFUzI1NiIs..."
    },
    {
      "type": "oauth2-access-token",
      "conveyance": "reference",
      "reference": {
        "token-hint": "ZGVsZWdhdGlvbi0w...",
        "issuer-hint": "https://as.example"
      }
    },
    {
      "type": "eat-evidence",
      "conveyance": "reference",
      "reference": {
        "evidence-handle": "urn:example:evidence:7c2a"
      }
    }
  ]
}
]]></sourcecode>
      <t>
        Here "set-digest", computed over the enumerated entries and
        combined with "request-binding", lets the receiver detect that
        an entry was added, removed, or substituted; if the agent signs
        "set-digest", a stripped credential becomes detectable rather
        than indistinguishable from one never presented.
      </t>
      <t>
        The receiver determines a verifier per entry: the WIT is
        verified locally against the issuing trust domain's keys, the
        access token is introspected at the issuing authorization
        server, and the evidence is appraised by the attestation
        verifier associated with the evidence's trust anchor.  Suppose
        the attestation verifier is unreachable.  The three Verification
        Results:
      </t>
      <sourcecode type="json"><![CDATA[
[
  {
    "credential-type": "wimse-wit",
    "status": "valid",
    "verifier": "local:wit-validator",
    "produced-at": "2026-06-11T09:30:05Z",
    "fresh-until": "2026-06-11T09:40:05Z"
  },
  {
    "credential-type": "oauth2-access-token",
    "status": "valid",
    "verifier": "https://as.example/introspect",
    "produced-at": "2026-06-11T09:30:06Z",
    "fresh-until": "2026-06-11T09:32:06Z"
  },
  {
    "credential-type": "eat-evidence",
    "status": "indeterminate",
    "reason": "verifier-unreachable",
    "verifier": "https://rats.example/appraise",
    "produced-at": "2026-06-11T09:30:08Z"
  }
]
]]></sourcecode>
      <t>
        The decision policy evaluates the results against the Decision
        Context:
      </t>
      <sourcecode type="json"><![CDATA[
{
  "request-type": "tool-invocation",
  "risk-level": "high",
  "expected-types": [
    "wimse-wit",
    "oauth2-access-token",
    "eat-evidence"
  ]
}
]]></sourcecode>
      <t>
        Because the request is classified high risk and the
        attestation result is indeterminate, the policy does not
        allow the request (see <xref target="m-decision"/>); nor does
        it simply deny, since the two other results are valid and
        fresh.  The outcome is "step-up": the gateway asks the agent
        to re-present attestation evidence, illustrating a handling
        decision beyond binary allow/deny as discussed in <xref
        target="m-decision"/>.
      </t>
    </section>

    <section anchor="ack" numbered="false">
      <name>Acknowledgments</name>
      <t>
        TODO.
      </t>
    </section>
  </back>
</rfc>