<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     docName="draft-newton-agreement-evidence-00"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     tocInclude="true"
     symRefs="true"
     sortRefs="true"
     version="3">

  <front>
    <title abbrev="Agreement Evidence">Agreement Evidence for Multi-Party Agent Negotiation</title>
    <seriesInfo name="Internet-Draft" value="draft-newton-agreement-evidence-00"/>
    <author fullname="Erik Newton" initials="E." surname="Newton">
      <address>
        <email>eriknewton@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="3"/>

    <area>Applications and Real-Time</area>

    <abstract>
      <t>
      Autonomous agents can exchange offers and signatures without
      producing an artifact that records which parties reached which
      outcome, over which transcript digest and message count, and for how
      long that record may be relied upon. This document defines JSON
      agreement-evidence objects
      for structured, multi-attribute negotiation. The core object is an
      agreement attestation. A verified attestation establishes one thing:
      that a named set of parties jointly countersigned a stated outcome
      over a stated transcript digest and message count, together with
      behavioral counters each of them accepted. It does not establish that the outcome
      matches what the transcript says, that any statement a party made is
      true, or that the parties are anonymous. The format provides no
      member for a negotiated price, quantity, date, or principal
      identity. A producer is obligated not to place those values in the
      free-text members the format does provide, and a verifier cannot
      detect a violation of that obligation, so the absence of term values
      from a received object is a producer's obligation rather than a
      verified property. Sections 4 through 8 and 10 define
      every member of the object, its JSON type, its encoding, its value
      constraints, and the verification procedure. This document also
      defines relying-side freshness obligations and describes related
      approval, fulfillment, and revocation artifacts, whose formats it
      leaves to other documents.
      </t>
      <t>
      This document does not define identity, authority delegation,
      payment, settlement, transport, boundary-decision receipts, or a
      general evidence composition and sufficiency model.
      </t>
    </abstract>
  </front>

  <middle>

    <section anchor="intro">
      <name>Introduction</name>
      <t>
      A signature proves who signed particular bytes. It does not
      necessarily prove that two parties agreed or that a once-valid claim
      remains current. Single-issuer action
      receipts are useful evidence of what one policy engine, gateway, or
      observer recorded. They do not express a negotiated outcome that
      multiple counterparties jointly bind.
      </t>
      <t>
      This document occupies that narrower agreement-evidence layer.
      Negotiating parties exchange individually signed and hash-chained
      messages. At session conclusion, they produce an agreement
      attestation whose members are defined in
      <xref target="field-definitions"/>. Every listed party countersigns
      the same issuance snapshot before the outcome can be credited as
      outcome-bound. The snapshot includes a transcript digest and message
      count that the parties countersigned. Its descriptive
      members are constrained so that
      behavioral evidence can be shared without disclosing the deal terms
      themselves.
      </t>
      <t>
      Verifying the object requires the object itself and a key-binding
      mechanism the deployment supplies. It does not require a particular
      transport, payment rail, transparency service, or cross-format
      composition framework. Transcript reconstruction is out of scope for
      this revision and may be specified in a later one.
      </t>
      <t>
      What a verified attestation establishes is stated exactly: a named
      set of parties jointly countersigned one stated outcome over one
      stated transcript digest and message count, with behavioral counters
      each of them accepted. This document defines no procedure for re-deriving the
      outcome from the transcript, so a verified attestation is no
      evidence that the outcome matches the transcript. It is no evidence
      that a statement a party made is true. It offers no anonymity: the
      agent identifier of every listed party is in the object, and a
      holder of two attestations can correlate them.
      </t>

      <section anchor="design-goals">
        <name>Design Goals</name>
        <t>This document has four goals:</t>
        <ol type="1">
          <li>Define evidence that a named set of parties reached a named
          negotiation outcome.</li>
          <li>Require all listed parties, not merely the holder, to bind
          that outcome.</li>
          <li>Carry useful behavioral signals without raw negotiated
          terms.</li>
          <li>Require both signer-asserted validity and an independent
          relying-side freshness policy.</li>
        </ol>
      </section>

      <section anchor="non-goals">
        <name>Non-Goals</name>
        <t>This document does not define:</t>
        <ul>
          <li>real-world or legal identity verification;</li>
          <li>mandates, delegation chains, or authorization-envelope
          formats;</li>
          <li>payment processing, settlement finality, or proof of
          delivery;</li>
          <li>network transport, routing, discovery, or service
          availability;</li>
          <li>a general-purpose action or access-control receipt;</li>
          <li>reputation scoring, Sybil resistance, or a centralized
          reputation service;</li>
          <li>a general cross-format evidence taxonomy, composer, or
          sufficiency verdict;</li>
          <li>end-to-end encryption; or</li>
          <li>proof that every statement in an attestation is objectively
          true.</li>
        </ul>
      </section>
    </section>

    <section anchor="terminology">
      <name>Terminology</name>

      <section anchor="reqlang">
        <name>Requirements Language</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&#160;14 <xref target="RFC2119"/>
        <xref target="RFC8174"/> when, and only when, they appear in all
        capitals, as shown here.
        </t>
      </section>

      <section anchor="definitions">
        <name>Definitions</name>
        <dl newline="false">
          <dt>Party:</dt>
          <dd>An autonomous agent participating in a negotiation.</dd>

          <dt>Offer:</dt>
          <dd>A proposed assignment of values to one or more terms. An
          offer can be complete, partial, conditional, or a bundle.</dd>

          <dt>Agreement:</dt>
          <dd>The final term values accepted by all parties, together with
          the signed transcript that records how those values were
          reached.</dd>

          <dt>Negotiation transcript:</dt>
          <dd>The ordered set of signed protocol messages for a session,
          connected by predecessor hashes, in the form the negotiation
          protocol defines. This document defines no transcript format.</dd>

          <dt>Agreement attestation:</dt>
          <dd>A signed, privacy-preserving statement about a completed
          negotiation session. It identifies the outcome and behavioral
          signals and does not carry the negotiated term values. This
          document calls it "the attestation" where no ambiguity
          arises.</dd>

          <dt>Issuance snapshot:</dt>
          <dd>The value derived from an attestation by the procedure in
          <xref target="countersig-payload"/>, over which all party
          countersignatures are computed.</dd>

          <dt>Holder:</dt>
          <dd>Any entity in possession of an attestation, whether or not
          it is a party.</dd>

          <dt>Outcome-bound:</dt>
          <dd>A property of an attestation for which every party listed in
          <tt>parties[]</tt> has a resolvable and valid countersignature
          over the same issuance snapshot.</dd>

          <dt>Deployment profile:</dt>
          <dd>The set of choices a deployment makes outside this document
          and states in its own specification. It names the key-binding
          mechanism and the revocation source if any. This document defines
          neither.</dd>

          <dt>Terminal state:</dt>
          <dd>The single result <xref target="verification"/> exposes to
          application policy. This document defines exactly four terminal
          states, defined immediately below, and defines no other result
          label. A verifier reports exactly one of them for any received
          artifact.</dd>

          <dt>not-bound:</dt>
          <dd>The terminal state of an artifact the verification procedure
          rejects at any step, and of an attestation at version 0.5.0 or
          later whose outcome binding <xref target="outcome-binding"/>
          does not establish. It carries no outcome-binding claim.</dd>

          <dt>bound-only:</dt>
          <dd>The terminal state of an attestation that is outcome-bound,
          and whose revocation status the verifier did not determine. The
          status is undetermined for any of three reasons: the deployment
          profile names no revocation source, the named source was
          unavailable, or the named source supplied a record that cannot be
          interpreted under the deployment's own definition of that source.
          All three reasons produce this one state.</dd>

          <dt>current:</dt>
          <dd>The terminal state of an attestation that is outcome-bound,
          passed the verification procedure's freshness checks, and whose
          named revocation source answered and reported the attestation as
          not revoked.</dd>

          <dt>legacy:</dt>
          <dd>The terminal state of an artifact whose
          <tt>concordia_attestation</tt> value is well formed and below
          0.5.0. Such an artifact is retained as a record of its own
          contents. It is never outcome-bound and never current, and the
          verification procedure runs no signature, binding, temporal, or
          revocation step over it.</dd>

          <dt>Relying party:</dt>
          <dd>A verifier that decides whether to act on an attestation or
          related artifact.</dd>
        </dl>
      </section>
    </section>

    <section anchor="formation">
      <name>Agreement Formation and Evidence Surfaces</name>

      <section anchor="lifecycle">
        <name>Negotiation Lifecycle</name>
        <t>
        Implementations of the negotiation protocol that produces these
        artifacts typically progress through the states PROPOSED, ACTIVE,
        AGREED, REJECTED, EXPIRED, and DORMANT, exchanging signed offers,
        counteroffers, acceptances, commitments, declines, and
        withdrawals, and enforce session, offer, and round limits. That
        protocol is out of scope for this document, which specifies only
        the evidence artifacts. No requirement of this document names a
        message format.
        </t>
        <t>
        This document does not reproduce the offer grammar or the
        state-transition table. See <xref target="rel-scitt"/> for how
        this scope choice relates to ongoing work in the broader
        agent-protocol space.
        </t>
      </section>

      <section anchor="two-surfaces">
        <name>Two Evidence Surfaces</name>
        <t>
        There is no third standalone object that carries both private term
        values and public evidence. The protocol intentionally exposes two
        signed surfaces for different audiences:
        </t>
        <ul>
          <li>Negotiating parties retain the final commit messages that
          close a negotiation and record the Agreement as defined in
          <xref target="definitions"/>. Those messages contain the actual
          accepted term values and are individually signed and
          hash-chained into the transcript.</li>
          <li>A third party that needs proof an agreement was reached, but
          does not need the term values, receives the attestation defined
          in <xref target="attestation"/>.</li>
        </ul>
        <t>
        The attestation's outcome, party set, chain head, and message
        count record what the parties jointly bound about the session. The
        format provides no member for a term value. The constraints in
        <xref target="privacy"/> then obligate a producer not to place a
        term value in the free-text members the format does provide, which
        are <tt>category</tt> and <tt>summary</tt>. Those constraints bind
        the producer, and a verifier cannot detect a violation of them by
        inspecting a received object, so a relying party that reads an
        attestation learns that no member is defined to carry a term value
        and does not learn that no term value was smuggled into one. An attestation whose
        <tt>outcome.status</tt> is <tt>rejected</tt>, <tt>expired</tt>, or
        <tt>withdrawn</tt> records that no agreement formed, so an
        attestation is evidence about a session rather than proof that an
        agreement exists.
        </t>
        <t>
        An attestation defined by this document is produced when a
        negotiation concludes, and it records what the parties bound at
        that moment rather than a commitment fixed in advance of some
        later evaluation. A relying party that requires a commitment fixed
        before a decision obtains that commitment from a separate
        artifact, for example an approval receipt over the digest of a
        canonical Offer as described in
        <xref target="approval-receipt"/>, and this document does not
        define one.
        </t>
      </section>
    </section>

    <section anchor="attestation">
      <name>Agreement Attestation</name>

      <section anchor="required-fields">
        <name>Attestation Members</name>
        <t>
        This section defines the attestation produced at the conclusion of
        a negotiation session. Whether a session must produce one is a
        property of the negotiation protocol and is out of scope.
        </t>
        <t>
        An attestation defined by this document contains exactly the
        following members, of which <tt>concordia_attestation</tt>,
        <tt>attestation_id</tt>, <tt>session_id</tt>, <tt>timestamp</tt>,
        <tt>outcome</tt>, <tt>parties</tt>, <tt>meta</tt>, and
        <tt>transcript_hash</tt> are required at every version:
        </t>
        <ul>
          <li><tt>concordia_attestation</tt>, the format version, a string
          of exactly three dot-separated non-negative decimal integers
          without leading zeros. Artifacts defined by this version carry
          "0.6.0". A verifier compares two versions by numeric comparison
          of the three components in order.</li>
          <li><tt>attestation_id</tt>, a unique artifact identifier;</li>
          <li><tt>session_id</tt>, the negotiation session
          identifier;</li>
          <li><tt>timestamp</tt>, the issuance time;</li>
          <li><tt>outcome</tt>, including status and round count;</li>
          <li><tt>parties[]</tt>, including each party's agent identifier,
          role, behavioral counters, and party signature;</li>
          <li><tt>meta</tt>, containing only the bounded context members
          permitted by <xref target="privacy"/>;</li>
          <li><tt>transcript_hash</tt>;</li>
          <li><tt>chain_head</tt> and <tt>message_count</tt>;</li>
          <li><tt>validity_temporal</tt>;</li>
          <li><tt>countersignatures</tt>; and</li>
          <li><tt>summary</tt> and <tt>references</tt>, each optional at
          every version.</li>
        </ul>
        <t>
        The member name <tt>concordia_attestation</tt> is retained from
        the deployed base of artifacts that this format already describes.
        Renaming it would invalidate every signature computed over an
        existing artifact.
        </t>
        <t>
        <xref target="field-definitions"/> is normative. It defines every
        member listed above, its JSON type, its encoding, its cardinality,
        and its value constraints.
        The identifier <tt>urn:concordia:schema:attestation:v0.5</tt>
        names the machine-readable form of the member set of the 0.5.0
        predecessor of this format and is informative. It is registered in
        no IANA registry, no requirement of this document reads it, and it
        appears here only to name the form the 0.5.0 line published. The
        0.6.0 member set differs from that of the 0.5.0 line by the
        removal of three members: the <tt>fulfillment</tt> member of the
        attestation root, the <tt>extensions</tt> member of a reference
        element, and the <tt>window</tt> mode of
        <tt>validity_temporal</tt>. On the members it retains, this
        document adds constraints that a 0.5.0 implementation does not
        apply. Where a published schema document and this document
        disagree, this document governs.
        </t>
      </section>

      <section anchor="outcome-vocab">
        <name>Outcome Vocabulary</name>
        <t>
        <tt>outcome.status</tt> is one of <tt>agreed</tt>,
        <tt>rejected</tt>, <tt>expired</tt>, or <tt>withdrawn</tt>. The
        outcome also carries the number of rounds and the session
        duration, and can carry the term count and the resolution
        mechanism, as defined in <xref target="tbl-outcome"/>. Those
        values describe the session; they do not expose the negotiated
        terms.
        </t>
      </section>

      <section anchor="behavioral-signals">
        <name>Behavioral Signals</name>
        <t>
        Each <tt>parties[]</tt> element carries a <tt>behavior</tt> object
        holding the members defined in <xref target="tbl-behavior"/>:
        <tt>offers_made</tt>, <tt>concessions</tt>,
        <tt>concession_magnitude</tt>, <tt>signals_shared</tt>,
        <tt>constraints_declared</tt>, <tt>constraints_violated</tt>,
        <tt>reasoning_provided</tt>, <tt>withdrawal</tt>, and
        <tt>response_time_avg_seconds</tt>. It carries no other member.
        These are evidence inputs and not a protocol-defined reputation
        score. A relying party <bcp14>MAY</bcp14> calculate its own score
        or ignore them.
        </t>
      </section>

      <section anchor="field-definitions">
        <name>Field Definitions</name>
        <t>
        This section is normative. It defines the complete member set of
        an attestation and of every object nested inside one. An
        implementation of the attestation format and of its verification
        can be written from Sections 4 through 8 and 10 of this document
        with two external inputs named by the deployment profile: the
        key-binding mechanism, which step 3 of
        <xref target="verification"/> requires for every verification, and
        the revocation source of step 7, if currency is sought. This
        document defines neither.
        </t>
        <t>Encodings are pinned as follows.</t>
        <ul>
          <li>A signature value is the 64-octet Ed25519
          <xref target="RFC8032"/> signature of
          <xref target="RFC8032" section="5.1.6" sectionFormat="comma"/>,
          encoded with the base64url alphabet of
          <xref target="RFC4648" section="5" sectionFormat="comma"/> with
          the two trailing padding characters that section requires for a
          64-octet input. The encoded value is therefore exactly 88
          characters: 86 drawn from that alphabet followed by two padding
          characters. The final encoded group carries four unused bits,
          and those bits <bcp14>MUST</bcp14> be zero. A recipient
          <bcp14>MUST</bcp14> reject a signature value of any other
          length, a value whose padding is absent or misplaced, a value
          carrying any character outside that alphabet, a value carrying
          whitespace, and a value whose unused bits are not zero. This is the encoding the 0.5.0
          line already produces, retained so that no existing signature
          value changes form. Two signature values are equal when their 64 decoded
          octets are equal, and a recipient <bcp14>MUST</bcp14> compare
          the decoded octets rather than the encoded characters.</li>
          <li>A public key is the 32-octet value of
          <xref target="RFC8032" section="5.1.5" sectionFormat="comma"/>.
          No member defined by this document carries a public key.</li>
          <li>A timestamp is an RFC 3339 <xref target="RFC3339"/>
          date-time whose time-offset is the single character "Z". A
          recipient <bcp14>MUST</bcp14> reject a numeric offset, including
          "+00:00", and <bcp14>MUST</bcp14> reject a fractional second of
          more than three digits.</li>
          <li><tt>chain_head</tt> and <tt>transcript_hash</tt> are SHA-256
          <xref target="RFC6234"/> digest strings, rendered as the literal
          "sha256:" followed by 64 lowercase hexadecimal characters.
          <tt>transcript_hash</tt> is opaque to the verifier
          this document defines: its preimage is undefined here, no check
          in this document reads it, no verification result this document
          defines makes any claim about it, and a verifier neither
          recomputes nor compares it. It is retained because the 0.5.0
          line carries it. <tt>chain_head</tt> is an opaque value in the
          issuance snapshot. Its preimage and computation are defined by
          the negotiation protocol that produced the transcript, not by
          this document. The verifier this document defines neither
          recomputes nor compares it; the verified claim is that every
          listed party countersigned that string and <tt>message_count</tt>
          in the same issuance snapshot.</li>
          <li>Every string member defined by this document is carried in
          Unicode Normalization Form C <xref target="UAX15"/>. A recipient
          <bcp14>MUST</bcp14> reject a string member whose received value
          differs from its own Normalization Form C, and
          <bcp14>MUST</bcp14> compare two identifier strings only after
          both are in that form. Where this section states a length in
          characters, the unit is the Unicode scalar value. Where it
          states a length in octets, the unit is the octet of the UTF-8
          <xref target="RFC3629"/> encoding of the normalized value.</li>
          <li>Where this section says a member carries no whitespace, that
          member <bcp14>MUST NOT</bcp14> carry a character with the
          Unicode White_Space property, and <bcp14>MUST NOT</bcp14> carry
          a character in the ranges U+0000 to U+001F, U+007F to U+009F,
          U+200B to U+200F, or U+2028 to U+202E.</li>
        </ul>
        <t>
        This format is extended by publishing a new version under
        <xref target="required-fields"/> rather than by adding members.
        The value vocabularies of a reference's <tt>type</tt> and
        <tt>relationship</tt> members are the exception: a recipient
        <bcp14>MUST</bcp14> preserve a <tt>type</tt> or
        <tt>relationship</tt> value it does not recognize as an opaque
        string rather than rejecting it, so that a later version's
        relationship survives a round trip through an earlier
        implementation.
        </t>

        <table anchor="tbl-root">
          <name>Attestation Root Members</name>
          <thead>
            <tr><th>Member</th><th>Type</th><th>Cardinality</th><th>Constraints</th></tr>
          </thead>
          <tbody>
            <tr><td>concordia_attestation</td><td>string</td><td>required</td><td>Three dot-separated non-negative decimal integers, no leading zeros. "0.6.0" for this version.</td></tr>
            <tr><td>attestation_id</td><td>string</td><td>required</td><td>1 to 256 octets, no whitespace.</td></tr>
            <tr><td>session_id</td><td>string</td><td>required</td><td>1 to 256 octets, no whitespace.</td></tr>
            <tr><td>timestamp</td><td>string</td><td>required</td><td>RFC 3339 date-time with a "Z" offset.</td></tr>
            <tr><td>outcome</td><td>object</td><td>required</td><td>Members of Table 2. No other member.</td></tr>
            <tr><td>parties</td><td>array</td><td>required</td><td>2 to 64 elements, each as in Table 3. Identifiers distinct per Section 6.2.</td></tr>
            <tr><td>meta</td><td>object</td><td>required</td><td>Members of Table 5. No other member.</td></tr>
            <tr><td>transcript_hash</td><td>string</td><td>required</td><td>"sha256:" plus 64 lowercase hexadecimal characters.</td></tr>
            <tr><td>chain_head</td><td>string</td><td>required at 0.5.0 and later</td><td>"sha256:" plus 64 lowercase hexadecimal characters.</td></tr>
            <tr><td>message_count</td><td>integer</td><td>required at 0.5.0 and later</td><td>1 to 10000 inclusive, per Section 11.7.</td></tr>
            <tr><td>validity_temporal</td><td>object</td><td>required at 0.5.0 and later</td><td>Modes and semantics in Section 8.3.</td></tr>
            <tr><td>countersignatures</td><td>object</td><td>required at 0.5.0 and later</td><td>Member names are exactly the agent identifiers in parties; values are signatures. Section 6.1.</td></tr>
            <tr><td>summary</td><td>string</td><td>optional</td><td>At most 1024 Unicode scalar values. Constrained by Section 7.</td></tr>
            <tr><td>references</td><td>array</td><td>optional</td><td>At most 32 elements, each as in Table 6.</td></tr>
          </tbody>
        </table>

        <table anchor="tbl-outcome">
          <name>Members of the outcome Object</name>
          <thead>
            <tr><th>Member</th><th>Type</th><th>Cardinality</th><th>Constraints</th></tr>
          </thead>
          <tbody>
            <tr><td>status</td><td>string</td><td>required</td><td>One of agreed, rejected, expired, withdrawn.</td></tr>
            <tr><td>rounds</td><td>integer</td><td>required</td><td>0 to 2^53-1 inclusive.</td></tr>
            <tr><td>duration_seconds</td><td>integer</td><td>required</td><td>0 to 2^53-1 inclusive.</td></tr>
            <tr><td>terms_count</td><td>integer</td><td>optional</td><td>1 to 2^53-1 inclusive.</td></tr>
            <tr><td>resolution_mechanism</td><td>string</td><td>optional</td><td>One of direct, split, foa, tradeoff, escalation, none.</td></tr>
          </tbody>
        </table>

        <table anchor="tbl-party">
          <name>Members of a parties Element</name>
          <thead>
            <tr><th>Member</th><th>Type</th><th>Cardinality</th><th>Constraints</th></tr>
          </thead>
          <tbody>
            <tr><td>agent_id</td><td>string</td><td>required</td><td>1 to 256 octets, no whitespace. Compared after normalization as stated above.</td></tr>
            <tr><td>role</td><td>string</td><td>required</td><td>One of initiator, responder, mediator, witness.</td></tr>
            <tr><td>behavior</td><td>object</td><td>required</td><td>Members of Table 4. No other member.</td></tr>
            <tr><td>signature</td><td>string</td><td>required</td><td>Signature over that party's own behavioral record. See the note below this table.</td></tr>
          </tbody>
        </table>

        <t>
        A <tt>parties[]</tt> element's <tt>signature</tt> member is
        removed before the issuance snapshot is derived
        (<xref target="countersig-payload"/>). This document defines no
        verification step over it, and a verifier
        <bcp14>MUST NOT</bcp14> treat its presence or its validity as
        evidence that an outcome is outcome-bound. Outcome binding rests on
        <tt>countersignatures</tt> alone, as
        <xref target="outcome-binding"/> specifies.
        </t>

        <table anchor="tbl-behavior">
          <name>Members of a behavior Object</name>
          <thead>
            <tr><th>Member</th><th>Type</th><th>Cardinality</th><th>Constraints</th></tr>
          </thead>
          <tbody>
            <tr><td>offers_made</td><td>integer</td><td>optional</td><td>0 to 2^53-1 inclusive.</td></tr>
            <tr><td>concessions</td><td>integer</td><td>optional</td><td>0 to 2^53-1 inclusive.</td></tr>
            <tr><td>concession_magnitude</td><td>number</td><td>optional</td><td>0.0 to 1.0 inclusive.</td></tr>
            <tr><td>signals_shared</td><td>integer</td><td>optional</td><td>0 to 2^53-1 inclusive.</td></tr>
            <tr><td>constraints_declared</td><td>integer</td><td>optional</td><td>0 to 2^53-1 inclusive.</td></tr>
            <tr><td>constraints_violated</td><td>integer</td><td>optional</td><td>0 to 2^53-1 inclusive.</td></tr>
            <tr><td>reasoning_provided</td><td>boolean</td><td>optional</td><td>true or false.</td></tr>
            <tr><td>withdrawal</td><td>boolean</td><td>optional</td><td>true or false.</td></tr>
            <tr><td>response_time_avg_seconds</td><td>number</td><td>optional</td><td>0 or greater.</td></tr>
          </tbody>
        </table>

        <table anchor="tbl-meta">
          <name>Members of the meta Object</name>
          <thead>
            <tr><th>Member</th><th>Type</th><th>Cardinality</th><th>Constraints</th></tr>
          </thead>
          <tbody>
            <tr><td>category</td><td>string</td><td>optional</td><td>Taxonomy grammar below. At most 64 octets.</td></tr>
            <tr><td>value_range</td><td>string</td><td>optional</td><td>Bucket vocabulary below. At most 32 octets.</td></tr>
            <tr><td>extensions_used</td><td>array</td><td>optional</td><td>At most 16 elements, each a string of 1 to 64 octets with no whitespace naming a protocol extension active in the session.</td></tr>
            <tr><td>mediator_invoked</td><td>boolean</td><td>optional</td><td>true or false.</td></tr>
          </tbody>
        </table>

        <t>
        The <tt>category</tt> grammar is a dotted lowercase taxonomy path.
        Each segment is one or more characters drawn from a to z, 0 to 9,
        underscore, and hyphen, and a single full stop separates adjacent
        segments. The whole value is at most 64 octets.
        </t>
        <t>
        A <tt>value_range</tt> value is one of the bucket tokens 0-100,
        100-500, 500-1000, 1000-5000, 5000-10000, 10000-50000,
        50000-100000, 100000-500000, 500000-1000000, or 1000000+,
        followed by a single underscore and a three-letter uppercase
        currency code, for example 1000-5000_USD. The bands are
        enumerated so that an exact price cannot be encoded as a
        degenerate range. A recipient <bcp14>MUST</bcp14> reject any
        other value.
        </t>

        <table anchor="tbl-reference">
          <name>Members of a references Element</name>
          <thead>
            <tr><th>Member</th><th>Type</th><th>Cardinality</th><th>Constraints</th></tr>
          </thead>
          <tbody>
            <tr><td>id</td><td>string</td><td>required</td><td>1 to 256 octets, no whitespace.</td></tr>
            <tr><td>type</td><td>string</td><td>required</td><td>1 to 64 octets, no whitespace. Emit vocabulary below.</td></tr>
            <tr><td>relationship</td><td>string</td><td>required</td><td>1 to 64 octets, no whitespace. Emit vocabulary below.</td></tr>
            <tr><td>version</td><td>string</td><td>optional</td><td>At most 256 octets, no whitespace.</td></tr>
            <tr><td>signed_at</td><td>string</td><td>optional</td><td>RFC 3339 date-time with a "Z" offset.</td></tr>
            <tr><td>signer_did</td><td>string</td><td>optional</td><td>1 to 256 octets, no whitespace.</td></tr>
          </tbody>
        </table>

        <t>
        A reference element carries a <tt>type</tt> drawn from receipt,
        chain_session, predicate, and mandate, and a
        <tt>relationship</tt> drawn from supersedes, extends, fulfills,
        and references. A recipient preserves an unrecognized value of
        either member as an opaque string, as stated above. A reference
        element carries no member other than the six of Table 6. This
        version defines no extension point inside a reference element; a
        later version that needs one introduces it by publishing a new
        format version, on the terms of
        <xref target="required-fields"/>.
        </t>

        <t>
        The <tt>validity_temporal</tt> object carries a <tt>mode</tt>
        discriminator and the members that mode requires.
        <xref target="freshness-required"/> defines the two modes, the
        members each one carries, and the interval semantics a verifier
        applies. The object carries no member other than those its mode
        requires.
        </t>
      </section>
    </section>

    <section anchor="canon">
      <name>Canonicalization and Signatures</name>

      <section anchor="canon-json">
        <name>Canonical JSON</name>
        <t>
        Objects defined by this document are JSON <xref target="RFC8259"/>
        values that use the JSON Canonicalization Scheme (JCS)
        <xref target="RFC8785"/>. A signer and verifier
        <bcp14>MUST</bcp14> canonicalize the same logical object to
        identical UTF-8 <xref target="RFC3629"/> bytes before signing or
        verification. Implementations <bcp14>MUST</bcp14> reject values
        that cannot be represented under
        <xref target="field-definitions"/> and the canonicalization rules.
        </t>
        <t>
        A verifier recanonicalizes the received object under JCS and
        verifies every signature over the recanonicalized bytes. All
        numeric members defined by this document are integers in the range
        0 to 2^53-1 inclusive, except <tt>concession_magnitude</tt>, which
        is a number between 0.0 and 1.0 inclusive, and
        <tt>response_time_avg_seconds</tt>, which is a number of 0 or
        greater. Where this document states a narrower range for a
        particular member, including the positive
        <tt>duration_seconds</tt> of
        <xref target="freshness-required"/> and the bounds of
        <xref target="resource-limits"/>, that narrower range governs and
        the general range above does not admit a value the narrower range
        excludes. A recipient <bcp14>MUST</bcp14> reject a numeric value
        outside its stated range, <bcp14>MUST</bcp14> reject an object in
        which a member name occurs more than once, as detected during
        parsing and before any duplicate-resolution rule is applied, and
        <bcp14>MUST</bcp14> reject input that is not well-formed UTF-8 or
        that contains an unpaired surrogate.
        </t>
      </section>

      <section anchor="sig-verify">
        <name>Signature Verification Criteria</name>
        <t>
        Implementations <bcp14>MUST</bcp14> verify Ed25519
        <xref target="RFC8032"/> signatures as specified in
        <xref target="RFC8032" section="5.1.7" sectionFormat="of"/> using
        the cofactorless equation, and <bcp14>MUST</bcp14> reject a
        signature whose R or S component is not canonically encoded, whose
        S is not reduced modulo L, or whose public key is not a
        canonically encoded point of order L. These criteria apply to
          every signature a verifier checks under this document, which is
          each party countersignature of
          <xref target="countersig-payload"/>.
        </t>
        <t>
        A signature required by this document is computed over canonical
        payload bytes that carry no context string separating a
        countersignature from any other Ed25519 signature made with the same
        key. A deployment that reuses keys across protocols relies on those
        payload shapes being distinguishable in practice rather than on a
        separation this document enforces. <xref target="sec-key-compromise"/>
        states that bound.
        </t>
      </section>
    </section>

    <section anchor="multiparty">
      <name>Multi-Party Binding</name>

      <section anchor="countersig-payload">
        <name>Countersignature Payload</name>
        <t>
        The countersignature payload is the JCS canonicalization of the
        issuance snapshot. To derive it, an implementation
        <bcp14>MUST</bcp14>:
        </t>
        <ol type="1">
          <li>begin with the fully assembled attestation;</li>
          <li>remove every member named <tt>signature</tt> recursively at
          every depth;</li>
          <li>remove the top-level <tt>countersignatures</tt> member;
          and</li>
          <li>canonicalize the result using JCS.</li>
        </ol>
        <t>
        No countersignature covers itself or a sibling countersignature.
        Every party therefore signs byte-identical, mutually independent
        payload bytes. Those bytes carry no context string that separates
        them from any other payload a party signs with the same key, on
        the terms stated in <xref target="sig-verify"/> and
        <xref target="sec-key-compromise"/>.
        </t>
        <t>
        <tt>countersignatures</tt> is a JSON object whose member names are
        the agent identifiers appearing in <tt>parties[]</tt> and whose
        values are Ed25519 signatures over the payload derived above,
        encoded as <xref target="field-definitions"/> pins them.
        </t>
        <t>
        The member set of an attestation is closed: an attestation carries
        only the members defined in <xref target="field-definitions"/>, at
        the root and at every nested object. Step 2 of
        <xref target="verification"/> therefore rejects an attestation
        carrying any member <xref target="field-definitions"/> does not
        define, including a member named <tt>signature</tt> at a location
        <xref target="field-definitions"/> does not define, before any
        signature is verified. The removal rule in this section operates
        on that closed set.
        </t>
      </section>

      <section anchor="outcome-binding">
        <name>Outcome-Binding Verification</name>
        <t>
        For <tt>concordia_attestation</tt> version 0.5.0 or later, a
        verifier <bcp14>MUST NOT</bcp14> credit an outcome as
        outcome-bound unless:
        </t>
        <ol type="1">
          <li><tt>parties[]</tt> contains at least two entries;</li>
          <li>every entry's agent identifier is distinct;</li>
          <li><tt>countersignatures</tt> is present;</li>
          <li>the member names of <tt>countersignatures</tt> are exactly
          the set of agent identifiers in <tt>parties[]</tt>, with no
          additional and no missing member;</li>
          <li>every party listed in <tt>parties[]</tt> has exactly one
          corresponding signature;</li>
          <li>the verifier resolves the key for every listed party;
          and</li>
          <li>every signature verifies over the payload in
          <xref target="countersig-payload"/>.</li>
        </ol>
        <t>
        The all-listed-parties rule, together with the minimum of two
        entries, prevents a holder from changing the outcome, removing a
        counterparty row, and re-signing with only its own key.
        </t>
        <t>
        An attestation carries no signature distinct from the party
        countersignatures, and it names no assembling role that a verifier
        could check. Its authenticity rests entirely on the
        countersignature of every listed party over the issuance snapshot,
        so an attestation whose outcome is not credited as outcome-bound
        is not authenticated by anything in this document.
        </t>
        <t>
        An attestation whose <tt>concordia_attestation</tt> value does not
        match the grammar in <xref target="required-fields"/> is rejected
        at step 2 of <xref target="verification"/> and is not retained.
        </t>
        <t>
        An artifact whose version is well formed and below 0.5.0 leaves
        the procedure of <xref target="verification"/> at step 2 with the
        terminal state legacy, and no check of this section is applied to
        it. Such an artifact <bcp14>MAY</bcp14> be retained as a record of
        its own contents. Its outcome <bcp14>MUST NOT</bcp14> be credited
        as outcome-bound, and it <bcp14>MUST NOT</bcp14> be reported as
        current. No requirement of <xref target="freshness"/> applies to
        it, because every requirement there is defined for version 0.5.0
        and later.
        </t>
      </section>

    </section>

    <section anchor="privacy">
      <name>Privacy Requirements</name>
      <t>
      An attestation carries metadata about negotiation behavior. It does
      not disclose the deal. Items 1 through 4 below constrain the content
      an implementation places in free-form members, so they are
      producing-side obligations that a verifier cannot confirm by
      inspection, and the verification result vocabulary of
      <xref target="definitions"/> carries no state for them: an
      attestation that violates one of them still verifies. An
      implementation that assembles an attestation:
      </t>
      <ol type="1">
        <li><bcp14>MUST NOT</bcp14> populate any field with an exact
        negotiated price, quantity, date, or other term value;</li>
        <li><bcp14>MUST NOT</bcp14> include an item or service description
        beyond the permitted <tt>category</tt> and <tt>value_range</tt>
        fields;</li>
        <li><bcp14>MUST NOT</bcp14> include free-text reasoning copied
        from negotiation messages;</li>
        <li><bcp14>MUST NOT</bcp14> include the identity of a human or
        organization represented by an agent; only the agent identifier
        is carried;</li>
        <li><bcp14>MUST</bcp14> draw <tt>value_range</tt>, when present,
        from the fixed bucket vocabulary defined in
        <xref target="field-definitions"/> and <bcp14>MUST</bcp14> reject
        all other values rather than coerce them;</li>
        <li><bcp14>MUST</bcp14> encode <tt>category</tt>, when present, as
        a dotted lowercase taxonomy path of at most 64 octets matching the
        grammar in <xref target="field-definitions"/>, where each segment
        is one or more characters drawn from a to z, 0 to 9, underscore,
        and hyphen, and <bcp14>MUST</bcp14> reject any other value rather
        than coercing it;</li>
        <li><bcp14>MAY</bcp14> omit <tt>category</tt> for additional
        privacy;</li>
        <li><bcp14>MUST</bcp14> reject a reference identifier longer than
        256 octets or containing whitespace, and <bcp14>MUST</bcp14>
        reject an attestation carrying more than 32 references, rather
        than truncating either; and</li>
        <li><bcp14>MUST</bcp14> keep <tt>summary</tt>, when present,
        within 1024 Unicode scalar values and <bcp14>MUST NOT</bcp14> copy
        a negotiated term value or free-text reasoning into it.
        <tt>summary</tt> is a free-text member, so this constraint is a
        producing-side obligation that a verifier cannot confirm by
        inspection, and it widens the residual channel described
        below.</li>
      </ol>
      <t>
      The taxonomy grammar constrains shape rather than meaning. A
      dishonest party can encode its own term in a syntactically valid
      <tt>category</tt> segment, and it has wider latitude still in the
      free-text <tt>summary</tt> member. This is an accepted, bounded
      residual channel over <tt>category</tt> and <tt>summary</tt>
      together: it can expose that party's own information, and it does
      not let that party sign on behalf of a counterparty. A future
      registered taxonomy could narrow the <tt>category</tt> half of it.
      </t>
    </section>

    <section anchor="freshness">
      <name>Freshness and Replay</name>

      <section anchor="freshness-general">
        <name>General Relying-Side Obligation</name>
        <t>
        A currently valid signature is not evidence that the signed claim
        remains true. The freshness requirements below determine whether
        an attestation may be relied upon.
        </t>
        <t>
        A relying party <bcp14>MUST</bcp14> configure a maximum evidence
        age not exceeding 90 days, a maximum accepted validity lifetime
        not exceeding 90 days, and a clock-skew allowance not exceeding
        300 seconds, and <bcp14>MUST</bcp14> reject evidence that exceeds
        any of them. A relying party <bcp14>MAY</bcp14> configure tighter
        values. Throughout this document 90 days is 7776000 seconds, which
        is 90 multiplied by 86400, and is not a calendar quantity.
        </t>
        <t>
        Every requirement of <xref target="freshness"/>, including the
        evidence-age anchor defined below, is defined for an
        attestation at version 0.5.0 or later and for no other artifact.
        An artifact whose version is well formed and below 0.5.0 reaches
        the terminal state legacy at step 2 of
        <xref target="verification"/>, so no anchor is computed for it and
        no ceiling of this section is applied to it.
        </t>
        <t>
        Evidence age is the verifier's current time minus the evidence-age anchor defined below.
        </t>
        <t>
        A relying party <bcp14>MUST</bcp14> enforce its own maximum
        evidence age independently of the signer's asserted validity
        window, and <bcp14>MUST</bcp14> reject a signer-asserted
        timestamp or interval start that is future-dated beyond that
        clock-skew allowance. The evidence-age anchor is the earlier of
        the attestation's <tt>timestamp</tt> member and the start of its
        <tt>validity_temporal</tt> interval. A verifier
        <bcp14>MUST</bcp14> enforce that finite skew bound and fail closed
        outside it, whatever the quality of its clock synchronization.
        </t>
        <t>
        A relying party <bcp14>MUST</bcp14> reject an attestation whose
        <tt>validity_temporal</tt> interval has ended at the time of
        verification.
        </t>
        <t>
        A relying party <bcp14>MAY</bcp14> apply a tighter freshness bound
        than the signer asserted.
        </t>
      </section>

      <section anchor="freshness-issuer">
        <name>Producing-Side Obligation</name>
        <t>
        A party <bcp14>MUST NOT</bcp14> countersign an attestation whose
        <tt>validity_temporal</tt> lifetime exceeds 90 days as
        <xref target="freshness-general"/> defines that quantity. That
        lifetime
        is the length of the interval that
        <xref target="freshness-required"/> defines for the stated mode,
        which is the span between <tt>from</tt> and <tt>until</tt> in
        absolute mode and the value of <tt>duration_seconds</tt> in
        relative mode.
        A party <bcp14>MAY</bcp14> apply a shorter maximum.
        </t>
      </section>

      <section anchor="freshness-required">
        <name>Required Temporal Validity</name>
        <t>
        <tt>validity_temporal</tt> is <bcp14>REQUIRED</bcp14> on every
        attestation at version 0.5.0 or later. It is a JSON object
        carrying a <tt>mode</tt> member whose value is either "absolute"
        or "relative", and the members that mode requires. All timestamps
        are RFC 3339 <xref target="RFC3339"/> date-time values encoded as
        <xref target="field-definitions"/> states. When <tt>mode</tt> is
        "absolute", the members <tt>from</tt> and <tt>until</tt> are
        present, the interval is [from, until], and the lifetime is the
        span between those two times. When <tt>mode</tt> is
        "relative", the members <tt>from</tt> and
        <tt>duration_seconds</tt>, a positive integer, are present, the
        interval is [from, from + duration_seconds], and the lifetime is
        <tt>duration_seconds</tt>. Each mode therefore has exactly one
        interval and exactly one lifetime, which is the quantity the caps
        of <xref target="freshness-general"/> and
        <xref target="freshness-issuer"/> bound. A verifier
        <bcp14>MUST</bcp14> reject a <tt>validity_temporal</tt> object
        whose <tt>mode</tt> member is absent or carries another value,
        whose members for the stated mode are absent, which carries any
        other member, or whose interval is empty or reversed.
        </t>
        <t>
        An artifact whose version is well formed and below 0.5.0 reaches
        the terminal state legacy at step 2 of
        <xref target="verification"/> and is never read for this member.
        An artifact at version 0.5.0 or later that omits this member is
        rejected at that step with the terminal state not-bound.
        </t>
      </section>


      <section anchor="single-use">
        <name>Single Use</name>
        <t>
        An attestation defined by this document carries no single-use
        semantics, and the temporal validity of
        <xref target="freshness-required"/> alone permits an unbounded
        number of effects inside the signed window. A relying party that
        treats one attestation as grounds for a consequential effect
        <bcp14>SHOULD</bcp14> keep a consumption record for that
        attestation, keyed by its <tt>attestation_id</tt>, inside its own
        accounting domain, and consult that record before admitting a
        further effect.
        </t>
        <t>
        This document defines no atomic check-and-record operation, no
        concurrency rule, and no maximum, so two simultaneous decisions
        inside one accounting domain, and two decisions in separate
        domains, can each admit an effect against the same attestation. A
        deployment that needs enforced single use obtains it from a
        mechanism that defines those semantics, for example the budgeted
        capability described in <xref target="rel-requirements"/>.
        </t>
      </section>
    </section>

    <section anchor="related-artifacts">
      <name>Related Evidence Artifacts</name>
      <t>
      This section is informative. It describes related companion
      artifacts whose full normative definition belongs to a separate
      document. It states no requirement of its own and uses no
      requirement keyword. No requirement of this document reads a member
      of any artifact sketched here. The sketches are drawn from the
      Concordia Protocol Specification named in <xref target="crosswalk"/>.
      </t>

      <section anchor="approval-receipt">
        <name>ApprovalReceipt</name>
        <t>
        An ApprovalReceipt records a human or policy approval decision
        over the digest of the canonical form of an Offer as defined in
        <xref target="definitions"/>; that companion format specifies how
        the digest is computed. <tt>approve</tt> and <tt>deny</tt> are
        both binding signed decisions. The receipt can reference the
        mandate it fulfills without defining the mandate format. It is not
        proof that the approved transaction executed.
        </t>
      </section>

      <section anchor="fulfillment-attestation">
        <name>FulfillmentAttestation</name>
        <t>
        A FulfillmentAttestation records whether an agreed exchange was
        fulfilled, fulfilled with mediation, failed, or remained disputed.
        It references the agreement attestation it fulfills. It is
        distinct from payment settlement evidence: payment settled is not
        proof of delivery, and fulfillment is not proof of payment
        finality.
        </t>
      </section>

      <section anchor="revocation-record">
        <name>RevocationRecord and Cascade Decision</name>
        <t>
        A RevocationRecord identifies a specific artifact, its effective
        time, and whether revocation is limited to that artifact or
        cascades to dependents. In that companion format, a verifier
        recomputes any committed cascade decision from the retained raw
        artifact bytes. This document states no requirement over cascade
        traversal, because it defines no revocation record, no authority
        rule, and no cascade graph. A cascade decision is
        a scoped verifier result over the artifacts defined or referenced
        by this document; it is not a general-purpose cross-format
        composition or sufficiency engine.
        </t>
      </section>
    </section>

    <section anchor="verification">
      <name>Verification Procedure</name>
      <t>
      To reach a terminal state for a received artifact, a relying party
      <bcp14>MUST</bcp14> perform the following steps in fail-closed
      order. The four terminal states are defined in
      <xref target="definitions"/>, and step 9 exposes exactly one of
      them.
      </t>
      <ol type="1">
        <li>Reject the received bytes with the terminal state not-bound,
        without parsing them, if their length exceeds the relying party's
        maximum artifact size, which <xref target="resource-limits"/> caps
        at 262144 octets.</li>
        <li>Strictly parse the received bytes and reject the artifact with
        the terminal state not-bound if they are not I-JSON
        <xref target="RFC7493"/>, if their JSON nesting depth exceeds 16,
        or if <tt>concordia_attestation</tt> is absent, does not match the
        grammar in <xref target="field-definitions"/>, or is greater than
        the highest version this verifier implements. Then read that
        member. An artifact whose value is well formed and below 0.5.0
        terminates here with the terminal state legacy, and the verifier
        <bcp14>MUST NOT</bcp14> apply any step below to it: it performs no
        signature verification, no outcome binding, no temporal check, and
        no revocation check over that artifact. For an
        artifact at version 0.5.0 or later, reject the artifact with the
        terminal state not-bound if any value is malformed under
        <xref target="field-definitions"/>, if any member is not defined
        by <xref target="field-definitions"/>, or if
        <tt>message_count</tt> lies outside 1 to 10000 inclusive. Every
        check in this step precedes every signature verification
        below.</li>
        <li>Resolve, for every agent identifier in <tt>parties[]</tt>,
        exactly one Ed25519 public key valid at the attestation's issuance
        time, using the key-binding mechanism the deployment profile
        defines. This document defines no such mechanism. If a key cannot
        be resolved, if more than one key resolves, or if the deployment
        defines no binding mechanism, the verifier terminates with the
        terminal state not-bound.</li>
        <li>Recompute the countersignature payload and verify every
        listed party's countersignature as specified in
        <xref target="outcome-binding"/>. If any check there fails,
        terminate with the terminal state not-bound.</li>
        <li>Reject the attestation unless the verifier's current time lies
        within the interval expressed by <tt>validity_temporal</tt>, and
        validate that interval's ordering, its lifetime against the
        relying party's maximum, and both the attestation timestamp and
        the interval start against the relying party's clock-skew
        allowance. Reject the attestation with the terminal state
        not-bound if any of those checks fails. Every artifact that
        reaches this step carries version 0.5.0 or later and therefore
        carries the member this step reads.</li>
        <li>Apply the relying party's own freshness ceiling, even when it
        is tighter than the signed window, and reject the attestation with
        the terminal state not-bound when the ceiling is exceeded.</li>
        <li>Determine revocation status. If the deployment profile names
        a revocation source, apply the records that source supplies as the
        deployment's own definition of that source specifies, and reject a
        revoked attestation with the terminal state not-bound. This
        document defines no revocation record format, no retrieval
        mechanism, and no authority model. The verifier
        <bcp14>MUST</bcp14> treat revocation status as undetermined in
        each of three cases: the deployment names no revocation source,
        the named source is unavailable, or the named source supplies a
        record that cannot be interpreted under the deployment's own
        definition of that source. In every one of those three cases the
        verifier <bcp14>MUST NOT</bcp14> report the artifact as current
        and <bcp14>MUST</bcp14> carry it to step 9 as bound-only, which
        retains the outcome-binding property the earlier steps established.</li>
        <li>Compare <tt>session_id</tt> and the agent identifiers in
        <tt>parties[]</tt> against the session and counterparty set the
        relying party expected for this interaction, and reject the
        attestation with the terminal state not-bound when either differs.
        A verified attestation is evidence about the session it names and
        about no other.</li>
        <li>Only then expose one terminal state to application policy:
        current when step 7 determined revocation status and the artifact
        is not revoked, and bound-only otherwise. An artifact that reached
        this step is outcome-bound.</li>
      </ol>
      <t>
      The version gate at step 2 is what keeps the legacy state coherent.
      An artifact below 0.5.0 carries no signer-asserted validity window
      and, on the 0.5.0 line, carries no countersignature map, so running
      a later step over it would ask for a member it does not carry. An
      artifact whose version string is malformed is rejected at step 2
      with the terminal state not-bound and is not retained as legacy.
      </t>
      <t>
      The four terminal states are the whole reported vocabulary. An
      implementation <bcp14>MAY</bcp14> expose diagnostic detail
      alongside the state it reports, and <bcp14>MUST NOT</bcp14> report
      any other state name in its place. An implementation
      <bcp14>MUST NOT</bcp14> silently replace one terminal state with
      another, and in particular <bcp14>MUST NOT</bcp14> report a legacy
      or bound-only artifact as current.
      </t>
      <t>
      A verifier that returns a typed failure reason <bcp14>MUST</bcp14>
      distinguish a result this document's checks cannot produce at all
      from a result this verifier could not reach with the inputs it held,
      and <bcp14>MUST NOT</bcp14> report the second as the first. This
      document defines no scope comparison, so a scope relation falls in
      the first category, while an unresolvable party key or an unavailable
      revocation source falls in the second.
      </t>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>
      This section is written against four attacker positions: an on-path
      attacker that can read, delay, suppress, or modify messages in
      transit; a single dishonest party to the negotiation; the complete
      listed party set acting together against a third party; and an
      attacker holding a compromised party key. What the checks preserve
      against each position, and what they leave open, is stated here
      rather than left to the reader.
      </t>
      <t>
      Against the on-path attacker, signature verification detects
      modification of the countersigned attestation bytes, and no check
      detects delay, suppression, or traffic analysis
      (<xref target="sec-delivery"/>).
      </t>
      <t>
      Against a single dishonest party, requiring every listed party's
      countersignature preserves the jointly bound members against
      unilateral rewriting, and no check makes that party's behavioral
      self-report objective or closes the residual channel over
      <tt>category</tt> and <tt>summary</tt> that
      <xref target="privacy"/> records
      (<xref target="sec-dishonest"/>).
      </t>
      <t>
      Against an attacker holding a compromised party key, revocation
      bounds how long such an artifact remains useful once the deployment
      detects the compromise and the verifier can reach a revocation
      source. No check detects an artifact that back-dates its own
      <tt>timestamp</tt> and <tt>validity_temporal</tt> members, so
      revocation bounds this attacker rather than detecting it
      (<xref target="sec-key-compromise"/>).
      </t>
      <t>
      Collusion of the entire listed party set against a third party is
      the design's primary residual risk, and no check defined here
      detects it.
      </t>

      <section anchor="sec-dishonest">
        <name>Dishonest Negotiation Party</name>
        <t>
        A party can issue a false behavioral self-report. Requiring every
        listed party's countersignature prevents one holder from
        rewriting the shared outcome, but it does not make every
        self-described behavioral detail objective truth. Applications
        must distinguish jointly bound outcome members from party-level
        self-reports.
        </t>
        <t>
        The outcome an attestation carries is what the listed parties
        jointly asserted at issuance. This document defines no procedure
        for re-deriving an outcome from the transcript and no check that
        the transcript's final message agrees with <tt>outcome.status</tt>,
        so a set of parties that agree to misdescribe their own session
        produces evidence this document's checks accept. Every check here
        is a check on what the parties bound together, and none is a check
        that what they bound is true.
        </t>
        <t>
        <tt>chain_head</tt> is an opaque value in the issuance snapshot,
        and <tt>message_count</tt> is the count the parties countersigned
        with it. This document defines no check that derives the
        transcript, proves completeness, or establishes the order in which
        messages were created.
        </t>
        <t>
        <tt>transcript_hash</tt> is opaque to the verifier this document
        defines. No check here reads it, and a verified result makes no
        claim about it beyond the fact that the listed parties
        countersigned a snapshot containing that string.
        <tt>chain_head</tt> is the digest string that the abstract and
        <xref target="intro"/> name, but its preimage is not defined here.
        </t>
        <t>
        A party can replay old but still correctly signed evidence.
        Required temporal validity and independent relying-side age
        limits reduce this risk; neither signature verification nor the
        signed window alone is sufficient.
        </t>
      </section>

      <section anchor="sec-delivery">
        <name>Compromised Delivery Path</name>
        <t>
        The negotiation messages of a protocol that produces an
        attestation are not protected by this document. A relay or mailbox
        can read offer terms and reasoning unless that separate protocol or
        transport protects them. Deployments <bcp14>MUST NOT</bcp14>
        describe this document as an end-to-end encryption protocol.
        </t>
        <t>
        Countersignature verification detects modification of the
        attestation bytes. It does not prevent delay, suppression, traffic
        analysis, or denial of service. Session and offer timeouts bound
        how long a party waits and do not guarantee availability.
        </t>
        <t>
        A holder that suppresses a relying party's access to a revocation
        source is not detectable by any check in this document. An
        attestation verified without a determination of revocation status
        is evidence that the parties bound an outcome at issuance, and it
        is not evidence that the outcome stands today.
        </t>
      </section>

      <section anchor="sec-privacy-leak">
        <name>Privacy Leakage</name>
        <t>
        The closed schema provides no member for a raw deal term. The
        residual channel described in <xref target="privacy"/> remains,
        and it has two halves: the <tt>category</tt> taxonomy, whose
        grammar constrains shape rather than meaning, and the free-text
        <tt>summary</tt>, whose content constraint is a producing-side
        obligation a verifier cannot confirm. A producer that violates
        either obligation still produces an artifact that verifies. Correlation across stable
        agent identifiers, timestamps, categories, and session metadata
        can also reveal patterns even when individual term values are
        absent. Implementers <bcp14>SHOULD</bcp14> minimize retention and
        disclosure according to their deployment's risk model.
        </t>
      </section>

      <section anchor="sec-key-compromise">
        <name>Key Compromise and Identity</name>
        <t>
        This document does not define identity proofing, key discovery,
        key rotation, or key revocation. A deployment
        <bcp14>MUST</bcp14> define how keys are bound to agent identifiers
        and how compromise is detected and handled. Outcome binding proves
        control of the resolved keys. It does not prove the real-world
        identity or the authority of their holders.
        </t>
        <t>
        A deployment that does not define key binding, rotation, and
        revocation cannot perform step 3 of
        <xref target="verification"/> and therefore cannot verify an
        attestation defined by this document at all.
        </t>
        <t>
        Signatures defined by this document are computed over canonical
        payload bytes with no context string distinguishing a
        countersignature from a negotiation message. A deployment that
        signs both with one key relies on the payload shapes being
        distinguishable in practice rather than on a separation this
        document enforces. Closing that gap would need a future version to
        introduce an explicit context string, and a version that did so
        would invalidate every signature produced under this one. This
        document specifies no such string and commits no future version to
        any particular construction.
        </t>
        <t>
        Agent identifiers are compared as the normalized strings of
        <xref target="field-definitions"/>. Two identifiers that a human
        reads as the same name but that differ after that normalization
        are different parties under this document, so preventing
        confusable identifiers is a property of the deployment's
        identifier issuance rather than of any check defined here.
        </t>
        <t>
        Agreement evidence is long-lived by design, and this document
        anchors no external time source. A party key that is compromised
        or that becomes forgeable long after issuance can be used to
        produce an artifact that back-dates its own <tt>timestamp</tt> and
        <tt>validity_temporal</tt> members, and nothing inside the
        artifact distinguishes that artifact from one issued at the time
        it claims. The relying-side evidence-age ceiling of
        <xref target="freshness-general"/> bounds how long such an
        artifact remains useful to an attacker; it does not detect the
        forgery. A deployment that needs that detection anchors the
        artifact in an external append-only service at issuance.
        </t>
      </section>

      <section anchor="sec-sybil">
        <name>Sybil Behavior and Completeness</name>
        <t>
        This document does not prevent one actor from operating multiple
        agent identities. It also does not prove that a selectively
        disclosed set of attestations is a party's complete history. A
        verified aggregate can prove that the revealed set is internally
        sound and party-bound; it cannot prove the set is representative
        without an external append-only history anchor.
        </t>
      </section>

      <section anchor="sec-pqc">
        <name>Post-Quantum Migration Path</name>
        <t>
        Ed25519 <xref target="RFC8032"/> is the mandatory-to-implement
        signature algorithm for version 0.6.0 of this format, and this
        document does not define per-object algorithm negotiation:
        algorithm choice is fixed per profile version rather than
        negotiated on the wire, which removes the downgrade and
        attacker-choice failure modes that negotiation would otherwise
        introduce. <xref target="RFC7696"/> (BCP&#160;201) discusses the
        tradeoffs of algorithm agility in general terms and is cited here
        for background. Agreement evidence is long-lived by design (see
        <xref target="freshness"/>), so a signature algorithm that becomes
        cryptanalytically broken during an attestation's useful lifetime
        would retroactively weaken the probative value of evidence issued
        under it. <xref target="RFC9958"/> surveys the post-quantum
        signature landscape; ML-DSA and SLH-DSA are the NIST-standardized
        post-quantum signature algorithms most likely to be named by a
        future profile version of this format. This document does not
        adopt either algorithm, does not define a hybrid classical/
        post-quantum signature mode, and does not add a negotiation field:
        the migration mechanism is a new profile version, consistent with
        the fixed-profile design this section describes.
        </t>
      </section>

      <section anchor="resource-limits">
        <name>Resource Limits</name>
        <t>
        The limits of this section are relying-party requirements, and
        <xref target="verification"/> states the step at which each one is
        applied. A verifier <bcp14>MUST</bcp14> reject, before parsing it,
        a received artifact larger than its configured maximum artifact
        size, and that configured maximum <bcp14>MUST NOT</bcp14> exceed
        262144 octets. A verifier <bcp14>MUST</bcp14> reject an artifact
        whose JSON nesting depth exceeds 16.         <tt>message_count</tt>
        <bcp14>MUST</bcp14> be an integer between 1 and 10000 inclusive,
        and a verifier <bcp14>MUST</bcp14> reject an attestation outside
        that range. The rejections of steps 1 and 2 of
        <xref target="verification"/>, which are the artifact-size cap,
        the nesting-depth cap, and the <tt>message_count</tt> range, run
        before any signature verification. The member caps of
        <xref target="field-definitions"/> bound the
        remaining attacker-controlled lengths inside the attestation: at
        most 64 parties, at most 32 references, at most 16 extension
        names, at most 256 octets in any identifier, and at most 1024
        Unicode scalar values in <tt>summary</tt>. This document processes
        no transcript. The <tt>message_count</tt> cap instead bounds an
        attacker-controlled integer that applications may display, log, or
        use in policy.
        </t>
        <t>
        Two listed parties do not imply two transcript messages. A single
        message can carry a jointly meaningful commitment, so
        <tt>message_count</tt> has a floor of 1 and the number of listed
        parties implies nothing about the number of messages.
        </t>
      </section>
    </section>

    <section anchor="operational">
      <name>Operational and Privacy Considerations</name>
      <t>
      Implementations <bcp14>SHOULD</bcp14> keep raw transcripts under the
      parties' control and present the narrower attestation when term
      disclosure is unnecessary. Logs and diagnostics
      <bcp14>SHOULD</bcp14> avoid copying raw deal terms or cryptographic
      material. Verifiers <bcp14>SHOULD</bcp14> return typed failure
      reasons without echoing untrusted private content, on the terms
      stated in <xref target="verification"/>. Clock synchronization is
      operationally important; the finite skew bound a verifier enforces
      is specified in <xref target="freshness-general"/>.
      </t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>
      This document requests no IANA actions. The vocabularies it
      defines, the outcome status values of
      <xref target="outcome-vocab"/>, the <tt>value_range</tt> buckets and
      <tt>category</tt> grammar of <xref target="field-definitions"/>, and
      the reference <tt>type</tt> and <tt>relationship</tt> values of
      <xref target="field-definitions"/>, are versioned within this
      document's own member set and change only by publication of a new
      version. A recipient rejects a <tt>status</tt> or
      <tt>value_range</tt> value outside the enumerated set, and preserves
      an unrecognized reference <tt>type</tt> or <tt>relationship</tt>
      value as an opaque string.
      </t>
      <t>
      This document registers no media type. An attestation defined here
      is carried inside a deployment's own protocol, which names the type
      it uses, and this document defines no transport. A version that
      defines a transport is where a media-type registration belongs.
      </t>
    </section>

    <section anchor="neighboring">
      <name>Relationship to Neighboring Work</name>
      <t>This section is informative.</t>

      <section anchor="rel-composition">
        <name>Evidence Composition and Sufficiency</name>
        <t>
        A general evidence-composition framework can treat a verified
        attestation as a native evidence component, alongside the
        ApprovalReceipt, FulfillmentAttestation, and RevocationRecord that
        <xref target="related-artifacts"/> names. This document defines
        the attestation and defines none of those three: their member
        sets, signature preimages, and authority rules come from the
        Concordia Protocol Specification described in
        <xref target="crosswalk"/> or from whatever document a deployment
        names, and no requirement of this document reads a member of any
        of them. The verification procedure
        (<xref target="verification"/>) is authoritative for the
        attestation alone. An external composer decides whether a set of
        heterogeneous evidence is sufficient for its own relying
        policy.
        </t>
        <t>
        This composition is optional. No normative requirement in this
        document depends on any particular composition framework or draft
        revision. <xref target="epaec"/> illustrates one such external
        composition model without creating a dependency on it.
        </t>
      </section>

      <section anchor="rel-request">
        <name>Evidence Request and Refusal</name>
        <t>
        A relying party can refuse an interaction with a structured
        challenge that describes missing evidence, a freshness
        requirement, accepted presentation profiles, and retry state. This
        document's artifacts can be consumed in that pattern without this
        document defining a competing challenge format: a party can
        decline a proposed session with a reason and later open or
        reactivate a session after obtaining the requested evidence. This
        document does not define a machine-readable outstanding-evidence
        vocabulary in the decline message.
        </t>
      </section>

      <section anchor="rel-authority">
        <name>Authority and Mandates</name>
        <t>
        Authorization assertions and mandates describe what an agent is
        permitted to do before negotiation. This document describes what
        the parties negotiated and jointly bound afterward. A mandate can
        be referenced by an artifact defined in this document; the mandate
        format and authorization decision remain external.
        </t>
        <t>
        This document places obligations on the party that relies on an
        attestation and places none on a policy evaluator deciding whether
        an action may proceed. Binding an evaluator in advance to decide
        against a specific prior commitment is a property of the
        authorization layer described in this section, and an
        implementation that requires it obtains it there.
        </t>
      </section>

      <section anchor="rel-boundary">
        <name>Boundary-Decision and Action Receipts</name>
        <t>
        Access-control and action receipts record what one boundary,
        gateway, or policy engine decided or observed. An attestation
        defined by this document records what multiple negotiating
        parties jointly bound. A deployment can produce both artifacts for
        the same broader transaction; neither substitutes for the other.
        </t>
      </section>

      <section anchor="rel-settlement">
        <name>Settlement Evidence</name>
        <t>
        Payment and ledger evidence prove rail-specific authorization,
        consumption, or finality. This document intentionally does not.
        Likewise, a FulfillmentAttestation as described in
        <xref target="fulfillment-attestation"/> does not prove payment
        finality. Together they can describe different parts of one
        transaction without collapsing their signer positions.
        </t>
      </section>

      <section anchor="rel-scitt">
        <name>Relationship to the agentproto Working Group</name>
        <t>
        The proposed IETF agentproto working group charter describes a
        standards-track agentic dialog management protocol (dialog
        correlation,
        lifecycle, and transport bindings), an informational reference
        architecture, and informational use cases and requirements. Its
        charter-ietf-agentproto-00-04, dated 2026-10-02, lists this
        out-of-scope item: "Audit data structures and their production,
        validation, or consumption, though dialog identifiers may be used
        in auditing." Its coordination section names,
        verbatim,
        "Evidence and transparency: SCITT, RATS, on software and hardware
        security" and, for identity and authorization, "Security: Web
        Authorization Protocol (OAuth), webbotauth, WIMSE."
        </t>
        <t>
        The evidence objects defined by this document are not an
        agentproto deliverable and are not listed in its charter. This
        document touches the agentproto charter only at the
        evidence-and-transparency coordination point named above and at the
        dialog-identifier hook preserved in the out-of-scope line. This
        document defines no mapping from <tt>session_id</tt> to a dialog
        identifier, and it defines no dialog-management, transport-binding,
        session-lifecycle, or identity/authorization mechanism of its own.
        </t>
      </section>

      <section anchor="rel-umbrella">
        <name>Relationship to a Neutral Evidence-Composition Interface</name>
        <t>
        A related effort defines a protocol-neutral interface for
        composing evidence across multiple agent-evidence formats. This
        document defines this specification's own artifact family; the
        neutral-interface effort defines a composition interface across
        formats. Neither is a normative dependency of the other, and this
        document does not describe, reference, or rely on that effort's
        schema, status, or publication venue.
        </t>
      </section>

      <section anchor="rel-adjacent">
        <name>Adjacent Multi-Signer Evidence Work</name>
        <t>
        Other individual Internet-Drafts define multi-signer evidence for
        agent actions and transactions. <xref target="I-D.laxsharma-pact"/>
        defines a contract layer in which a buyer and a seller co-sign a
        JCS-canonicalized task contract; a Verdict is bound by digest to
        the Delivery it judges; and a Facilitator alone signs one Outcome
        Record per contract as input to reputation systems. That contract
        format binds pricing and scope terms directly into the signed
        object and does not specify an independent relying-side freshness
        discipline.
        <xref target="I-D.mih-agent-bilateral-attestation"/> defines a
        four-move exchange in which each of two organizations holds the
        other's signature over the same action digest; it covers a single
        directed action rather than a negotiated multi-attribute outcome,
        and its wire encoding is deferred to a future revision.
        </t>
        <t>
        The attestation defined by this document differs from both: it
        binds an outcome reached through a multi-round, multi-attribute
        negotiation (<xref target="formation"/>); it structurally excludes
        negotiated price, quantity, date, and free-text term values from
        the signed object (<xref target="privacy"/>); and it defines an
        independent relying-side freshness obligation
        (<xref target="freshness"/>) that neither adjacent draft
        specifies. These efforts are complementary rather than competing;
        a relying party could in principle consume evidence from more than
        one of these formats for a single broader transaction.
        </t>
      </section>

      <section anchor="rel-requirements">
        <name>Adjacent Requirements and Single-Issuer Evidence Work</name>
        <t>
        <xref target="I-D.somoza-dmsc-atn-agent-trust-negotiation"/>
        defines a pre-negotiation trust handshake that binds a capability
        manifest, a delegation chain, a provenance attestation, and a
        session receipt to a discovered agent identity, and computes an
        agreed scope through a specified intersection algebra over the
        peers' declarations. That work establishes what a pair of agents
        is permitted to attempt before a negotiation of terms opens. This
        document defines the evidence produced after such a negotiation
        closes, and it carries no capability manifest, no delegation
        chain, and no scope algebra of its own.
        </t>
        <t>
        <xref target="I-D.wadkins-agentproto-action-determinability"/>
        states mechanism-independent requirements for establishing at a
        later time that a claimed action occurred under the conditions
        said to govern it, including that the governing conditions were
        fixed no later than the decision and that an independent evaluator
        can establish the claim without cooperation from an original
        participant. Those requirements are stated over any evidence
        format and define none. An attestation defined by this document is
        one artifact such an evaluator can read.
        <xref target="two-surfaces"/> records that this document binds
        what the parties agreed at conclusion rather than a commitment
        fixed in advance, <xref target="rel-authority"/> records that it
        places no obligation on a policy evaluator, and
        <xref target="sec-dishonest"/> records what it does and does not
        establish about ordering.
        </t>
        <t>
        <xref target="I-D.sergeev-claim-boundaries"/> states
        protocol-neutral limits on what signed evidence can support, and
        the bounds in <xref target="sec-dishonest"/> and
        <xref target="sec-key-compromise"/> of this document correspond to
        rules 1, 2, 3, 4, and 8 of its Section 6: a verified attestation
        supports the claim stated in <xref target="intro"/> under the
        key-binding premise of <xref target="sec-key-compromise"/>, and
        supports no claim about the truth of the outcome, the completeness
        of the transcript, or the order in which the transcript's messages
        were created.
        </t>
        <t>
        <xref target="I-D.bradleyb-audit-decision-records"/> records
        authorization decisions rather than actions, so that a denial, an
        expiry, or an unfulfilled commitment remains representable, and it
        requires a record to disclose what establishes the order of the
        decision against the effect and whether that mechanism sits inside
        the producer's own trust boundary. This document records a digest
        and count that the parties countersigned, and
        <xref target="sec-dishonest"/> states what it does and does not
        establish about precedence.
        </t>
        <t>
        <xref target="I-D.schrock-ep-bounded-capability-receipts"/>
        defines a signed capability carrying a budget with explicit units,
        together with a reserve, admit, and reconcile state machine that
        refuses overspend, prevents replay of an operation, serializes
        concurrent owners, and charges an indeterminate operation
        conservatively. It bounds how much authority an agent may consume
        before and while it acts. This document reports what a set of
        parties bound after a negotiation concluded, and it defines no
        budget, no reservation, no consumption record, and no single-use
        semantics of its own beyond the relying-side bound in
        <xref target="single-use"/>.
        </t>
        <t>
        <xref target="I-D.correctover-ccs"/> defines a runtime conformance
        check over an individual agent tool call across seven dimensions
        and emits a signed receipt carrying an allow, deny, or escalate
        verdict for one invocation, using Ed25519 signatures over JCS
        canonical JSON as this document does. It judges a single call at
        the moment that call is made and records one issuer's verdict.
        This document binds an outcome that several parties reached across
        many messages and records no verdict, so a deployment can produce
        both artifacts for one broader transaction without either standing
        in for the other.
        </t>
      </section>

    </section>

  </middle>

  <back>

    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="S. Bradner"/>
          <date year="1997" month="March"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba" fullname="B. Leiba"/>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC8032" target="https://www.rfc-editor.org/info/rfc8032">
        <front>
          <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
          <author initials="S." surname="Josefsson" fullname="S. Josefsson"/>
          <author initials="I." surname="Liusvaara" fullname="I. Liusvaara"/>
          <date year="2017" month="January"/>
        </front>
        <seriesInfo name="RFC" value="8032"/>
        <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        <annotation>
        Informational. Cited normatively for the Ed25519 signature
        algorithm and the verification criteria required by
        <xref target="sig-verify"/>; as with
        <xref target="RFC8785"/>, <xref target="RFC6234"/>, and
        <xref target="RFC7493"/>, this is a downward reference from a Standards Track document and is expected
        to be flagged and pre-approved at IETF Last Call.
        </annotation>
      </reference>
      <reference anchor="RFC8785" target="https://www.rfc-editor.org/info/rfc8785">
        <front>
          <title>JSON Canonicalization Scheme (JCS)</title>
          <author initials="A." surname="Rundgren" fullname="A. Rundgren"/>
          <author initials="B." surname="Jordan" fullname="B. Jordan"/>
          <author initials="S." surname="Erdtman" fullname="S. Erdtman"/>
          <date year="2020" month="June"/>
        </front>
        <seriesInfo name="RFC" value="8785"/>
        <seriesInfo name="DOI" value="10.17487/RFC8785"/>
        <annotation>
        Informational. Cited normatively for the canonicalization scheme
        used throughout this document; a Standards Track document citing
        an Informational RFC normatively is a downward reference and is
        expected to be flagged and pre-approved at IETF Last Call. Two
        verified errata are on file against this RFC and were checked at
        conversion time: Errata ID 6292 (editorial, Section 3.2.2.2 cross
        reference) and Errata ID 7920 (technical, Section 5, handling of
        negative zero); neither changes the normative text this document
        relies on.
        </annotation>
      </reference>
      <reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259">
        <front>
          <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
          <author initials="T." surname="Bray" fullname="T. Bray" role="editor"/>
          <date year="2017" month="December"/>
        </front>
        <seriesInfo name="STD" value="90"/>
        <seriesInfo name="RFC" value="8259"/>
        <seriesInfo name="DOI" value="10.17487/RFC8259"/>
      </reference>
      <reference anchor="RFC3629" target="https://www.rfc-editor.org/info/rfc3629">
        <front>
          <title>UTF-8, a transformation format of ISO 10646</title>
          <author initials="F." surname="Yergeau" fullname="F. Yergeau"/>
          <date year="2003" month="November"/>
        </front>
        <seriesInfo name="STD" value="63"/>
        <seriesInfo name="RFC" value="3629"/>
        <seriesInfo name="DOI" value="10.17487/RFC3629"/>
      </reference>
      <reference anchor="RFC6234" target="https://www.rfc-editor.org/info/rfc6234">
        <front>
          <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
          <author initials="D." surname="Eastlake 3rd" fullname="D. Eastlake 3rd"/>
          <author initials="T." surname="Hansen" fullname="T. Hansen"/>
          <date year="2011" month="May"/>
        </front>
        <seriesInfo name="RFC" value="6234"/>
        <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        <annotation>
        Informational. Cited normatively for the SHA-256 digest strings
        <tt>chain_head</tt> and <tt>transcript_hash</tt>; as with
        <xref target="RFC8785"/>, <xref target="RFC8032"/>, and
        <xref target="RFC7493"/>, this is a downward reference from a
        Standards Track document and is expected to be flagged and
        pre-approved at IETF Last Call.
        </annotation>
      </reference>
      <reference anchor="RFC3339" target="https://www.rfc-editor.org/info/rfc3339">
        <front>
          <title>Date and Time on the Internet: Timestamps</title>
          <author initials="G." surname="Klyne" fullname="G. Klyne"/>
          <author initials="C." surname="Newman" fullname="C. Newman"/>
          <date year="2002" month="July"/>
        </front>
        <seriesInfo name="RFC" value="3339"/>
        <seriesInfo name="DOI" value="10.17487/RFC3339"/>
      </reference>
      <reference anchor="RFC4648" target="https://www.rfc-editor.org/info/rfc4648">
        <front>
          <title>The Base16, Base32, and Base64 Data Encodings</title>
          <author initials="S." surname="Josefsson" fullname="S. Josefsson"/>
          <date year="2006" month="October"/>
        </front>
        <seriesInfo name="RFC" value="4648"/>
        <seriesInfo name="DOI" value="10.17487/RFC4648"/>
      </reference>
      <reference anchor="RFC7493" target="https://www.rfc-editor.org/info/rfc7493">
        <front>
          <title>The I-JSON Message Format</title>
          <author initials="T." surname="Bray" fullname="T. Bray" role="editor"/>
          <date year="2015" month="March"/>
        </front>
        <seriesInfo name="RFC" value="7493"/>
        <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        <annotation>
        Informational. Cited normatively for the I-JSON restrictions
        applied at step 2 of <xref target="verification"/>; as with
        <xref target="RFC8785"/>, <xref target="RFC8032"/>, and
        <xref target="RFC6234"/>, this is a downward reference from a
        Standards Track document and is expected to be flagged and
        pre-approved at IETF Last Call.
        </annotation>
      </reference>
      <reference anchor="UAX15" target="https://www.unicode.org/reports/tr15/">
        <front>
          <title>Unicode Standard Annex #15: Unicode Normalization Forms</title>
          <author>
            <organization>The Unicode Consortium</organization>
          </author>
        </front>
      </reference>
    </references>

    <references>
      <name>Informative References</name>
      <reference anchor="RFC7696" target="https://www.rfc-editor.org/info/rfc7696">
        <front>
          <title>Guidelines for Cryptographic Algorithm Agility and Selecting Mandatory-to-Implement Algorithms</title>
          <author initials="R." surname="Housley" fullname="R. Housley"/>
          <date year="2015" month="November"/>
        </front>
        <seriesInfo name="BCP" value="201"/>
        <seriesInfo name="RFC" value="7696"/>
        <seriesInfo name="DOI" value="10.17487/RFC7696"/>
      </reference>
      <reference anchor="RFC9958" target="https://www.rfc-editor.org/info/rfc9958">
        <front>
          <title>Post-Quantum Cryptography for Engineers</title>
          <author initials="A." surname="Banerjee" fullname="A. Banerjee"/>
          <author initials="T." surname="Reddy.K" fullname="T. Reddy.K"/>
          <author initials="D." surname="Schoinianakis" fullname="D. Schoinianakis"/>
          <author initials="T." surname="Hollebeek" fullname="T. Hollebeek"/>
          <author initials="M." surname="Ounsworth" fullname="M. Ounsworth"/>
          <date year="2026" month="June"/>
        </front>
        <seriesInfo name="RFC" value="9958"/>
        <seriesInfo name="DOI" value="10.17487/RFC9958"/>
        <annotation>
        Informational. Title, author list, and June 2026 publication date
        verified at the RFC Editor and the datatracker on 2026-09-16.
        </annotation>
      </reference>
      <reference anchor="RFC7942" target="https://www.rfc-editor.org/info/rfc7942">
        <front>
          <title>Improving Awareness of Running Code: The Implementation Status Section</title>
          <author initials="Y." surname="Sheffer" fullname="Y. Sheffer"/>
          <author initials="A." surname="Farrel" fullname="A. Farrel"/>
          <date year="2016" month="July"/>
        </front>
        <seriesInfo name="BCP" value="205"/>
        <seriesInfo name="RFC" value="7942"/>
        <seriesInfo name="DOI" value="10.17487/RFC7942"/>
      </reference>
      <reference anchor="I-D.laxsharma-pact" target="https://datatracker.ietf.org/doc/draft-laxsharma-pact/">
        <front>
          <title>PACT: Co-Signed Task Contracts, Delivery and Verdict Records, and Outcome Records for Autonomous Agents</title>
          <author initials="L." surname="Sharma" fullname="Laxmikant Sharma"/>
          <date year="2026" month="September" day="16"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-laxsharma-pact-02"/>
        <annotation>Work in progress. Revision, date, title, and author verified active at the datatracker on 2026-10-03.</annotation>
      </reference>
      <reference anchor="I-D.mih-agent-bilateral-attestation" target="https://datatracker.ietf.org/doc/draft-mih-agent-bilateral-attestation/">
        <front>
          <title>Bilateral Attestation of Cross-Organization Agent Actions</title>
          <author initials="S." surname="Mih" fullname="Steven Mih"/>
          <date year="2026" month="September" day="13"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-mih-agent-bilateral-attestation-02"/>
        <annotation>Work in progress. Revision, date, title, and author verified active at the datatracker on 2026-09-16.</annotation>
      </reference>
      <reference anchor="I-D.schrock-ep-authorization-evidence-chain" target="https://datatracker.ietf.org/doc/draft-schrock-ep-authorization-evidence-chain/">
        <front>
          <title>Authorization Evidence Chains: Composing Heterogeneous Agent-Action Evidence (EP-AEC)</title>
          <author initials="I." surname="Schrock" fullname="Iman Schrock"/>
          <date year="2026" month="September" day="28"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-schrock-ep-authorization-evidence-chain-07"/>
        <annotation>Work in progress. Revision, date, title, and author verified active at the datatracker on 2026-10-03; this is the document that carries the EP-AEC sufficiency and composition model referenced informatively in <xref target="epaec"/>, distinct from its sibling <xref target="I-D.schrock-ep-bounded-capability-receipts"/>, which defines a budgeted capability.</annotation>
      </reference>
      <reference anchor="I-D.somoza-dmsc-atn-agent-trust-negotiation" target="https://datatracker.ietf.org/doc/draft-somoza-dmsc-atn-agent-trust-negotiation/">
        <front>
          <title>Agent Trust Negotiation: Capability, Delegation, and Provenance Binding for AI Agents</title>
          <author initials="E." surname="Somoza" fullname="Enrique Somoza"/>
          <date year="2026" month="May" day="29"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-somoza-dmsc-atn-agent-trust-negotiation-00"/>
        <annotation>Work in progress. Revision, date, title, and author verified active at the datatracker on 2026-09-16.</annotation>
      </reference>
      <reference anchor="I-D.wadkins-agentproto-action-determinability" target="https://datatracker.ietf.org/doc/draft-wadkins-agentproto-action-determinability/">
        <front>
          <title>Independent Determinability of Agent Actions</title>
          <author initials="D." surname="Wadkins" fullname="Douglas Wadkins"/>
          <date year="2026" month="September" day="10"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-wadkins-agentproto-action-determinability-00"/>
        <annotation>Work in progress. Revision, date, title, and author verified active at the datatracker on 2026-09-16.</annotation>
      </reference>
      <reference anchor="I-D.sergeev-claim-boundaries" target="https://datatracker.ietf.org/doc/draft-sergeev-claim-boundaries/">
        <front>
          <title>Claim Boundaries for Execution Evidence</title>
          <author initials="M." surname="Sergeev" fullname="M. Sergeev"/>
          <date year="2026" month="September" day="23"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-sergeev-claim-boundaries-01"/>
        <annotation>Work in progress. Revision, date, title, and author verified against the IETF archive on 2026-09-24.</annotation>
      </reference>
      <reference anchor="I-D.bradleyb-audit-decision-records" target="https://datatracker.ietf.org/doc/draft-bradleyb-audit-decision-records/">
        <front>
          <title>Signed Decision Records for Agent Authorization: Disclosures, Entry Emission, and Ordering Evidence</title>
          <author initials="B." surname="B" fullname="Bradley B"/>
          <date year="2026" month="August" day="13"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-bradleyb-audit-decision-records-00"/>
        <annotation>Work in progress. Revision, date, title, and author verified active at the datatracker on 2026-09-16; the author field at the datatracker renders as "Bradley B" and is cited here as it appears there.</annotation>
      </reference>
      <reference anchor="I-D.schrock-ep-bounded-capability-receipts" target="https://datatracker.ietf.org/doc/draft-schrock-ep-bounded-capability-receipts/">
        <front>
          <title>Bounded Capability Receipts and Durable Spend Control for Agent Actions</title>
          <author initials="I." surname="Schrock" fullname="Iman Schrock"/>
          <date year="2026" month="September" day="9"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-schrock-ep-bounded-capability-receipts-06"/>
        <annotation>Work in progress. Revision, date, title, and author verified active at the datatracker on 2026-09-16.</annotation>
      </reference>
      <reference anchor="I-D.correctover-ccs" target="https://datatracker.ietf.org/doc/draft-correctover-ccs/">
        <front>
          <title>Correctover Conformance Shape (CCS): Runtime Verification for AI Agent Tool Calls</title>
          <author initials="G." surname="Wang" fullname="Guigui Wang"/>
          <date year="2026" month="September" day="14"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-correctover-ccs-09"/>
        <annotation>Work in progress. Revision, date, title, and author verified active at the datatracker on 2026-09-16.</annotation>
      </reference>
    </references>

    <section anchor="crosswalk" numbered="true">
      <name>Source Crosswalk</name>
      <t>This appendix is informative. The source specification is the
      Concordia Protocol Specification, the document from which this
      document's artifact family is drawn. The table records which section
      of that specification each subject of this document is derived from,
      for editor traceability; it is not part of the normative text, and
      no requirement of this document depends on it.</t>
      <table anchor="tbl-crosswalk">
        <name>Crosswalk to the Source Specification</name>
        <thead>
          <tr><th>Document subject</th><th>Concordia Protocol Specification section</th></tr>
        </thead>
        <tbody>
          <tr><td>Scope and non-goals</td><td>Sections 1.4 and 2</td></tr>
          <tr><td>Terms and agreement surfaces</td><td>Sections 3 and 4</td></tr>
          <tr><td>Lifecycle and offer grammar</td><td>Sections 5 and 6</td></tr>
          <tr><td>JCS, signatures, and transcript digest fields</td><td>Sections 9.2, 9.3, and 9.6.2</td></tr>
          <tr><td>Attestation schema and fields</td><td>Sections 9.6.2 and 9.6.3</td></tr>
          <tr><td>Approval, fulfillment, revocation</td><td>Sections 9.6.4a through 9.6.4d</td></tr>
          <tr><td>Outcome binding</td><td>Section 9.6.5a</td></tr>
          <tr><td>Privacy invariant</td><td>Section 9.6.6</td></tr>
          <tr><td>Freshness and replay</td><td>Section 9.7</td></tr>
          <tr><td>Threat-model security organization</td><td>Section 9.8</td></tr>
          <tr><td>Typed references</td><td>Section 11.5</td></tr>
        </tbody>
      </table>
    </section>

    <section anchor="impl-status" numbered="true">
      <name>Implementation Status</name>
      <t>
      This appendix is informative and is provided in the form described
      by <xref target="RFC7942"/>. The RFC Editor is requested to remove
      this appendix before publication, along with the reference to
      <xref target="RFC7942"/>.
      </t>
      <t>
      The implementations reported on are a JSON Schema for the
      attestation, a Python reference SDK, a JavaScript reference SDK, and
      a conformance suite, all maintained by the author of this document.
      Every row below describes one source tree at one revision: the
      Concordia repository on its main branch at commit 847729cd. It does
      not describe a package published to an index, and a published
      package may be older or newer than that commit. At that commit the
      attestation version the implementations emit is 0.5.0. The version
      this document specifies is 0.6.0, and no part of that line exists at
      that commit.
      </t>
      <t>
      The table is generated rather than edited. It carries 62 rows, one
      for every requirement-keyword occurrence in Sections 4 through 10 of
      this document, in document order: 35 occurrences of
      <bcp14>MUST</bcp14>, 18 of <bcp14>MUST NOT</bcp14>, 7 of
      <bcp14>MAY</bcp14>, 1 of <bcp14>REQUIRED</bcp14>, and 1 of
      <bcp14>SHOULD</bcp14>. A requirement inside that range cannot be
      omitted by an editorial choice. The range is not the whole
      document: <xref target="security"/> and
      <xref target="operational"/> carry requirement keywords that this
      table does not enumerate, among them the resource limits of
      <xref target="resource-limits"/> that steps 1 and 2 of
      <xref target="verification"/> apply.
      </t>
      <t>
      Each row carries exactly one of three states, and the state follows
      a rule rather than a judgement, so that two rows reporting the same
      fact carry the same state:
      </t>
      <ul>
        <li>"implemented at 847729cd" means the behavior the requirement
        describes is present at that commit. Every such row carries an
        evidence key naming the test file or the schema construct that
        shows it; the keys are listed after the table. A row granting a
        permission is reported by whether the tree at that commit behaves
        consistently with the permission. The row reports that one
        requirement and says nothing about the constraints this document
        adds elsewhere.</li>
        <li>"scheduled for 0.6.0" means the requirement addresses a
        verifier, a relying party, or a producer, the implementations
        could carry it, and they do not carry it at that commit. It states
        this document's target and claims no existing code.</li>
        <li>"specified here, no implementation" means the requirement
        addresses producer free-text content where no validator can test
        compliance. No revision of these implementations moves such a row.</li>
      </ul>
      <t>
      The table contains 17 rows implemented at 847729cd, 40 rows
      scheduled for 0.6.0, and 5 rows specified here with no
      implementation. The implementations emit 0.5.0 and this document
      specifies 0.6.0.
      </t>
      <table anchor="tbl-impl">
        <name>Per-Requirement Implementation Status</name>
        <thead>
          <tr><th>Requirement</th><th>Section</th><th>Status</th></tr>
        </thead>
        <tbody>
          <tr><td>A relying party MAY calculate its own score from the behavioral signals or ignore them</td><td>4.3</td><td>implemented at 847729cd [E1]</td></tr>
          <tr><td>The four unused bits of the final encoded signature group MUST be zero</td><td>4.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST reject a signature value of the wrong length, with absent or misplaced padding, with a character outside the alphabet, with whitespace, or with non-zero unused bits</td><td>4.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST compare decoded signature octets rather than encoded characters</td><td>4.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST reject a timestamp whose offset is not the single character Z</td><td>4.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST reject a fractional second of more than three digits</td><td>4.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST reject a string member that is not in Normalization Form C</td><td>4.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST compare identifier strings only after normalization</td><td>4.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A member declared free of whitespace MUST NOT carry a White_Space character</td><td>4.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>Such a member MUST NOT carry a character in the listed control and format ranges</td><td>4.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST preserve an unrecognized reference type or relationship as an opaque string</td><td>4.4</td><td>implemented at 847729cd [E2]</td></tr>
          <tr><td>A verifier MUST NOT treat a parties element signature as evidence that an outcome is outcome-bound</td><td>4.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST reject a value_range outside the enumerated bucket vocabulary</td><td>4.4</td><td>implemented at 847729cd [E3]</td></tr>
          <tr><td>A signer and a verifier MUST canonicalize the same logical object to identical UTF-8 bytes</td><td>5.1</td><td>implemented at 847729cd [E4]</td></tr>
          <tr><td>Implementations MUST reject values that cannot be represented under Section 4.4 and the canonicalization rules</td><td>5.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST reject a numeric value outside its stated range</td><td>5.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST reject an object carrying a repeated member name, detected at parse time</td><td>5.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A recipient MUST reject input that is not well-formed UTF-8 or that carries an unpaired surrogate</td><td>5.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>Implementations MUST verify Ed25519 signatures with the cofactorless equation of RFC 8032</td><td>5.2</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>Implementations MUST reject a non-canonical R or S, an unreduced S, or a public key not of order L</td><td>5.2</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>An implementation MUST derive the countersignature payload by the four steps of this section</td><td>6.1</td><td>implemented at 847729cd [E5]</td></tr>
          <tr><td>A verifier MUST NOT credit an outcome as outcome-bound unless all seven listed conditions hold</td><td>6.2</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A well-formed artifact below 0.5.0 MAY be retained as a record of its own contents</td><td>6.2</td><td>implemented at 847729cd [E6]</td></tr>
          <tr><td>Its outcome MUST NOT be credited as outcome-bound</td><td>6.2</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>It MUST NOT be reported as current</td><td>6.2</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>An assembling implementation MUST NOT populate any member with an exact negotiated term value</td><td>7</td><td>specified here, no implementation</td></tr>
          <tr><td>It MUST NOT include an item or service description beyond category and value_range</td><td>7</td><td>specified here, no implementation</td></tr>
          <tr><td>It MUST NOT include free-text reasoning copied from negotiation messages</td><td>7</td><td>specified here, no implementation</td></tr>
          <tr><td>It MUST NOT include the identity of a represented human or organization</td><td>7</td><td>specified here, no implementation</td></tr>
          <tr><td>It MUST draw value_range from the fixed bucket vocabulary</td><td>7</td><td>implemented at 847729cd [E3]</td></tr>
          <tr><td>It MUST reject every other value_range value rather than coerce it</td><td>7</td><td>implemented at 847729cd [E3]</td></tr>
          <tr><td>It MUST encode category to the dotted lowercase taxonomy grammar</td><td>7</td><td>implemented at 847729cd [E3]</td></tr>
          <tr><td>It MUST reject every other category value rather than coercing it</td><td>7</td><td>implemented at 847729cd [E3]</td></tr>
          <tr><td>It MAY omit category for additional privacy</td><td>7</td><td>implemented at 847729cd [E7]</td></tr>
          <tr><td>It MUST reject a reference identifier longer than 256 octets or carrying whitespace</td><td>7</td><td>implemented at 847729cd [E3]</td></tr>
          <tr><td>It MUST reject an attestation carrying more than 32 references</td><td>7</td><td>implemented at 847729cd [E3]</td></tr>
          <tr><td>It MUST keep summary within 1024 Unicode scalar values</td><td>7</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>It MUST NOT copy a negotiated term value or free-text reasoning into summary</td><td>7</td><td>specified here, no implementation</td></tr>
          <tr><td>A relying party MUST configure a maximum evidence age, a maximum validity lifetime, and a skew allowance within the stated ceilings</td><td>8.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A relying party MUST reject evidence exceeding any of those three</td><td>8.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A relying party MAY configure tighter values</td><td>8.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A relying party MUST enforce its own evidence age independently of the signed window</td><td>8.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A relying party MUST reject a timestamp or interval start future-dated beyond the skew allowance</td><td>8.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A verifier MUST enforce the finite skew bound and fail closed outside it</td><td>8.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A relying party MUST reject an attestation whose validity interval has ended</td><td>8.1</td><td>implemented at 847729cd [E6]</td></tr>
          <tr><td>A relying party MAY apply a tighter freshness bound than the signer asserted</td><td>8.1</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A party MUST NOT countersign a validity lifetime exceeding 90 days</td><td>8.2</td><td>implemented at 847729cd [E6]</td></tr>
          <tr><td>A party MAY apply a shorter maximum lifetime</td><td>8.2</td><td>implemented at 847729cd [E6]</td></tr>
          <tr><td>validity_temporal is REQUIRED on every attestation at 0.5.0 and later</td><td>8.3</td><td>implemented at 847729cd [E8]</td></tr>
          <tr><td>A verifier MUST reject a validity_temporal object that is malformed, carries an extra member, or expresses an empty or reversed interval</td><td>8.3</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A relying party SHOULD keep a consumption record for an attestation it acts on, keyed by attestation_id</td><td>8.4</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A relying party MUST perform the nine verification steps in fail-closed order</td><td>10</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>An artifact below 0.5.0 terminates at step 2 with the terminal state legacy, and the verifier MUST NOT apply any later step to it</td><td>10</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>The verifier MUST treat revocation status as undetermined in each of the three named cases</td><td>10</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>In each of those cases the verifier MUST NOT report the artifact as current</td><td>10</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>In each of those cases the verifier MUST carry the artifact to step 9 as bound-only</td><td>10</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>An implementation MAY expose diagnostic detail alongside the terminal state it reports</td><td>10</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>An implementation MUST NOT report any state name other than the four terminal states</td><td>10</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>An implementation MUST NOT silently replace one terminal state with another</td><td>10</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>An implementation MUST NOT report a legacy or bound-only artifact as current</td><td>10</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A typed failure reason MUST distinguish a result the checks cannot produce from one this verifier could not reach</td><td>10</td><td>scheduled for 0.6.0</td></tr>
          <tr><td>A typed failure reason MUST NOT report the second of those as the first</td><td>10</td><td>scheduled for 0.6.0</td></tr>
        </tbody>
      </table>
      <t>
      Evidence keys for the rows above, each a path in the Concordia
      repository at commit 847729cd:
      </t>
      <dl newline="false">
        <dt>E1:</dt>
        <dd>concordia/reputation/scorer.py, which computes scores outside
        the attestation.</dd>
        <dt>E2:</dt>
        <dd>tests/test_references.py, the unknown-type and
        unknown-relationship round-trip cases.</dd>
        <dt>E3:</dt>
        <dd>tests/test_attestation_l3_bucket_vocabulary.py, which pins the
        enumerated <tt>value_range</tt> vocabulary, the
        <tt>category</tt> grammar, the reference string caps, and the
        32-reference count cap, each rejected rather than coerced.</dd>
        <dt>E4:</dt>
        <dd>tests/test_canonicalization_rfc8785.py.</dd>
        <dt>E5:</dt>
        <dd>tests/test_attestation_signature_verification.py, against
        concordia/attestation.py and concordia/cosign.py, which strip every
        <tt>signature</tt> member, exclude the countersignature map, and
        canonicalize.</dd>
        <dt>E6:</dt>
        <dd>tests/test_validity_temporal.py, including the ended-interval
        case, the legacy-readable case, the issuer refusal above 90 days,
        and the shorter-window cases.</dd>
        <dt>E7:</dt>
        <dd>schemas/attestation.schema.json, where the <tt>meta</tt> object
        carries no required member, so <tt>category</tt> may be
        omitted.</dd>
	        <dt>E8:</dt>
	        <dd>schemas/attestation.schema.json, the version-gated
	        <tt>allOf</tt> that requires <tt>validity_temporal</tt> at 0.5.0
	        and later.</dd>
	      </dl>
      <t>
      Two notes. First, this document removes members that the schema at
      that commit carries:
      the <tt>fulfillment</tt> member of the attestation root, the
      <tt>extensions</tt> member of a reference element, and the
      <tt>window</tt> validity mode. It also removes the requirements
      that read members of the approval, fulfillment, and revocation
      artifacts, since it does not define those artifacts. An artifact at
      version 0.5.0 or later carrying a removed member is rejected at step
      2 of <xref target="verification"/>, which is intended.
      </t>
      <t>
      A second note bears on the legacy rows. At 847729cd the temporal
      validity helper returns a valid result for an artifact below 0.5.0
      that carries no validity window, so that commit does not implement
      the rule that such an artifact is never reported as current. The two
      rows carrying that rule read as scheduled for that reason.
      </t>
      <t>
      This appendix is evidence for draft readiness. It is not a normative
      dependency on either reference SDK.
      </t>
    </section>

    <section anchor="epaec" numbered="true">
      <name>EP-AEC Compatibility</name>
      <t>This appendix is informative and creates no normative dependency.
      </t>
      <t>
      <xref target="I-D.schrock-ep-authorization-evidence-chain"/>, also
      known by its short name EP-AEC, defines a transport-agnostic
      composition object and a fail-closed evaluation algorithm for
      combining heterogeneous agent-action evidence against a relying
      party's pinned evidence requirement. It distinguishes whether a set
      of evidence is SATISFIED (it fills the stated requirement) from
      whether an action is AUTHORIZED (a separate, local policy decision),
      and states that native validity alone is not sufficient for
      composition.
      </t>
      <t>
      An attestation at version 0.6.0 that reaches the terminal state
      current under <xref target="verification"/> of this document is a
      candidate native evidence component under that model: an EP-AEC
      composition layer could treat this document's own countersignature
      and freshness semantics as native validity inputs, while still
      applying its own requirement-level freshness bound. This document
      carries no artifact signature distinct from the party countersignatures
      (<xref target="outcome-binding"/>), and it determines revocation
      status only when the deployment supplies a revocation source
      (<xref target="verification"/>).
      </t>
      <t>
      This document does not require, normatively reference, or depend on
      EP-AEC or any other evidence-composition framework. An
      implementation of this document's attestation format and
      verification procedure (<xref target="attestation"/> and
      <xref target="verification"/>) is complete and independently useful
      without it.
      </t>
    </section>

  </back>
</rfc>
