<?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 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mih-agent-evidence-request-01" 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-01"/>
    <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="October" day="29"/>
    <area>Security</area>
    <keyword>transparency</keyword>
    <keyword>audit</keyword>
    <keyword>evidence</keyword>
    <keyword>interaction model</keyword>
    <abstract>
      <?line 86?>

<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 108?>

<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-disclosure-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>
          <tr>
            <td align="left">
              <tt>categories</tt></td>
            <td align="left">
              <bcp14>OPTIONAL</bcp14></td>
            <td align="left">the evidence categories the requester asks the responder to declare (<xref target="categories"/>)</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. 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 (<xref target="carries"/>)</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="carries"/>, <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 (<xref target="carries"/>), is itself a contradiction the
requester can cite (<xref target="symmetric"/>).</t>
        <section anchor="carries">
          <name>What a Record Carries</name>
          <t>The <tt>correlation</tt> and <tt>exchange</tt> forms resolve to the records that carry
an identifier or cite a half. Which members of a record count is fixed by
the record's evidence format. The requester does not fix it, and the
responder does not choose it per request.</t>
          <ul spacing="normal">
            <li>
              <t>A record <strong>carries a correlation identifier</strong> when the identifier is,
octet for octet, the whole value of one of the record's correlation
members: the members its evidence format designates as holding a
correlation identifier. The identifier appearing anywhere else does not
make the record carry it: in content the format does not designate, in
free text, as part of a longer value, or under a member of the same
name that the format does not designate.</t>
            </li>
            <li>
              <t>A record <strong>cites an exchange half</strong> when it holds a typed reference,
with the relation its evidence format designates for citing a
counterparty's half of an exchange, whose digest is the half's digest.
The same digest in any other member, or in a reference with any other
relation, does not make the record cite the half.</t>
            </li>
          </ul>
          <t>For two record formats that define these subjects' members, the
designations are:</t>
          <ul spacing="normal">
            <li>
              <t>Evidence Layer records (<xref target="I-D.mih-agent-evidence-layer"/>):  </t>
              <ul spacing="normal">
                <li>
                  <t>Correlation members: the header's <tt>subject_ref</tt>
(<xref section="4" sectionFormat="of" target="I-D.mih-agent-evidence-layer"/>), and any header field
a profile adds under that section's provision for profile-added
header fields and designates as an equivalent correlation field
(<xref section="9" sectionFormat="of" target="I-D.mih-agent-evidence-layer"/>), for example each
text-valued member of a <tt>correlation</tt> map added by a profile.</t>
                </li>
                <li>
                  <t>Half citation: an entry of the header's <tt>links</tt> whose <tt>type</tt> is
<tt>cites</tt> and whose <tt>target</tt> is the half's digest
(<xref section="5" sectionFormat="of" target="I-D.mih-agent-evidence-layer"/>).</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Capsules (<xref target="I-D.mih-scitt-agent-action-capsule"/>):  </t>
              <ul spacing="normal">
                <li>
                  <t>Correlation members: the correlation fields that document names
(<xref section="3.4" sectionFormat="of" target="I-D.mih-scitt-agent-action-capsule"/>: currently
<tt>action_id</tt>, <tt>decision_id</tt>, <tt>external_ref</tt>, and <tt>chain</tt>), cited here
and not redefined.</t>
                </li>
                <li>
                  <t>Half citation: an entry of <tt>references</tt> whose <tt>citation_purpose</tt> is
<tt>counterparty_half</tt> and whose <tt>digest</tt> is the half's digest
(<xref section="5.5.6" sectionFormat="of" target="I-D.mih-scitt-agent-action-capsule"/>). An entry
with any other <tt>citation_purpose</tt>, <tt>responds_to</tt> included, does not
cite a half.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>A responder resolves these subjects under the designations of the
records it holds, and <bcp14>MUST NOT</bcp14> serve a record for a <tt>correlation</tt> or
<tt>exchange</tt> subject unless, under its format's designation, the record
carries the identifier or cites the half. A served record that, under
its format's designation, does not carry the identifier or cite the half
is not responsive to the subject, and an artifact that includes one does
not answer it.</t>
          <t>A requester checking a served record against the subject applies the
designation of that record's format, not the layout of its own records.
A record that carries the identifier, or cites the half, under its own
format's designation conforms, wherever the requester's own records
would have held it. A requester that cannot identify the record's
format, does not implement it, or receives a record whose format
designates no correlation members or no half citation, <bcp14>MUST</bcp14> treat the
record's carriage as unchecked: it <bcp14>MUST NOT</bcp14> treat the record as not
carrying the identifier or not citing the half, and <bcp14>MUST NOT</bcp14> reject the
artifact on that ground. An unchecked record is still checked against
the coverage anchor like any other.</t>
        </section>
      </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>. A responder first checks
that each member present in <tt>coverage</tt> has a conforming value, and
refuses a non-conforming value with reason <tt>request_malformed</tt>, whether
or not the other member is present; only then does it apply the
both-or-neither rule.</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 anchor="categories">
        <name>Categories</name>
        <t>The <tt>categories</tt> field, when present, names evidence categories and asks
the responder to declare, for each one, what it offers. Some evidence
formats define such a declaration: a statement inside the artifact that
gives each category of a named category set one status, for example
available, withheld, or absent. This field is how a requester says which
categories it wants declared. The request itself, and the meaning of each
status, belong to the evidence format and are not defined here.</t>
        <t>The value is a map with two members:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Member</th>
              <th align="left">Presence</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>set</tt></td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">identifier of a category set</td>
            </tr>
            <tr>
              <td align="left">
                <tt>names</tt></td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">a non-empty array of distinct category names from that set</td>
            </tr>
          </tbody>
        </table>
        <t>Each identifier and name is a text string. The value space of <tt>set</tt>, and
of <tt>names</tt> within a set, is that of a category-set registry to be
defined in a companion document. This document does not define category
sets and registers none.</t>
        <t>[[EDITOR: open for a later revision: the registry that defines category
sets and their names; what a responder declares for a set or a name it
does not recognize; and whether the order of <tt>names</tt> carries meaning.]]</t>
        <t>Implementing <tt>categories</tt> is <bcp14>OPTIONAL</bcp14> for a responder. A responder that
implements it treats a <tt>categories</tt> value that is not a map, lacks either
member, has a member of the wrong type, or has an empty or duplicated
<tt>names</tt> as malformed, and refuses the request with reason
<tt>request_malformed</tt>. Names are compared as exact strings.</t>
        <t>The field asks for a declaration, nothing else. It does not change the
<tt>subject</tt>, it does not change <tt>coverage</tt> (<xref target="coverage"/>), and it does not
change which records are served. A declaration states what the responder
says it offers. It is not a proof that the responder offers all of it
(<xref target="security"/>).</t>
        <t>A responder that does not implement <tt>categories</tt> ignores it, as it
ignores any field it does not understand (<xref target="request"/>), malformed or not.
Its artifact then carries no declaration. A requester <bcp14>MUST NOT</bcp14> rely on
<tt>categories</tt> being understood, and <bcp14>MUST NOT</bcp14> read a missing declaration as
a statement about any category.</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-disclosure-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>
          <li>
            <t><strong>The request identified:</strong> the digest of the request being answered,
computed over the request bytes as received, exactly as for a refusal
(<xref target="refusal"/> item 1).</t>
          </li>
          <li>
            <t><strong>An issuance time:</strong> the time the envelope was issued.</t>
          </li>
          <li>
            <t><strong>A signature:</strong> by the responder, in whatever signature format the
deployment's evidence mechanism already uses, covering at least items
4 and 5, the artifact's digest, and the identification of the resolved
anchor.</t>
          </li>
        </ol>
        <t>Items 4 to 6 <bcp14>MUST</bcp14> be present. They bind one answer to one instance of
asking. Two envelopes for the same subject under the same anchor name the
same artifact digest; envelopes answering requests with different bytes,
for example different nonces (<xref target="nonce"/>), differ in the request digest. The artifact is
caller-invariant (<xref target="invariance"/>); the envelope is not, and is not meant
to be. A requester that holds the bytes it sent, or their digest
(<xref target="request-recording"/>), can check that an envelope answers its request
and not another one. An envelope whose request digest is not the digest
of the requester's own request bytes does not answer that request,
however well it verifies otherwise. A deployment profile <bcp14>MAY</bcp14> fix the
member names and the signature format of the envelope; this document
fixes only what the signature covers.</t>
        <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, categories if
present and honored (<xref target="categories"/>)), and <bcp14>MUST NOT</bcp14> be a function of the
requester, its principal reference (<xref target="principal"/>), or the channel. Two
requests that differ in <tt>derivation</tt>, or in a <tt>categories</tt> value the
responder honors, ask different questions, and their artifacts are not
compared. A responder that honors <tt>categories</tt> <bcp14>MUST</bcp14> honor it alike for
every requester that sends the same value; honoring it for some
requesters and not others makes the artifact a function of the
requester.</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 (<xref target="carries"/>) 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: open: whether to register a
second derivation, the result of a sampled recomputation of a subject by
a third party.]]</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 in this section, two
more for message-oriented agent protocols in <xref target="a2a-binding"/> and
<xref target="mcp-binding"/> under the rules of <xref target="carriage"/>, 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 outcomes that have a
reply as reply types (<xref target="carriage"/>). 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 GET returns the static resource, which is not an artifact
response and carries no envelope; a requester that needs the binding of
<xref target="artifact"/> items 4 to 6 sends the request, pinned or not, as a POST. 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 anchor="carriage">
        <name>Carriage Rules</name>
        <t>A2A <xref target="A2A"/> and MCP <xref target="MCP"/> carry this interaction as two more
adapters of the same exchange. They add no message, no outcome, and no
member of any signed object. The rules below apply to both, and to any
other message-oriented binding.</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Octets, not values.</strong> A carriage moves the request bytes and the
reply bytes as opaque octets. It never parses and re-serializes them.
Where the carriage is JSON and writes bytes as text, the octets are
those obtained by decoding that text. The request digest
(<xref target="refusal"/> item 1, <xref target="artifact"/> item 4) is computed over those
decoded octets as received, never over the text and never over a
re-serialization.</t>
          </li>
          <li>
            <t><strong>One request, one digest.</strong> The same request bytes therefore have
the same digest over every carriage. A requester that may send one
request over more than one carriage <bcp14>SHOULD</bcp14> encode it in deterministic
CBOR (<xref section="4.2" sectionFormat="of" target="RFC8949"/>) everywhere, as the peer-to-peer
stream binding requires.</t>
          </li>
          <li>
            <t><strong>Two media types, same encoding back.</strong> A request is labeled with
one of two media types: <tt>application/cbor</tt> for deterministic CBOR or
<tt>application/json</tt> for JCS <xref target="RFC8785"/>, compared as exact strings with
no parameters. Bytes labeled with any other media type are not a
request. A responder writes the reply in the encoding of the request
and labels it with the request's media type.</t>
          </li>
          <li>
            <t><strong>Carriage is not request.</strong> Nothing a carriage adds is part of the
request: message and task identifiers, context identifiers, metadata,
protocol-version and extension headers, follow-up messages in an
interrupted task, and any client identification. None of it is
covered by a signature this document defines, and none of it may
influence the artifact (<xref target="invariance"/>).</t>
          </li>
          <li>
            <t><strong>Errors are not refusals.</strong> Authentication or authorization in the
carriage decides whether a responder answers, never what a given
subject under a given anchor yields. A responder that declines puts a
signed refusal in the reply position, or sends no reply. A carriage
error, task failure, or error flag is never a refusal, and a responder
<bcp14>MUST NOT</bcp14> present one as its refusal (<xref target="discipline"/>).</t>
          </li>
          <li>
            <t><strong>Classified by the reply bytes.</strong> A requester classifies what it
receives by the reply bytes alone. Task states, error flags, and
human-readable text never make a reply an artifact response or a
refusal, and never make a reply absent. Anything that is not a reply
in the carriage's reply position leaves the request pending
(<xref target="pending"/>) and, once the window closes, is recorded as absence
(<xref target="absence"/>).</t>
          </li>
          <li>
            <t><strong>Each reply on its own.</strong> Each distinct reply is classified and
verified on its own; a reply delivered more than once under the same
carriage identifier is one reply. Two replies to one request digest, over one
carriage or several, are compared as any two artifacts are
(<xref target="invariance"/>).</t>
          </li>
        </ol>
      </section>
      <section anchor="a2a-binding">
        <name>A2A Binding</name>
        <t>This binding uses A2A version 1.0.1 (<xref target="A2A"/>). Field names are A2A's.
A2A's JSON bindings write the bytes of a <tt>raw</tt> part as base64 with
padding (<xref section="4" sectionFormat="of" target="RFC4648"/>).</t>
        <t><strong>Declaration.</strong> A responder that carries this interaction over A2A
lists one extension in its Agent Card's <tt>capabilities.extensions</tt>, with
<tt>uri</tt> exactly
<tt>https://datatracker.ietf.org/doc/draft-mih-agent-evidence-request/</tt>,
<tt>required</tt> set to <tt>false</tt>, and the responder's manifest (<xref target="transports"/>)
as <tt>params</tt>. A responder <bcp14>MUST NOT</bcp14> advertise this binding under any other
URI. The Agent Card <bcp14>SHOULD</bcp14> list <tt>application/cbor</tt> and
<tt>application/json</tt> among its default input and output modes.</t>
        <t><strong>Request.</strong> The request is one <tt>Message</tt> with role user, whose <tt>parts</tt>
hold exactly one <tt>Part</tt> whose <tt>raw</tt> is the request bytes and whose
<tt>mediaType</tt> is one of the two media types of <xref target="carriage"/>, and whose
<tt>extensions</tt> contain the extension URI. The requester <bcp14>MUST</bcp14> send A2A
version <tt>1.0</tt> and list the extension URI in A2A's extensions service
parameter; without a version, A2A reads the request as an earlier
protocol version. The <tt>Message</tt> <bcp14>MUST NOT</bcp14> carry a <tt>taskId</tt>, so that each
request starts its own task. If the requester sets accepted output
modes, they <bcp14>MUST</bcp14> include the request's media type. A <tt>Message</tt> that
holds the request in any other form (a <tt>data</tt> or <tt>text</tt> part, metadata,
or a <tt>raw</tt> part of another media type) carries no request bytes to
digest. It is not a request under this binding, and the responder <bcp14>MUST
NOT</bcp14> answer it with an artifact response or a refusal.</t>
        <t><strong>Reply.</strong> The responder <bcp14>MUST</bcp14> return a <tt>Task</tt>, not a direct <tt>Message</tt>.
Its reply is one A2A <tt>Artifact</tt> whose <tt>extensions</tt> contain the extension
URI, with exactly one <tt>Part</tt> whose <tt>raw</tt> is the reply bytes and whose
<tt>mediaType</tt> is that of the request. When the responder streams, it <bcp14>MUST</bcp14>
send that <tt>Artifact</tt> whole, in one update that neither appends to an
earlier one nor is followed by another chunk. Artifacts with the same
<tt>artifactId</tt> are one reply. An A2A <tt>Artifact</tt> is a container in A2A's
task model; it is not the evidence artifact, and none of its own fields
is signed or verified. Both an artifact response and a refusal leave the
task completed. A follow-up <tt>Message</tt> that continues an interrupted task
carries no request bytes and is carriage (<xref target="carriage"/> rule 4).</t>
        <t>The requester classifies a task by its reply <tt>Artifact</tt>, whatever the
task state:</t>
        <ul spacing="normal">
          <li>
            <t>a reply <tt>Artifact</tt> of the form above is a reply;</t>
          </li>
          <li>
            <t>a reply <tt>Artifact</tt> of any other form is not a reply;</t>
          </li>
          <li>
            <t>with no reply <tt>Artifact</tt>, a task that is submitted, working, waiting
for input or authorization, or in an unspecified state is pending;</t>
          </li>
          <li>
            <t>with no reply <tt>Artifact</tt>, a task that is completed, rejected, failed,
or canceled, an A2A error, and a direct <tt>Message</tt> are the responder
sending no reply. None of them is a refusal.</t>
          </li>
        </ul>
      </section>
      <section anchor="mcp-binding">
        <name>MCP Binding</name>
        <t>This binding uses MCP revision 2026-07-28 (<xref target="MCP"/>). Field names are
MCP's.</t>
        <t><strong>Listing.</strong> A responder that carries this interaction over MCP lists two
tools under exactly these names: <tt>evidence_manifest</tt>, which takes no
arguments and whose <tt>structuredContent</tt> is the responder's manifest
(<xref target="transports"/>), and <tt>evidence_request</tt>.</t>
        <t><strong>Request.</strong> The arguments of <tt>evidence_request</tt> are exactly two members:
<tt>request</tt>, the request bytes in base64url without padding
(<xref section="5" sectionFormat="of" target="RFC4648"/>), and <tt>media_type</tt>, one of the two media types
of <xref target="carriage"/>. The tool's input schema admits no other member. The
<tt>request</tt> member <bcp14>MUST NOT</bcp14> be annotated to be copied into an HTTP header,
since that would expose the request to intermediaries (<xref target="privacy"/>).
Arguments that do not have this form (a member missing or extra,
<tt>request</tt> not base64url, another <tt>media_type</tt>) carry no request bytes to
digest, and the responder <bcp14>MUST NOT</bcp14> answer them with an artifact response
or a refusal. Arguments that have this form but decode to bytes that are
not a well-formed request are a request, and are refused with reason
<tt>request_malformed</tt>.</t>
        <t><strong>Reply.</strong> Both an artifact response and a refusal are returned as a
complete tool result, with the error flag false, whose
<tt>structuredContent</tt> is a map with <tt>reply</tt>, the reply bytes in base64url
without padding, and <tt>media_type</tt>, that of the request. A requester
reads only <tt>structuredContent</tt>: a <tt>reply</tt> in base64url with the
request's <tt>media_type</tt> is the reply, whatever the error flag says. A
result asking for further input, with no reply yet, leaves the request
pending, and a retry <bcp14>MUST</bcp14> carry the same <tt>request</tt> and <tt>media_type</tt>;
different bytes are a different request. Anything else (a result without
such a <tt>reply</tt>, a protocol error, an unknown tool) is not a reply, and
is never a refusal, whatever its text says.</t>
      </section>
    </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 category declaration declares; it does not prove.</strong> A declaration
returned for <tt>categories</tt> (<xref target="categories"/>) is the responder's signed
statement of what it offers in each category. It is attributable, and a
counterparty's records can contradict it (<xref target="symmetric"/>), but it is no
more complete than anything else the responder chose to record. A
requester <bcp14>SHOULD NOT</bcp14> treat a declared "absent" as proof that nothing of
that category exists.</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>Carriage metadata reveals the ask.</strong> Over A2A and MCP
(<xref target="a2a-binding"/>, <xref target="mcp-binding"/>) the carriage itself (an extension
header, a tool name, a task) tells an intermediary that an evidence
request was made, even when the request bytes are protected. Transport
confidentiality is the only mitigation.</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>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </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-agent-evidence-layer">
          <front>
            <title>Evidence Layer</title>
            <author initials="S." surname="Mih" fullname="Steven Mih">
              <organization/>
            </author>
            <date year="2026" month="October"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mih-agent-evidence-layer-00"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="I-D.mih-scitt-agent-action-capsule">
          <front>
            <title>An Agent Action Capsule Profile for SCITT</title>
            <author initials="S." surname="Mih" fullname="Steven Mih">
              <organization/>
            </author>
            <date year="2026" month="September"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mih-scitt-agent-action-capsule-05"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="I-D.mih-scitt-checkpointed-local-log">
          <front>
            <title>The Checkpointed Local Log (CLL)</title>
            <author initials="S." surname="Mih" fullname="Steven Mih">
              <organization/>
            </author>
            <date year="2026" month="October"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mih-scitt-checkpointed-local-log-02"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="A2A" target="https://github.com/a2aproject/A2A/blob/v1.0.1/docs/specification.md">
          <front>
            <title>Agent2Agent (A2A) Protocol Specification</title>
            <author>
              <organization>A2A Project</organization>
            </author>
            <date/>
          </front>
          <refcontent>Version 1.0.1</refcontent>
        </reference>
        <reference anchor="MCP" target="https://modelcontextprotocol.io/specification/2026-07-28">
          <front>
            <title>Model Context Protocol Specification</title>
            <author>
              <organization>Model Context Protocol</organization>
            </author>
            <date year="2026" month="July" day="28"/>
          </front>
        </reference>
        <reference anchor="I-D.mih-zhang-agent-disclosure-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="October"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mih-zhang-agent-disclosure-bundle-01"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
      </references>
    </references>
    <?line 1424?>

<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="changes">
      <name>Changes from -00</name>
      <t>[[RFC Editor: please remove this section before publication.]]</t>
      <ul spacing="normal">
        <li>
          <t>New <xref target="carries"/>, "What a Record Carries": which members of a record
carry a correlation identifier or cite an exchange half are fixed by
the record's evidence format, with the designations for Evidence Layer
records and Capsules.</t>
        </li>
        <li>
          <t><xref target="artifact"/>: the artifact response envelope now carries the request
digest, an issuance time, and a signature covering both, the artifact
digest, and the resolved anchor. <xref target="transports"/>: a GET of a static
resource is not an artifact response; the envelope binding needs a
POST.</t>
        </li>
        <li>
          <t><xref target="coverage"/>: a non-conforming member value is refused
<tt>request_malformed</tt> before the both-or-neither rule applies.</t>
        </li>
        <li>
          <t>New <xref target="categories"/>: the <bcp14>OPTIONAL</bcp14> <tt>categories</tt> request field, a category
set identifier and category names, <bcp14>OPTIONAL</bcp14> for a responder to
implement. <xref target="invariance"/> adds it to the inputs of the artifact when
honored, and requires a responder to honor it alike for every
requester. <tt>coverage</tt> is unchanged.</t>
        </li>
        <li>
          <t><xref target="transports"/>: new carriage rules (<xref target="carriage"/>) and two bindings, A2A
(<xref target="a2a-binding"/>) and MCP (<xref target="mcp-binding"/>). The peer-to-peer stream
binding's message-oriented sentence now maps only the outcomes that
have a reply to reply types; -00 said "the three outcomes as three
reply types", but absence has no reply.</t>
        </li>
        <li>
          <t>Security and Privacy Considerations: a category declaration declares
and does not prove; carriage metadata reveals the ask.</t>
        </li>
        <li>
          <t>References: RFC 4648 added as normative, A2A and MCP as informative.
The Checkpointed Local Log and Evidence Bundle references name their
posted revisions; the Evidence Bundle is cited under its current name,
draft-mih-zhang-agent-disclosure-bundle (posted -00 cited it under an
earlier anchor). Evidence Layer and Agent Action Capsule references,
cited by the text added in <xref target="carries"/>, are new.</t>
        </li>
      </ul>
    </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>
