<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 4.0.5) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mih-agent-evidence-request-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="Evidence Request">An Interaction Model for Requesting Verifiable Evidence</title>
    <seriesInfo name="Internet-Draft" value="draft-mih-agent-evidence-request-00"/>
    <author initials="S." surname="Mih" fullname="Steven Mih">
      <organization>Action State Group, Inc.</organization>
      <address>
        <email>spec@actionstate.ai</email>
      </address>
    </author>
    <date year="2026" month="September" day="26"/>
    <area>Security</area>
    <keyword>transparency</keyword>
    <keyword>audit</keyword>
    <keyword>evidence</keyword>
    <keyword>interaction model</keyword>
    <abstract>
      <?line 49?>

<t>Parties increasingly need to request verifiable evidence from a counterparty
they do not trust — an audit trail, an interaction history, an account of
actions taken — and to receive an answer they can check rather than believe.
Evidence formats for the answer exist; the ask has no standard shape, and
today one system's silence, another's error, and a third's stale cache are
indistinguishable to a relying party. This document defines a
transport-agnostic request/response interaction for verifiable evidence: a
request that names its subject and a coverage anchor, and a set of possible
outcomes that is exactly one of three things — the evidence artifact, a
signed refusal carrying a machine-readable reason, or a recorded absence.
The interaction makes asking, granting, and refusing each attributable and
checkable, and requires that the same subject under the same coverage yield
a byte-identical artifact for every requester. The interaction is symmetric:
any party to a recorded exchange may ask the other, anchored on its own
record of that exchange. A responder may additionally commit, in a
signed statement, to keep a subject answerable until a stated time, so that
a later absence is attributable rather than merely recorded. The document
deliberately defines no evidence format, no identity or principal scheme,
no trust policy, no availability guarantee, and no rule about who may ask.</t>
    </abstract>
  </front>
  <middle>
    <?line 71?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>A growing class of systems — autonomous agents, multi-party computation
pipelines, registries of signed claims — accumulate evidence about their own
actions: signed statements, receipts, transparency-log inclusion
proofs. Formats for these artifacts exist and continue to
mature; the SCITT architecture <xref target="RFC9943"/> and COSE Receipts <xref target="RFC9942"/> are
representative examples, and this document depends on neither. What has no
standard shape is the <strong>ask</strong>. Each ecosystem invents its own convention for
"give me your evidence": a bespoke query endpoint here, an ad-hoc agent
command there, a static file by private agreement somewhere else. The
answers are not comparable. When a relying party asks two counterparties the
same question, one counterparty's silence, another's transport error, and a
third's stale cached answer all look alike — and none of the three leaves a
record that the question was asked.</t>
      <t>This document standardizes the interaction, not the evidence. It defines a
request — a small map naming a <strong>subject</strong> (what evidence is wanted) and a
<strong>coverage anchor</strong> (the commitment the answer must verify against) — and
constrains the outcome to exactly one of three states: the evidence
artifact itself, a signed refusal with a machine-readable reason, or a
recorded absence. Each outcome is something the requester can record and
later cite. The evidence artifact remains opaque to this specification; it
is identified by digest and verified against the anchor by format-specific
means outside this document. A deployment that already has a format for the
artifact — for example an Evidence Bundle
(<xref target="I-D.mih-zhang-agent-action-capsule-evidence-bundle"/>) — carries it inside
the artifact response envelope this document defines (<xref target="artifact"/>);
nothing here restates that format.</t>
      <t>Two further properties follow from deployments of this interaction shape,
sketched in <xref target="field-evidence"/>. First, the interaction is symmetric: the
party that served a request may later ask the party that made it, and each
side's strongest coverage anchor is its own sealed record of the exchange
(<xref target="symmetric"/>). Second, the useful default answer to "show me your history"
is not the records but a constant-size summary of the commitments over them
— checkpoints, receipts, and consistency proofs — from which any individual
record can later be verified (<xref target="history-card"/>). A third property is
optional: a responder may sign a commitment that a subject will remain
answerable until a stated time (<xref target="retention"/>). Absence against an
outstanding commitment is evidence against the responder; absence
otherwise is evidence only of the requester's attempt.</t>
      <section anchor="failures">
        <name>Two Failure Modes</name>
        <t>The interaction is designed to close two specific failure modes this shape
exists to prevent, sketched in <xref target="field-evidence"/>:</t>
        <t><strong>The flattering version.</strong> A responder that serves evidence through an
unconstrained query interface can serve <em>different</em> evidence to different
requesters — a fuller history to an auditor it expects, a curated one to a
counterparty in a dispute. Nothing in the transport reveals the divergence.
The caller-invariance requirement addresses this, conditional on the
anchor-consistency requirement of <xref target="invariance"/>: the artifact
is a function of the subject and the coverage anchor, never of who is
asking.</t>
        <t><strong>The unaccountable refusal.</strong> A responder that declines by silence, by
generic error, or by an unsigned message leaves the requester with nothing
citable: "I asked and they refused" is an assertion, not a record. The
signed refusal (<xref target="refusal"/>) constrains this: a refusal is a first-class,
signed, machine-readable answer that the requester can record — and the
three-state discipline (<xref target="discipline"/>) keeps genuine non-response
distinguishable from refusal, so neither can be laundered into the other.</t>
      </section>
      <section anchor="nongoals">
        <name>Non-Goals</name>
        <t>This document deliberately does not define:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Any evidence format.</strong> The artifact is an opaque byte string identified
by digest. Signed statements, receipts, log entries, bundles of proofs —
all are carried, none are specified here.</t>
          </li>
          <li>
            <t><strong>Any identity or principal scheme.</strong> Where a deployment binds a request
or its response to a principal — the requester, the responder, or both —
the reference's scheme (a key, a DID, an account identifier, a
host-native name) is defined by the host or deployment, never by this
document (<xref target="principal"/>).</t>
          </li>
          <li>
            <t><strong>Requester identity, purpose, authorization, or disclosure policy carried
in the artifact.</strong> These belong to the request/relationship layer — a
deployment's own account, contract, or relationship model — and are
referenced by this interaction, never embedded in the evidence artifact
itself. What a <tt>principal</tt> field (<xref target="principal"/>) names, and what
relationship or contract a request cites, is deployment-defined and
outside this document.</t>
          </li>
          <li>
            <t><strong>Any trust decision.</strong> Receiving an artifact, a refusal, or nothing
implies no judgment about the responder. What a requester does with each
outcome is its own policy.</t>
          </li>
          <li>
            <t><strong>Authorization or standing.</strong> Who may ask, and what any requester is
entitled to receive, is the responder's policy and is out of scope. This
document constrains only the <em>form</em> of the answer, whichever answer policy
selects.</t>
          </li>
          <li>
            <t><strong>Any availability guarantee.</strong> The interaction makes loss detectable
and, where a responder has committed to retention (<xref target="retention"/>),
attributable. It never makes evidence available.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="terms">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t><strong>Requester:</strong> the party asking for evidence.</t>
      <t><strong>Responder:</strong> the party holding evidence and answering.</t>
      <t><strong>Evidence artifact:</strong> the byte string a responder serves in the granting
case. Opaque to this specification; identified by its digest.</t>
      <t><strong>Evidence stream:</strong> the append-only body of evidence a responder holds
and answers from — the ordered records over which its coverage anchors
commit. A responder <bcp14>MAY</bcp14> hold several streams; a request is answered
against exactly one.</t>
      <t><strong>Anchored:</strong> verifying against a coverage anchor by the
mechanism-specific means of the deployment's evidence format.</t>
      <t><strong>Coverage anchor:</strong> a commitment — for example, a signed checkpoint over an
append-only log, or a receipt from a transparency service <xref target="RFC9943"/> — that
the evidence artifact must verify against. The anchor is what turns an
artifact from a story into something checkable: an artifact that verifies
against an anchor the requester obtained or constrained independently is
tamper-evident with respect to that anchor.</t>
      <t><strong>Checkpoint / commitment:</strong> used generically for any signed, compact
representation of a body of evidence at a point in its history, such that
inclusion and consistency of evidence against it are checkable.
<xref target="I-D.mih-scitt-checkpointed-local-log"/> describes one example of such a
mechanism; this document depends on no particular one.</t>
      <t><strong>Freshness:</strong> how recent a coverage anchor is, measured in a
mechanism-specific unit (a log size, a timestamp).</t>
      <t><strong>Exchange half:</strong> a party's own sealed record of one interaction with a
counterparty — its request, or its response — citing the counterparty's
record by digest.</t>
      <t><strong>History card:</strong> the derivation <tt>history_card/1</tt> (<xref target="history-card"/>): the
checkpoints over an evidence stream, their external receipts, and the
consistency proofs between consecutive checkpoints. Constant size in the
number of records; discloses no record content.</t>
      <t><strong>Retention commitment:</strong> a signed statement by a responder that a named
subject will remain answerable under this interaction until a stated time
(<xref target="retention"/>).</t>
      <t><strong>Route:</strong> a locator — a resolver, a URL, an endpoint identifier — for
reaching a responder. Routes are hints. They are never subjects and never
identity.</t>
      <t><strong>Principal reference:</strong> an opaque value identifying a party — requester,
responder, or a party named in a retention commitment — in a scheme this
document does not define (<xref target="principal"/>). Distinct from a route: a route is
where a party can be reached; a principal reference is who it is under
whatever identity scheme the deployment recognizes.</t>
      <t><strong>The three interaction outcomes:</strong> artifact (<xref target="artifact"/>), signed refusal
(<xref target="refusal"/>), recorded absence (<xref target="absence"/>).</t>
      <t><strong>Pending:</strong> the state of a request, before its waiting window closes,
that has received neither an artifact response nor a signed refusal. Not
one of the three interaction outcomes; resolves to recorded absence only
once the window closes (<xref target="pending"/>).</t>
    </section>
    <section anchor="request">
      <name>The Request</name>
      <t>A request is a map — CBOR <xref target="RFC8949"/> in bindings that use CBOR, JSON in
bindings that use JSON, with the same field names — with the following
fields:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Field</th>
            <th align="left">Presence</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>subject</tt></td>
            <td align="left">
              <bcp14>REQUIRED</bcp14></td>
            <td align="left">what evidence is asked for (<xref target="subject"/>)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>coverage</tt></td>
            <td align="left">
              <bcp14>REQUIRED</bcp14></td>
            <td align="left">the anchoring constraint the response must satisfy (<xref target="coverage"/>)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>derivation</tt></td>
            <td align="left">
              <bcp14>OPTIONAL</bcp14></td>
            <td align="left">identifier of a named computation over the subject (<xref target="derivation-field"/>)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>deadline</tt></td>
            <td align="left">
              <bcp14>OPTIONAL</bcp14></td>
            <td align="left">latest useful response time (<xref target="deadline"/>)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>nonce</tt></td>
            <td align="left">
              <bcp14>RECOMMENDED</bcp14></td>
            <td align="left">requester-supplied nonce or timestamp (<xref target="nonce"/>)</td>
          </tr>
          <tr>
            <td align="left">
              <tt>route</tt></td>
            <td align="left">
              <bcp14>OPTIONAL</bcp14></td>
            <td align="left">where the requester believes the responder can be reached (<xref target="route-field"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>A responder <bcp14>MUST</bcp14> ignore request fields it does not understand. A requester
<bcp14>MUST NOT</bcp14> rely on any field not defined by this document being understood. A
deployment <bcp14>MAY</bcp14> bind a request to a principal reference (<xref target="principal"/>) by a
mechanism outside this document — for example, the signature that
authenticates the transport, or a field a deployment profile adds; this
document defines no such field and takes no position on how the binding is
made or checked.</t>
      <t>A request that is malformed — not a well-formed map, missing a <bcp14>REQUIRED</bcp14>
field, or carrying a defined field whose value does not conform — is
refused with reason <tt>request_malformed</tt> (<xref target="iana"/>), except where this
document assigns a more specific reason (as for <tt>coverage</tt>, <xref target="coverage"/>).</t>
      <t>[[EDITOR: whether the request map is expressed in CDDL is open for -01. The
field names in the table above are fixed; the semantics are as specified in
this document.]]</t>
      <section anchor="subject">
        <name>Subject</name>
        <t>The <tt>subject</tt> names what is asked for, in one of six forms:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Form</th>
              <th align="left">Content</th>
              <th align="left">Meaning</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>full_history</tt></td>
              <td align="left">(none)</td>
              <td align="left">the responder's entire evidence body for this evidence stream</td>
            </tr>
            <tr>
              <td align="left">
                <tt>checkpoints</tt></td>
              <td align="left">(none)</td>
              <td align="left">the responder's checkpoints and their receipts for this stream; no records</td>
            </tr>
            <tr>
              <td align="left">
                <tt>record</tt></td>
              <td align="left">digest</td>
              <td align="left">the single record identified by this digest</td>
            </tr>
            <tr>
              <td align="left">
                <tt>range</tt></td>
              <td align="left">(a, b)</td>
              <td align="left">the records at positions a through b inclusive, under the coverage anchor's ordering</td>
            </tr>
            <tr>
              <td align="left">
                <tt>correlation</tt></td>
              <td align="left">identifier</td>
              <td align="left">all records the responder holds that carry this correlation identifier</td>
            </tr>
            <tr>
              <td align="left">
                <tt>exchange</tt></td>
              <td align="left">digest of the requester's own half</td>
              <td align="left">every record the responder holds that cites this exchange half (<xref target="symmetric"/>)</td>
            </tr>
          </tbody>
        </table>
        <t>Subjects are digests, positions, and opaque identifiers — never display
names. Names drift; digests do not. A requester that holds only a name has
a resolution problem this document does not solve, and a responder <bcp14>MUST NOT</bcp14>
attempt fuzzy or best-effort matching of a subject: a subject that does not
resolve exactly is answered with a refusal carrying reason
<tt>no_such_subject</tt> (<xref target="refusal"/>).</t>
        <t>The <tt>range</tt> form presupposes a coverage-anchor mechanism that defines
record positions; under a mechanism defining no positional ordering it
cannot be satisfied and is refused with reason <tt>coverage_unsatisfiable</tt>.</t>
        <t>The <tt>checkpoints</tt> form asks for commitments only. It is the cheapest
question a stranger can ask and the one a responder can always safely
answer; the <tt>history_card/1</tt> derivation (<xref target="history-card"/>) is its
proof-carrying form.</t>
        <t>The <tt>exchange</tt> form names the requester's own sealed half of a prior
interaction. A responder that recorded its side of that interaction holds a
record citing that half by digest; the subject resolves to exactly those
records. A responder holding no record citing the half answers
<tt>no_such_subject</tt> — which, when the requester holds a signed reply from
that responder citing the same half, is itself a contradiction the
requester can cite (<xref target="symmetric"/>).</t>
      </section>
      <section anchor="coverage">
        <name>Coverage</name>
        <t>The <tt>coverage</tt> field carries <strong>exactly one</strong> of the following two members.
A request carrying both, or neither, is malformed, and the responder <bcp14>MUST</bcp14>
refuse it with reason <tt>coverage_unsatisfiable</tt>.</t>
        <t><strong><tt>expected_pin</tt> (digest):</strong> the requester already holds, obtained out of
band, a specific coverage anchor — for example a published checkpoint — and
requires the response to verify against exactly that anchor. This is the
strongest form: the anchor's integrity does not depend on the responder at
all, because the responder never chose it. A requester's own exchange half
is a valid pin for an <tt>exchange</tt> subject: the responder's record cites it,
and the requester sealed it before the responder's answer existed.</t>
        <t><strong><tt>min_freshness</tt> (size or time):</strong> the requester holds no specific anchor
and instead requires that the response be covered by a commitment at least
this fresh — at least this log size, or issued no earlier than this time.
The responder selects a qualifying anchor and identifies it in the
response. This form trades the pin's independence for availability: the
requester can always form the request, but the anchor's independence now
rests on whatever external witnessing or publication that anchor has,
outside this protocol (<xref target="security"/>).</t>
        <t>The two forms are mutually exclusive by design. A pinned request that also
stated a freshness floor would invite the responder to substitute "fresher"
coverage for the coverage the requester actually demanded; forbidding the
combination keeps the requester's constraint unambiguous.</t>
        <t>A responder <bcp14>MAY</bcp14> perform work to satisfy <tt>min_freshness</tt> — for example,
issue a new commitment covering evidence produced since its last one — and
<bcp14>SHOULD</bcp14> do so when a <tt>deadline</tt> permits. A responder that cannot satisfy the
coverage constraint <bcp14>MUST</bcp14> refuse with reason <tt>coverage_unsatisfiable</tt> rather
than serve an artifact under weaker coverage. Serving under
weaker-than-requested coverage is not a degraded success; it is a
different answer to a different question, and this document forbids it.</t>
      </section>
      <section anchor="derivation-field">
        <name>Derivation</name>
        <t>The <tt>derivation</tt> field, when present, names a computation over the subject
— by a registered token (<xref target="iana"/>) for the derivations this document
defines, or by the digest of a definition for any other — and
asks for that computation's <em>result</em>, re-derivable by the requester,
instead of the raw evidence. A count of records matching a predicate, a
sum over a declared field, a projection of specific fields: each is a named
computation whose definition declares exactly which fields of the
underlying evidence it reads.</t>
        <t>Derivation is also the disclosure mechanism of this document: the declared
field set of the named computation bounds what the responder reveals
(<xref target="derivation"/>). A responder that supports a derivation <bcp14>MUST</bcp14> evaluate it
over exactly the subject as anchored by <tt>coverage</tt> — a derivation is a view
of the anchored evidence, not an independent report — and the result <bcp14>MUST</bcp14>
be accompanied by whatever the requester needs to check that binding
(format-specific, out of scope here beyond the requirement that the binding
be checkable). A responder that does not support the named derivation at
all refuses with reason <tt>derivation_unsupported</tt>; a responder that supports
the derivation in general but not for this subject refuses with reason
<tt>no_such_subject</tt>, per <xref target="subject"/>.</t>
      </section>
      <section anchor="deadline">
        <name>Deadline</name>
        <t>The <tt>deadline</tt> field states the latest time at which a response is useful
to the requester. It is advisory in the sense that no transport can enforce
it, and normative in one respect: a responder that determines it cannot
answer by the deadline <bcp14>SHOULD</bcp14> send a refusal with reason <tt>deadline_unmet</tt>
before the deadline rather than let the exchange lapse into absence. A
refusal is cheap and citable; an absence is neither party's record of
anything except the requester's attempt.</t>
      </section>
      <section anchor="nonce">
        <name>Nonce</name>
        <t>The <tt>nonce</tt> field carries a requester-chosen nonce or timestamp; its use
is <bcp14>RECOMMENDED</bcp14>. It makes each transmitted request instance distinct, so a
refusal — identified by request digest, with a signed issuance time
(<xref target="refusal"/>) — binds to <em>this</em> instance of asking, not replayable against
a fresh one. Covered by the request digest, it <bcp14>MUST NOT</bcp14> influence the
artifact (<xref target="invariance"/>).</t>
      </section>
      <section anchor="route-field">
        <name>Route</name>
        <t>The <tt>route</tt> field carries the requester's belief about where the responder
can be reached — a resolver name, a URL, a peer endpoint identifier. It is
a hint for the transport binding and nothing more: it <bcp14>MUST NOT</bcp14> influence
the artifact (<xref target="invariance"/>), it is not a subject, and it is not identity.
A responder reached through a route is authenticated by its signature on
the response, never by the route (<xref target="security"/>). The field exists so that
the route actually attempted is part of the requester's record of asking,
and so a failed route is part of any absence recorded (<xref target="absence"/>).</t>
      </section>
      <section anchor="principal">
        <name>Principal Reference</name>
        <t>This document distinguishes a <strong>route</strong> (where a party can be reached,
<xref target="route-field"/>) from a <strong>principal reference</strong> (who a party is). It
defines the former and not the latter. Where a deployment needs to say
"this request came from, or this response is addressed to, this
particular party," it binds a principal reference into the exchange by
whatever mechanism it already has — a signature key, a DID, an account
identifier, or any other host-native scheme — and this document takes no
position on that scheme, its resolution, or its trust. A retention
commitment (<xref target="retention"/>) similarly names an answerable party without
this document defining what a name is.</t>
        <t>Two consequences for implementers. First, a requester or responder <bcp14>MAY</bcp14> be
authenticated at the transport layer (by the signature over a response, for
example, <xref target="security"/>) without either party ever appearing as a field in
the request or response maps this document defines: authentication and
<tt>subject</tt> resolution are independent, and a responder <bcp14>MUST NOT</bcp14> let
knowledge of the requester's principal change the artifact served for a
given (subject, coverage) pair (<xref target="invariance"/>). Second, a deployment
profile that adds a principal field to the request or response — to carry
purpose, authorization context, or a relationship reference alongside the
identity — does so as an extension this document neither requires nor
constrains; such a field is request/relationship-layer material and <bcp14>MUST
NOT</bcp14> appear inside the evidence artifact itself (<xref target="nongoals"/>).</t>
      </section>
      <section anchor="request-recording">
        <name>Recording the Request</name>
        <t>The request itself is evidence: it is the requester's proof of <em>having
asked</em>. Requesters <bcp14>SHOULD</bcp14> record each request they send — in their own
evidence stream, signed, in the encoding actually transmitted — before or
at transmission time. Where requests are recorded or their digests
exchanged, deterministic encoding <bcp14>SHOULD</bcp14> be used: CBOR Core Deterministic
Encoding (<xref section="4.2" sectionFormat="of" target="RFC8949"/>) for CBOR, JCS <xref target="RFC8785"/> for JSON,
so that the recorded bytes and the transmitted bytes are the same bytes.
A requester that retains neither the transmitted request bytes nor their
digest cannot correlate a refusal — identified only by digest — with its
own record of having asked.</t>
        <t>Request recording is a <bcp14>SHOULD</bcp14>, not a <bcp14>MUST</bcp14>: <xref target="recording"/>'s "I asked; they
refused" property is empty without it, but this document does not require
a requester to keep records it has no use for.</t>
      </section>
    </section>
    <section anchor="response">
      <name>Interaction Outcomes</name>
      <t>An interaction produces exactly one of three outcomes: the artifact
response, a signed refusal, or a recorded absence. Only the first two are
messages a responder sends; the third is not a message at all — it is the
requester's own record that no response arrived within its waiting window.
Treating these as <strong>outcomes</strong> rather than as three things a responder
chooses among matters: a responder can grant or refuse, full stop; it
cannot "respond with absence," because absence is precisely the case in
which nothing arrived to be a response. There is no fourth outcome, and no
outcome is ever converted into another (<xref target="discipline"/>).</t>
      <section anchor="artifact">
        <name>The Artifact Response</name>
        <t>The artifact response is the signed response envelope for the granting
outcome. The object it carries is opaque to this specification and <bcp14>MAY</bcp14> be
an Evidence Bundle (<xref target="I-D.mih-zhang-agent-action-capsule-evidence-bundle"/>)
or any other evidence artifact the deployment's evidence format defines;
this document specifies the envelope and its binding to the request and
the coverage anchor, never the carried object's internal shape.</t>
        <t>The envelope carries:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>The artifact:</strong> the evidence bytes themselves, or a derivation result
(<xref target="derivation-field"/>), identified by digest.</t>
          </li>
          <li>
            <t><strong>The coverage anchor resolved:</strong> under <tt>expected_pin</tt>, confirmation of
the pinned anchor; under <tt>min_freshness</tt>, the anchor the responder
selected, which <bcp14>MUST</bcp14> satisfy the requested freshness.</t>
          </li>
          <li>
            <t><strong>Verification material:</strong> whatever proofs let the requester verify the
artifact against the anchor <strong>offline</strong> — inclusion proofs, consistency
proofs, countersignatures, receipts <xref target="RFC9942"/>. An anchor <bcp14>MAY</bcp14> carry
receipts from more than one transparency service; each receipt is
verified on its own terms, and how many independent services a
requester requires is requester policy, not a property of this
interaction. The formats are evidence-mechanism-specific and out of
scope; the requirement is that the artifact be verifiable against the
anchor by the requester alone, with no further round trip to the
responder and no appeal to the responder's honesty.</t>
          </li>
        </ol>
        <t>For the <tt>checkpoints</tt> subject and the <tt>history_card/1</tt> derivation the
artifact <em>is</em> the verification material: there is no separate record to
verify, only commitments and the proofs between them. Implementations
<bcp14>MUST NOT</bcp14> serve an empty artifact alongside proofs in these cases; the
proofs are the artifact, and caller invariance (<xref target="invariance"/>) binds them.</t>
        <t>An artifact response <bcp14>MAY</bcp14> be accompanied by a retention commitment
(<xref target="retention"/>) covering the subject served.</t>
        <t>An artifact response that cannot be verified against the anchor is, to the
requester, not evidence but an unverifiable story, and requesters <bcp14>SHOULD</bcp14>
treat a verification failure as adverse — equivalent to discovering the
exchange was not what it claimed — rather than as a retryable transport
fault.</t>
      </section>
      <section anchor="refusal">
        <name>The Signed Refusal</name>
        <t>A refusal is an answer, not an error. It carries:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>The request identified:</strong> the digest of the request being refused,
computed over the request bytes as received.</t>
          </li>
          <li>
            <t><strong>A reason:</strong> exactly one machine-readable token from the registry
established in <xref target="iana"/>. The initial tokens are <tt>not_authorized</tt>,
<tt>no_such_subject</tt>, <tt>coverage_unsatisfiable</tt>, <tt>derivation_unsupported</tt>,
<tt>policy_declined</tt>, <tt>deadline_unmet</tt>, <tt>request_malformed</tt>, and
<tt>retention_expired</tt>. The last is distinct from <tt>no_such_subject</tt> by
design: it states that the responder once committed to answer this
subject (<xref target="retention"/>) and the commitment has lapsed, so a lapsed
promise cannot be presented as never having held the evidence.</t>
          </li>
          <li>
            <t><strong>An issuance time:</strong> the time the refusal was issued, which <bcp14>MUST</bcp14> be
present and <bcp14>MUST</bcp14> be covered by the signature. It binds the refusal to
a moment, so a recorded refusal cannot be presented as current policy
nor replayed against a fresh request (<xref target="nonce"/>).</t>
          </li>
          <li>
            <t><strong>A signature:</strong> the refusal is signed by the responder, in whatever
signature format the deployment's evidence mechanism already uses, such
that the requester can record the refusal and later demonstrate to a
third party that this responder refused this request for this stated
reason.</t>
          </li>
        </ol>
        <t>Human-readable detail <bcp14>MAY</bcp14> accompany the reason token; the token, not the
prose, is the machine-readable answer. A responder <bcp14>MUST</bcp14> select the most
specific applicable token, with one deliberate exception noted in
<xref target="privacy"/>: a responder <bcp14>MAY</bcp14> uniformly answer <tt>policy_declined</tt> wherever a
more specific token would disclose information its policy protects,
overriding the most-specific-token rule. That choice is policy, made by
the responder, applied
uniformly; it is not a license to select tokens per-requester in a way that
leaks by differentiation (<xref target="privacy"/>).</t>
        <t>A refusal refuses the request, once. It creates no standing obligation and
no standing prohibition; the same request <bcp14>MAY</bcp14> be made again and <bcp14>MAY</bcp14> be
answered differently as the responder's policy or evidence changes.</t>
      </section>
      <section anchor="pending">
        <name>Pending</name>
        <t>Before the requester's waiting window closes, a request that has received
neither an artifact response nor a signed refusal is <strong>pending</strong>:
outstanding, not yet resolved, and not yet evidence of anything. Pending is
not one of the three interaction outcomes — it is the state of a request
between issuance and either an answer or the close of the window — and
<bcp14>MUST NOT</bcp14> be recorded or cited as if it were an absence. A requester <bcp14>MAY</bcp14>
track a request as pending, for its own bookkeeping or to display
outstanding requests to an operator, without that tracking implying
anything about the eventual outcome.</t>
        <t>Only once the waiting window closes with neither an artifact nor a refusal
received does a request's state resolve to absence (<xref target="absence"/>). Until
that boundary, delay, slow transport, and a responder about to answer are
indistinguishable from one another, and none of them <bcp14>MUST</bcp14> be recorded as
if the outcome were already known.</t>
      </section>
      <section anchor="absence">
        <name>Recorded Absence</name>
        <t>Absence is the outcome in which no response — neither artifact nor refusal
— arrives within the requester's waiting window (its <tt>deadline</tt> if it set
one, or its local timeout otherwise); before that window closes, the
request is pending, not absent (<xref target="pending"/>). Absence is not sent by
anyone; it is <em>recorded by the requester</em>: the request digest, the
transport attempted, and the window in which no answer came.</t>
        <t>Absence is an outcome about the exchange, not about the responder's intent.
A network partition, a crashed responder, and a responder deliberately
ignoring the request produce identical absences, and the requester's record
<bcp14>SHOULD NOT</bcp14> embellish the absence with an inferred intent.</t>
        <t>An absence record <bcp14>SHOULD</bcp14> cite any retention commitment (<xref target="retention"/>)
the requester holds for the subject, and the <tt>route</tt> attempted. Absence
inside an outstanding commitment is chargeable to the responder that
signed it; absence without one is evidence of nothing but the attempt. The
commitment changes whom the absence is evidence <em>against</em>; it does not
change what the absence <em>is</em>, and the requester still <bcp14>MUST NOT</bcp14> infer
intent.</t>
      </section>
      <section anchor="discipline">
        <name>The Three-State Discipline</name>
        <t>The three outcomes are mutually exclusive and are never synthesized into
one another:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Absence is NEVER synthesized into refusal.</strong> No party — not the
requester, not a transport intermediary, not a recording system — may
manufacture a refusal object from a timeout. A refusal exists only if the
responder signed one. A requester's records <bcp14>MUST</bcp14> keep "they refused"
(their signature, their reason) and "they did not answer" (my attempt,
my window) as distinct, differently-evidenced facts.</t>
          </li>
          <li>
            <t><strong>Refusal is never degraded into absence.</strong> A requester that receives a
valid signed refusal <bcp14>SHOULD</bcp14> record it as such; discarding a refusal and
recording an absence misstates the exchange.</t>
          </li>
          <li>
            <t><strong>An unverifiable artifact is not a fourth outcome.</strong> An artifact
response that fails verification against the anchor is recorded as what
it is: a response received and failed. It is neither a grant nor an
absence, and requesters <bcp14>SHOULD NOT</bcp14> record it as a successful grant.</t>
          </li>
          <li>
            <t><strong>A commitment never converts an absence into a refusal.</strong> A retention
commitment (<xref target="retention"/>) makes an absence attributable; it does not
make it a signed act of the responder, and no party may record it as one.</t>
          </li>
          <li>
            <t><strong>Pending is never recorded as absence.</strong> A request still inside its
waiting window is pending (<xref target="pending"/>), not absent; only the close of
the window resolves it one way or the other.</t>
          </li>
        </ul>
        <t>The discipline exists because the three outcomes carry different
evidentiary weight — a refusal is the responder's signed act, an absence is
only the requester's attempt — and any synthesis between them forges the
stronger from the weaker.</t>
      </section>
      <section anchor="status-mapping">
        <name>Mapping to a Requirement-Satisfaction Status</name>
        <t>This document defines no requirement-satisfaction vocabulary; a deployment
composing this interaction with an evidence-contract or evidence-bundle
layer typically derives one from the three outcomes above. The mapping
shape — not a specific registry — is informative:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Outcome</th>
              <th align="left">Typically maps to (illustrative)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Artifact response, verified</td>
              <td align="left">requirement satisfied</td>
            </tr>
            <tr>
              <td align="left">Artifact response, verification fails</td>
              <td align="left">requirement status indeterminate — never treated as satisfied</td>
            </tr>
            <tr>
              <td align="left">Refusal: <tt>no_such_subject</tt>, <tt>coverage_unsatisfiable</tt></td>
              <td align="left">evidence not found, or not yet committed</td>
            </tr>
            <tr>
              <td align="left">Refusal: <tt>not_authorized</tt>, <tt>policy_declined</tt>, <tt>derivation_unsupported</tt></td>
              <td align="left">evidence withheld by policy, not absent</td>
            </tr>
            <tr>
              <td align="left">Refusal: <tt>retention_expired</tt></td>
              <td align="left">a prior commitment lapsed; distinct from never having held the evidence</td>
            </tr>
            <tr>
              <td align="left">Pending</td>
              <td align="left">request outstanding; the window has not closed, nothing yet to map</td>
            </tr>
            <tr>
              <td align="left">Recorded absence</td>
              <td align="left">status unknown to the requester; not evidence of non-satisfaction</td>
            </tr>
          </tbody>
        </table>
        <t>A deployment's own vocabulary <bcp14>MAY</bcp14> be coarser or finer than this table; the
table exists to show that the three outcomes carry enough distinction to
support one, not to define it.</t>
      </section>
    </section>
    <section anchor="invariance">
      <name>Caller Invariance</name>
      <t>This is the normative core of the document.</t>
      <t>For a given responder, the same <tt>subject</tt> under the same coverage anchor
<bcp14>MUST</bcp14> yield a byte-identical evidence artifact, regardless of the
requester's identity, the transport binding used, or any other property of
the request. Formally: the artifact <bcp14>MUST</bcp14> be a deterministic function of
(subject, resolved coverage anchor, derivation if present), and <bcp14>MUST NOT</bcp14> be
a function of the requester, its principal reference (<xref target="principal"/>), or
the channel.</t>
      <t>Under <tt>expected_pin</tt> the resolved anchor is fixed by the requester, so two
requesters pinning the same anchor and naming the same subject <bcp14>MUST</bcp14> receive
identical bytes. Under <tt>min_freshness</tt> the responder selects the anchor;
two requests resolved against the <em>same</em> selected anchor <bcp14>MUST</bcp14> receive
identical bytes, and the anchor identification in the response
(<xref target="artifact"/>) is what lets requesters compare notes across resolutions.</t>
      <t>Caller invariance is the anti-flattering-version property (<xref target="failures"/>).
It is what makes the artifact <em>evidence</em> rather than a per-audience story:
any two requesters — or one requester over two channels — can detect a
responder serving divergent versions by comparing artifact digests for the
same (subject, anchor) pair, without trusting each other's verification and
without any authority adjudicating. A responder <bcp14>MAY</bcp14> refuse a requester
outright (<xref target="refusal"/>); what it <bcp14>MUST NOT</bcp14> do is grant different requesters
different bytes for the same anchored subject. Access control is a
policy; per-audience evidence is a forgery of the interaction.</t>
      <t><strong>Anchor consistency.</strong> Caller invariance would be hollow if a responder
could hand each requester its own anchor. All coverage anchors a
responder serves for a given evidence stream <bcp14>MUST</bcp14> lie on one mutually
consistent append-only history, and the responder <bcp14>MUST</bcp14> be able to
produce, on request, a consistency proof between any two anchors it has
served for that stream, in the proof format of the deployment's evidence
mechanism. The limits of this requirement are discussed in <xref target="security"/>.</t>
      <t>Two consequences for implementers:</t>
      <ul spacing="normal">
        <li>
          <t>The artifact serialization <bcp14>MUST</bcp14> be deterministic. An artifact assembled
with nondeterministic map ordering, timestamps of assembly, or per-request
nonces violates invariance even with honest intent. Deterministic
encodings (<xref section="4.2" sectionFormat="of" target="RFC8949"/>; <xref target="RFC8785"/> for JSON) are the
practical tool.</t>
        </li>
        <li>
          <t>Verification material (<xref target="artifact"/> item 3) is NOT required to be
byte-identical across requesters — a consistency proof, for instance, may
legitimately depend on which earlier anchor a particular requester holds.
Invariance binds the artifact; the proofs bind the artifact to the
anchor.</t>
        </li>
      </ul>
      <t>One subject form needs its own statement. An <tt>exchange</tt> subject is
invariant per (exchange-half digest, anchor) like any other, but no two
requesters can hold the same half, so cross-requester comparison is
unavailable there. Invariance for <tt>exchange</tt> is instead checked by the
responder's own recorded ask (<xref target="recording"/>) against the artifact it
served: the responder's record and the requester's record must name the
same artifact digest. The subject does not weaken invariance; it changes
who holds the second copy.</t>
    </section>
    <section anchor="symmetric">
      <name>The Symmetric Ask</name>
      <t>Nothing in this document distinguishes the party that originally requested
an action from the party that performed it. Once both have sealed their
halves of an exchange — each citing the other's record by digest — either
<bcp14>MAY</bcp14> ask the other for evidence about that exchange, using the <tt>exchange</tt>
subject anchored on its own half. A provider asking its former requester
is the same interaction with the roles swapped; no new message, no new
state.</t>
      <t>The consequence is the one property no single-responder interaction can
otherwise provide. A responder's log, however well witnessed, proves only
the integrity of what the responder chose to write. A counterparty that
sealed its own half of every exchange can prove an <em>omission</em> by
arithmetic: it holds a signed reply citing a half the responder now claims
not to have. Coverage is a property of the counterparty's record, not of
the log, and the symmetric ask is how that record is exercised.</t>
      <t>Deployments <bcp14>MAY</bcp14> condition interaction on evidence — for example, a policy
that serves only to peers whose history card (<xref target="history-card"/>) verifies
against an independently obtained checkpoint. Such a policy is a
requiring-party decision and is outside this document; the interaction
only makes it expressible.</t>
    </section>
    <section anchor="recording">
      <name>Recording the Exchange</name>
      <t>Each side <bcp14>SHOULD</bcp14> seal its half of the exchange into its own records: the
requester its request, and whichever of the three outcomes followed; the
responder the requests it received and the artifacts or refusals it served.
Both sides' recording is a <bcp14>SHOULD</bcp14>: requester-side recording is what gives
absence any meaning at all, and responder-side recording is the
responder's own counter-record when a response it sent never arrived
(<xref target="security"/>).</t>
      <t>The consequence worth naming: once both the ask and the answer are
recordable, <strong>"I asked; they refused" becomes citable material</strong> — a signed
refusal in the requester's records, a recorded ask in the responder's — and
each party can grade the other's conduct over time from its own records,
with no authority anywhere in the loop. A requester's policy might treat a
counterparty's pattern of <tt>policy_declined</tt> refusals differently from a
pattern of absences; a responder's policy might treat a requester's
recorded asks as standing to receive more. This document enables those
policies and defines none of them (<xref target="nongoals"/>).</t>
    </section>
    <section anchor="derivation">
      <name>Derivation-Scoped Disclosure</name>
      <t>When <tt>derivation</tt> names a computation, the computation's declared field set
defines the <strong>minimal disclosure</strong> needed to re-derive it: the responder
reveals exactly the fields the named computation reads, and nothing more.
The responder <bcp14>MUST NOT</bcp14> disclose fields outside the declared set as part of
a derivation response, and <bcp14>MUST NOT</bcp14> evaluate a computation whose declared
field set it is unwilling to disclose — the correct answer in that case is
a refusal, not a silently truncated evaluation.</t>
      <t>Three disclosure tiers fall out naturally:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Digests-only</strong> — no derivation; subjects and artifacts identified and
verified by digest, content never disclosed. Always safe to serve
(subject to <xref target="privacy"/> on low-entropy content).</t>
        </li>
        <li>
          <t><strong>Derivation-scoped</strong> — a named computation's declared fields, and only
those. Minimal content disclosure, deliberate, and recorded: the
derivation identifier in the recorded request states exactly what was
revealed and why.</t>
        </li>
        <li>
          <t><strong>Full</strong> — the raw evidence bytes. The rare tier, appropriate where the
requester's role requires the whole record.</t>
        </li>
      </ol>
      <section anchor="history-card">
        <name>The History Card</name>
        <t>This document registers one derivation, <tt>history_card/1</tt>, defined as
follows. For the named evidence stream, the result is the ordered list of
tuples (checkpoint, receipts for that checkpoint, consistency proof from
the previous checkpoint), from the stream's first checkpoint to the one
resolved by <tt>coverage</tt>. Its declared field set contains no record content:
the card discloses commitments, external receipts over those commitments,
and the proofs that each commitment extends the last. Its size is linear
in the number of checkpoints and independent of the number of records.</t>
        <t>The history card is the default first question. It is the thing a
stranger checks before deciding whether to ask for anything else; it is
safe to serve to anyone under the digests-only tier; and it is sufficient
to verify any individual record the responder later serves, by inclusion
proof against a checkpoint the requester already holds. A card that fails
to verify — a consistency proof that does not chain, a receipt that does
not cover its checkpoint — is treated as an unverifiable artifact
(<xref target="discipline"/>).</t>
        <t>The derivation registry and definition format for other computations are
expected to grow in a subsequent version. [[EDITOR: whether a second
derivation, the result of a sampled recomputation of a subject by a third
party, is registered in -00 or deferred to -01 — open.]]</t>
      </section>
    </section>
    <section anchor="retention">
      <name>Retention Commitments</name>
      <t>A responder <bcp14>MAY</bcp14> issue a <strong>retention commitment</strong>: a signed statement that
a named subject will remain answerable under this interaction until a
stated time. It carries:</t>
      <ol spacing="normal" type="1"><li>
          <t>the subject, in one of the forms of <xref target="subject"/>, and the evidence
stream it belongs to;</t>
        </li>
        <li>
          <t><tt>until</tt>: the time after which the commitment lapses, covered by the
signature;</t>
        </li>
        <li>
          <t>optionally, a <tt>route</tt> at which the responder expects to be reachable,
and optionally a principal reference (<xref target="principal"/>) naming who is
answerable, when that differs from the signer;</t>
        </li>
        <li>
          <t>the responder's signature, in the signature format of the deployment's
evidence mechanism.</t>
        </li>
      </ol>
      <t>A commitment is a promise about <em>answerability under this interaction</em>.
It says nothing about whether the bytes exist anywhere else, and it does
not make the subject available; it makes a later failure to answer
attributable to the party that promised.</t>
      <t>A commitment <bcp14>MAY</bcp14> be carried alongside an artifact response
(<xref target="artifact"/>), published with the responder's checkpoints, or placed in
a citing record's reference block as an optional member beside the digest
of the thing cited. It <bcp14>MUST NOT</bcp14> appear in a request. A commitment that
names a subject by anything other than a digest or a position under a
checkpoint is malformed: the digest remains the identity, and the
commitment is a route with a promise attached, never an address.</t>
      <t>Within <tt>until</tt>, an absence for the committed subject is recorded citing
the commitment (<xref target="absence"/>). Within <tt>until</tt>, a refusal carrying
<tt>not_authorized</tt>, <tt>coverage_unsatisfiable</tt>, <tt>request_malformed</tt>, or
<tt>derivation_unsupported</tt> reflects a property of the request or of this
responder's capabilities, not a failure to honor the commitment, and is
not a breach. Any other refusal reason — <tt>no_such_subject</tt>,
<tt>policy_declined</tt>, or <tt>deadline_unmet</tt> — within <tt>until</tt> is a broken
commitment: the responder promised this subject would remain answerable
and is refusing it on a ground the promise foreclosed; the refusal is
signed, so the breach documents itself. After <tt>until</tt>, the correct
refusal is <tt>retention_expired</tt>.</t>
      <t>The separation this section preserves is the one that a reference field
promising only "resolvable" cannot express: that a name staying resolvable
and the bytes staying unchanged are two different promises. The digest
keeps the second. The commitment, when present, names who is answerable
for the first, and for how long.</t>
    </section>
    <section anchor="transports">
      <name>Transport Bindings</name>
      <t>The interaction is transport-agnostic; a binding maps the request map, the
three outcomes, and the recording discipline onto a concrete transport.
Bindings are intentionally thin. Two are defined here and one is reserved.</t>
      <t><strong>Peer-to-peer stream binding.</strong> On a multiplexed peer transport that
negotiates named subprotocols at connection time, this interaction is the
subprotocol <tt>evidence-request/1</tt>. One request frame, one response frame;
each frame is the deterministic CBOR encoding (<xref section="4.2" sectionFormat="of" target="RFC8949"/>)
of the maps in <xref target="request"/> and <xref target="response"/>. Absence is the stream closed
or timed out without a response frame. The subprotocol identifier is what
lets any two peers implementing it interoperate without prior
arrangement; a peer that does not offer it has not refused — it has not
answered, and the requester records that as absence, not as
<tt>policy_declined</tt>. Message-oriented agent protocols bind the same way,
with the request as a named message type and the three outcomes as three
reply types. The identifier <tt>evidence-request/1</tt> is a document constant of
this specification; it does not require registration in a separate
subprotocol registry.</t>
      <t><strong>HTTP binding.</strong> Pinned, parameterless requests (a <tt>full_history</tt> or
<tt>checkpoints</tt> subject under <tt>expected_pin</tt>) map onto GET of a static
resource: the URL identifies the subject, the pin travels as a query
parameter or is implied by the resource, and caller invariance is
trivially auditable because the resource is the same bytes for every
client. Parameterized requests (ranges, correlations, exchanges,
derivations, <tt>min_freshness</tt>) map onto POST with the request map as the
body. A responder <bcp14>SHOULD</bcp14> publish a manifest — its evidence stream
identifiers, the subject forms and derivations it supports, and where
retention commitments (<xref target="retention"/>) can be fetched — so a requester can form a
well-formed request without a prior round trip. A refusal is an HTTP
response carrying the signed refusal object: a successful transport
exchange carrying a refusal answer. Bindings <bcp14>MUST NOT</bcp14> conflate
transport-level errors with refusals (<xref target="discipline"/>).</t>
      <t><strong>Registry query.</strong> A registry or query service exposing stored claims can
expose this same interaction over its query path, so that a query answer
arrives as an anchored artifact, a signed refusal, or a recordable absence
rather than as a bare result set. This binding is reserved: its concrete
mapping onto a specific query protocol is left to a future companion
document rather than specified here.</t>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t><strong>The coverage anchor is the whole game.</strong> Every checkable property of this
interaction flows through the anchor. A response that is not verifiable
against an anchor the requester obtained or constrained independently of
the responder is a story with a signature on it: internally consistent,
attributable, and worth exactly the responder's word. Requesters <bcp14>SHOULD</bcp14>
prefer <tt>expected_pin</tt> with independently obtained anchors wherever the
deployment makes anchors available out of band — published checkpoints,
transparency-service receipts <xref target="RFC9943"/>, mutually recorded prior
exchanges. <tt>min_freshness</tt> responses inherit only whatever independence the
responder-selected anchor has from its own witnessing or publication.</t>
      <t><strong>Split views: per-requester anchor forks defeat invariance.</strong> Caller
invariance binds the artifact to (subject, anchor), not the anchor to a
single history: a responder that maintains divergent histories and steers
each requester to an anchor on "its" fork — a split-view (equivocation)
attack — serves individually verifiable, per-anchor-invariant answers
while defeating invariance in substance. The anchor-consistency rule of
<xref target="invariance"/> makes any fork a provable violation once two served
anchors are compared; but detection ultimately requires that comparison —
anchor gossip among requesters, or external witnessing of anchors —
infrastructure outside this protocol. This protocol constrains the
attack but cannot alone close it.</t>
      <t><strong>Freshness of an anchor is not recency of evidence.</strong> An anchor's
issuance freshness never implies recency or completeness of the evidence
it covers: a just-issued anchor can commit to a history omitting
everything the responder chose never to record. A time-based
<tt>min_freshness</tt> satisfied by a responder-issued anchor is, absent
external witnessing, responder self-attestation about its own clock and
log.</t>
      <t><strong>Requester-side anchor staleness is a discipline, not a guarantee.</strong> A
requester pinning a cached anchor gets exactly what that anchor covers —
including nothing the responder has done since. The protocol cannot make a
stale pin fresh; it can only make the staleness visible (the anchor is
identified in every response). Requesters for whom recency matters must
maintain their anchor supply — refreshing pins from independent sources, or
using <tt>min_freshness</tt> and accepting its weaker independence — and that
maintenance is operational discipline outside this protocol.</t>
      <t><strong>Integrity is not coverage.</strong> This protocol can establish that an artifact
verifies against an anchor, and that it is the same artifact for every
asker. It <strong>never proves that the responder's evidence is complete
coverage of reality</strong>: a responder that simply never recorded an event, or
that maintains a second evidence stream it is never asked about, produces
perfectly verifiable, perfectly caller-invariant answers with the event
absent. No request/response interaction with a single responder can close
this; the complement is counterparty-held records — each party to an
interaction recording its own half — so that omission by one holder is
contradicted by the other's evidence (<xref target="symmetric"/>). Deployments <bcp14>SHOULD
NOT</bcp14> represent a verified artifact response as proof that nothing else
happened.</t>
      <t><strong>A principal reference is not authenticated by this document.</strong> Where a
deployment binds a request or a commitment to a principal reference
(<xref target="principal"/>), verifying that binding is the deployment's own mechanism
(typically a signature check outside the fields this document defines);
this document neither strengthens nor weakens whatever guarantee that
mechanism provides.</t>
      <t><strong>Refusals and absences carry weight only when recorded.</strong> The
accountability properties of <xref target="recording"/> exist only for parties that
actually record. A requester that discards refusals has no citable record
of them; the protocol makes the record possible, not automatic.</t>
      <t><strong>Absence is unauthenticated; suppression is invisible.</strong> An absence
records only the requester's own attempt: an on-path adversary that
suppresses a response the responder actually sent produces exactly the
same absence as a responder that never answered, so absence carries
minimal evidentiary weight against the responder. Responder-side
recording (<xref target="recording"/>) is the counter-record for this case, and
deployments <bcp14>SHOULD</bcp14> use integrity-protected transports so suppression
requires active interference.</t>
      <t><strong>Refusal partitioning is the residual per-audience channel.</strong> Caller
invariance constrains the artifact, not who receives one: a responder can
serve the friendly requester and refuse everyone else — each refusal
well-formed, signed, and permitted — recreating a per-audience view
through the pattern of refusals. Authorization remains responder policy
(<xref target="nongoals"/>); the countermeasure is the recording discipline: signed
refusals make a partitioning pattern demonstrable from the accumulated
records of the refused.</t>
      <t><strong>Signed refusals are commitments.</strong> A responder's refusal is a signed
statement it may later be confronted with — including a <tt>no_such_subject</tt>
refusal for a subject the responder later serves. Responders <bcp14>SHOULD</bcp14> treat
reason-token selection with the same care as any other signed statement.</t>
      <t><strong>A retention commitment is a promise, not availability.</strong> A responder
that commits to retention (<xref target="retention"/>) and then loses the bytes has
breached. The interaction records the breach; it does not prevent it, and
deployments <bcp14>SHOULD NOT</bcp14> present a retention commitment as a guarantee that
the evidence will be there.</t>
      <t><strong>The symmetric ask closes omission, not fabrication.</strong> A counterparty's
half (<xref target="symmetric"/>) proves that an exchange existed and what each side
committed to; it does not prove that the content either side recorded is
true. Corroboration of content — a second party recomputing the same work
— is a different witness and is outside this document.</t>
      <t><strong>Routes are attack surface.</strong> A <tt>route</tt> (<xref target="route-field"/>) is chosen by
the requester and may be wrong, stale, or supplied by an adversary. A
requester <bcp14>MUST NOT</bcp14> treat a route as the responder's identity, and <bcp14>MUST</bcp14>
authenticate every response by the responder's signature. A response
signed by the wrong key is not a response from the responder, whatever
route it arrived by.</t>
      <t><strong>Denial of service.</strong> Requests are cheap to send; artifact assembly,
fresh-commitment issuance under <tt>min_freshness</tt>, and derivation evaluation
are not. Responders <bcp14>MAY</bcp14> apply rate and cost policy freely — refusing with
<tt>policy_declined</tt> is always available and always honest — but <bcp14>MUST NOT</bcp14> let
load-shedding take the form of caller-variant artifacts, which would
violate <xref target="invariance"/> where refusal would not.</t>
    </section>
    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t><strong>Digests-only is the default posture.</strong> The base interaction discloses
digests, positions, and anchors — not content. Content disclosure happens
only through derivation (<xref target="derivation"/>) or a full-tier artifact, is
deliberate, and — where the exchange is recorded — leaves a record of
exactly what was disclosed, to whom, under which request.</t>
      <t><strong>Low-entropy content defeats digest opacity.</strong> A digest of a
low-entropy value (an enumerable identifier, a small-range field) can be
reversed by dictionary: an observer holding candidate values checks each
against the digest. Subjects, correlation identifiers, and
digests-only responses over low-entropy content <bcp14>SHOULD</bcp14> therefore be
constructed with salting or equivalent hardening, per the conventions of
the deployment's evidence format; this document does not define the salt
discipline but requires deployments to have one wherever digests are
relied on to conceal enumerable content.</t>
      <t><strong>Leakage through reason tokens.</strong> The difference between
<tt>no_such_subject</tt> and <tt>not_authorized</tt> reveals whether the subject exists;
other token distinctions leak analogously. A responder <bcp14>MAY</bcp14> answer
<tt>policy_declined</tt> uniformly wherever a more specific token would disclose
information its policy protects (<xref target="refusal"/>). The uniformity is the
point: a per-requester choice of token leaks by differentiation exactly
what the uniform token conceals.</t>
      <t><strong>Coverage probing leaks log size.</strong> A size-based <tt>min_freshness</tt> is a
threshold query on current log size — granted at or above the threshold,
refused <tt>coverage_unsatisfiable</tt> below it — so a requester can
binary-search it to learn the log's size and, over time, its growth rate,
without ever seeing content. Responders for whom activity volume is
sensitive can extend the uniform-<tt>policy_declined</tt> posture to coverage
refusals.</t>
      <t><strong>History cards leak cadence and volume.</strong> A card (<xref target="history-card"/>)
discloses the number and spacing of checkpoints, and thereby an
approximation of activity over time, without any record content.
Responders for whom that is sensitive have the same option as for
coverage probing: a uniform <tt>policy_declined</tt> for the derivation.</t>
      <t><strong>Exchange subjects reveal a relationship.</strong> An <tt>exchange</tt> request names a
half that only the two parties could hold, so any intermediary that sees
the request learns that they interacted. Both parties already know;
transport confidentiality is the only mitigation for everyone else.</t>
      <t><strong>Correlation identifiers <bcp14>SHOULD</bcp14> be non-identifying.</strong> A <tt>correlation</tt>
subject is visible to the responder and to any transport intermediary;
identifiers that name persons or otherwise carry meaning outside the
exchange leak that meaning to every party that sees the request.</t>
      <t><strong>The request itself leaks interest.</strong> Asking about a subject reveals that
the requester cares about it — to the responder, and to intermediaries on
an unprotected transport. Requesters with sensitive interest patterns
should weigh the ask itself as a disclosure; transport confidentiality
protects against intermediaries but never against the responder.</t>
      <t><strong>A principal reference, once bound, is itself disclosure.</strong> Any
deployment mechanism that binds a request or response to a principal
reference (<xref target="principal"/>) discloses that reference to whoever observes the
exchange. Whether that reference is itself sensitive — a persistent
identifier versus a fresh one-time key — is a property of the host's
identity scheme, outside this document's control.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests that IANA establish a registry titled "Evidence
Request Refusal Reasons". The registration policy is Specification
Required. Each entry consists of a reason token (lowercase ASCII,
underscore-separated), a one-line description, and a reference. The
initial contents are:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Token</th>
            <th align="left">Description</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>not_authorized</tt></td>
            <td align="left">the responder's policy does not authorize this requester for this subject</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">
              <tt>no_such_subject</tt></td>
            <td align="left">the subject does not resolve to evidence the responder holds</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">
              <tt>coverage_unsatisfiable</tt></td>
            <td align="left">the responder cannot satisfy the coverage constraint as stated</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">
              <tt>derivation_unsupported</tt></td>
            <td align="left">the responder does not support the named derivation</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">
              <tt>policy_declined</tt></td>
            <td align="left">the responder declines without further characterization</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">
              <tt>deadline_unmet</tt></td>
            <td align="left">the responder cannot answer within the stated deadline</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">
              <tt>request_malformed</tt></td>
            <td align="left">the request is not well-formed as specified by the defining document</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">
              <tt>retention_expired</tt></td>
            <td align="left">the responder's retention commitment for this subject has lapsed</td>
            <td align="left">This document</td>
          </tr>
        </tbody>
      </table>
      <t>This document further requests a registry titled "Evidence Request
Derivations", registration policy Specification Required. Each entry
consists of a derivation token (lowercase ASCII, underscore-separated,
with a <tt>/N</tt> version suffix), a one-line description, the declared field
set or a reference to it, and a reference. The initial contents are:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Token</th>
            <th align="left">Description</th>
            <th align="left">Declared fields</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>history_card/1</tt></td>
            <td align="left">checkpoints, receipts, and consistency proofs for a stream</td>
            <td align="left">none (no record content)</td>
            <td align="left">
              <xref target="history-card"/></td>
          </tr>
        </tbody>
      </table>
      <t>This document makes no other requests of IANA.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-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" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </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" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8785">
          <front>
            <title>JSON Canonicalization Scheme (JCS)</title>
            <author fullname="A. Rundgren" initials="A." surname="Rundgren"/>
            <author fullname="B. Jordan" initials="B." surname="Jordan"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>Cryptographic operations like hashing and signing need the data to be expressed in an invariant format so that the operations are reliably repeatable. One way to address this is to create a canonical representation of the data. Canonicalization also permits data to be exchanged in its original form on the "wire" while cryptographic operations performed on the canonicalized counterpart of the data in the producer and consumer endpoints generate consistent results.</t>
              <t>This document describes the JSON Canonicalization Scheme (JCS). This specification defines how to create a canonical representation of JSON data by building on the strict serialization methods for JSON primitives defined by ECMAScript, constraining JSON data to the Internet JSON (I-JSON) subset, and by using deterministic property sorting.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8785"/>
          <seriesInfo name="DOI" value="10.17487/RFC8785"/>
        </reference>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9942">
          <front>
            <title>CBOR Object Signing and Encryption (COSE) Receipts</title>
            <author fullname="O. Steele" initials="O." surname="Steele"/>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="A. Delignat-Lavaud" initials="A." surname="Delignat-Lavaud"/>
            <author fullname="C. Fournet" initials="C." surname="Fournet"/>
            <date month="June" year="2026"/>
            <abstract>
              <t>CBOR Object Signing and Encryption (COSE) Receipts prove properties of a Verifiable Data Structure (VDS) to a verifier. VDSs and associated Proof Types enable security properties, such as minimal disclosure, transparency, and non-equivocation. Transparency helps maintain trust over time and has been applied to certificates, end-to-end encrypted messaging systems, and supply chain security. This specification enables concise transparency-oriented systems by building on Concise Binary Object Representation (CBOR) and COSE. The extensibility of the approach is demonstrated by providing CBOR encodings for Merkle inclusion and consistency proofs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9942"/>
          <seriesInfo name="DOI" value="10.17487/RFC9942"/>
        </reference>
        <reference anchor="RFC9943">
          <front>
            <title>An Architecture for Trustworthy and Transparent Digital Supply Chains</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="A. Delignat-Lavaud" initials="A." surname="Delignat-Lavaud"/>
            <author fullname="C. Fournet" initials="C." surname="Fournet"/>
            <author fullname="Y. Deshpande" initials="Y." surname="Deshpande"/>
            <author fullname="S. Lasker" initials="S." surname="Lasker"/>
            <date month="June" year="2026"/>
            <abstract>
              <t>Traceability in supply chains is a growing security concern. While Verifiable Data Structures (VDSs) have addressed specific issues, such as equivocation over digital certificates, they lack a universal architecture for all supply chains. This document defines such an architecture for single-issuer signed statement transparency. It ensures extensibility and interoperability between different transparency services as well as compliance with various auditing procedures and regulatory requirements.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9943"/>
          <seriesInfo name="DOI" value="10.17487/RFC9943"/>
        </reference>
        <reference anchor="I-D.mih-scitt-checkpointed-local-log">
          <front>
            <title>The Checkpointed Local Log</title>
            <author initials="S." surname="Mih" fullname="Steven Mih">
              <organization/>
            </author>
            <date year="2026" month="August"/>
          </front>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="I-D.mih-zhang-agent-action-capsule-evidence-bundle">
          <front>
            <title>AAC Evidence Bundle</title>
            <author initials="S." surname="Mih" fullname="Steven Mih">
              <organization/>
            </author>
            <author initials="Y." surname="Zhang" fullname="Yiqun Zhang">
              <organization/>
            </author>
            <date year="2026" month="September"/>
          </front>
          <refcontent>Work in Progress</refcontent>
        </reference>
      </references>
    </references>
    <?line 1086?>

<section anchor="field-evidence">
      <name>Example Deployments</name>
      <t>The properties above are sketched, not proved, against four kinds of
deployment. Each is described by capability only, at a length that omits
implementation detail; none is a conformance requirement, and none names a
specific product or organization.</t>
      <t><strong>An enterprise system-of-record</strong> answers audit requests for a business
unit's transaction history from a counterparty's compliance function. The
same <tt>full_history</tt> request, pinned against the same published checkpoint,
is served identically whether it arrives over the system's internal
case-management API or a batch export a partner fetches nightly — the same
bytes both paths, exercising caller invariance (<xref target="invariance"/>) across
transports operated by different teams within one organization. Requests
and their outcomes are recorded in the system's own audit log, giving the
compliance function a citable record of what was asked and answered,
independent of the case file itself.</t>
      <t><strong>A peer-to-peer inference mesh</strong> runs a sidecar responder on every serving
node, answering <tt>checkpoints</tt>, <tt>record</tt>, and <tt>exchange</tt> subjects over a
subprotocol negotiated at connection time. Both halves of every served
exchange are sealed — the requester's commitment before sending, the
provider's reply citing it — and checkpoints go to a witness no serving
node operates. This deployment shape exercises the symmetric ask
(<xref target="symmetric"/>) and the history card as the constant-size default
(<xref target="history-card"/>).</t>
      <t><strong>A decentralized social protocol</strong> — clients publish signed events through
nodes they do not operate and do not fully trust — uses this interaction
for a client to ask a node for the interaction history tied to one of its
own signing keys. <tt>subject</tt> names the key, <tt>coverage</tt> pins a checkpoint the
client obtained from a different node, and the node answers with the same
bytes regardless of which node served the request, refuses
<tt>coverage_unsatisfiable</tt> if it has not yet observed enough events to
satisfy the pin, or refuses <tt>no_such_subject</tt> if it holds nothing under
that key at all. Because a client can run the same request against several
nodes and compare artifact digests, caller invariance (<xref target="invariance"/>)
turns "my node says X" into something checkable rather than trusted.</t>
      <t><strong>A continuous-integration pipeline</strong> requests build-provenance evidence
for one artifact from an upstream stage before promoting it: <tt>subject</tt>
names the artifact by its build digest, <tt>coverage</tt> pins the upstream
stage's checkpoint recorded when the artifact was produced, and <tt>deadline</tt>
bounds how long the promotion step will wait before treating the request
as absence rather than blocking indefinitely. A stage that cannot produce
the provenance in time refuses <tt>deadline_unmet</tt> rather than let promotion
discover only a timeout; whether a promotion step proceeds anyway on
absence, rather than treating it as a blocked release, is a policy
decision this document does not make for it.</t>
      <t>None of the four sketches above is a claim of conformance or of deployed
practice; retention commitments (<xref target="retention"/>) in particular remain a
design proposal here, not a description of running code. The divergences a
real deployment of any of these shapes would show — different refusal
conventions, different freshness expressions, no common recording
discipline — are precisely the gaps the normative sections above close.</t>
    </section>
    <section anchor="refblocks">
      <name>Reference Blocks and This Interaction</name>
      <t>Evidence formats that cite other artifacts commonly carry a reference
block of roughly the shape {relation, identifier, resolver, retention,
digest}, in which the identifier is a name in the resolver's system and
the digest is optional. Read against this interaction, the required and
optional halves swap, and each member maps onto one thing defined here:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Reference member</th>
            <th align="left">Maps to</th>
            <th align="left">Status under this interaction</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">digest</td>
            <td align="left">
              <tt>record</tt> subject</td>
            <td align="left">
              <bcp14>REQUIRED</bcp14>; the identity of the cited thing</td>
          </tr>
          <tr>
            <td align="left">position under a checkpoint</td>
            <td align="left">
              <tt>range</tt> subject with <tt>expected_pin</tt></td>
            <td align="left">
              <bcp14>OPTIONAL</bcp14>; a positional address, never a second identity</td>
          </tr>
          <tr>
            <td align="left">identifier + resolver</td>
            <td align="left">
              <tt>route</tt></td>
            <td align="left">
              <bcp14>OPTIONAL</bcp14>; a hint for reaching a responder</td>
          </tr>
          <tr>
            <td align="left">retention</td>
            <td align="left">retention commitment (<xref target="retention"/>)</td>
            <td align="left">
              <bcp14>OPTIONAL</bcp14>; a signed promise by a named party, with an expiry</td>
          </tr>
        </tbody>
      </table>
      <t>The inversion this produces is deliberate: a producer that cannot name a
resolver may still cite, and a producer that cannot compute a digest may
not. A reference that promises only that a name stays resolvable cannot
say whether the bytes behind it are the ones present at issue time; a
digest can, and a commitment beside it says who is answerable for
serving them and until when. This appendix defines no reference-block
format; it shows how one of the common shapes lands on the interaction so
that the two can cite each other without either defining the other.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author thanks the participants in early discussions that helped
shape this model.</t>
      <t>The evidence formats this interaction carries, and the transparency
mechanisms its anchors lean on, are the work of the SCITT and COSE
communities (<xref target="RFC9943"/>, <xref target="RFC9942"/>); this document exists because those
answers made the shape of the ask the remaining gap.</t>
    </section>
  </back>

</rfc>
