<?xml version="1.0" encoding="UTF-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-hillier-scitt-arp-06" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" tocDepth="4" version="3">
  
  <front>
    <title abbrev="ARP">Attestation Reconciliation Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-hillier-scitt-arp-06"/>
    <author initials="J. D." surname="Hillier" fullname="Joel David Hillier">
      <organization>Certisyn, Inc.</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>jhillier@certisyn.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="23"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <keyword>SCITT</keyword>
    <keyword>RATS</keyword>
    <keyword>attestation</keyword>
    <keyword>reconciliation</keyword>
    <keyword>cross-jurisdictional</keyword>
    <keyword>policy-version</keyword>
    <keyword>agentic-AI</keyword>
    <keyword>friend-or-foe</keyword>
    <abstract>
      

<t>This document specifies the Attestation Reconciliation Protocol (ARP), a
deterministic, bilateral, minimum-disclosure mechanism for reconciling
verification claims against a plurality of sovereign authoritative registers
without raw register records leaving their data-residency jurisdiction. ARP
extends the SCITT (Supply Chain Integrity, Transparency, and Trust)
architecture to cross-sovereign claim reconciliation. A reconciliation server
canonicalises a structured claim, binds the identity of the requesting
principal -- including, where the requester is an autonomous agent, a
friend-or-foe determination of that agent's verifiable principal binding --
projects the claim through register-specific controlled projection functions
producing the nearest permitted ancestor predicate supported by each
addressed register, transmits register-specific ciphertexts, receives partial
attestations whose payload discloses, of the subject, only a verdict, an optional
divergence axis, the applied profile parameters and a query binding digest,
aggregates those attestations under a verdict arithmetic the deployment's policy
resolves, committing each register's contribution to a Merkle tree, and seals the resulting reconciliation output against
a policy-version hash. An append-only cross-jurisdictional settlement-layer
ledger records digests and structural metadata, with no claim, register-record
or principal content. The protocol supports retroactive
re-evaluation of historical reconciliations under updated pattern libraries or
policy versions without bilateral renegotiation, and a
cryptographic-primitive-upgrade path including post-quantum primitives. This
revision adds a normative binding to the SCITT Reference APIs, register
data-format profiles for beneficial-ownership, corporate-registry, customs and
consolidated-sanctions formats, and a source-data version binding that makes a
change in a historical verdict attributable to a change in policy or to a change
in the underlying published corpus.</t>
    </abstract>
  </front>
  <middle>
    

<section anchor="note-to-the-rfc-editor">
      <name>Note to the RFC Editor</name>
      <t>RFC EDITOR: please remove this section before publication.</t>
      <t>This document is Standards Track and makes six normative references to
Informational documents: RFC 2104, RFC 6234, RFC 6839, RFC 8785, RFC 9053 and
RFC 9334. Each is a downref under <xref target="RFC8067"/>. RFC 6839, RFC 9053 and RFC 9334
are already recorded in the downref registry, so no Last Call action is required
for them. RFC 2104 and RFC 6234 are cited for HMAC and for SHA-256, which every
digest this document defines depends on and which earlier revisions used
throughout with no normative reference at all; RFC EDITOR, please confirm their
current downref-registry status, since it may have changed since this revision
was written. RFC 8785 is not registered, and it is the one that needs the
announcement below. That reference is
deliberately normative: ARP's Canonical Claim is a digest over an RFC 8785
serialisation preceded by Unicode Normalization Form C, and the subject digest
of <xref target="composition"/> is a digest over an unmodified RFC 8785 serialisation.
Neither can be computed without RFC 8785, and an implementation that
substituted any other canonicalisation would compute a different value for the
same claim. The reference is therefore load-bearing for interoperability and
cannot be demoted to informative. This is called out here so that the downref
can be noted in the IETF Last Call announcement, which Section 2 of <xref target="RFC8067"/>
strongly recommends without requiring.</t>
      <t>This document also makes a normative reference to
<xref target="I-D.ietf-scitt-scrapi"/>, which at the time of writing has completed IETF
process and is in the RFC Editor queue with no RFC number yet assigned. <xref target="scrapi-binding"/> imposes
requirements expressed in terms of that document's endpoints, status codes and
media types, and an implementation cannot satisfy them without it, so the
reference cannot be informative. RFC EDITOR: this document should not be
published before that draft, and the reference should be updated to the
resulting RFC number.</t>
    </section>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Sovereign authoritative registers record facts that are treated as conclusive
within their jurisdiction. Examples include beneficial-ownership registers
(such as the United States FinCEN Beneficial Ownership Secure System, the
United Kingdom People with Significant Control register, and the European
Union beneficial-ownership registers under the Anti-Money-Laundering
Directives), corporate registries, consolidated sanctions lists,
export-control registers, foreign-ownership-and-control-or-influence
registers, maritime vessel registrations, flag-state registers, aviation
registrations, land-title registries, customs declarations, and multilateral
biometric registers.</t>
      <t>Institutional decision-makers -- including export-control compliance officers,
anti-money-laundering review functions, foreign-investment screening review
functions, sanctions-screening operators, multilateral aid distribution
authorities, and platform-owned verification infrastructure -- routinely
require reliance on facts recorded across two or more sovereign registers
simultaneously.</t>
      <t>Cross-sovereign reliance today faces four structural problems, which this
protocol is designed to address in combination:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Raw-record disclosure.</strong> Existing approaches require the raw register
record either to leave its data-residency jurisdiction or to be re-disclosed
in plaintext to a relying party in another jurisdiction. Sovereign registers
under data-protection regimes are jurisdictionally constrained against such
re-disclosure.</t>
        </li>
        <li>
          <t><strong>Non-reconcilable register outputs.</strong> Each sovereign register exposes a
different schema, a different signing chain, a different verdict semantic,
and a different statutory access regime. A relying party that requires a
deterministic combined verdict over n sovereign registers therefore faces
n parallel verification problems.</t>
        </li>
        <li>
          <t><strong>Non-auditable settlement.</strong> Cross-sovereign reliance, where it occurs at
all, occurs without a settlement-layer audit trail consumable by sovereign
regulators.</t>
        </li>
        <li>
          <t><strong>Unverifiable requester identity in an agentic setting.</strong> Cross-sovereign
reliance is increasingly initiated not by an authenticated human operator
but by an autonomous software agent acting on behalf of a principal. Where
the agent's binding to a real, authenticated principal cannot be verified,
the reconciliation is performed for an unknown or impersonated party, and
the settlement record attributes reliance to no accountable principal. An
agent whose principal binding cannot be verified is treated as hostile
(zero-trust); the normative rules are in <xref target="terminology"/> and
<xref target="agent-iff-integrity"/>.</t>
        </li>
      </ol>
      <t>This document specifies ARP, a protocol that addresses all four deficiencies
in combination, and is layered atop the SCITT architecture <xref target="RFC9943"/> and the
RATS architecture <xref target="RFC9334"/>.</t>
      <t>The fourth deficiency is not hypothetical. Where an autonomous agent can act,
its containment assumptions may not hold at run time, and a binding between an
agent's claimed authority and its actual conduct that is established only after
the fact is not a control. The binding must be checkable at the moment of
action.</t>
      <t>ARP is designed for that moment. Forensic reconstruction establishes what an
agent did after a consequence has occurred; ARP reconciles an agent's claimed
authority and principal binding against authoritative registers while the
action can still be refused. A reconciliation that yields a non-decisive or
divergent verdict is a control input available before the action commits, not
an audit finding available after. This document treats real-time reconciliation
of claimed-versus-actual conduct as a first-class property of accountable
autonomous action.</t>
    </section>
    <section anchor="relationship">
      <name>Relationship to Other Work</name>
      <t>This protocol is assembled from existing work wherever existing work reaches,
and this section states what it takes, what it does not replace, and why it
exists as a separate document rather than as an extension to one of them. A
reader who concludes after this section that an existing mechanism already
covers the problem has the information needed to say so, which is the purpose of
putting it before the specification rather than after it.</t>
      <section anchor="what-this-document-builds-on">
        <name>What this document builds on</name>
        <t>The transparency model is <xref target="RFC9943"/>. A Reconciliation Output is a Signed
Statement in that architecture's sense, the Settlement-Layer Ledger is a
Transparency Service, and <xref target="composition-scitt"/> states the mapping field by
field. This document defines no registration API and expects
<xref target="I-D.ietf-scitt-scrapi"/>. Receipts are <xref target="RFC9942"/>. Where the two disagree,
<xref target="RFC9943"/> governs and this document is wrong.</t>
        <t>The evidence-appraisal vocabulary is <xref target="RFC9334"/>. <xref target="composition"/> states the
correspondence between a Reconciliation Output and an Attestation Result, and
the Reconciliation Agreement occupies the position of an Appraisal Policy. This
document does not define a second appraisal model.</t>
        <t>Logging and inclusion proofs are <xref target="RFC9162"/>. <xref target="aggregation"/>
uses the <xref target="RFC9162"/> leaf and proof structure without modification. The Merkle
constructions here are that construction; the only thing this document adds is
what goes into the leaf.</t>
        <t>Encoding is <xref target="RFC8949"/> with <xref target="RFC8785"/> where a JSON form is required, and
signatures are <xref target="RFC9052"/> and <xref target="RFC9053"/>. <xref target="encoding"/> adds determinism
requirements over those and defines no new encoding.</t>
        <t>Requester authentication over HTTP is <xref target="RFC9421"/>, and the agentic binding of
<xref target="agentic"/> composes with <xref target="I-D.ietf-webbotauth-httpsig-protocol"/> rather
than defining a parallel scheme.</t>
      </section>
      <section anchor="what-this-document-does-not-replace">
        <name>What this document does not replace</name>
        <t>It does not replace Verifiable Credentials or Decentralized Identifiers, and it
is not a credential format. A Reconciliation Output is not held by a subject,
is not presented by a subject, and carries no selective-disclosure mechanism for
a holder. Where a deployment needs a subject-held credential, that work exists
and this document is not it.</t>
        <t>It does not replace a national register's own API, signing chain or statutory
access regime, and it does not ask a register to change any of them. The whole
premise of <xref target="format-profiles"/> is that registers keep their interfaces.</t>
        <t>It does not define a trust framework, an accreditation scheme or a policy
language. What counts as an acceptable register, an acceptable operator or an
acceptable verdict is out of scope and stays with the relying party.</t>
      </section>
      <section anchor="why-it-is-a-separate-document">
        <name>Why it is a separate document</name>
        <t>The problem in <xref target="introduction"/> is a relying party requiring a deterministic
combined verdict over two or more sovereign registers that will not export their
raw records, and requiring a settlement record a sovereign regulator can audit
afterwards. Each ingredient of that exists. The combination does not.</t>
        <t><xref target="RFC9943"/> makes a statement transparent once it has been made, and is
deliberately silent on how the statement was produced or whether it reconciles
anything. <xref target="RFC9334"/> appraises evidence about one attester and does not
reconcile the outputs of several independent authorities into one verdict.
<xref target="RFC9162"/> proves an entry is in a log and says nothing about what the entry
means. None of the three is deficient in this. Reconciliation across sovereign
registers, under a declared agreement, with non-answers distinguished from
negative answers and with a coverage denominator a relying party can check, is a
layer above all of them, and adding it to any one of them would push work into
that document which its own charter does not cover.</t>
        <t>The alternative this document rejects, and names so that a reader can disagree
with the choice rather than assume it was not made, is a profile of
<xref target="RFC9943"/> carrying the reconciliation semantics in an unconstrained payload.
That is smaller and it fails at the one property the problem requires: a payload
a Transparency Service does not interpret cannot carry a verdict two independent
verifiers must reach identically. Determinism has to be specified where the
verdict is produced.</t>
      </section>
      <section anchor="where-the-design-was-taken-from-elsewhere">
        <name>Where the design was taken from elsewhere</name>
        <t>Several mechanisms here were established by other people, several of them in
review of earlier revisions of this document, and each is named at the point of
use as well as in <xref target="acknowledgments"/>. The Signing Input Digest construction of
<xref target="signature-malleability"/> follows from a reproduction posted to the SCITT
mailing list rather than from anything original here. The sweep-every-instance
method applied to that construction, and the two-axis separation of the
coverage vocabulary, are likewise attributed where they are used. A specification
that presents a borrowed design as its own invention is defective independently
of whether the design is sound, and the naming is normative practice in this
document rather than courtesy.</t>
      </section>
    </section>
    <section anchor="terminology">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>",
"<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.</t>
      <t>The following terms are defined for use throughout this document:</t>
      <dl>
        <dt>Sovereign Register:</dt>
        <dd>
          <t>An authoritative data store maintained by or on behalf of a sovereign and
treated as conclusive within that sovereign's jurisdiction for the
predicates the register is empowered to record.</t>
        </dd>
        <dt>Register Operator:</dt>
        <dd>
          <t>The entity that operates the Sovereign Register and is contractually
empowered to bind the register's attestations.</t>
        </dd>
        <dt>Bilateral Register Agreement:</dt>
        <dd>
          <t>A negotiated contractual instrument between the operator of the
reconciliation server and a Register Operator, declaring the terms under which
a register is addressable under this document. <xref target="bra"/> enumerates the items an
Agreement <bcp14>MUST</bcp14> declare, in the order that fixes them, and defines the
Agreement Hash each Agreement carries.</t>
        </dd>
        <dt>Witness Set:</dt>
        <dd>
          <t>The set of observers, declared in a Bilateral Register Agreement under
<xref target="witness-entries"/>, whose Head Consistency Statements under
<xref target="head-consistency"/> and Witness Linkage Segments under <xref target="witness-linkage"/>
constitute head-consistency evidence independent of the responding service.</t>
        </dd>
        <dt>Witness Linkage Segment:</dt>
        <dd>
          <t>A signed record, published by a witness at its own origin under
<xref target="witness-linkage"/>, of the linkage arrays it observed over a contiguous
interval of Entry Sequence Numbers. Consecutive Segments from one witness
cover a Ledger from that witness's Attestation Floor upward, and are what a
relying party assembles a chain between two heads from where <xref target="quorum-rule"/>
obliges it to hold one.</t>
        </dd>
        <dt>Witness Quorum:</dt>
        <dd>
          <t>The number of Witness Entries, as <xref target="witness-entries"/> defines them, with
pairwise distinct Operating-Party Identifiers whose head-consistency evidence
a relying party must hold before the evidence condition of <xref target="read-responses"/>
is satisfied. Declared under <xref target="bra-witness"/> and evaluated under
<xref target="quorum-rule"/>, which states what that evidence is in each of its two
branches.</t>
        </dd>
        <dt>Policy-Epoch Store:</dt>
        <dd>
          <t>The persisted, versioned record of a deployment's verification-policy state,
from which the Policy-Version Hash of <xref target="sealing"/> is reconstructible and from
which the reconciliation server resolves, per predicate and named regime set,
the Verdict Arithmetic and its parameters and the reliance interval. It holds
the Deployment Blinding Value and the Requester-Binding of each reconciliation.
It is internal to the reconciliation server; this document constrains what it
must be able to answer and not how it is built.</t>
        </dd>
        <dt>Requesting Principal:</dt>
        <dd>
          <t>The accountable party on whose behalf a reconciliation is performed. A
Requesting Principal is either an authenticated human or institutional
operator, or an autonomous agent carrying a Verified Principal Credential
that binds it to such an operator.</t>
        </dd>
        <dt>Requesting Agent:</dt>
        <dd>
          <t>An autonomous software agent that initiates a reconciliation. A Requesting
Agent is FRIENDLY when it carries a verifiable identity -- a request signed
under HTTP Message Signatures <xref target="RFC9421"/> per Web Bot Auth
<xref target="I-D.ietf-webbotauth-httpsig-protocol"/>, a genuinely verified declared bot,
or a Verified Principal Credential -- and ENEMY when its principal binding is
absent or unverifiable. Anything unverifiable is treated as ENEMY.</t>
        </dd>
        <dt>Verified Principal Credential:</dt>
        <dd>
          <t>A cryptographic credential asserting that a named, authenticated principal
stands behind a request, verifiable without contacting the credential issuer
in the reconciliation hot path. A Verified Principal Credential <bcp14>MAY</bcp14> be
carried in any COSE-enveloped structure binding the claim, its evidentiary
provenance, and the principal's credential, or in any equivalent
verifiable-credential form <xref target="W3C-VC-DM-2.0"/>.</t>
        </dd>
        <dt>Agent Friend-or-Foe (IFF) Determination:</dt>
        <dd>
          <t>The deterministic classification of a Requesting Agent as FRIENDLY or ENEMY,
computed from the presence and cryptographic validity of a verifiable agent
identity and, where required by policy, a Verified Principal Credential. The
determination is recorded in the Requester-Binding field and committed to the
Policy-Version Hash.</t>
        </dd>
        <dt>Canonical Claim:</dt>
        <dd>
          <t>A deterministic structured representation of a verification claim,
comprising at least a subject identifier, a predicate, an attested value,
an applicable-regimes set, and an evidentiary provenance manifest.
Canonicalisation is performed in the following order, which is normative
because the operations do not commute:
</t>
          <ol spacing="normal" type="1"><li>
              <t>Unicode Normalization Form C <xref target="UAX15"/> is applied to every string value
and to every object member name.</t>
            </li>
            <li>
              <t>Object member names are sorted by UTF-16 code unit, as specified in
Section 3.2.3 of <xref target="RFC8785"/>.</t>
            </li>
            <li>
              <t>Declared array order is preserved.</t>
            </li>
            <li>
              <t>Numbers are rendered as specified in Section 3.2.2.3 of <xref target="RFC8785"/>.</t>
            </li>
            <li>
              <t>A member whose value is absent is omitted, rather than serialised with a
null placeholder.</t>
            </li>
          </ol>
          <t>Steps 1 and 2 are order-dependent and observably so: for an object carrying
the member names "A" followed by COMBINING RING ABOVE (U+0041 U+030A) and
"B", normalising before sorting and sorting before normalising yield
different serialisations and therefore different Claim Hashes. This
specification requires normalisation first.</t>
          <t>The member-sort code unit is normative. An implementation that sorts by
Unicode code point rather than by UTF-16 code unit produces a different Claim
Hash for any object carrying a member name outside the Basic Multilingual
Plane. The two orderings are not interchangeable, and this specification pins
the UTF-16 reading, which is the one Section 3.2.3 of <xref target="RFC8785"/> specifies.</t>
          <t>This construction is NOT the construction defined in <xref target="composition"/> for
<tt>subject_digest</tt>. The two <bcp14>MUST NOT</bcp14> be substituted for one another; see
<xref target="construction-distinctness"/>.</t>
        </dd>
        <dt>Predicate Taxonomy:</dt>
        <dd>
          <t>A controlled hierarchical classification of predicates that may be the
subject of reconciliation, enabling taxonomic prefix match in projection.
The taxonomy includes an <tt>agent:</tt> branch whose predicates reconcile the
verifiability of an agent's binding to a principal (for example
<tt>agent:principal-binding-verifiable</tt> and <tt>agent:credential-attested</tt>).</t>
        </dd>
        <dt>Per-Register Claim Projection:</dt>
        <dd>
          <t>The narrowest structured query sufficient to elicit the required Partial
Attestation under a register's Bilateral Register Agreement, computed by
the controlled projection function as the nearest ancestor of the Canonical
Claim Predicate that is a member of the register's permitted-predicate set.
Where the taxonomy admits more than one such ancestor, the projection <bcp14>MUST</bcp14>
fail rather than choose.</t>
        </dd>
        <dt>Partial Attestation:</dt>
        <dd>
          <t>A cryptographically signed output produced by a Sovereign Register in
response to a Per-Register Claim Projection. The Partial Attestation
payload <bcp14>SHALL</bcp14> disclose, of the subject, only a Reconciliation-Verdict field,
an <bcp14>OPTIONAL</bcp14> Divergence-Axis field, the applied parameters of
<xref target="format-profiles"/> and the Query Binding, which is a digest; it <bcp14>SHALL NOT</bcp14>
disclose any register record. Fields denoting state rather than the subject --
the Freshness Timestamp, and the Source-Data Version Identifier of
<xref target="source-versioning"/> --
are enumerated in <xref target="partial-attestation"/>.</t>
        </dd>
        <dt>Applicable-Regimes Set:</dt>
        <dd>
          <t>The set of regulatory regimes a Canonical Claim names as applicable. It is a
claim field chosen by the requester and states which law the requester asserts
governs the question. It does not carry the Verdict Arithmetic, its parameters
or the reliance interval; those are resolved by the reconciliation server from
the policy-epoch store of <xref target="sealing"/>, keyed on the predicate and the named
regimes, and are committed to the Policy-Version Hash. A requester names the
regime; the deployment's policy determines how evidence under it combines and
how long a verdict may be relied upon.</t>
        </dd>
        <dt>Combined Verdict:</dt>
        <dd>
          <t>The single verdict value produced by aggregating the Reconciliation-Verdict
fields of the Per-Register Result Set of <xref target="reconciliation-output"/> under the
Verdict Arithmetic resolved under <xref target="verdict-arithmetic"/>. Its values are
match, no-match, partial-match and indeterminate. The decisive values are
match and no-match.</t>
        </dd>
        <dt>Reconciliation Hash:</dt>
        <dd>
          <t>The SHA-256 digest of <xref target="RFC6234"/> over the deterministically encoded CBOR serialisation of a
Reconciliation Output excluding its Sealing Signature and Sealing-Key
Identifier, as specified in <xref target="reconciliation-output"/>, and with every
signature made by a party other than the sealing reconciliation server
replaced by the Signing Input Digest of that signature. Those are the register
signature carried in each Query Binding Record, the register signature carried
in each Non-Answer Statement, and the authorising operator's signature carried
in the Override Record of <xref target="adversarial-test"/>. Excluding the Sealing
Signature is not sufficient on its own: a Reconciliation Output embeds
signatures made by parties other than the server, and a digest over those
names whichever encoding the reader was handed, for the reason
<xref target="signature-malleability"/> gives. The rule is stated over the class -- every
signature not made by the sealing server -- and not over an enumeration,
because an enumeration is complete only until a field is added, and the
Override Record is the field that showed this.</t>
        </dd>
        <dt>Authority Origin:</dt>
        <dd>
          <t>The serialisation of an origin as Section 6.2 of <xref target="RFC6454"/> defines it: the
scheme, the U+003A COLON and two U+002F SOLIDUS characters, the host, and,
where the port differs from the default for the scheme, a U+003A COLON and the
port in decimal with no leading zeros. The scheme and the host are lowercased.
There is no trailing solidus, no path, no query and no fragment, and no
userinfo component: <tt>https://register-a.example</tt> and
<tt>https://register-a.example:8443</tt> are Authority Origins and
<tt>https://register-a.example/</tt>, <tt>https://Register-A.example</tt>,
<tt>https://register-a.example:443</tt> and <tt>register-a.example</tt> are not.
An implementation <bcp14>MUST</bcp14> reject a value in any of those other forms rather than
normalise it, because a value that is normalised on receipt is a value two
parties can hash differently before they compare it.
</t>
          <t>This document uses Authority Origins as bytewise sort keys inside signed sets,
as path segments, and as equality targets against the origin component of a
Sealing-Key Identifier. Each of those three uses breaks on a different
divergence: a sort key reorders, a path segment resolves elsewhere, and an
equality test refuses a key that was in fact authorised. Fixing the form once,
here, is what makes those three uses one term.</t>
        </dd>
        <dt>Signing Input Digest:</dt>
        <dd>
          <t>The SHA-256 digest over the deterministically encoded CBOR <tt>Sig_structure</tt> of
a COSE_Sign1, as Section 4.4 of <xref target="RFC9052"/> constructs it: the array of the
context string <tt>"Signature1"</tt>, the protected header, the external additional
authenticated data, and the payload. It is a digest of what the signer signed
and not of the envelope carrying it, so it does not depend on the signature
bytes and does depend on the protected header, which in this document carries
the key identifier and the algorithm identifier under <xref target="cbor-cose"/>. This
document supplies no external additional authenticated data: the third element
is the zero-length byte string in every <tt>Sig_structure</tt> it defines, and an
implementation <bcp14>MUST NOT</bcp14> supply another value, because a Signing Input Digest
a third party cannot reproduce is not an identifier. The protected header is
taken as the byte string transmitted and <bcp14>MUST NOT</bcp14> be re-encoded; those bytes
are the signer's and are what the signature covers. Every digest in this
document that identifies or chains a signed artefact is a Signing Input
Digest, for the reason <xref target="signature-malleability"/> gives.</t>
        </dd>
        <dt>Divergence Axis:</dt>
        <dd>
          <t>A controlled descriptor identifying a structural qualification on a verdict.
Most identify the reason for a non-match; those recorded by the reconciliation
server may qualify a verdict of any value. The controlled set is the registry of <xref target="iana"/>, which at the time of writing
comprises identity-mismatch,
jurisdictional-scope-mismatch, temporal-mismatch,
ownership-threshold-mismatch, sanctions-list-match, register-record-absent,
claim-predicate-unsupported,
claim-projection-narrowed-beyond-attestation-scope,
agent-principal-unverifiable, agent-credential-absent,
agent-impersonation-suspected, agent-action-scope-divergence (the
authorised scope attested for an agent action and the actual conduct
attested for it do not reconcile), source-version-skew, register-threshold-divergence (two
registers answered the same predicate under different declared interest
thresholds, per <xref target="profile-bods"/>), declared-not-determined (the register
could answer only over a declared fact where the claim ranged over a
determined one, per <xref target="profile-customs"/>), and freshness-stale. Divergence
Axes recorded by the reconciliation server rather than by a register, which the
registry marks as such and which initially are freshness-stale,
source-version-skew, register-threshold-divergence, declared-not-determined and
agent-action-scope-divergence, are carried in the Reconciliation Output, not in
the register's signed Partial-Attestation payload.</t>
        </dd>
        <dt>Source-Data Version Identifier:</dt>
        <dd>
          <t>An identifier denoting the state of a published corpus, external to both the
Bilateral Register Agreement and the Policy Version, against which a register
evaluated a Projected Predicate. A consolidated sanctions list is the
characteristic case. Its purpose is attribution: without it, a change in a
historical Combined Verdict cannot be attributed to a change in policy state
rather than to a change in the underlying corpus. Requirements are in
<xref target="source-versioning"/>.</t>
        </dd>
        <dt>Post-Seal Evaluation Qualifier:</dt>
        <dd>
          <t>A controlled descriptor identifying a condition arising after a Reconciliation
Output has been sealed, carried in a Post-Seal Evaluation Record per
<xref target="post-seal"/> rather than in the Output. The values are those of the registry in
<xref target="iana"/>, at the time of writing notarisation-incomplete and
attribution-indeterminate. A Post-Seal Evaluation
Qualifier is not a Divergence Axis: a Divergence Axis qualifies a verdict, and
a Post-Seal Evaluation Qualifier qualifies an operation on an Output whose
verdict is already fixed.</t>
        </dd>
        <dt>Threshold-Sensitive Predicate:</dt>
        <dd>
          <t>A Predicate whose truth depends on an interest threshold, so that two
registers evaluating it under different declared thresholds are not answering
the same question. A profile registered under <xref target="format-profiles"/> <bcp14>MUST</bcp14> state
which of its predicates are threshold-sensitive.</t>
        </dd>
        <dt>Source Class:</dt>
        <dd>
          <t>A partition of the Addressed-Registers Identifier Set resolved for the named
regimes under <xref target="verdict-arithmetic"/>, over which source-class-quorum is
evaluated.</t>
        </dd>
        <dt>Sovereign Re-Notification:</dt>
        <dd>
          <t>A signed notification emitted through the Regulator Portal to each regulator
whose
statutory scope covers a reconciliation whose historical Combined Verdict has
materially changed. The supersession that occasions it is separately recorded
as a <tt>continuation-supersession</tt> entry on the Settlement-Layer Ledger under
<xref target="settlement-ledger"/>, so that a relying party that acted on the superseded
Output can discover the change.</t>
        </dd>
        <dt>Reconciliation Nonce:</dt>
        <dd>
          <t>A value of at least 128 bits drawn from a cryptographically secure random
source, unique to one Per-Register Claim Projection and therefore to one
register within one reconciliation. It is never reused. Two registers
addressed in the same reconciliation receive different nonces, so their Query
Bindings differ even where the Projected Predicate and Subject Reference are
identical, and an attestation elicited from one register cannot be presented
as an answer from another.</t>
        </dd>
        <dt>Source-Version Skew:</dt>
        <dd>
          <t>The condition, recorded as source-version-skew, in which two Partial
Attestations answer the same Projected Predicate against different states of
the same published corpus. Both are within their freshness windows; the skew
is in the corpus, not in the attestations. It is not a disagreement, and an
implementation <bcp14>MUST NOT</bcp14> treat it as one.</t>
        </dd>
        <dt>Attribution Indeterminate:</dt>
        <dd>
          <t>The Post-Seal Evaluation Qualifier, recorded as attribution-indeterminate, in
which a Retroactive Evaluation cannot determine whether a material change in a
historical Combined Verdict arose from a change in policy state or from a
change in Source-Data Version. It is a statement about the evaluation, not
about any register's answer.</t>
        </dd>
        <dt>Reconciliation Output:</dt>
        <dd>
          <t>A data structure aggregating Partial Attestations from a single
reconciliation event, sealed against a Policy-Version Hash.</t>
        </dd>
        <dt>Verdict Arithmetic:</dt>
        <dd>
          <t>The operator governing how per-register verdicts combine into the Combined
Verdict, specified in <xref target="verdict-arithmetic"/>. The controlled set comprises
conjunction, disjunction, threshold-count and source-class-quorum.</t>
        </dd>
        <dt>Hash-Linkage Aggregation:</dt>
        <dd>
          <t>An aggregation of Partial Attestations in which the per-register
attestations are reduced to their Signing Input Digests, ordered, committed to a
 Merkle tree,
and emitted with a Merkle root and a per-register verdict band. The Merkle
commitment and its inclusion proofs <bcp14>MAY</bcp14> be encoded as COSE Receipts
<xref target="RFC9942"/>.</t>
        </dd>
        <dt>Policy-Version Hash:</dt>
        <dd>
          <t>A cryptographic commitment to the canonical verification-policy state in
force at the moment of reconciliation, including reconciliation rules,
threshold parameters, pattern-library version, applicable-regimes
precedence, verdict-arithmetic selection with every parameter it takes, the
reliance interval, the Agent-IFF policy in force, the Requester-Binding, and
the Bilateral-Register-Agreement Hashes of the addressed registers.</t>
        </dd>
        <dt>Settlement-Layer Ledger:</dt>
        <dd>
          <t>An append-only cross-jurisdictional log retaining hashes of reconciliations
and no Canonical-Claim, register-record or principal content. It carries
entries of two kinds, discriminated by an entry type: a reconciliation entry,
which records a sealed Reconciliation Output, and a Continuation entry, which
records a notarisation outcome, a Post-Seal Evaluation Record or a supersession
arising after that Output was sealed. Every entry carries a sequence number,
the entry type, the claim hash, the reconciliation hash, an entry timestamp, a
prior-entry hash, a self-entry hash and an entry signature; the fields each
kind carries in addition are enumerated in <xref target="settlement-ledger"/>. A
Continuation entry may also carry a transparency-service identifier, an entry
identifier, an HTTP status code, a post-seal evaluation record hash, a
material-change indicator, a superseding reconciliation hash and a superseding
entry sequence number. Not every field is a digest -- the sequence
numbers, the timestamps, the entry type, the descriptors and the indicators are
not -- but no field carries Canonical-Claim, register-record or principal
content, and no field is a retrieval address.</t>
        </dd>
        <dt>Audience Set:</dt>
        <dd>
          <t>The set of Audience Members of a Reconciliation Output, sealed with it under
<xref target="entitlement"/>. Each Audience Member is an accountable-principal identifier
together with a verification method that can be presented after the
reconciliation. The Requesting Principal is a member wherever it can be
identified. Entitlement to
read about a reconciliation follows membership, not possession of the artefact.</t>
        </dd>
        <dt>Reliance Horizon:</dt>
        <dd>
          <t>The time after which an Audience Member <bcp14>MUST NOT</bcp14> treat a Combined Verdict as
current without reading the Continuation entries for its Reconciliation Hash.
It is the Reconciliation Timestamp advanced by the reliance interval that
deployment policy declares for the predicate and the named regimes, resolved as
<xref target="verdict-arithmetic"/> resolves the Verdict Arithmetic. It bounds reliance and
does not affect the validity of the Sealing Signature.</t>
        </dd>
        <dt>Ledger Head Statement:</dt>
        <dd>
          <t>A signed statement of the current head of the Settlement-Layer Ledger,
published at a well-known URI and notarised at a declared interval, comprising
the head's Entry Sequence Number, its Self-Entry Hash, its Entry Timestamp, the
time the Statement was produced, and a pointer to the most recent completed
head notarisation. Defined in <xref target="settlement-ledger"/>.</t>
        </dd>
        <dt>Evaluation Sweep Statement:</dt>
        <dd>
          <t>A signed record that a retroactive evaluation was performed, comprising the
trigger, the policy state applied, the ledger head at the start and end of the
sweep, the counts examined and materially changed, a Merkle root over the Claim
Hashes examined, a timestamp, a pointer to the
notarisation of the previous Statement. Defined in <xref target="sweep-statements"/>. Its purpose is to make
an evaluation that never ran a signed omission rather than a silence.</t>
        </dd>
        <dt>Non-Answer Statement:</dt>
        <dd>
          <t>A statement signed by a register recording that it declined to answer, over the
Reconciliation Identifier, the Projected Predicate, the Subject Reference, the
Reconciliation Nonce and the reason. Required wherever a Non-Answer Reason is
register-attested, per <xref target="no-answer"/>.</t>
        </dd>
      </dl>
    </section>
    <section anchor="architecture">
      <name>Architecture</name>
      <t>ARP comprises seventeen subsystems arranged as a deterministic pipeline:</t>
      <ol spacing="normal" type="1"><li>
          <t>Canonical Claim Ingestion</t>
        </li>
        <li>
          <t>Requester Identity Binding and Agent Friend-or-Foe Gate</t>
        </li>
        <li>
          <t>Adversarial Pre-Transmission Test</t>
        </li>
        <li>
          <t>Per-Register Projection Function, under the profile of <xref target="format-profiles"/>
declared in the Bilateral Register Agreement</t>
        </li>
        <li>
          <t>Per-Register Encryption</t>
        </li>
        <li>
          <t>Partial-Attestation Reception, including Source-Data Version Binding</t>
        </li>
        <li>
          <t>Non-Answer Resolution</t>
        </li>
        <li>
          <t>Verdict Re-Typing</t>
        </li>
        <li>
          <t>Aggregation under the Verdict Arithmetic, per <xref target="aggregation"/></t>
        </li>
        <li>
          <t>Policy-Version-Hash Sealing</t>
        </li>
        <li>
          <t>Settlement-Layer Ledger Write</t>
        </li>
        <li>
          <t>Notarisation under <xref target="scrapi-binding"/>, where performed</t>
        </li>
        <li>
          <t>Regulator Portal</t>
        </li>
        <li>
          <t>Retroactive Evaluation</t>
        </li>
        <li>
          <t>Output Delivery under <xref target="delivery"/></t>
        </li>
        <li>
          <t>Post-Seal Evaluation Recording</t>
        </li>
        <li>
          <t>Cryptographic-Primitive-Upgrade Path</t>
        </li>
      </ol>
      <t>Given an identical Canonical Claim, an identical Requester-Binding, an identical
Audience Set, an identical Addressed-Registers Identifier Set, identical
Bilateral-Register-Agreement Hashes for the addressed registers, an identical
Pattern-Library Version Identifier, and an identical Policy-Version
Identifier, the system <bcp14>MUST</bcp14> produce Reconciliation Outputs identical in every
field save those enumerated below as outside this requirement, and identical
Claim Hash and Policy-Version Hash values in the corresponding Settlement-Layer
Ledger entries.</t>
      <t>The Reconciliation Hash is deliberately not among those values. It is a content
commitment over one sealed Output, taken over a preimage that includes that
Output's Reconciliation Timestamp, and it is not reproducible across runs; the
Reconciliation Identifier of <xref target="reconciliation-output"/> is the reproducible index,
and it is the Claim Hash and Policy-Version Hash that make it so. Requiring an
identical Reconciliation Hash would require an identical timestamp, which no
implementation can deliver.</t>
      <t>The per-event fields of a Ledger entry -- Entry Sequence Number, Entry Timestamp,
Prior-Entry Hash, Self-Entry Hash and Entry Signature -- are position-dependent
by construction and are outside this requirement; the Entry Signature is
further outside it because a signature scheme is not required to be
deterministic. Within the Reconciliation Output itself the Reconciliation
Timestamp, the Reliance Horizon computed from it, the Sealing Signature and any
Override Record are outside it: the
first is per-event, the second need not be deterministic, and an Override Record
records an operator's discretionary act rather than a function of the enumerated
inputs. The register-produced signatures the Output carries -- the Partial
Attestation inside each Query Binding Record, and each Non-Answer Statement --
are outside it on the same ground as the Sealing Signature: they are signatures,
and a signature scheme need not be deterministic. So is the Sealing-Key
Identifier, which is rotation state and not an enumerated input. So are the
Reconciliation Event Identifier, the Reconciliation Identifier that carries it,
and every Reconciliation Nonce carried in a Query Binding Record or a Non-Answer
Statement, together with the register signatures taken over them: each is drawn
fresh per reconciliation and is uniqueness state rather than an enumerated
input. Two reconciliations agreeing on every enumerated input <bcp14>MUST</bcp14> differ in all
three, and an implementation <bcp14>MUST NOT</bcp14> read that difference as a determinism
failure. Stating it matters because the requirement above is expressed as
identity in every field save those carved out here, so a field that is
necessarily fresh and not carved out makes the requirement unsatisfiable by any
implementation. So are <tt>attestation-stale</tt> and <tt>register-unresponsive</tt>, and the
Divergence-Axis and verdict consequences that follow from either: both are
functions of wall-clock timing and network conditions rather than of the
enumerated inputs, which is the same ground on which the Freshness Timestamps
themselves are outside it. A reconciliation driven to a <tt>query-budget-exhausted</tt>
or <tt>subject-ceiling-exhausted</tt> Non-Answer Reason
under <xref target="no-answer"/> is also outside it, because the budget is accumulated state
and not an enumerated input. The residual risk that carve-out creates, and why
this document does not close it, is set out in <xref target="budget-suppression"/>. The Freshness Timestamps of the constituent
Partial Attestations, and any Source-Data Version Identifiers they carry per
<xref target="source-versioning"/>, are likewise outside it: both denote state external to
the enumerated inputs. Two reconciliations agreeing on every enumerated input
but differing in Source-Data Version are not required to agree field for field, and
an implementation <bcp14>MUST NOT</bcp14> treat such a difference as a determinism failure.</t>
      <section anchor="ingestion">
        <name>Canonical Claim Ingestion</name>
        <t>A Canonical Claim comprises:</t>
        <ul spacing="normal">
          <li>
            <t>Subject Identifier</t>
          </li>
          <li>
            <t>Predicate (drawn from the controlled Predicate Taxonomy)</t>
          </li>
          <li>
            <t>Attested Value (in the canonical type for the Predicate)</t>
          </li>
          <li>
            <t>Applicable-Regimes Set</t>
          </li>
          <li>
            <t>Evidentiary Provenance Manifest</t>
          </li>
          <li>
            <t>Claim Timestamp (<xref target="RFC3339"/> UTC)</t>
          </li>
          <li>
            <t>Claim Hash: the SHA-256 digest over the deterministically encoded CBOR array
<tt>["arp-claim-v1", Deployment Blinding Value, canonical serialisation]</tt>, where
the canonical serialisation is the <xref target="RFC8785"/> form of the preceding fields as
<xref target="terminology"/> constructs it, carried as a CBOR byte string. Framing the
blinding value as an array element rather than concatenating it is what stops
two deployments differing on order, separator or length prefix while claiming
the same construction identifier</t>
          </li>
        </ul>
        <t>The reconciliation server <bcp14>MUST</bcp14> verify, before computing the Claim Hash, that
the octets it received under <xref target="request-binding"/> are the canonicalisation of the
claim they carry. It <bcp14>MUST</bcp14> parse them, re-serialise the parsed fields as this
section constructs them, and refuse a request whose received octets differ from
that re-serialisation, or whose member set is not exactly the fields enumerated
above, returning the <tt>422</tt> of <xref target="request-binding"/> with a Remediation Advisory
naming the difference.</t>
        <t><xref target="request-binding"/> has the requester supply the <xref target="RFC8785"/> serialisation as a
byte string and has the server hash the octets it received, for a reason that is
correct: re-serialising a natively encoded claim would let two servers receiving
identical bytes compute different Claim Hashes. The consequence not drawn was
that the preimage of the Settlement-Layer Ledger index is then chosen by the
requester. A claim submitted in NFD and the same claim in NFC have identical
canonical field values and produce two Claim Hashes, two ledger indices and two
retroactive-evaluation keys, and a sweep selecting on one misses the other. The
check above keeps the requester's octets as the preimage and makes them
canonical, which is what the rest of this section already assumes of them. The
same argument appears at <xref target="terminology"/> for the Authority Origin -- a value
normalised on receipt is a value two parties hash differently before they
compare it -- and it was applied there and not here.</t>
        <t>Two claims whose canonical field values are identical <bcp14>MUST</bcp14> produce the same
canonical form, and the same Claim Hash within one deployment. Across
deployments the Claim Hash differs by the Deployment Blinding Value while the
canonical form does not. Declared array order is significant;
claims differing only in declared array order are distinct claims. The Claim Hash is the index on the
Settlement-Layer Ledger and the key for retroactive re-evaluation.</t>
        <t>The Evidentiary Provenance Manifest is a JSON object, and this document does not
otherwise constrain its members. It <strong><bcp14>MUST NOT</bcp14> carry a signature, a COSE_Sign1,
or any other signed artefact, in any member at any depth</strong>, and a reconciliation
server <bcp14>MUST</bcp14> refuse a claim whose Manifest carries one, returning the <tt>422</tt> of
<xref target="request-binding"/>.</t>
        <t>Where the evidentiary provenance is itself a signed artefact -- a COSE-enveloped
evidence structure, or a Verified Principal Credential -- the Manifest carries
the Signing Input Digest of that artefact, rendered as a lowercase hexadecimal
text string, and the artefact travels outside the Canonical Claim.</t>
        <t>The Manifest is a field of the Canonical Claim and therefore inside the Claim
Hash preimage, so a signature within it is a signature inside a digest preimage,
re-encodable in transit by a party holding no key, for the reason
<xref target="signature-malleability"/> gives. A claim carrying one indexes the
Settlement-Layer Ledger under a value that moves while the claim does not, and
no party outside the deployment can detect it, because the Claim Hash is blinded
and cannot be recomputed outside the deployment at all.</t>
        <t>This is the seventh carrier and the only one the class rule of
<xref target="signature-malleability"/> could not have reached. That rule directs a party
computing a digest to substitute a Signing Input Digest for any signature made
by another party, and it is inoperable here for two reasons: the preimage is
<xref target="RFC8785"/> JSON, which has no byte-string type for the substituted value, and
<xref target="request-binding"/> has the server hash the requester's octets, so a server-side
substitution would produce a Claim Hash over bytes the requester never signed.
Where a construction cannot be repaired by the general rule, the content has to
be excluded rather than the rule extended, which is what the prohibition above
does. An earlier revision instead said the container form "does not alter the
Claim Hash", which is true of the container and false of what the container
holds.</t>
      </section>
      <section anchor="requester-identity-binding-and-agent-friend-or-foe-gate">
        <name>Requester Identity Binding and Agent Friend-or-Foe Gate</name>
        <t>Before the Adversarial Pre-Transmission Test, the reconciliation server <bcp14>MUST</bcp14>
establish the identity of the Requesting Principal and record it in a
Requester-Binding field. The Requester-Binding comprises a requester-binding
class, the identifier of the accountable principal where known, and a reference
to the verification method used. The class is one of:</t>
        <ul spacing="normal">
          <li>
            <t><tt>human-operator</tt>, where an authenticated human or institutional operator is
the accountable principal.</t>
          </li>
          <li>
            <t><tt>agent-verified</tt>, where an agent's signing key verified AND the principal it
asserts was corroborated by a reconciliation under <xref target="agentic"/> or by a Verified
Principal Credential whose status was checked.</t>
          </li>
          <li>
            <t><tt>agent-key-verified</tt>, where an agent's signing key verified but the principal
it asserts was not corroborated.</t>
          </li>
          <li>
            <t><tt>agent-unverified</tt>, where the request was signed under a bare key that resolves
to no signature-agent card, carries no Verified Principal Credential, and
asserts no principal. The key gives continuity of identity between requests and
nothing else, which is why it is a class and not a refusal; a request that
carries no verifying signature at all is not admitted, by <xref target="read-signing"/>.</t>
          </li>
        </ul>
        <t><tt>agent-key-verified</tt> exists because possession of a key and binding to a
principal are different facts and earlier revisions recorded them as one. An
agent that signs correctly under a Web Bot Auth key has demonstrated that it is
the same agent as last time; it has not demonstrated that any accountable party
stands behind it. Recording that state as <tt>agent-verified</tt> overclaims to every
downstream reader, and recording it as <tt>agent-unverified</tt> discards a real and
useful fact. A relying party that requires an attributable principal should treat
<tt>agent-key-verified</tt> as it treats <tt>agent-unverified</tt>; one that requires only
continuity of identity may treat it as it treats <tt>agent-verified</tt>. This document
states no requirement on a relying party's own risk policy; what it requires is
that the two states be recorded distinctly so that the policy can be applied. The Agent-IFF
policy states which reconciliations may be decisive at each class.</t>
        <t>Where the requester is an autonomous agent, the server <bcp14>MUST</bcp14> perform an Agent
Friend-or-Foe (IFF) Determination. An agent is classified FRIENDLY only where
at least one verifiable identity is present and cryptographically valid: a
request signed under HTTP Message Signatures <xref target="RFC9421"/> with a key resolvable
through a Web Bot Auth signature-agent card
<xref target="I-D.meunier-webbotauth-registry"/>, advertised via the Signature-Agent header
<xref target="I-D.ietf-webbotauth-httpsig-protocol"/>, which also defines the key
directory it names, a genuinely verified declared
bot, or a Verified Principal Credential. An agent presenting no such identity,
or an identity that fails verification, <bcp14>MUST</bcp14> be classified ENEMY.</t>
        <t>The Agent-IFF policy in force declares, per predicate class, whether an ENEMY
requester is refused outright, permitted only for non-decisive advisory
reconciliation, or permitted with the requester-binding class recorded as
<tt>agent-unverified</tt>, and whether an agent whose key verified but whose principal
was not corroborated -- class <tt>agent-key-verified</tt> -- may reach a decisive
verdict. The server <bcp14>MUST NOT</bcp14> silently upgrade an ENEMY requester to
FRIENDLY. The Requester-Binding and the Agent-IFF policy identifier are
committed to the Policy-Version Hash so that the settlement record is
attributable to a determined requester class.</t>
      </section>
      <section anchor="adversarial-test">
        <name>Adversarial Pre-Transmission Test</name>
        <t>Before any Per-Register Claim Projection is produced, the Adversarial
Pre-Transmission Test Subsystem applies the current Pattern Library to the
Canonical Claim. The Pattern Library enumerates structural evasion patterns
against the projection and aggregation mechanisms of this protocol, including
projection-narrowing-evasion,
predicate-substitution-evasion, attested-value-bracketing-evasion,
addressed-register-cherry-picking, agreement-staleness-injection,
pattern-library-version-pinning, and agent-principal-spoofing (an unverifiable
agent asserting a principal binding it does not hold).</t>
        <t>The Subsystem emits either a Pass result or a Remediation Advisory. A Remediation
Advisory comprises:</t>
        <ul spacing="normal">
          <li>
            <t>a Refusal Ground, one of <tt>pattern-matched</tt>, <tt>regime-not-admitted</tt>,
<tt>audience-member-not-enrolled</tt> or <tt>agent-iff-refused</tt></t>
          </li>
          <li>
            <t>the identifiers of the Pattern Library patterns that matched, and the narrowing
or substitution each concerns, present exactly where the Ground is
<tt>pattern-matched</tt></t>
          </li>
          <li>
            <t>the regime, the Audience Member Identifier or the Agent-IFF ground the other
three Grounds concern respectively, present under the corresponding Ground</t>
          </li>
        </ul>
        <t>It is encoded as a CBOR array in that field order under the media type registered
in <xref target="iana"/>, absent fields as CBOR null, and is returned to the requester as
<xref target="request-binding"/> provides. No projection is transmitted and no Reconciliation
Output is produced. The Advisory is the only artefact a refused requester
receives, so it carries the ground rather than leaving the requester to infer
it.</t>
        <t>Where the Ground is <tt>pattern-matched</tt>, the second field <bcp14>MUST</bcp14> be encoded as CBOR
null in the Advisory returned to the requester, the array's field order being
unchanged, and the matched identifiers and the narrowing or substitution each
concerns <bcp14>MUST</bcp14> be retained by the server and disclosed only to a regulator under
<xref target="regulator-portal"/> and to an Audit Identity under <xref target="audit-path"/>.</t>
        <t>A requester that can vary a claim and read back which pattern matched
enumerates, one refusal at a time, the corpus <xref target="per-register-encryption"/>
declines to disclose even to a register. The query budget does not bound the
probe, being keyed per principal per subject, so an evader varying subjects
probes without limit. An Advisory that names the pattern is a more efficient
route into the Pattern Library than the Library's confidentiality is a defence
of it, and the party it was handed to is the one party the Test exists to
defend against.</t>
        <t>The Per-Register Encryption Subsystem <bcp14>MUST</bcp14> architecturally withhold external
transmission until a Pass result has been emitted or until an authorised
operator has explicitly overridden the outcome. An override <bcp14>MUST</bcp14> be recorded in
the Reconciliation Output as an Override Record and is thereby covered by the
Sealing Signature. An override that left no artefact would be indistinguishable
from a Pass to every external party, which would make the only manual bypass of
the protocol's own adversarial gate invisible to the regulators that gate exists
to serve.</t>
        <t>An Override Record comprises:</t>
        <ul spacing="normal">
          <li>
            <t>the identifiers of the Pattern Library patterns that matched</t>
          </li>
          <li>
            <t>the Pattern-Library Version Identifier under which they matched</t>
          </li>
          <li>
            <t>the Override Ground, drawn from the registry of <xref target="iana"/></t>
          </li>
          <li>
            <t>the identifier of the authorising operator</t>
          </li>
          <li>
            <t>an Override Timestamp (<xref target="RFC3339"/> UTC)</t>
          </li>
          <li>
            <t>a signature by the authorising operator, a COSE_Sign1 whose payload is the CBOR
array of the fields above in the order listed with the signature position
encoded as CBOR null, encoded under Section 4.2.1 of <xref target="RFC8949"/>, and carrying
as its key identifier the JWK thumbprint, computed as in <xref target="RFC7638"/>, of a key published
in the reconciliation server's Operator Key Set at
<tt>/.well-known/arp-operator-keys</tt> on its Authority Origin. That key set is
published and validated as the sealing key set of <xref target="sealing-key-discovery"/> is,
save that the Authorised-Origin Document <bcp14>MUST</bcp14> name a key identifier for the
operator key set distinct from the one anchoring the sealing key set. Sealing
keys and operator keys are separate sets because they are held by different
parties for different purposes: a server able to sign an override with its
sealing key could manufacture an operator's authorisation, and a server holding
the only key that anchors its own operator key set could do the same one level
up</t>
          </li>
        </ul>
        <t>The signature is by the operator and not by the server. A record the server
signs attests only that the server says an operator authorised the bypass; a
record the operator signs is a statement the operator made and cannot later
disown, which is what a manual override of an adversarial gate has to be for the
regulator reading it. The Override Ground is drawn from a registry so that
grounds are enumerable and comparable across deployments rather than free text
that no reviewer can aggregate.</t>
        <t>The reconciliation entry that records an overridden reconciliation carries an
Override Indicator, so that a regulator reading the Ledger under
<xref target="regulator-portal"/> can see that a bypass occurred without holding the Output.
Having seen it, the regulator reads the Output itself under <xref target="audit-path"/> or
through the entitlement its statutory scope gives it, and reads the Record. An
Override Record visible only to the Audience Set the operator chose to serve
would be invisible to the party the mechanism exists for, which is the failure
this paragraph and the Indicator together close.</t>
        <t>The Record names an operator in the clear, in an artefact whose Policy-Version
Hash is blinded under <xref target="sealing"/> precisely to keep principal identities out of
reach. That is not a contradiction: blinding protects the Ledger, which is
published, and the Reconciliation Output is confidential to its Audience Set
under <xref target="entitlement"/>. An override is a discretionary act by a named human
against a named pattern, and the parties entitled to the Output are the parties
entitled to know who performed it. Nothing about the override reaches the Ledger
except through the Reconciliation Hash, which is a digest.</t>
      </section>
      <section anchor="projection">
        <name>Per-Register Projection Function</name>
        <t>For each addressed register, the controlled projection function <bcp14>MUST</bcp14> inspect
the Canonical Claim against the permitted-predicate set declared in the
Bilateral Register Agreement. Where the Canonical Claim's Predicate is
directly a member of the permitted-predicate set, the Projected Predicate
equals the Canonical Claim Predicate.</t>
        <t>Where it is not, the projection function resolves the Predicate through
taxonomic prefix match: walking the Predicate Taxonomy upward from the
Canonical Claim Predicate until reaching a Predicate that is a member of the
permitted-predicate set. Where the walk reaches more than one such Predicate at
the same taxonomic distance, the projection <bcp14>MUST</bcp14> fail with
<tt>projection-ambiguous</tt> rather than choose between them. Where the walk reaches
the taxonomy root without finding one, the projection <bcp14>MUST</bcp14> fail with
<tt>projection-unsupported</tt>. The narrowing operation <bcp14>MUST</bcp14> be recorded in the
Narrowed-From field of the Per-Register Claim Projection.</t>
        <t>The Predicate Taxonomy over which that walk is performed is the union of the
branches the Register Data-Format Profiles of <xref target="format-profiles"/> define, each
branch's parent relation being the one its profile declares and each branch's
root being the predicate that profile names as such. Taxonomic distance is
defined only between predicates within one branch. A predicate belonging to no
declared branch has no parent, and a walk that would leave the branch it began
in <bcp14>MUST</bcp14> fail with <tt>projection-unsupported</tt>. The <tt>agent:</tt> branch of <xref target="agentic"/>
is governed by no profile and is therefore flat: its predicates have no parent
and a walk beginning at one <bcp14>MUST</bcp14> fail on the same reason.</t>
        <t>There is no registry of predicates and this document does not create one. The
taxonomy is a deployment artefact assembled from declared profiles, which is
what makes it checkable by the register: the permitted-predicate set is item 1
of <xref target="bra-items"/> and is therefore inside the Agreement Hash, so the second party
to a projection can test the walk against terms it negotiated. Earlier revisions
named the taxonomy and left the reader to infer where its edges came from.</t>
        <t>A Per-Register Claim Projection comprises:</t>
        <ul spacing="normal">
          <li>
            <t>Reconciliation Identifier</t>
          </li>
          <li>
            <t>Register Identifier</t>
          </li>
          <li>
            <t>Projected Predicate</t>
          </li>
          <li>
            <t>Subject Reference, in the form the addressed register's Bilateral Register
Agreement declares</t>
          </li>
          <li>
            <t>Attested Value, where the Projected Predicate takes one</t>
          </li>
          <li>
            <t>Narrowed-From, absent where the Projected Predicate equals the Canonical
Claim Predicate</t>
          </li>
          <li>
            <t>Bilateral-Register-Agreement Hash</t>
          </li>
          <li>
            <t>Policy-Version Hash</t>
          </li>
          <li>
            <t>Freshness Window, as declared in the Bilateral Register Agreement</t>
          </li>
          <li>
            <t>Reconciliation Nonce</t>
          </li>
          <li>
            <t>Profile Parameter Set, being the values the Bilateral Register Agreement
declared under <xref target="format-profiles"/> that the register is to apply</t>
          </li>
          <li>
            <t><bcp14>OPTIONAL</bcp14> Requester-Binding Class, present exactly where the Bilateral Register
Agreement requires it under <xref target="containment"/>, disclosing the class and not the
principal</t>
          </li>
        </ul>
        <t>A Per-Register Claim Projection is encoded as a CBOR array in the field order
above, an absent <bcp14>OPTIONAL</bcp14> or conditionally absent field encoded as CBOR null so
that position is preserved. This is the only structure a sovereign register receives, and it is enumerated
here so that its contents are determinate and its digest constructions
reproducible.</t>
        <t>The wire binding over which it is transmitted is not specified by this document.
This document specifies what the channel must achieve -- the structure it
carries, the confidentiality and authenticated-additional-data properties of
<xref target="per-register-encryption"/>, and the Query Binding the register signs over -- and
leaves the transport, the endpoint, the framing and the concrete encryption
construction to be declared in each Bilateral Register Agreement.</t>
        <t>That is a deliberate scoping decision and it is a real limitation, stated here
rather than left to be discovered: two reconciliation servers addressing the same
register do so over channels the register defined, so ARP is interoperable in its
artefacts and not yet in that leg's transport. Specifying it -- an endpoint, a
media type, and a COSE_Encrypt construction pinning the AEAD and the ordering of
its authenticated additional data -- is the principal item of work this revision
leaves for the next. The
register does not receive the Canonical Claim, the Addressed-Registers
Identifier Set, or any other register's projection.</t>
        <t>The register echoes the Policy-Version Hash in its Partial Attestation; it does
not compute it, and it is not required to be able to. The reconciliation server
<bcp14>MUST</bcp14> send the same Policy-Version Hash to every addressed register in one
reconciliation, and <bcp14>MUST</bcp14> verify on reception that each Partial Attestation
echoes it. A mismatch <bcp14>MUST</bcp14> be treated as a refusal by that register and recorded
under <xref target="no-answer"/>. Without this the per-register signatures over the
Policy-Version Hash -- the only independent corroboration of it -- would be
discarded at aggregation, and a server could address different registers under
different policy versions undetectably.</t>
        <section anchor="subject-mapping">
          <name>Subject Mapping Record</name>
          <t>The projection function transforms the Canonical Claim's Subject Identifier into
a Subject Reference in the form the addressed register's Bilateral Register
Agreement declares. Until this revision nothing recorded that transformation,
nothing constrained it, and no party outside the reconciliation server could
check it.</t>
          <t>That is the gravest thing a reader can fail to notice about an Output. Every
signature in a Reconciliation Output can verify, every Query Binding can
recompute, the Merkle Root can be correct, the ledger entry can chain and the
notarised Signed Statement can pass every check in <xref target="registration"/>, while every
addressed register answered honestly and completely <strong>about a different
person</strong>. The registers answer about the Subject Reference they were sent. The
Output is read as an answer about the Subject Identifier in the claim. Nothing
joined the two, and a substitution at that step is invisible to the requester,
to an Audience Member, to a regulator reading the portal, to an Audit Identity,
and to the registers themselves, none of which is shown the Canonical Claim.</t>
          <t>Each Per-Register Result Set entry for which a projection was transmitted <bcp14>MUST</bcp14>
therefore carry a <strong>Subject Mapping Record</strong>: the two-element CBOR array of the
Subject Reference transmitted to that register, and the <strong>Subject Mapping
Descriptor</strong> -- a text string, drawn from the registry of <xref target="iana"/>, naming the
transformation applied. The initial registrations are <tt>identity</tt>, where the
Subject Reference is the Subject Identifier unchanged; <tt>profile-declared</tt>, where
the transformation is the one the register's declared Data-Format Profile
specifies for the Subject Identifier's form; and <tt>agreement-declared</tt>, where the
Bilateral Register Agreement declares the transformation as one of its terms.
A registration <bcp14>MUST</bcp14> specify a transformation that is a function of the Subject
Identifier and of declared terms alone, so that a party holding the Canonical
Claim and the applicable Agreement can recompute the Subject Reference and
compare it. The designated expert <bcp14>MUST</bcp14> refuse a registration whose
transformation takes any input the server chooses at reconciliation time, since
such a descriptor would name the discretion rather than remove it.</t>
          <t>A verifier holding the Canonical Claim <bcp14>MUST</bcp14> recompute the Subject Reference
under the named descriptor and <bcp14>MUST</bcp14> reject the Output where the recomputed value
differs from the one carried. A verifier not holding the Canonical Claim cannot
perform that check, and this document does not claim otherwise: what the record
gives that party is an attributable statement, signed and sealed and ledgered,
of which subject each register was actually asked about. The substitution
remains possible and stops being deniable, which is the same trade
<xref target="no-answer"/> makes for a suppressed register answer.</t>
          <t>This does not close the case where the Subject Identifier in the claim was
already the wrong person. Nothing in a reconciliation protocol can, and
<xref target="subject-digest-scope"/> states the boundary.</t>
        </section>
      </section>
      <section anchor="format-profiles">
        <name>Register Data-Format Profiles</name>
        <t>A Bilateral Register Agreement <bcp14>MUST</bcp14> declare the data format in which the
addressed register expresses the facts the permitted-predicate set ranges over.
The projection function of <xref target="projection"/> operates on predicates, not on
records; a format profile is what lets an implementer determine which predicates
a given register can actually answer, and what a narrowing means against that
register's own structure.</t>
        <t>A profile is a property of a data format, not of a register. It states, for the
format it covers, how a permitted predicate is expressed and what the Predicate
Taxonomy's parent relation corresponds to in that format. Parameters that vary
between registers using the same format -- interest thresholds, maximum chain
depths, the set of named lists and the identifiers a register uses for their
states -- are not properties of the profile and <bcp14>MUST</bcp14> be declared in the
Bilateral Register Agreement. A profile <bcp14>MUST</bcp14> enumerate the parameters a Bilateral Register Agreement declaring
it is required to supply, and <bcp14>MUST</bcp14> state which of its predicates are
threshold-sensitive per <xref target="terminology"/>, on which the third re-typing ground of
<xref target="verdict-retyping"/> turns.</t>
        <t>Without that split a single registered identifier would carry facts that differ
between registers, and two registers using the same format under different
thresholds could not both declare it. A profile <bcp14>MUST NOT</bcp14> introduce a means of transporting register records; profiles
constrain predicate expression only.</t>
        <t>The vocabulary documents a profile names are informative to this document and
normative to an implementation of that profile: an implementation cannot
evaluate a projection expressed in a vocabulary without it. A profile <bcp14>MUST</bcp14> pin
the dated version of each vocabulary it names.</t>
        <t>This document defines four profiles, with the identifiers registered in
<xref target="iana"/>:</t>
        <ul spacing="normal">
          <li>
            <t><tt>arp-profile-bods</tt> (<xref target="profile-bods"/>)</t>
          </li>
          <li>
            <t><tt>arp-profile-corporate-org</tt> (<xref target="profile-corporate"/>)</t>
          </li>
          <li>
            <t><tt>arp-profile-customs-wco</tt> (<xref target="profile-customs"/>)</t>
          </li>
          <li>
            <t><tt>arp-profile-sanctions-consolidated</tt> (<xref target="profile-sanctions"/>)</t>
          </li>
        </ul>
        <t>Identifiers beginning <tt>x-</tt> are reserved for bilateral use and <bcp14>MUST NOT</bcp14> be
registered. A Bilateral Register Agreement <bcp14>MAY</bcp14> declare one.</t>
        <t>Each of the four profiles below states the dated vocabulary it uses where it
names one, the parent relation for each branch of its predicate space over which
narrowing is defined, the parameters a Bilateral Register Agreement declaring it
must supply, and which of its predicates are threshold-sensitive within the
meaning of <xref target="verdict-retyping"/>.</t>
        <section anchor="profile-bods">
          <name>Beneficial ownership: BODS</name>
          <t>For registers expressing beneficial ownership as <xref target="BODS"/> records, the
permitted-predicate set is expressed over relationship records -- termed
ownership-or-control statements before BODS 0.4 -- reachable from a declared
subject entity. This profile is written against BODS 0.4.</t>
          <t>Taxonomic narrowing corresponds to reducing the depth of the ownership chain a
predicate ranges over. A relying party's question is characteristically about
ultimate beneficial ownership -- the transitive closure -- while a register may
be able to answer only a bounded-depth predicate over direct or
once-removed interests. The parent of a predicate at depth n is the corresponding predicate at depth
n-1. The direct-interest predicate is the root of this profile's branch of the
Predicate Taxonomy, and the walk of <xref target="projection"/> fails as
<tt>projection-unsupported</tt> on reaching it, as it does at the taxonomy root.</t>
          <t>A Bilateral Register Agreement declaring <tt>arp-profile-bods</tt> <bcp14>MUST</bcp14> supply the
maximum chain depth over which the register's permitted predicates are
evaluated. Where the Canonical Claim ranges
over the transitive closure and the register's declared maximum depth is finite,
the projection is a narrowing and <bcp14>MUST</bcp14> be recorded in Narrowed-From. An
implementation <bcp14>MUST NOT</bcp14> treat a bounded-depth <tt>no-match</tt> as a
transitive-closure <tt>no-match</tt>. The rule is stated in <xref target="verdict-retyping"/> and
applies to that register's contribution, not to the Combined Verdict: a
<tt>no-match</tt> returned at bounded depth against a closure claim is re-typed to
<tt>indeterminate</tt> before aggregation, and the Verdict Arithmetic then proceeds
unchanged. A <tt>match</tt> found at any depth does establish the existential closure
predicate and is not re-typed.</t>
          <t>The depth at which the register answered is reported in the Applied-Parameter
Set of its Partial Attestation and <bcp14>MUST</bcp14> be carried into the Projection Record of
<xref target="reconciliation-output"/>. A register <bcp14>MAY</bcp14> answer at a shallower depth than the
declared maximum; the declared maximum is therefore not a substitute for the
applied value, and re-typing under <xref target="verdict-retyping"/> turns on the applied
value.</t>
          <t>Interest thresholds -- the percentage at which an interest becomes reportable --
vary by jurisdiction and are properties of the register, not of the claim or of
the format. A Bilateral Register Agreement declaring <tt>arp-profile-bods</tt> <bcp14>MUST</bcp14>
supply the threshold its permitted predicates assume. Two
registers answering the same predicate under different thresholds are not
answering the same question. The reconciliation server <bcp14>MUST</bcp14> add
<tt>register-threshold-divergence</tt> to the Server-Recorded Divergence-Axis Set
wherever the Reconciliation Output combines registers whose declared thresholds
differ, irrespective of the verdicts they returned.</t>
          <t>In this profile the ownership and control predicates are
threshold-sensitive; the identity and existence predicates are not.</t>
        </section>
        <section anchor="profile-corporate">
          <name>Corporate registries: vCard and the Organization Ontology</name>
          <t>A profile in this class <bcp14>MUST</bcp14> declare <xref target="W3C-ORG"/> for any branch of its predicate
space over which taxonomic narrowing is defined. <xref target="RFC6350"/> expresses
organisational hierarchy only within one organisation's own <tt>ORG</tt> structured
value and defines no property relating one organisation to another, so a
vCard-only profile has no term capable of satisfying the parent-relation
requirement of <xref target="format-profiles"/> and <bcp14>MUST NOT</bcp14> declare a narrowing branch.
vCard remains available for the identifying and contact predicates, over which
no narrowing is defined.</t>
          <t>For registers expressing legal-entity and organisational structure, a profile
<bcp14>MAY</bcp14> declare <xref target="RFC6350"/> vCard properties or <xref target="W3C-ORG"/> classes and properties
as the vocabulary in which permitted predicates are expressed.</t>
          <t>A profile <bcp14>MUST</bcp14> declare exactly one parent relation for each branch of its
predicate space, and <bcp14>MUST</bcp14> partition that space so the branches do not overlap.
Declaring two relations applicable to one predicate would make the taxonomic
walk of <xref target="projection"/> reach two predicates at equal distance, which that
section requires to fail as <tt>projection-ambiguous</tt>.</t>
          <t>Where <xref target="W3C-ORG"/> is used, <tt>org:subOrganizationOf</tt> is the parent relation for
the organisational-structure branch, and <tt>org:hasSite</tt> for the branch of
predicates ranging over establishment or place of business.</t>
          <t>Neither vocabulary asserts the legal effect of a recorded fact. <xref target="W3C-ORG"/> does
carry a notion of legal recognition -- <tt>org:FormalOrganization</tt> denotes an
organisation recognised in legal jurisdictions, and <tt>org:identifier</tt> a company
registration number -- but recognition is not determination. A predicate
expressed in these terms is a predicate about a register's recorded
representation of an entity, not about the entity's status in law, and a profile
<bcp14>MUST NOT</bcp14> be read as asserting the latter.</t>
          <t>The vocabulary is pinned to <xref target="W3C-ORG"/> as at its 2014 Recommendation and to
<xref target="RFC6350"/>. A Bilateral Register Agreement declaring this profile supplies the
register's jurisdiction identifier and the identifier scheme of its
<tt>org:identifier</tt> values. No predicate in this profile is threshold-sensitive:
corporate registries record recognition rather than a quantified interest.</t>
        </section>
        <section anchor="profile-customs">
          <name>Customs and transport: UN/CEFACT and the WCO Data Model</name>
          <t>For customs declarations and transport registers, a profile <bcp14>MAY</bcp14> declare
<xref target="UNCEFACT"/> core components or <xref target="WCO-DM"/> classes as the vocabulary for
permitted predicates.</t>
          <t>Both express declaration-side and authority-side facts, and telling them apart
is the purpose of this profile rather than a property of the vocabularies. The
WCO Data Model's Declaration Response and its Licence, Permit, Certificate and
Other packages record authority determinations, as does UN/CEFACT's eCERT for
sanitary and phytosanitary certification; the goods and cargo declaration
classes in both record what was declared to an authority.</t>
          <t>A Bilateral Register Agreement declaring <tt>arp-profile-customs-wco</tt> <bcp14>MUST</bcp14> supply,
for each permitted predicate, whether it ranges over a declared fact or over a
determined one. Where a relying party's Canonical Claim ranges over a determined
fact and the register can answer only over a declared one, that is a narrowing
and <bcp14>MUST</bcp14> be recorded in Narrowed-From. The reconciliation server <bcp14>MUST</bcp14> derive the Divergence
Axis <tt>declared-not-determined</tt> from the Narrowed-From field and add it to the
Server-Recorded Divergence-Axis Set of <xref target="reconciliation-output"/> whenever the
narrowing occurred, whether or not it changed the Combined Verdict; the
corresponding contribution is re-typed under <xref target="verdict-retyping"/>. The register
cannot record it: the register never sees the Canonical Claim, and the Combined
Verdict does not exist until every Partial Attestation has been received.</t>
          <t>The vocabulary is pinned to Version 4 of the <xref target="WCO-DM"/> and to the UN/CEFACT
Core Component Library release the Bilateral Register Agreement names, which it
<bcp14>MUST</bcp14> name. The Agreement also supplies the declaration types the register
answers over. No predicate in this profile is threshold-sensitive.</t>
        </section>
        <section anchor="profile-sanctions">
          <name>Sanctions: consolidated list formats</name>
          <t>For registers expressing designation status by reference to a consolidated list
-- <xref target="OFAC-SDN"/>, <xref target="EU-CFSP"/> or equivalent -- the permitted-predicate set is
expressed over designation of a subject entity on a named list.</t>
          <t>Consolidated lists are republished on no fixed schedule -- OFAC states there is
no predetermined timetable, and the EU list is updated as amending regulations
are adopted -- and are distributed either as full republications or as delta
updates against a prior state. That the cadence is event-driven strengthens the
requirement below rather than weakening it: a relying party cannot infer list
state from the clock. A designation verdict is meaningful only relative to the
list state that produced it, and this has a
consequence the rest of this document depends on: without it, a change in a
historical Combined Verdict cannot be attributed to a policy change rather than
to a list change. Accordingly the requirements of <xref target="source-versioning"/> apply.</t>
          <t>A Bilateral Register Agreement declaring <tt>arp-profile-sanctions-consolidated</tt>
<bcp14>MUST</bcp14> supply the set of lists the register consults and, for each, the identifier
by which the register expresses that list's state. Where the register publishes both a full
list and deltas, the identifier <bcp14>MUST</bcp14> denote the resulting state and not the
delta applied to reach it.</t>
          <t>A profile in this class names no single vocabulary, consolidated sanctions lists
having no common schema. It instead pins, per register, the list identifier and
the publisher's state-identifier form that <xref target="source-versioning"/> requires, both
supplied by the Bilateral Register Agreement, together with the matching
predicate set the register answers over. No predicate in this profile is
threshold-sensitive: a designation is a listed-or-not fact.</t>
        </section>
      </section>
      <section anchor="source-versioning">
        <name>Source-Data Version Binding</name>
        <t>Where a register's answer depends on a source data state that changes
independently of the Bilateral Register Agreement and of the Policy Version --
a consolidated sanctions list being the characteristic case -- the Partial
Attestation <bcp14>MUST</bcp14> carry a Source-Data Version Identifier Set: one identifier for
each source consulted in evaluating the Projected Predicate. Each identifier is
a two-element CBOR array of the list name as declared in the Bilateral Register
Agreement, as a text string, and the state identifier the LIST PUBLISHER
assigns to that state, rather than any value of the register's own devising.</t>
        <t>The state identifier is itself a two-element CBOR array of a form discriminator
and a value. The discriminator is the text string <tt>token</tt> where the publisher
assigns a version token, and the value is that token as a text string exactly as
the publisher renders it, with no normalisation, trimming or case folding. The
discriminator is the text string <tt>digest</tt> where the publisher assigns none, and
the value is the SHA-256 digest, as a 32-octet CBOR byte string, of the octets
the publisher serves for that state, taken as served and before any
decompression, transcoding or reformatting the register applies.</t>
        <t>The discriminator is present because the two branches are a text string and a
byte string in one position, and a reader that must infer which it holds from
the CBOR major type is a reader that will be wrong the first time a publisher
issues a token that happens to decode. The "as served, before decompression"
rule is present because a consolidated list published as a compressed archive
has at least two byte sequences with an equal claim to being the corpus, and two
registers that choose differently produce two identifiers for one state, which
<xref target="retroactive"/> would then read as a version change that never occurred.</t>
        <t>The Source-Data Version Identifier Set <bcp14>MUST</bcp14> be encoded as a CBOR array sorted in
bytewise lexicographic order of the deterministic CBOR encoding of each member.
Every other set this document carries into a signature is ordered, and for the
reason <xref target="audience"/> gives: an unordered set gives one signed artefact as many
digests as it has permutations. A register consulting three lists would
otherwise have six conforming encodings of one attestation, each producing a
different Merkle leaf under <xref target="aggregation"/> and a different Reconciliation Hash. A register-chosen opaque string would be an arbitrary-bandwidth
channel from register to relying party, carried under signature into a sealed
and ledgered artefact, and the rule that differing identifiers <bcp14>MUST NOT</bcp14> be read
as disagreement would normalise it. The reconciliation server <bcp14>MUST</bcp14> reject an
identifier that is not drawn from the publisher's own state sequence, under
<xref target="no-answer"/> with the reason <tt>attestation-source-version-invalid</tt>. The tuple form is what
keeps identifiers issued by one register over different lists from colliding, so
that a register consulting several lists can denote the state of each.</t>
        <t>The Source-Data Version Identifier Set <bcp14>MUST</bcp14> be carried in the
<tt>arp-source-data-version</tt> COSE header parameter of the Partial Attestation's
protected header, and is thereby covered by the Partial-Attestation signature.
It <bcp14>MUST</bcp14> be carried into the Per-Register Result Set of
<xref target="reconciliation-output"/> for each addressed register that supplied one, and is
thereby covered by the Sealing Signature.</t>
        <t>A register <bcp14>MUST</bcp14> evaluate every Projected Predicate over a given list against the
state the corresponding member of its declared Source-Data Version Identifier
Set denotes, and <bcp14>MUST</bcp14> use the same identifier for every Partial Attestation it
issues over that list until it adopts a new state. Without this the identifier would vary per subject and become
a disclosure channel.</t>
        <t>Given that requirement this does not weaken minimum disclosure: a list-state
identifier is a property of a published corpus rather than a register record, it
discloses which published state was consulted and nothing about the subject
entity, and it is identical across every Partial Attestation the register issues
over that list regardless of verdict.</t>
        <t>Retroactive Evaluation depends on this. On re-evaluation under an updated
Pattern Library or Policy Version, an implementation <bcp14>MUST</bcp14> distinguish a material
change in a historical Combined Verdict arising from the change in policy state
from one arising from a change in Source-Data Version. Both <bcp14>MUST</bcp14> trigger
Sovereign Re-Notification where material, and the notification <bcp14>MUST</bcp14> state which
of the two occurred. Where an implementation cannot distinguish them, it <bcp14>MUST</bcp14>
emit a Post-Seal Evaluation Record carrying <tt>attribution-indeterminate</tt> per
<xref target="post-seal"/> rather than attribute the change to policy.</t>
        <t>An implementation <bcp14>MUST NOT</bcp14> infer that two Partial Attestations whose
Source-Data Version Identifier Sets differ for a list they have in common
disagree. They may be answers to the
same predicate against different states of the same corpus. The reconciliation
server <bcp14>MUST</bcp14> record this as <tt>source-version-skew</tt>, which is distinct from
<tt>freshness-stale</tt>: a skewed attestation is within its freshness window and is
retained and combined, whereas a stale one falls outside that window and is
rejected under <xref target="replay-defence"/>.</t>
      </section>
      <section anchor="per-register-encryption">
        <name>Per-Register Encryption</name>
        <t>These are requirements on whatever bilateral channel <xref target="projection"/> leaves each
Bilateral Register Agreement to declare; they are properties the channel <bcp14>MUST</bcp14>
provide and not a wire construction this document pins.</t>
        <t>Each Per-Register Claim Projection <bcp14>MUST</bcp14> be encrypted under the addressed
register's public key material declared in the Bilateral Register Agreement.
The Reconciliation Nonce <bcp14>MUST</bcp14> be transmitted in the clear alongside the
ciphertext, and the encryption operation <bcp14>MUST</bcp14> bind the
Bilateral-Register-Agreement Hash and that nonce into the ciphertext as
authenticated additional data, such that a register attempting to decrypt under
a stale Bilateral-Register-Agreement Hash, or with a nonce other than the one
the ciphertext was sealed against, fails at the authenticated-additional-data
verification step. The register <bcp14>MUST</bcp14> verify that the nonce so bound equals the
Reconciliation Nonce field of the decrypted projection.</t>
        <t>The nonce travels in the clear because authenticated additional data is an input
to the decryption operation and cannot be recovered from the plaintext that
operation produces. It discloses nothing: it is a random value carrying no
information about the subject or the claim.</t>
        <t>These two are the only values so bound. Authenticated additional data detects a
mismatch only against an expectation the receiver independently holds. A
register independently holds its own agreement, and it is handed the nonce. It does not hold the Pattern-Library Version
Identifier: the Pattern Library is the reconciliation server's internal
adversarial-test corpus and is not published to registers, so binding it would
either fail universally or be supplied alongside the ciphertext by the same
party that chose it, detecting nothing.</t>
        <t>A register <bcp14>MUST NOT</bcp14> issue more than one Partial Attestation for a given
Reconciliation Nonce, and <bcp14>MUST</bcp14> reject a projection whose nonce it has already
answered. Without this a captured ciphertext could be replayed indefinitely,
each replay yielding a freshly timestamped signed attestation and defeating the
freshness window of <xref target="replay-defence"/>.</t>
      </section>
      <section anchor="partial-attestation">
        <name>Partial Attestation Reception</name>
        <t>A Partial Attestation comprises:</t>
        <ul spacing="normal">
          <li>
            <t>Register Identifier</t>
          </li>
          <li>
            <t>Reconciliation-Verdict Field (<tt>match</tt>, <tt>no-match</tt>, <tt>partial-match</tt>, or <tt>indeterminate</tt>)</t>
          </li>
          <li>
            <t><bcp14>OPTIONAL</bcp14> Divergence-Axis Field</t>
          </li>
          <li>
            <t>Bilateral-Register-Agreement Hash</t>
          </li>
          <li>
            <t>Policy-Version Hash</t>
          </li>
          <li>
            <t><bcp14>OPTIONAL</bcp14> Source-Data Version Identifier Set, present where required by
<xref target="source-versioning"/> and carried in the <tt>arp-source-data-version</tt> COSE header
parameter of <xref target="iana"/></t>
          </li>
          <li>
            <t><bcp14>OPTIONAL</bcp14> Applied-Parameter Set, being the profile parameters the register
actually applied in evaluating the Projected Predicate, present wherever the
Profile Parameter Set of the Per-Register Claim Projection was non-empty</t>
          </li>
          <li>
            <t>Query Binding, the SHA-256 digest over the deterministically encoded CBOR
array <tt>["arp-query-binding-v1", Reconciliation Identifier, Projected
Predicate, Subject Reference, Reconciliation Nonce]</tt>, those four values taken
from the Per-Register Claim Projection it answers. The construction is a
five-element array whose first element is a fixed domain-separation string,
rather than a byte concatenation, so that two implementations cannot differ on framing and the
digest cannot collide with any other construction in this document. Within that
array the Reconciliation Identifier is a byte string of 80 octets as
<xref target="reconciliation-output"/> fixes it, the Projected Predicate is a text string,
the Reconciliation Nonce is a byte string of at least 16 octets, and the Subject
Reference takes the CBOR type the Subject Reference form of item 8 of
<xref target="bra-items"/> declares, which that Agreement <bcp14>MUST</bcp14> state. The register and the
reconciliation server compute this digest independently and <bcp14>MUST</bcp14> obtain the same
value, so an element whose type is left open is an element on which they can
differ while agreeing on every negotiated term</t>
          </li>
          <li>
            <t>Freshness Timestamp</t>
          </li>
          <li>
            <t>Cryptographic Signature, a COSE_Sign1 by the register whose payload is the
CBOR array of the fields above in the order listed, with an absent <bcp14>OPTIONAL</bcp14> or
conditionally absent field encoded as CBOR null so that position is preserved,
encoded under Section 4.2.1 of <xref target="RFC8949"/>. The register's signing key is
published in its key set under <xref target="sealing-key-discovery"/>, so that a relying
party or auditor holding the attestation can resolve the key and verify the
signature without the reconciliation server's assurance</t>
          </li>
        </ul>
        <t>The Query Binding is what makes an attestation an answer to a question rather
than a free-standing assertion. Without it the signed payload says only that a
register returned a verdict under some agreement and policy version at some
time, and says nothing about what it was asked. Two consequences follow, and
both are severe: an attestation harvested for one subject could be placed into
the Per-Register Result Set of a reconciliation about another subject and would
verify against every other check; and a register could answer the same question
differently to two requesters and deny having done so, because its signature
would not identify the question.</t>
        <t>The <tt>arp-policy-version-hash</tt>, <tt>arp-bilateral-agreement-hash</tt> and
<tt>arp-source-data-version</tt> in a Partial Attestation's protected header <bcp14>MUST</bcp14> equal
the corresponding payload fields, and an implementation <bcp14>MUST</bcp14> reject an
attestation where they differ: a value carried twice with no equality rule is a
value an implementation may read either way. The third is included because
<xref target="source-versioning"/> carries the Source-Data Version Identifier Set in the
protected header and again into the Per-Register Result Set, which is the
condition this rule exists to govern, and an earlier revision applied the rule
to the first two only.</t>
        <t>The reconciliation server <bcp14>MUST</bcp14> recompute the Query Binding from the projection
it transmitted and <bcp14>MUST</bcp14> reject an attestation whose Query Binding does not
match, under <xref target="no-answer"/> with the reason <tt>attestation-binding-mismatch</tt>.</t>
        <t>The Query Binding Record of <xref target="reconciliation-output"/> carries the three
projection values and the register's signed attestation into the Output, so that
a relying party or auditor can recompute the binding and verify the register's
signature independently. A check performed only by the reconciliation server
would rest on the honesty of the party the rest of this document declines to
trust. The
Reconciliation Nonce is unique per Per-Register Claim Projection per
<xref target="terminology"/> and <bcp14>MUST NOT</bcp14> be reused, so that an attestation is admissible
only into the reconciliation, and against the register, that elicited it.</t>
        <t>The Partial Attestation payload <bcp14>SHALL NOT</bcp14> contain any register-record field,
any pre-image of the register record, or any field beyond those enumerated.
Restricting the Partial-Attestation payload to the enumerated fields, of which
the verdict, the divergence axis, the applied parameters and the Query
Binding -- a digest over the Subject Reference -- vary with the subject, is the
mechanism by which ARP limits raw-record disclosure. Residual
inference channels are discussed in <xref target="side-channel"/>.</t>
      </section>
      <section anchor="merkle-construction">
        <name>Merkle Construction</name>
        <t>Two structures in this document commit to a set of digests through a Merkle
tree: the Merkle Root of Hash-Linkage Aggregation, and the Examined-Set Root
of <xref target="sweep-statements"/>. Both use this construction, so that an inclusion proof
produced by one implementation verifies under another.</t>
        <t>Leaves are the digests to be committed, sorted in bytewise lexicographic order
and deduplicated. Deduplication is why an Examined-Set Root commits to distinct
Claim Hashes and the count beside it counts Reconciliation Outputs: two Outputs
over one claim share a Claim Hash, so the leaf count and the examined count need
not be equal and neither is derivable from the other. A leaf node is <tt>SHA-256(0x00 || leaf)</tt>. An internal node is
<tt>SHA-256(0x01 || left || right)</tt>. Where a level has an odd number of nodes, the
last is carried up to the next level unchanged rather than duplicated. A tree
over one leaf has that leaf's leaf-node hash as its root; a tree over no leaves
has thirty-two zero octets as its root.</t>
        <t>For every non-empty tree this is the Merkle Tree Hash of Section 2.1.1 of
<xref target="RFC9162"/> instantiated with SHA-256. <xref target="RFC9162"/> carries the hash algorithm as a log parameter and this document
fixes SHA-256, which is the hash that Certificate Transparency logs built on the
earlier specification also use, so an implementer arriving from either computes
the same tree.</t>
        <t>The odd-node rule stated above and that recursive split at the largest power of
two below the leaf count are two descriptions of one tree: at every leaf count
they produce the same root, and at every leaf count and index they produce the
same sibling array. An implementation may compute either way and interoperate
with one that computes the other. This is stated because the two rules do not
look alike, so a reader who knows Certificate Transparency has no way to
establish from the prose alone that they agree; and because a third convention
is in common use, in which the last node at an odd level is duplicated and
paired with itself. That convention produces the same root at every leaf count
that is a power of two, because no level of such a tree is ever odd, and a
different root at every other leaf count. A conformance vector taken at four or
eight leaves will therefore not detect it, and an implementation that ports it
will pass a test suite and diverge in production.</t>
        <t>This document and Certificate Transparency diverge at exactly one input to the
tree function, the empty tree, and the divergence is deliberate. Certificate Transparency defines the Merkle Tree Hash of the empty
list as the hash of the empty string, which under SHA-256 is
<tt>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</tt>; this
document defines it as thirty-two zero octets. The Certificate Transparency
value is a well formed digest that a verifier reproduces successfully and may
then treat as a root that commits to something. Thirty-two zero octets is a
value no commitment in this document produces, so it cannot be mistaken for one.
An implementation <bcp14>MUST</bcp14> use the value defined in this section and <bcp14>MUST NOT</bcp14>
substitute the Certificate Transparency empty-tree value. The requirement below,
that a verifier reject any inclusion proof presented against the empty root,
applies to whichever value a construction gives the empty tree, and the reason
for it does not depend on which value that is.</t>
        <t>Two further differences are matters of input and of encoding rather than of the
tree, and each is a place an implementation ported from a Certificate
Transparency log will be wrong if it is carried over unchanged. This document
sorts leaves in bytewise lexicographic order and deduplicates them before the
tree is built, where a Certificate Transparency log commits to entries in the
order it received them; an implementation <bcp14>MUST</bcp14> apply the ordering and
deduplication stated above and <bcp14>MUST NOT</bcp14> assume submission order. And this
document's inclusion proof carries the leaf alongside the index, the leaf count
and the sibling array, where the inclusion proof of Section 2.1.3 of
<xref target="RFC9162"/> carries the index and the tree size but not the leaf, which its
verifier is assumed already to hold. The leaf is the only field that differs,
and <xref target="leaf-binding"/> states what a verifier must do with it.</t>
        <t>An inclusion proof is a CBOR array of the leaf, its zero-based index, the leaf
count, and the array of sibling hashes from the leaf's level upward. Domain
separation between leaf and internal nodes is what stops a proof of an internal
node being presented as a proof of a leaf.</t>
        <t>Three properties of that array are stated here because each is a place two
implementations otherwise diverge while both believing they conform. The array
carries one entry for each level at which the node being proved has a sibling,
and no entry for a level at which it was carried up unchanged, so its length is
not in general the base-two logarithm of the leaf count and a verifier <bcp14>MUST NOT</bcp14>
derive the expected length that way. No direction bit is carried: at each level
the verifier derives whether the sibling is the left or the right operand from
the index and the leaf count, taking the floor of half the index and the
<strong>ceiling</strong> of half the level width as it ascends. Halving the width by
truncation instead gives the wrong width at every leaf count that is not a power
of two -- five leaves give widths 5, 3, 2, 1 and not 5, 2, 1 -- which is
precisely the range of leaf counts this section exists to pin down. The
derivation is well defined because the shape of the tree is fixed by the leaf
count alone. And the empty tree's root of thirty-two zero octets admits no
inclusion proof; a verifier <bcp14>MUST</bcp14> reject any proof presented against it rather
than treat a root it can reproduce as a root that commits to something.</t>
        <section anchor="leaf-binding">
          <name>Leaf binding</name>
          <t>The leaf a proof carries is a convenience and is not evidence. A verifier <bcp14>MUST</bcp14>
compute the leaf from the object whose inclusion is being proved -- the
Signing Input Digest of the Partial Attestation for a Merkle Root under
<xref target="aggregation"/>, the Claim Hash for an Examined-Set Root under
<xref target="sweep-statements"/> -- and <bcp14>MUST</bcp14> use that computed value, and no value taken
from the proof, as the input to the sibling walk. Where the proof carries a
leaf, the verifier <bcp14>MUST</bcp14> refuse the proof if the computed value does not equal
it, and <bcp14>MUST</bcp14> perform that comparison before the sibling array is walked.</t>
          <t>The requirement is stated over the object rather than over the carried field
because the field is not always present. <xref target="aggregation"/> permits per-register
inclusion proofs to be encoded as COSE Receipts <xref target="RFC9942"/>, whose inclusion
proof carries no leaf; a requirement written only as a comparison against a
carried leaf would be vacuous under that encoding, which is the encoding a
SCITT-aware verifier is most likely to use.</t>
          <t>The ordering is the whole of the requirement. A proof whose leaf is lifted
unchanged from another object's valid proof folds to the correct root under a
sibling array that verifies, because it is a correct proof -- of the other
object. A verifier that walks the path first and takes the carried leaf on trust
accepts it, and concludes that the object it holds was committed when what was
committed was something else. Nothing in the walk depends on the object, so the
walk cannot detect this; only the recomputation can. It is the more dangerous
half of its pair: a malformed proof fails loudly on every path a verifier
tries, while a valid proof bound to the wrong leaf passes every check except
this one.</t>
        </section>
        <section anchor="verification-outcomes">
          <name>Verification outcomes</name>
          <t>The preceding rules tell a verifier to refuse. They do not give it any way to
record which refusal it made, and four conditions that arrive at "refuse"
through this section are evidence about four different things. A deployment that
reports them alike reports something that did not happen, and the report will be
believed, because the check that produced it worked exactly as specified.</t>
          <t>A verifier that refuses a proof or an artefact under this document <bcp14>MUST</bcp14> record a
Verification Outcome, drawn from the registry of <xref target="iana"/>, and <bcp14>MUST NOT</bcp14> report
one as another. The initial values are:</t>
          <dl>
            <dt><tt>proof-against-empty-root</tt>:</dt>
            <dd>
              <t>A proof was presented against the empty-tree root of <xref target="merkle-construction"/>.
Evidence of neither equivocation nor re-encoding: the empty root commits to
nothing and no proof against it can be valid.</t>
            </dd>
            <dt><tt>leaf-object-mismatch</tt>:</dt>
            <dd>
              <t>The leaf recomputed from the object differs from the leaf the proof carries.
Evidence of equivocation by the serving party, and the case this section
exists to catch.</t>
            </dd>
            <dt><tt>root-mismatch</tt>:</dt>
            <dd>
              <t>The sibling walk completed and produced a root other than the one named.
Evidence of equivocation by the serving party.</t>
            </dd>
            <dt><tt>same-act-distinct-encodings</tt>:</dt>
            <dd>
              <t>The artefact the verifier holds and the artefact the proof or digest commits
to have equal Signing Input Digests and unequal enveloped bytes. <strong>Evidence of
a re-encoding and not of equivocation.</strong> A verifier <bcp14>MUST</bcp14> test for this
condition before reporting <tt>leaf-object-mismatch</tt> or <tt>root-mismatch</tt>, and
where it holds, <bcp14>MUST</bcp14> report this outcome instead.</t>
            </dd>
          </dl>
          <t>The last is the one that changes what a reader concludes. Two artefacts with one
Signing Input Digest are one signing act under two encodings, which
<xref target="signature-malleability"/> shows a third party holding no key can produce from
the honest signer's own bytes -- and which, for ECDSA, is produced by any
implementation that normalises <tt>s</tt> on ingest while believing it is hardening.
Reporting that as detected tampering accuses a party of equivocating on the
strength of an operation an intermediary performed correctly. The constructions
of <xref target="signature-malleability"/> make the digests stable; this makes the report
that survives them accurate.</t>
        </section>
      </section>
      <section anchor="aggregation">
        <name>Aggregation</name>
        <t>The aggregation subsystem operates in Hash-Linkage Aggregation. Each
Partial Attestation is committed to a Merkle tree as <xref target="merkle-construction"/>
defines it, under the leaf value that is its Signing Input Digest, and the
resulting Merkle Root is carried in the Reconciliation Output. The leaf is the
Signing Input Digest and not a digest of the attestation as received, so that
the leaf a verifier computes under <xref target="leaf-binding"/> does not depend on which of
several byte-strings carrying one register signature it happens to hold. Its
per-register inclusion proofs <bcp14>MAY</bcp14> be encoded as COSE Receipts <xref target="RFC9942"/>,
enabling any SCITT-aware verifier to check inclusion without a bespoke proof
format. Each leaf commits one register's attestation individually, so an
inclusion proof discloses no other register's payload.</t>
      </section>
      <section anchor="no-answer">
        <name>Registers That Do Not Answer</name>
        <t>A register may fail to produce a usable Partial Attestation. Every such state
has a defined outcome, because dropping the register silently would produce
exactly the addressed-register-cherry-picking pattern the Adversarial
Pre-Transmission Test exists to detect.</t>
        <t>The Per-Register Result Set <bcp14>MUST</bcp14> carry an entry for every addressed register.
Where no usable attestation was received, the entry carries no Attested Verdict
and carries instead, in its own field, a Non-Answer Reason drawn from:</t>
        <ul spacing="normal">
          <li>
            <t><tt>projection-ambiguous</tt> and <tt>projection-unsupported</tt>, where the projection
itself failed and no projection was transmitted</t>
          </li>
          <li>
            <t><tt>agreement-drift-suspended</tt>, where reconciliation against that register was
suspended for Bilateral-Register-Agreement drift</t>
          </li>
          <li>
            <t><tt>attestation-stale</tt>, where the Freshness Timestamp fell outside the declared
window and the attestation was rejected</t>
          </li>
          <li>
            <t><tt>attestation-signature-invalid</tt>, where the signature did not verify</t>
          </li>
          <li>
            <t><tt>attestation-echo-mismatch</tt>, where a value the register echoed did not match
the one sent, or a value carried in the protected header did not equal the
corresponding payload field</t>
          </li>
          <li>
            <t><tt>attestation-binding-mismatch</tt>, where the Query Binding the server recomputed
did not match the one the attestation carries, which is an attestation
elicited for a different question</t>
          </li>
          <li>
            <t><tt>attestation-source-version-invalid</tt>, where a Source-Data Version Identifier
was not drawn from the publisher's own state sequence</t>
          </li>
          <li>
            <t><tt>attestation-scope-exceeded</tt>, where the register attested a Divergence Axis the
registry of <xref target="iana"/> records as server-recorded</t>
          </li>
          <li>
            <t><tt>register-unresponsive</tt>, where no attestation was received within the window
declared in the Bilateral Register Agreement</t>
          </li>
          <li>
            <t><tt>register-refused</tt>, where the register declined to answer, whether under its
own statutory access regime or under the Agent-IFF policy</t>
          </li>
          <li>
            <t><tt>query-budget-exhausted</tt>, where the reconciliation would exceed the
per-principal per-subject query budget declared under <xref target="containment"/></t>
          </li>
          <li>
            <t><tt>subject-ceiling-exhausted</tt>, where the reconciliation would exceed a per-subject
ceiling declared under <xref target="containment"/></t>
          </li>
          <li>
            <t><tt>audience-constraint-exceeded</tt>, where the requested Audience Set exceeds the
audience constraint that register declares under <xref target="audience"/></t>
          </li>
          <li>
            <t><tt>non-answer-unattested</tt>, where the register asserted a register-attested reason
without a verifying Non-Answer Statement</t>
          </li>
        </ul>
        <t>Each Non-Answer Reason is either register-attested or server-observed, and the
registry of <xref target="iana"/> <bcp14>MUST</bcp14> record which for every registration.
<tt>register-refused</tt> is register-attested. <tt>attestation-stale</tt> and the five
<tt>attestation-</tt> reasons above are server-observed but arise from an attestation
the server holds. The remainder are server-observed with no register artefact
behind them.</t>
        <t>Earlier revisions carried a single <tt>attestation-unverifiable</tt> covering all five
of those conditions, and normative text in four other sections directed
implementations to it for causes its own definition did not name. They are not
variants of one condition and an auditor cannot be asked to treat them as one.
A failed signature is a broken or impersonated register. An echo mismatch is an
attestation about a different policy state. A binding mismatch is the
reconciliation server presenting an attestation elicited for a different subject
or predicate, which is a server-side attack and not a register fault at all. A
source-version invalidity is a register attempting a covert channel. A scope
excess is a register claiming competence the registry says it does not have.
Recording all five as one value tells the Register Operator reading its own
entry under <xref target="read-operations"/> that something was wrong with its attestation,
and does not tell it whether the fault was its own. This document made exactly
this argument for <tt>non-answer-unattested</tt> two paragraphs below and did not
apply it here. An implementation <bcp14>MUST NOT</bcp14> record any of the five under a
value that does not name its cause.</t>
        <t>Where a Non-Answer Reason is register-attested, the Per-Register Result Set entry
<bcp14>MUST</bcp14> carry a Non-Answer Statement in the field <xref target="reconciliation-output"/> defines
for it. The Statement is a COSE_Sign1 by that register, under the primitive its
Bilateral Register Agreement declares and under a key resolvable as in
<xref target="sealing-key-discovery"/>, whose payload is the CBOR array</t>
        <artwork>
["arp-non-answer-v1", Reconciliation Identifier, Projected Predicate,
 Subject Reference, Reconciliation Nonce, Non-Answer Reason]
</artwork>
        <t>encoded under Section 4.2.1 of <xref target="RFC8949"/>. The Reconciliation Identifier is
inside the payload for the reason the Query Binding of <xref target="partial-attestation"/>
carries it: without it a refusal elicited in one reconciliation is admissible as
a refusal in another over the same subject and predicate.</t>
        <t>Where a register-attested reason is recorded without a Statement, or with one
that does not verify, the reason <bcp14>MUST</bcp14> be replaced by <tt>non-answer-unattested</tt>.
That is a distinct reason and not any of the <tt>attestation-</tt> reasons, which denote a
Partial Attestation the server holds and could not verify; collapsing the two
would put the missing-refusal case back into a server-observed bucket and undo
the distinction this rule exists to draw.</t>
        <t>Without that rule a <tt>register-refused</tt> is an unattested assertion by the party
that transmitted the projection, and a server can suppress a <tt>match</tt> by claiming
the register declined. The server can still downgrade a reconciliation to
<tt>indeterminate</tt> by asserting a server-observed reason -- <tt>register-unresponsive</tt>
is indistinguishable from a network failure by construction, and this document
does not pretend otherwise -- but it cannot dress suppression as an act of the
register. Suppressing a sanctions hit is the harm this domain cares about, and
the difference between "the register would not say" and "I did not ask" is the
difference the record must preserve.</t>
        <t>A Non-Answer Reason is not a verdict, occupies its own field of the Per-Register
Result Set per <xref target="reconciliation-output"/>, and <bcp14>MUST NOT</bcp14> be combined by the
Verdict Arithmetic. Its effect is given in <xref target="verdict-arithmetic"/>: a reconciliation with
any non-answering register cannot reach a decisive Combined Verdict.</t>
        <t>Where the reason is <tt>attestation-stale</tt>, <tt>freshness-stale</tt> <bcp14>MUST</bcp14> also be added to
the Server-Recorded Divergence-Axis Set against that Register Identifier.</t>
        <t>A reconciliation server <bcp14>MUST</bcp14> reject a Partial Attestation that attests a
Divergence Axis the registry of <xref target="iana"/> records as server-recorded, with the
reason <tt>attestation-scope-exceeded</tt>. A register cannot attest a relation between
itself and another register, which is what those axes are.</t>
      </section>
      <section anchor="verdict-retyping">
        <name>Verdict Re-Typing</name>
        <t>A register answers the Projected Predicate it was sent, which may be a narrowing
of the Canonical Claim Predicate. Where the narrowing means the register's
answer does not bear on the claim as asked, the reconciliation server <bcp14>MUST</bcp14>
re-type that register's Reconciliation-Verdict Field before aggregation, and
<bcp14>MUST</bcp14> record the attested value, the re-typed value and the ground on which it
re-typed in the Per-Register Result Set, so that an auditor can reproduce the
decision without the server's assurance.</t>
        <t>Re-typing is confined to these cases:</t>
        <ul spacing="normal">
          <li>
            <t>Any contribution other than <tt>match</tt>, attested against a bounded-depth
predicate where the Canonical Claim ranged over a transitive closure, is
re-typed to <tt>indeterminate</tt>. A bounded-depth answer that is not a <tt>match</tt> is
evidence about the bounded depth only, and that is as true of <tt>partial-match</tt>
and <tt>indeterminate</tt> as of <tt>no-match</tt>. A <tt>match</tt> is not re-typed: an interest
found at any depth establishes the existential closure predicate.</t>
          </li>
          <li>
            <t>A <tt>match</tt> or <tt>no-match</tt> attested over a declared fact, where the Canonical
Claim ranged over a determined fact, is re-typed to <tt>partial-match</tt> under an
operator that admits that value and to <tt>indeterminate</tt> under one that does
not, per <xref target="verdict-arithmetic"/>.</t>
          </li>
          <li>
            <t>A contribution from a register whose declared interest threshold differs from
that of any other addressed register, where the Canonical Claim's predicate is
threshold-sensitive, is re-typed to <tt>partial-match</tt> under an operator that
admits that value and to <tt>indeterminate</tt> under one that does not. Two
registers answering under different thresholds are not answering the same
question, and annotating that on the Reconciliation Output while allowing a
decisive Combined Verdict to be built from it would state a conclusion the
inputs do not support.  </t>
            <t>
Threshold-sensitivity is a property of a Register Data-Format Profile, which
declares which of its predicates are threshold-sensitive, and the test above
names the Canonical Claim Predicate, which is not expressed in any profile.
The test is therefore evaluated as follows, and is defined over a register set
whose members declare different profiles. The Canonical Claim Predicate is
threshold-sensitive where the Per-Register Claim Projection transmitted to ANY
addressed register was a predicate that register's declared profile marks
threshold-sensitive. Taking the disjunction rather than requiring agreement is
deliberate: a mixed-profile register set in which one profile marks the
predicate threshold-sensitive and another is silent is precisely the set in
which the thresholds may differ unnoticed, and requiring every profile to mark
it would disable the test in the case it exists for.</t>
          </li>
          <li>
            <t>A <tt>match</tt> attested against a Projected Predicate that is a proper ancestor of
the Canonical Claim Predicate is re-typed to <tt>partial-match</tt> under an operator
that admits that value and to <tt>indeterminate</tt> under one that does not, under
the ground <tt>projection-broadened</tt>. The projection function of <xref target="projection"/>
resolves by taxonomic prefix match upward, producing the nearest permitted
ancestor, so a register answering a Projected Predicate that narrowing did not
reach is answering a <strong>broader</strong> question than the claim asked. A subject
designated on some US sanctions list is not thereby designated on the OFAC SDN
list, and a decisive <tt>match</tt> assembled from the ancestor states a conclusion
the input does not support.  </t>
            <t>
A contribution other than <tt>match</tt> is not re-typed on this ground: a <tt>no-match</tt>
over an ancestor entails <tt>no-match</tt> over every descendant of it, so the
broadening is harmless in that direction and re-typing it would discard sound
evidence.  </t>
            <t>
Earlier revisions covered the converse only. The opening sentence of this
section says a register answers a Projected Predicate "which may be a
narrowing of the Canonical Claim Predicate", and the projection function
produces an ancestor, which is the opposite relation. The Output records the
broadening in the Narrowed-From field of the Projection Record, so a relying
party inspecting it could see what happened; nothing obliged it to look, and
the Combined Verdict was decisive either way. Recording a divergence while
permitting a decisive verdict built on it is the failure ground 3 above is
written against, and it applied here and was not applied.  </t>
            <t>
The Divergence Axis <tt>claim-projection-narrowed-beyond-attestation-scope</tt>
names this condition and is register-attestable, optional in the attestation,
and connected to no normative rule anywhere in this document; it appears in
its own enumeration and nowhere else. An axis a register need never emit, and
which changes no verdict when emitted, is not a control. This ground is.</t>
          </li>
        </ul>
        <t>Re-typing operates on a register's contribution. It does not override the
Verdict Arithmetic resolved under <xref target="verdict-arithmetic"/>, which is applied
afterwards to the re-typed set and is otherwise unaffected. An implementation
<bcp14>MUST NOT</bcp14> re-type on any ground not enumerated here.</t>
      </section>
      <section anchor="verdict-arithmetic">
        <name>Verdict Arithmetic</name>
        <t>The Verdict Arithmetic combines the Reconciliation-Verdict Fields of the
Per-Register Result Set, after any re-typing under <xref target="verdict-retyping"/>, into
the Combined Verdict. The requester names the applicable regimes in its
Canonical Claim; it does not choose the operator. The operator and every
parameter it takes are resolved by the reconciliation server from the
policy-epoch store of <xref target="sealing"/>, keyed on the predicate and the named regimes,
and are committed to the Policy-Version Hash. They are carried into the
Reconciliation Output so that a relying party can reproduce the combination.</t>
        <t>A requester able to choose both the operator and its threshold could choose the
verdict: disjunction over five registers and threshold-count with a threshold of
five differ only in which answer they return over the same contributions, and
selecting between them after seeing which registers were addressed is verdict
shopping that no downstream check would detect. Naming a regime is a claim about
which law applies, which the requester is competent to make and accountable for;
selecting an operator is a determination about how evidence combines, which the
deployment's policy makes.</t>
        <t>Naming regimes is not thereby unconstrained. The reconciliation server <bcp14>MUST</bcp14>
verify that every regime the Applicable-Regimes Set names is one the policy-epoch
store admits for that predicate, and <bcp14>MUST</bcp14> refuse a claim naming a regime that is
not, returning a Remediation Advisory identifying it. Without that check a
requester enumerates admissible regime sets, reads out of the Outputs it receives
which operator, threshold and reliance interval each resolves to, and selects the
combination that returns the answer it wants -- taking the longest reliance
interval with it. That is verdict shopping at one remove. There is nothing to probe for: <xref target="read-signing"/>
requires the server to publish the resolved operator, its parameters and the
reliance interval per predicate and regime set, so the mapping is available
without probing and the admitted-regime check is what constrains the choice.</t>
        <t>Three rules apply to every operator and take precedence over the operator's own
table:</t>
        <ul spacing="normal">
          <li>
            <t>The Addressed-Registers Identifier Set <bcp14>MUST NOT</bcp14> be empty, and a Combined
Verdict <bcp14>MUST NOT</bcp14> be computed over an empty contribution set. Every operator
below is defined by a condition universally quantified over the contributions,
so every one of them is vacuously satisfied where there are none: conjunction
yields <tt>match</tt>, disjunction and threshold-count yield <tt>no-match</tt>, and the two
rules that follow -- both of which begin "where any" -- do not fire, because
there is no contribution to be indecisive. A decisive verdict from no evidence
at all is the failure mode the rest of this section is built to prevent, and
it is reached not by an operator behaving badly but by every guard being true
of nothing. A relying party <bcp14>MUST</bcp14> reject an Output whose Addressed-Registers
Identifier Set is empty, and <bcp14>MUST NOT</bcp14> treat its Combined Verdict as a verdict.</t>
          </li>
          <li>
            <t>Where any addressed register has no decisive contribution because it did not
answer, was refused or was rejected under <xref target="no-answer"/>, the Combined Verdict
<bcp14>MUST</bcp14> be <tt>indeterminate</tt>. An operator <bcp14>MUST NOT</bcp14> reach a decisive verdict over an
incomplete register set, which would be indistinguishable from
addressed-register-cherry-picking.</t>
          </li>
          <li>
            <t>Where any contribution is <tt>indeterminate</tt>, the Combined Verdict <bcp14>MUST</bcp14> be
<tt>indeterminate</tt> wherever the operator's table would otherwise yield
<tt>no-match</tt>. An <tt>indeterminate</tt> contribution is an absence of evidence and a
decisive negative may not be built on one, so the rule states the substitute
result rather than only a prohibition; a prohibition without a substitute
would leave the verdict undefined in exactly the cases it governs.</t>
          </li>
        </ul>
        <t>Operators are drawn from the registry of <xref target="iana"/>. Subject to those rules, the
initial four are:</t>
        <dl>
          <dt>conjunction:</dt>
          <dd>
            <t><tt>match</tt> where every contribution is <tt>match</tt>. <tt>no-match</tt> where any contribution
is <tt>no-match</tt>. <tt>partial-match</tt> where every contribution is <tt>match</tt> or
<tt>partial-match</tt> and at least one is <tt>partial-match</tt>. <tt>indeterminate</tt>
otherwise.</t>
          </dd>
          <dt>disjunction:</dt>
          <dd>
            <t><tt>match</tt> where any contribution is <tt>match</tt>. <tt>no-match</tt> where every contribution
is <tt>no-match</tt>. <tt>partial-match</tt> where at least one is <tt>partial-match</tt> and none
is <tt>match</tt>. <tt>indeterminate</tt> otherwise.</t>
          </dd>
          <dt>threshold-count:</dt>
          <dd>
            <t><tt>match</tt> where the count of <tt>match</tt> contributions meets or exceeds the
threshold resolved for the named regimes. <tt>no-match</tt> where the count
of <tt>match</tt> contributions cannot reach the threshold and no contribution is
<tt>indeterminate</tt>. <tt>indeterminate</tt> otherwise, which includes every case in which
an <tt>indeterminate</tt> contribution is present and the threshold is not met.
<tt>partial-match</tt> contributions do not count toward the threshold.</t>
          </dd>
          <dt>source-class-quorum:</dt>
          <dd>
            <t>threshold-count evaluated per source class, over the partition and the
per-class threshold resolved for the named regimes, then combined across
classes by conjunction. A source class containing no addressed register
contributes <tt>indeterminate</tt> and <bcp14>MUST NOT</bcp14> contribute <tt>no-match</tt>. Without that
rule the class is threshold-count over nothing: the count of <tt>match</tt>
contributions cannot reach a threshold of one or more, no contribution is
<tt>indeterminate</tt> because there is no contribution, and the class yields a
decisive negative built on an empty class -- which conjunction then propagates
to the Combined Verdict. The <tt>indeterminate</tt>-substitution rule above does not
reach it, because that rule governs evidence that is present and inconclusive
and this is evidence that is absent. Suppressing a hit by partitioning it into
a class with no members in it is a decisive negative assembled out of the
partition, and the partition is resolved from the policy-epoch store rather
than from the registers actually addressed.</t>
          </dd>
        </dl>
        <t>Every operator admits <tt>partial-match</tt> except threshold-count and
source-class-quorum, which do not. Where <xref target="verdict-retyping"/> would re-type a
contribution to <tt>partial-match</tt> under an operator that does not admit it, the
contribution is re-typed to <tt>indeterminate</tt> instead.</t>
      </section>
      <section anchor="reconciliation-output">
        <name>Reconciliation Output</name>
        <t>A Reconciliation Output comprises:</t>
        <ul spacing="normal">
          <li>
            <t>Reconciliation Event Identifier</t>
          </li>
          <li>
            <t>Reconciliation Identifier</t>
          </li>
          <li>
            <t>Claim Hash</t>
          </li>
          <li>
            <t>Reconciliation Timestamp</t>
          </li>
          <li>
            <t>Reliance Horizon of <xref target="entitlement"/></t>
          </li>
          <li>
            <t>Audience Set of <xref target="entitlement"/></t>
          </li>
          <li>
            <t>Combined Verdict</t>
          </li>
          <li>
            <t>Verdict Arithmetic as resolved under <xref target="verdict-arithmetic"/>, together with
every parameter that operator takes -- the threshold for threshold-count, and
both the source-class partition and the per-class threshold for
source-class-quorum</t>
          </li>
          <li>
            <t>Addressed-Registers Identifier Set, each member an Authority Origin, sorted in
bytewise lexicographic order of its UTF-8 encoding</t>
          </li>
          <li>
            <t>Bilateral-Register-Agreement Hash Set, sorted in bytewise lexicographic order
of the digests themselves, in the order of the Addressed-Registers Identifier
Set having no meaning once a register may be absent from a set</t>
          </li>
          <li>
            <t>Policy-Version Hash</t>
          </li>
          <li>
            <t>Pattern-Library Version Identifier</t>
          </li>
          <li>
            <t>Requester-Binding Class</t>
          </li>
          <li>
            <t>Per-Register Result Set, one entry per addressed register, ordered by Register
Identifier in bytewise lexicographic order of its UTF-8 encoding</t>
          </li>
          <li>
            <t>Aggregation-Method Descriptor, drawn from the registry of <xref target="iana"/></t>
          </li>
          <li>
            <t>Merkle Root, constructed as in <xref target="merkle-construction"/></t>
          </li>
          <li>
            <t>Server-Recorded Divergence-Axis Set, possibly empty</t>
          </li>
          <li>
            <t><bcp14>OPTIONAL</bcp14> Override Record, present exactly where an Adversarial
Pre-Transmission Test failure was overridden</t>
          </li>
          <li>
            <t>Sealing-Key Identifier</t>
          </li>
          <li>
            <t>Sealing Signature, a COSE_Sign1 by the reconciliation-server sealing key whose
payload is the CBOR array of this Output with the Sealing Signature position
alone encoded as CBOR null, so that it covers every other field including the
Sealing-Key Identifier</t>
          </li>
        </ul>
        <t>The Reconciliation Event Identifier is a 16-octet value drawn from a
cryptographically secure random source at the start of a reconciliation, unique
to that reconciliation across the life of the deployment.</t>
        <t>The Reconciliation Identifier is the Claim Hash concatenated with the
Policy-Version Hash concatenated with the Reconciliation Event Identifier.</t>
        <t>Earlier revisions omitted the third component, and the first two are both
reproducible functions of enumerated inputs. Two reconciliations over one claim
under one policy state therefore shared an identifier, and the protocol keys
three mechanisms on it that each assume it names one event:</t>
        <ul spacing="normal">
          <li>
            <t>A register's own read under <xref target="read-operations"/> is keyed on the Reconciliation
Identifier, and exists so that a server cannot discard a register's signed
<tt>match</tt> and record <tt>register-unresponsive</tt> while the only party holding the
contradicting artefact has no operation with which to produce it. Where two
reconciliations shared the identifier, a server could record the register's
<tt>match</tt> in the first and suppress it in the second, and serve the first to the
register's audit read. The register sees its answer faithfully recorded and
the suppression is invisible.</t>
          </li>
          <li>
            <t>The Query Binding of <xref target="partial-attestation"/> carries the Reconciliation
Identifier so that an attestation is admissible only into the reconciliation
that elicited it. Every element of that preimage was identical across the two,
so an attestation elicited in the first verified unchanged inside the second.</t>
          </li>
          <li>
            <t>The Non-Answer Statement carries it so that a refusal elicited in one
reconciliation is not admissible as a refusal in another over the same subject
and predicate -- which, under unchanged policy, is precisely when the
identifier repeated.</t>
          </li>
        </ul>
        <t>The three protections were each written against the same assumption and the
assumption was not established anywhere. A retroactive supersession under a
Source-Data Version trigger leaves the policy state unchanged by definition, so
the identifier repeated on the path the document itself constructs, not only on
one a requester might contrive. The Event Identifier is what the three
mechanisms were already relying on.</t>
        <t>It is carried in the Output as its own field, so it is inside the Reconciliation
Hash preimage: two reconciliations that address no register and are sealed in
the same second would otherwise produce one Reconciliation Hash, which is the
ledger index and the retrieval key, and no field distinguishing them.</t>
        <t>The Event Identifier is not a secret and carries no requester-supplied content.
It is random rather than a counter so that it discloses nothing about
reconciliation volume to a register or to a relying party, and 16 octets rather
than 32 because it needs only uniqueness within a deployment.</t>
        <t>The Claim Hash binds the Output to the question it answers. Without it a relying
party receives a Combined Verdict with nothing to attribute it to, and the
Retroactive Evaluation Subsystem has no key to select on.</t>
        <t>The Verdict Arithmetic and its parameters are carried because a relying party
cannot otherwise reproduce the combination from the Per-Register Result Set, and
because <xref target="verdict-retyping"/> turns on which values the operator admits. The
Applicable-Regimes Set is a Canonical Claim field and is not itself carried in
the Output, so naming the operator without its parameters would leave
threshold-count and source-class-quorum irreproducible. <tt>source-class-quorum</tt> is
threshold-count evaluated per class and therefore takes a threshold as well as a
partition; carrying the partition alone would leave it as irreproducible as
carrying neither, which an earlier revision did.</t>
        <t>Each entry of the Per-Register Result Set comprises:</t>
        <ul spacing="normal">
          <li>
            <t>Register Identifier</t>
          </li>
          <li>
            <t>Answer State, either <tt>answered</tt> or <tt>not-answered</tt></t>
          </li>
          <li>
            <t>Attested Verdict, present exactly where the Answer State is <tt>answered</tt></t>
          </li>
          <li>
            <t>Non-Answer Reason of <xref target="no-answer"/>, present exactly where the Answer State is
<tt>not-answered</tt></t>
          </li>
          <li>
            <t>Effective Verdict, present exactly where the Answer State is <tt>answered</tt>, being
the Attested Verdict or its re-typing under <xref target="verdict-retyping"/></t>
          </li>
          <li>
            <t>Re-Typing Ground, drawn from the registry of <xref target="iana"/>, present exactly where
the Attested and Effective Verdicts differ</t>
          </li>
          <li>
            <t>Policy-Version Hash as echoed by that register, present exactly where the
Answer State is <tt>answered</tt></t>
          </li>
          <li>
            <t><bcp14>OPTIONAL</bcp14> Divergence-Axis Field, as attested by that register</t>
          </li>
          <li>
            <t><bcp14>OPTIONAL</bcp14> Source-Data Version Identifier Set, as attested by that register</t>
          </li>
          <li>
            <t>Projection Record, comprising the Narrowed-From field of the Per-Register
Claim Projection where a projection was transmitted, the Applied-Parameter
Set the register reported where the Answer State is <tt>answered</tt>, and the
Subject Mapping Record of <xref target="subject-mapping"/>; required
wherever a projection was transmitted and either the projection narrowed or
the Profile Parameter Set was non-empty</t>
          </li>
          <li>
            <t>Query Binding Record, present exactly where the Answer State is <tt>answered</tt>,
comprising the Projected Predicate, the Subject Reference and the
Reconciliation Nonce the server transmitted, and the register's signed Partial
Attestation</t>
          </li>
          <li>
            <t>Non-Answer Statement, present exactly where the Answer State is <tt>not-answered</tt>
and the Non-Answer Reason is register-attested under <xref target="no-answer"/>, comprising
the Projected Predicate, the Subject Reference and the Reconciliation Nonce the
server transmitted, and the register's signature over them together with the
reason and the Reconciliation Identifier, as <xref target="no-answer"/> constructs it. The
three projection values are carried here as well as in the Query Binding Record
because the two are never both present and a verifier of either needs the
preimage in the artefact it holds.</t>
          </li>
        </ul>
        <t>Each member of the Server-Recorded Divergence-Axis Set is a two-element array of
a Divergence Axis and the Register Identifier it concerns, the second element
being CBOR null where the axis concerns the reconciliation as a whole. Members
are sorted in bytewise lexicographic order of that encoding. A uniform two-element
member with an explicit null, rather than a member that is sometimes a pair and
sometimes a scalar, is what makes the Set's contribution to the Reconciliation
Hash determinate. Of the axes recorded by the server,
<tt>freshness-stale</tt> and <tt>declared-not-determined</tt> are per-register and <bcp14>MUST</bcp14> carry
a Register Identifier. <tt>source-version-skew</tt> is a relation between two or more
registers, and one member <bcp14>MUST</bcp14> be added for each register involved, so that the
set is a determinate function of the inputs rather than a choice between them; <tt>register-threshold-divergence</tt>
concerns the reconciliation and <bcp14>MUST NOT</bcp14>. <tt>agent-action-scope-divergence</tt> is
likewise a relation, between two capsules rather than between two registers, and
one member <bcp14>MUST</bcp14> be added for each Register Identifier whose contribution the
divergence concerns, or a single member carrying null where it concerns no
register's contribution; the rule is stated for all five axes and not four
because the Set is inside the Reconciliation Hash preimage, so an axis whose
member form is left open gives one reconciliation two ledger indices.
Recording a bare axis over five
addressed registers would state that something was stale without stating what,
which is not reproducible.</t>
        <t>The Set is a set rather than a single value: a reconciliation may be qualified
on more than one axis, and an encoding admitting only one would force an
implementation to choose between them silently.</t>
        <t>A Reconciliation Output is encoded as a CBOR array in the field order of this
section, an absent <bcp14>OPTIONAL</bcp14> or conditionally absent field encoded as CBOR null so
that position is preserved and the array's length is fixed. The Per-Register
Result Set is an array of arrays, each in the field order enumerated above, under
the same rule. The order is normative because the Reconciliation Hash is taken
over it, and because a CBOR map would be re-sorted into bytewise lexicographic
key order under Section 4.2.1 of <xref target="RFC8949"/>, which would override it.</t>
        <t>The Reconciliation Hash is the SHA-256 digest over that same CBOR array with the
Sealing-Key Identifier and Sealing Signature positions encoded as CBOR null. The
array's length is unchanged: "excluding" means null-substitution at fixed
positions and <bcp14>MUST NOT</bcp14> be implemented as truncation, because a shorter array
carries a different CBOR array header and therefore a different digest, and two
implementations reading "excluding" the two ways would never agree on a ledger
index. It is the value recorded in the Settlement-Layer Ledger, the value a
Post-Seal Evaluation Record references, and the retrieval key of
<xref target="ledger-read"/>.</t>
        <t>Determinism under Section 4.2.1 of <xref target="RFC8949"/> fixes how a given value is
encoded. It does not fix which CBOR type a field takes, nor the order of
elements within a field that is a set. The Reconciliation Hash is the ledger
index of <xref target="settlement-ledger"/>, the retrieval key of <xref target="ledger-read"/>, and a
value <xref target="request-binding"/> has the requester compute over an Output it has just
been handed, so two parties compute it independently and <bcp14>MUST</bcp14> obtain the same
value. The types are therefore fixed here, as <xref target="bra-hash"/> fixes them for the
Agreement Hash and <xref target="iana"/> fixes them for a Ledger entry.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">CBOR encoding</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Reconciliation Event Identifier</td>
              <td align="left">byte string of 16 octets</td>
            </tr>
            <tr>
              <td align="left">Reconciliation Identifier</td>
              <td align="left">byte string of 80 octets, the Claim Hash followed by the Policy-Version Hash followed by the Reconciliation Event Identifier</td>
            </tr>
            <tr>
              <td align="left">Claim Hash, Policy-Version Hash, Merkle Root</td>
              <td align="left">byte string of 32 octets</td>
            </tr>
            <tr>
              <td align="left">Reconciliation Timestamp, Reliance Horizon</td>
              <td align="left">text string, in the form fixed below</td>
            </tr>
            <tr>
              <td align="left">Combined Verdict</td>
              <td align="left">text string, one of the four values of <xref target="terminology"/></td>
            </tr>
            <tr>
              <td align="left">Verdict Arithmetic and its parameters</td>
              <td align="left">two-element array: the operator identifier as a text string, and its parameters as an array, empty for conjunction and disjunction, a one-element array of the threshold as an unsigned integer for threshold-count, and a two-element array of the source-class partition and the per-class threshold for source-class-quorum</td>
            </tr>
            <tr>
              <td align="left">source-class partition</td>
              <td align="left">array of two-element arrays of the class identifier as a text string and the sorted array of Register Identifiers in that class, the outer array sorted by class identifier</td>
            </tr>
            <tr>
              <td align="left">Addressed-Registers Identifier Set</td>
              <td align="left">array of Authority Origins as text strings, sorted as <xref target="reconciliation-output"/> states</td>
            </tr>
            <tr>
              <td align="left">Bilateral-Register-Agreement Hash Set</td>
              <td align="left">array of 32-octet byte strings, deduplicated, sorted</td>
            </tr>
            <tr>
              <td align="left">Pattern-Library Version Identifier</td>
              <td align="left">text string</td>
            </tr>
            <tr>
              <td align="left">Requester-Binding Class</td>
              <td align="left">text string</td>
            </tr>
            <tr>
              <td align="left">Aggregation-Method Descriptor</td>
              <td align="left">text string</td>
            </tr>
            <tr>
              <td align="left">Audience Set, Per-Register Result Set, Server-Recorded Divergence-Axis Set</td>
              <td align="left">array of arrays, each member in the field order its own section enumerates</td>
            </tr>
            <tr>
              <td align="left">Override Record</td>
              <td align="left">array in the field order of <xref target="adversarial-test"/>, or null</td>
            </tr>
            <tr>
              <td align="left">Sealing-Key Identifier</td>
              <td align="left">two-element array of the Authority Origin as a text string and the JWK thumbprint as a text string</td>
            </tr>
            <tr>
              <td align="left">Sealing Signature</td>
              <td align="left">byte string, the serialised COSE_Sign1, or null in a preimage</td>
            </tr>
            <tr>
              <td align="left">Register Identifier</td>
              <td align="left">text string</td>
            </tr>
            <tr>
              <td align="left">Answer State, Attested Verdict, Effective Verdict, Non-Answer Reason, Re-Typing Ground, Subject Mapping Descriptor</td>
              <td align="left">text string</td>
            </tr>
            <tr>
              <td align="left">Divergence-Axis Field</td>
              <td align="left">array of two-element arrays of the axis identifier as a text string and its Register Identifier or null, sorted by the deterministic encoding of the member</td>
            </tr>
            <tr>
              <td align="left">Query Binding Record, Non-Answer Statement, Projection Record</td>
              <td align="left">array in the field order its own section enumerates, or null</td>
            </tr>
          </tbody>
        </table>
        <t>The Bilateral-Register-Agreement Hash Set is deduplicated because two addressed
registers may be governed by one Agreement, and an implementation that carried
the digest twice and one that carried it once would compute two Policy-Version
Hashes and two Reconciliation Hashes from identical inputs.</t>
        <t>Every timestamp this document places inside a digest preimage or a signature
payload <bcp14>MUST</bcp14> be expressed in the form <tt>YYYY-MM-DDTHH:MM:SSZ</tt>: <xref target="RFC3339"/> with the
<tt>Z</tt> designator rather than a numeric offset, and with no fractional seconds.
<xref target="RFC3339"/> admits several renderings of one instant, and a preimage that admits
several renderings admits several digests.</t>
        <t>CBOR rather than <xref target="RFC8785"/>: the mandatory-to-implement encoding for a
Reconciliation Output is CBOR, and several of its fields are byte strings, for
which JSON has no type. Digesting a JSON rendering of it would require a
CBOR-to-JSON mapping this document does not define, and two implementations
would produce different ledger indices. The Canonical Claim is serialised under
<xref target="RFC8785"/> and that serialisation is carried as one element of the CBOR array
the Claim Hash is taken over; the Reconciliation Output is CBOR throughout.</t>
        <t>A Reconciliation Output is immutable once sealed. Conditions arising after
sealing are recorded under <xref target="post-seal"/> and <bcp14>MUST NOT</bcp14> be represented as fields
of the Reconciliation Output.</t>
      </section>
      <section anchor="entitlement">
        <name>Output Entitlement and Delivery</name>
        <t>The Reconciliation Output is the confidential artefact of this protocol and the
Settlement-Layer Ledger is its public one. An Output carries subject references,
register-signed Partial Attestations and principal identifiers; a Ledger entry carries digests, register origins and structural
metadata, and no claim, register-record or principal content. Every rule in this
document about who may see what rests on that division, and they are not
interchangeable. A party admitted to a Ledger read learns nothing of the subject
or the answer. A party holding an Output already holds the content of
one reconciliation, and admitting it to reads about that same reconciliation
discloses nothing it does not have.</t>
        <t>Earlier revisions had no answer to who may hold an Output. It was a bearer
artefact: possession was the whole of the entitlement, it never expired, and
every read predicate this document attempted was expressed in terms of a
Requester-Binding that the reader could not present and the Ledger could not
evaluate. This section supplies the missing term.</t>
        <section anchor="audience">
          <name>Audience</name>
          <t>A Reconciliation Output carries an Audience Set of zero or more Audience Members,
encoded as a CBOR array which is empty only in the case described below.
Each Audience Member comprises:</t>
          <ul spacing="normal">
            <li>
              <t>an Audience Member Identifier: a URI, in the same identifier space a
Requester-Binding uses for an accountable principal, encoded as a CBOR text
string. Two Audience Member Identifiers are equal where they do not differ
after normalisation under Sections 6.2.2 and 6.2.3 of <xref target="RFC3986"/>; comparison
is over the normalised form and is otherwise bytewise, and an implementation
<bcp14>MUST</bcp14> encode the normalised form rather than normalise on receipt, for the
reason <xref target="terminology"/> gives for an Authority Origin. It is a sort key inside
the Audience Set and so inside the Reconciliation Hash preimage, the first
element of every Witness Entry and so inside the Agreement Hash, and the
equality target of the quorum rule of <xref target="quorum-rule"/>; the same treatment is
given to an Operating-Party Identifier and was not given here</t>
            </li>
            <li>
              <t>a Verification Method Reference: the JWK thumbprint, computed as in
<xref target="RFC7638"/>, of the public key under which that member signs a read request
under <xref target="ledger-read"/>. It <bcp14>MUST</bcp14> be a durable key and <bcp14>MUST NOT</bcp14> be a session
credential or a one-time request signature, because the member has to present
it long after the reconciliation is over</t>
            </li>
          </ul>
          <t>Audience Members are sorted in bytewise lexicographic order of the deterministic
CBOR encoding of the Audience Member Identifier, and each member is encoded as a
two-element array in the field order above. Ordering is stated because the
Audience Set is inside the Reconciliation Hash preimage, and an unordered set
would give one Output as many hashes as it has permutations.</t>
          <t>The server <bcp14>MUST NOT</bcp14> require proof of possession from a named member at
reconciliation time -- the member is typically not present -- and naming one is
therefore an assertion by the Requesting Principal, not a fact about the member.
Two consequences follow and are stated so that neither surprises. Naming a party
places a row in that party's <tt>GET /arp/outputs</tt> enumeration and in the server's
access log that the party did not ask for, so a deployment <bcp14>SHOULD</bcp14> constrain who
may be named through the audience constraint below and through the enrolment
requirement of <xref target="request-binding"/>. And a member that loses or
rotates the key its thumbprint names loses entitlement to every Output that names
it, permanently, because the Audience Set cannot be amended after sealing; a
member that expects to rely on Outputs over time <bcp14>SHOULD</bcp14> be named by a thumbprint
of a key held for that purpose.</t>
          <t>The Requesting Principal is an Audience Member of every Output performed on its
behalf where it can be identified: by its accountable-principal identifier where
the Requester-Binding carries one, and otherwise as below. Where it does not -- classes <tt>agent-unverified</tt>
and <tt>agent-key-verified</tt> -- the Set carries a member whose Identifier is the URI
form of the verified signing key's thumbprint. Every requester signs, by
<xref target="read-signing"/>, so there is always a key to name and an Audience Set is never
empty.</t>
          <t>Further members are named in the reconciliation request, are enumerated inputs
for the purposes of <xref target="architecture"/>, and are sealed with the rest of the
Output. The Audience Set <bcp14>MUST NOT</bcp14> be enlarged after sealing; naming a
further member requires a new reconciliation, which is a new question and gets a
new answer.</t>
          <t>A Bilateral Register Agreement <bcp14>MAY</bcp14> declare an audience constraint: a maximum
cardinality, a permitted class of member, or both. Where the Audience Set exceeds
the constraint an addressed register declares, the reconciliation server <bcp14>MUST NOT</bcp14>
transmit a projection to that register and <bcp14>MUST</bcp14> record
<tt>audience-constraint-exceeded</tt> as its Non-Answer Reason. It <bcp14>MUST NOT</bcp14> refuse the
reconciliation, and <bcp14>MUST NOT</bcp14> quietly drop the register: the first leaves no
artefact stating why, and the second is the addressed-register-cherry-picking
<xref target="no-answer"/> exists to prevent. The reconciliation is sealed and, by
<xref target="verdict-arithmetic"/>, cannot reach a decisive Combined Verdict.</t>
          <t>The requester is not a party to any Bilateral Register Agreement and cannot read
the constraint, so it learns the cap from the reason recorded against that
register rather than by inspection. A register that attests about a subject is
entitled to bound how widely that attestation travels, and a constraint enforced
after transmission would be enforced too late. The constraint is enforced by the
reconciliation server on the register's behalf and the register cannot verify
that enforcement from any artefact this document defines; a register that requires
assurance of it should negotiate an audit right in its agreement.</t>
          <t>A party <bcp14>MUST NOT</bcp14> be treated as entitled to a Reconciliation Output by possession
alone. A relying party that has been handed an Output and is not an Audience
Member of it <bcp14>MAY</bcp14> verify its Sealing Signature and read its Combined Verdict --
nothing prevents this, and the signature is what makes the Output worth handing
on -- but it obtains no read under <xref target="ledger-read"/>, learns nothing of
supersession or post-seal evaluation, and <bcp14>MUST NOT</bcp14> treat the verdict as current.
Reliance without entitlement is reliance on a snapshot of unknown age.</t>
        </section>
        <section anchor="reliance-horizon">
          <name>Reliance Horizon</name>
          <t>A Reconciliation Output carries a Reliance Horizon: a time in the form of
<xref target="reconciliation-output"/>, being the Reconciliation Timestamp advanced by the
reliance interval the reconciliation server resolves from the policy-epoch store
of <xref target="sealing"/>, keyed on the predicate and the regimes the claim names, exactly
as it resolves the Verdict Arithmetic under <xref target="verdict-arithmetic"/>. A requester
able to set its own reliance interval could set its own staleness window, which
is the same defect as choosing its own Verdict Arithmetic. After that time an Audience
Member <bcp14>MUST NOT</bcp14> treat the Combined Verdict as current without having read the
Continuation entries for its Reconciliation Hash under <xref target="ledger-read"/> and found
no supersession.</t>
          <t>The Horizon does not invalidate the Output and does not weaken the Sealing
Signature: what was sealed remains true of the moment it was sealed. It bounds
reliance, not validity. A sanctions <tt>no-match</tt> is a statement about consolidated
lists as they stood, and those lists change on a daily cadence
(<xref target="profile-sanctions"/>); an artefact that asserted such a verdict indefinitely
and carried no marker of its own staleness would be relied upon indefinitely,
which is the failure <xref target="retroactive"/> exists to prevent and could not, having no
way to reach the party that had relied.</t>
          <t>The Reliance Horizon is derived from the Reconciliation Timestamp and is
therefore outside the reproducibility requirement of <xref target="architecture"/> on the same
ground.</t>
        </section>
        <section anchor="delivery">
          <name>Delivery</name>
          <t>The reconciliation server <bcp14>MUST</bcp14> return the sealed Reconciliation Output to the
Requesting Principal in the response to the request that commissioned it, in the
form <xref target="request-binding"/> states. Where the Adversarial Pre-Transmission Test emitted
a Remediation Advisory, the server returns that Advisory and no Output. <xref target="request-binding"/> enumerates the
responses to a commissioning request. A refusal under <xref target="containment"/> or an
audience constraint under <xref target="audience"/> is not among them: those refuse a register
and not the reconciliation, so an Output is produced and delivered, carrying the
reason against the register it concerns.</t>
          <t>That the server returns the Output is stated because nothing in earlier revisions
did. The document specified in detail what an Output contains, how it is sealed,
digested, ledgered and notarised, and never that any party receives one. Every
discovery path in this document begins with a party holding a Reconciliation
Hash, and it holds one because of this paragraph.</t>
          <t>An Audience Member other than the Requesting Principal is not delivered to. It
retrieves under <xref target="ledger-read"/>: the server has no channel to a party it has
never spoken to, and pushing a confidential artefact to an address named by
somebody else is not a mechanism this protocol should define.</t>
          <t>The Reconciliation Hash is the retrieval key and is not reproducible across runs
(<xref target="architecture"/>), so a party that has discarded it cannot recompute it, and the
Reconciliation Identifier is no help because the Claim Hash within it is blinded
under <xref target="sealing"/> and cannot be computed outside the deployment. The server <bcp14>MUST</bcp14>
therefore also answer the enumeration of <xref target="ledger-read"/>, returning to an
authenticated principal the Reconciliation Hashes of the Outputs whose Audience
Set names it. Without it, an Audience Member that has lost a 32-byte value has
lost every entitlement this section grants it, permanently and silently.</t>
          <t>The server <bcp14>MUST</bcp14> retain each sealed Output, and <bcp14>MUST</bcp14> answer reads of it and of its
Continuation entries, for the retention period, which is the LONGEST period any
Bilateral Register Agreement addressed by that reconciliation declares, and in no
case ending before the Reliance Horizon advanced by one further reliance
interval. Where two agreements declare different periods the longest governs. That
direction is specific to a retention period, which is a floor: the shortest
declaration would let one register's agreement extinguish another's.</t>
          <t>Wherever else this document takes a value from a plural set of agreements, the
direction is the one that makes the obligation stricter, and it is stated at each
site. For every interval that bounds a deadline -- the ledger-head notarisation
interval of <xref target="settlement-ledger"/>, and the Evaluation Sweep and supersession
deadlines measured against it -- the SHORTEST declaration governs. Taking the
longest there would let one permissive agreement postpone every deadline for
every other register, which inverts the obligation instead of strengthening it.
For the read rate limit of <xref target="read-errors"/>, the most permissive declaration
governs, a rate limit being a ceiling on the server's refusals rather than on its
duties.</t>
          <t>The extra interval matters. <xref target="reliance-horizon"/> requires an Audience Member to
read before relying past the Horizon, and entitlement is evaluated against the
Audience Set of the retained Output; a retention floor that ended exactly at the
Horizon would permit the server to discard the basis of that evaluation at the
moment the obligation begins, and the member would receive the <tt>404</tt> of
<xref target="read-errors"/> -- indistinguishable, by design, from never having been
entitled.</t>
        </section>
      </section>
      <section anchor="sealing">
        <name>Policy-Version-Hash Sealing</name>
        <t>The Policy-Version Hash <bcp14>MUST</bcp14> commit to:</t>
        <ol spacing="normal" type="1"><li>
            <t>Reconciliation rules</t>
          </li>
          <li>
            <t>Threshold parameters</t>
          </li>
          <li>
            <t>Pattern-Library Version Identifier</t>
          </li>
          <li>
            <t>Applicable-Regimes precedence</t>
          </li>
          <li>
            <t>Verdict-Arithmetic selection, together with every parameter that operator
takes</t>
          </li>
          <li>
            <t>The reliance interval from which the Reliance Horizon of
<xref target="reliance-horizon"/> is computed</t>
          </li>
          <li>
            <t>Agent-IFF policy identifier and the Requester-Binding</t>
          </li>
          <li>
            <t>Bilateral-Register-Agreement Hashes of the addressed registers</t>
          </li>
        </ol>
        <t>The Policy-Version Hash is the SHA-256 digest over the deterministically encoded
CBOR array</t>
        <artwork>
["arp-policy-version-v1", Deployment Blinding Value,
 reconciliation rules identifier, threshold parameters,
 Pattern-Library Version Identifier, applicable-regimes precedence,
 [Verdict Arithmetic, its parameters], reliance interval,
 Agent-IFF policy identifier, Requester-Binding,
 Bilateral-Register-Agreement Hash Set]
</artwork>
        <t>in that order, the Hash Set sorted in bytewise lexicographic order of the digests
and every other composite element a CBOR array in the order this section states
it. It <bcp14>MUST</bcp14> be reconstructible under audit from that array, held in the
policy-epoch store. A value every addressed register echoes and every auditor
recomputes cannot be left to "a canonical policy state", which earlier revisions
were content with and which is not a preimage.</t>
        <t>The Claim Hash and the Policy-Version Hash <bcp14>MUST</bcp14> each be computed over a preimage
that includes the Deployment Blinding Value: a secret of at least 128 bits drawn
once from a cryptographically secure random source, persisted in the
policy-epoch store, constant for the life of the deployment, and disclosed
outside the policy-epoch store only as <xref target="audit-path"/> provides. <xref target="audit-path"/>
discharges an auditor's need as far as it can without disclosing the constant
that blinds every digest in the deployment, and states what that leaves
unverified.</t>
        <t>It is constant rather than per-claim, and that is what makes it compatible with
the rest of this document. The Claim Hash remains a deterministic function of
the canonical claim fields within a deployment, so it remains usable as the
Settlement-Layer Ledger index and as the retroactive-evaluation key, and the
reproducibility requirement of <xref target="architecture"/> continues to hold: the same
deployment given the same enumerated inputs produces the same digests. What
changes is that the preimage is no longer guessable from outside the deployment.
A per-claim random value would defeat all three properties.</t>
        <t>Both digests are otherwise taken over low-entropy preimages: a subject
identifier is typically a company number of ten or so digits, a predicate is
drawn from a published taxonomy, and the accountable principal, agent-IFF policy
identifier and verdict arithmetic are each drawn from small enumerable sets
within one deployment. Both digests then appear where adversaries can reach
them -- the Policy-Version Hash in the protected header of every notarised
Signed Statement and in every reconciliation entry of the Ledger, the Claim Hash
in the Output and in every Ledger entry of either kind. Without blinding, anyone holding either can recover by exhaustive search
the subject that was investigated and the principal that commissioned the
reconciliation, which is the disclosure this protocol exists to prevent.
Blinding does not weaken reconstructibility under audit, since the Blinding
Value is persisted with the state it blinds.</t>
        <t>A register receives the same Policy-Version Hash as every other addressed
register, by <xref target="projection"/>. The Blinding Value prevents two colluding registers
from recovering the Addressed-Registers Identifier Set from it by search; that
they can observe they were addressed together is inherent and is discussed in
<xref target="side-channel"/>.</t>
        <t>Equality is a different matter from inversion. The Requester-Binding is an
element of the preimage and every other element is fixed by policy and by the
addressed register set, so one requester asking repeatedly about different
subjects presents every addressed register with the same Policy-Version Hash. A
register cannot recover who that requester is, and can group every reconciliation
that requester commissioned against it. Two registers addressed together can join
their traffic on the same value, as can any reader of the notarised Signed
Statements, in which the hash appears in the protected header. That is a stable
requester pseudonym, disclosed to parties <xref target="containment"/> otherwise limits to the
Requester-Binding Class, and reasoning about the preimage's resistance to search
says nothing about it: a correlation handle does not need to be inverted to work.</t>
        <t>A deployment for which that is unacceptable <bcp14>MUST</bcp14> substitute, in the seventh
element, a digest over the Requester-Binding and the Reconciliation Identifier.
The Policy-Epoch Store holds both, so an auditor can still reconstruct the
preimage, and the element then varies per reconciliation and carries no
cross-reconciliation handle. It is stated as a deployment choice rather than a
requirement because the constant form is what lets a register recognise a
returning counterparty under a bilateral agreement, which some deployments need
and others must not have. Discussed further in
<xref target="side-channel"/>.</t>
      </section>
      <section anchor="post-seal">
        <name>Post-Seal Evaluation Records</name>
        <t>Two conditions arise after a Reconciliation Output has been sealed and therefore
cannot be fields of it, and are not Divergence Axes: a Divergence Axis qualifies
a verdict, and these qualify an operation performed on an Output that is already
immutable.</t>
        <ul spacing="normal">
          <li>
            <t><tt>notarisation-incomplete</tt>, where notarisation under <xref target="scrapi-binding"/> neither
completed nor was refused within the polling bound.</t>
          </li>
          <li>
            <t><tt>attribution-indeterminate</tt>, where a Retroactive Evaluation could not
determine whether a material change arose from a change in policy state or
from a change in Source-Data Version.</t>
          </li>
        </ul>
        <t>Each is recorded in a Post-Seal Evaluation Record comprising:</t>
        <ul spacing="normal">
          <li>
            <t>the Reconciliation Hash of the Output it concerns</t>
          </li>
          <li>
            <t>the Post-Seal Evaluation Qualifier, drawn from the registry of <xref target="iana"/></t>
          </li>
          <li>
            <t>the Policy-Version Hash and Pattern-Library Version Identifier in force at
the time of the evaluation, which may differ from those the Output was sealed
under</t>
          </li>
          <li>
            <t>a Post-Seal Evaluation Timestamp, in the form of <xref target="reconciliation-output"/></t>
          </li>
          <li>
            <t>an Attribution Account, present exactly where the Qualifier is
<tt>attribution-indeterminate</tt>: a text string stating which of the two candidate
causes were examined and why neither could be excluded. A bare qualifier would
be a discretionary escape signed by the party that benefits from it</t>
          </li>
          <li>
            <t>a Sealing-Key Identifier</t>
          </li>
          <li>
            <t>a signature by the reconciliation-server sealing key, a COSE_Sign1 whose
payload is the CBOR array of this record with the signature position encoded as
CBOR null</t>
          </li>
        </ul>
        <t>A Post-Seal Evaluation Record is encoded as a CBOR array in the field order
above, an absent conditionally-absent field encoded as CBOR null so that position
is preserved. The Post-Seal Evaluation Record Hash of <xref target="settlement-ledger"/> is the Signing
Input Digest of that record's signature. Earlier revisions took it over the
array in its entirety with the signature included, on the ground that the digest
should be over the artefact as served under <xref target="ledger-read"/>. That ground does
not hold: under a signature primitive whose encoding is not byte-unique the
artefact as served is not one byte-string, and a digest over it names whichever
copy the reader was handed. <xref target="signature-malleability"/> states the measurement.</t>
        <t>A Post-Seal Evaluation Record <bcp14>MUST</bcp14> be retained by the reconciliation server for
the period of <xref target="delivery"/>, and a Continuation entry of type
<tt>continuation-post-seal-record</tt> <bcp14>MUST</bcp14> be appended to the Settlement-Layer Ledger
carrying the record's hash. The hash is not written into the entry that recorded
the reconciliation: that entry is already signed and the Ledger exposes no
UPDATE. An Audience Member of the Output discovers the record by reading the
Continuation entries for its Reconciliation Hash under <xref target="ledger-read"/> and
retrieves it by its hash under the same binding. The record travels as the
<tt>result</tt> element of the signed read response of <xref target="read-responses"/>; the media
type registered for the record labels it wherever it is carried outside that
envelope, and the Post-Seal Evaluation Record Hash is taken over the record
itself and not over the response that carried it. A record emitted but not appended would be undiscoverable, which would
make the attribution safety valve of <xref target="source-versioning"/> unreachable in exactly
the case it exists for.</t>
        <t>A Post-Seal Evaluation Record <bcp14>MUST NOT</bcp14> alter the Reconciliation Output it
references, and a relying party <bcp14>MUST NOT</bcp14> treat the existence of one as
invalidating that Output. A Reconciliation Output whose notarisation is
incomplete remains valid under its Sealing Signature.</t>
        <t>Where a Sovereign Re-Notification is emitted under <xref target="retroactive"/> for a
material change, the notification <bcp14>MUST</bcp14> state whether the change arose from
policy state or from Source-Data Version, and where it cannot, a Post-Seal
Evaluation Record carrying <tt>attribution-indeterminate</tt> <bcp14>MUST</bcp14> be emitted and
referenced by the notification.</t>
      </section>
      <section anchor="settlement-ledger">
        <name>Settlement-Layer Ledger</name>
        <t>The Ledger carries two kinds of entry. A reconciliation entry records a sealed
Reconciliation Output. A Continuation entry records a fact that arose after that
Output was sealed and therefore could not be a field of it. Every entry carries
an Entry Type drawn from the registry of <xref target="iana"/>, and the Entry Type determines
which further fields the entry carries. An entry whose Entry Type is not
<tt>reconciliation</tt> is a Continuation entry. Without a discriminator a verifier
reading an entry cannot tell which field list to apply, and an entry legitimately
lacking a field would be indistinguishable from one that is malformed.</t>
        <t>Every entry, of either kind, comprises these fields and in this order:</t>
        <ul spacing="normal">
          <li>
            <t>Entry Sequence Number, a strictly increasing integer with no gaps: the first
entry of a chain is 1 and each subsequent entry is its predecessor's plus one.
Contiguity is required because the consistency read of <xref target="read-operations"/>
cannot otherwise distinguish a sequence number the operator never allocated
from one it is refusing to answer for, the two being the same <tt>404</tt> by
<xref target="read-errors"/></t>
          </li>
          <li>
            <t>Entry Type, from the ARP Ledger Entry Types registry of <xref target="iana"/></t>
          </li>
          <li>
            <t>Claim Hash, the index of <xref target="architecture"/></t>
          </li>
          <li>
            <t>Reconciliation Hash of the Reconciliation Output the entry concerns</t>
          </li>
          <li>
            <t>Entry Timestamp (<xref target="RFC3339"/> UTC), the time at which the entry was appended</t>
          </li>
          <li>
            <t>Prior-Entry Hash, being the Signing Input Digest of the immediately preceding
entry's Entry Signature; in the first entry of a chain, which has no preceding
entry, thirty-two zero octets. It is taken over that entry's signing input and
not over the entry as served, so that a reader handed any byte-string carrying
that entry's signature computes one value. It still commits to every field of
the preceding entry, including that entry's Self-Entry Hash, and to the
Sealing-Key Identifier and the algorithm identifier in the protected header,
because the <tt>Sig_structure</tt> covers all of them</t>
          </li>
        </ul>
        <t>followed by the type-specific fields enumerated below, followed by:</t>
        <ul spacing="normal">
          <li>
            <t>Self-Entry Hash, being the SHA-256 digest over the CBOR array of this same
entry with the Self-Entry Hash and Entry Signature positions encoded as CBOR
null, encoded under the Core Deterministic Encoding Requirements of Section
4.2.1 of <xref target="RFC8949"/>, so that the array's length is the length fixed by the
Entry Type and is the same array a verifier already holds. The encoding
requirement is stated here and not left to be inferred from
<xref target="cbor-cose"/>: without it a definite-length and an indefinite-length encoding
of one entry yield two Self-Entry Hashes, and the head comparison of this
section treats that as a fork, which obliges every reader of the second
encoding to act under <xref target="ledger-replication"/> against an operator that
equivocated about nothing</t>
          </li>
          <li>
            <t>Entry Signature, a COSE_Sign1 by the reconciliation-server sealing key whose
payload is the CBOR array of this same entry with the Entry Signature position
alone encoded as CBOR null -- so it covers every other field including the
Self-Entry Hash -- and whose protected header carries the Sealing-Key
Identifier that resolves it</t>
          </li>
        </ul>
        <t>An entry is encoded as a CBOR array in the field order of this section, an absent
field -- whether marked <bcp14>OPTIONAL</bcp14> or conditionally absent under a stated condition
-- encoded as CBOR null, so that position is preserved and the array's length is
fixed by the Entry Type. Absence <bcp14>MUST</bcp14> be encoded and <bcp14>MUST NOT</bcp14> be expressed by a
shorter array: two encodings of one entry would otherwise yield two Self-Entry
Hashes, which the head comparison of this section treats as a fork. The
order is normative because the Self-Entry Hash is taken over it; an encoding as a
CBOR map would be re-sorted by key under the Core Deterministic Encoding Requirements of Section 4.2.1 of <xref target="RFC8949"/> and would override it. A field whose value is itself a choice --
the second field of a <tt>continuation-notarisation</tt> entry -- is encoded as a
two-element array of a discriminant and a value, the discriminant being the CBOR
text string <tt>entry-id</tt> or <tt>refused</tt>.</t>
        <t>The Self-Entry Hash is enumerated after the type-specific fields so that it
covers them. Placing it before them would leave a Continuation entry's payload
outside it. The Prior-Entry Hash is taken over the preceding entry's signing input rather
than over that entry's Self-Entry Hash, so that the Sealing-Key Identifier and
the algorithm identifier under which that entry was signed are inside the chain.
Were the chain to link Self-Entry Hash to Self-Entry Hash, neither would be
covered by anything, and an operator could re-sign every historical entry under
a revoked or unresolvable key while every hash in the chain, and every head
already published and notarised, continued to verify.</t>
        <t>The signature bytes themselves are deliberately outside the chain, and this is
a change from earlier revisions, which took the Prior-Entry Hash over the whole
preceding entry so that Entry Signatures were inside it. That is not
recoverable: <xref target="signature-malleability"/> measures a primitive under which one
signing act has many verifying encodings, so a chain keyed on those bytes breaks
for a reader handed a different one. What the chain binds is the identity of the
signing act rather than the bytes of one encoding of it.</t>
        <t><strong>Two things earlier revisions detected are no longer detectable and are stated
here rather than left to be discovered.</strong> Stripping a historical Entry Signature
while leaving its protected header and payload intact moves no Prior-Entry Hash.
So does re-signing an entry under the same key and header. The Sealing-Key
Identifier and the algorithm remain covered, so a re-signature under a
<em>different</em> key or algorithm still moves the chain, which is the case the
paragraph above is about; a re-signature under the same key does not.</t>
        <t>An entry is signed exactly once. A second signature over the same fields is a
different entry, <bcp14>MUST NOT</bcp14> be appended at the same Entry Sequence Number, and <bcp14>MUST
NOT</bcp14> replace the first.</t>
        <t>Under the Prior-Entry Hash of this section that rule has no verifier-side test,
and saying so is better than implying one. A Signing Input Digest is a value per
signing input, not per signature, so two signings of one entry share it and
yield one chain and one head rather than the two divergent chains an earlier
revision relied on to make the violation visible. The rule is therefore an
operator obligation an Audit Identity under <xref target="audit-path"/> can examine and a
reader cannot, which is the price of the digest being stable under
<xref target="signature-malleability"/>, and is paid deliberately: a rule that is unenforceable
against an honest reader is better than a chain that breaks for one.</t>
        <t>The Entry Timestamp is distinct from the Reconciliation Timestamp. A
Continuation entry may be appended weeks after the reconciliation it concerns,
and an entry carrying only a Reconciliation Timestamp would state that the
notarisation, the post-seal evaluation or the supersession occurred at the
moment of the reconciliation, which is false in every case the mechanism exists
for.</t>
        <t>An entry whose Entry Type is <tt>reconciliation</tt> additionally comprises:</t>
        <ul spacing="normal">
          <li>
            <t>Policy-Version Hash</t>
          </li>
          <li>
            <t>Addressed-Registers Identifier Set, each member an Authority Origin, sorted in
bytewise lexicographic order of its UTF-8 encoding</t>
          </li>
          <li>
            <t>Aggregation-Method Descriptor</t>
          </li>
          <li>
            <t>Merkle Root</t>
          </li>
          <li>
            <t>Requester-Binding-Class Descriptor, one of the four classes enumerated in
the Requester Identity Binding and Agent Friend-or-Foe Gate section</t>
          </li>
          <li>
            <t>Reconciliation Timestamp, as sealed in the Reconciliation Output</t>
          </li>
          <li>
            <t><bcp14>OPTIONAL</bcp14> Source-Reconciliation-Output Identifier, being the Reconciliation
Hash of the Output this reconciliation supersedes, present exactly where it
supersedes one</t>
          </li>
          <li>
            <t>Override Indicator, true exactly where the Reconciliation Output carries an
Override Record under the Adversarial Pre-Transmission Test</t>
          </li>
        </ul>
        <t>An entry whose Entry Type is <tt>continuation-notarisation</tt> additionally comprises:</t>
        <ul spacing="normal">
          <li>
            <t>Transparency Service Identifier, being the Authority Origin of that service</t>
          </li>
          <li>
            <t>exactly one of the EntryID that service returned, or the HTTP status code by
which that service terminally refused registration</t>
          </li>
        </ul>
        <t>Only the status code is recorded, never a response body. A body is authored by
the Transparency Service, is unbounded, and routinely echoes submitted content;
writing one into an append-only log with no DELETE would put text this document
does not control inside a record that forbids claim and principal content in the
clear.</t>
        <t>A <tt>continuation-notarisation</tt> entry <bcp14>MUST</bcp14> be appended where notarisation
completes, and where the Transparency Service returns a status the implementation
resolves as a terminal refusal under <xref target="async-registration"/>. Where a
status cannot be so resolved -- the 404 of <xref target="async-registration"/> carries
two meanings and a service is not obliged to distinguish them -- it is not a
terminal refusal, and the reconciliation is treated as one whose polling bound
was exhausted. In that case no <tt>continuation-notarisation</tt> entry is appended and
the outcome is recorded under <xref target="post-seal"/> as <tt>notarisation-incomplete</tt>.
Requiring an entry only on failure would leave the successful case -- the case
the join exists for -- unrecorded.</t>
        <t>Where an implementation subsequently learns the EntryID of a registration it had
recorded as incomplete, it <bcp14>MUST</bcp14> append the <tt>continuation-notarisation</tt> entry
then. This document defines no means by which it would learn that:
<xref target="I-D.ietf-scitt-scrapi"/> retrieves by EntryID and the EntryID is precisely what
was not received, polling is bounded, and no callback is specified. A
<tt>notarisation-incomplete</tt> record will therefore usually stand permanently, and it
is evidence that registration did not complete within the polling bound and not
that it failed. That is open.</t>
        <t>An entry whose Entry Type is <tt>continuation-post-seal-record</tt> additionally
comprises:</t>
        <ul spacing="normal">
          <li>
            <t>Post-Seal Evaluation Record Hash</t>
          </li>
        </ul>
        <t>An entry whose Entry Type is <tt>continuation-supersession</tt> additionally comprises:</t>
        <ul spacing="normal">
          <li>
            <t>Material-Change Indicator, stating whether the Combined Verdict changed
materially within the meaning of <xref target="retroactive"/></t>
          </li>
          <li>
            <t>Superseding-Reconciliation Hash, being the Reconciliation Hash of the
Reconciliation Output that supersedes the one this entry concerns, present
exactly where a superseding Output was produced and absent where the
supersession is the revocation of a Verified Principal Credential under
<xref target="retroactive"/>, which supersedes an Output without producing another</t>
          </li>
          <li>
            <t>Superseding-Entry Sequence Number, being the Entry Sequence Number of the
reconciliation entry that records the superseding Output, present under the
same condition</t>
          </li>
        </ul>
        <t>No Continuation entry carries a retrieval URI. Every artefact a Continuation
entry points at is retrieved under <xref target="ledger-read"/>, by hash for a Post-Seal
Evaluation Record and by Reconciliation Hash for a superseding Output, from the
same authority origin that served the entry. Carrying a URI instead would oblige
every reader to dereference an operator-chosen address before it could check
anything -- a forced fetch, a de-blinding oracle correlating a reader's network
identity with one Reconciliation Hash, and a covert channel that no constraint on
the URI's content can close, since host selection and path structure carry the
signal without stating anything. It would also put a non-digest field in a Ledger
whose whole disclosure argument is that it holds digests.</t>
        <t>A Reconciliation Output produced by Retroactive Evaluation to supersede an
earlier Output <bcp14>MUST</bcp14> carry the Audience Set and the Requester-Binding Class of the
Output it supersedes. Without that rule the party entitled to learn that its
verdict had changed would be entitled to the entry saying so and not to the
Output that says what it changed to, and the traversal would end one step short.
Such an Output has no commissioning request and is not delivered under
<xref target="delivery"/>; it is retrieved.</t>
        <t>Where the superseding reconciliation addresses a register whose audience
constraint the inherited Audience Set exceeds -- which can happen, since the
superseding reconciliation may address registers the superseded one did not --
that register is recorded <tt>audience-constraint-exceeded</tt> under <xref target="no-answer"/> like
any other. The Audience Set is not truncated to fit: truncating it would strand
the party the supersession exists to notify, and the constraint is satisfied by
not obtaining that register's answer rather than by silencing the reader.</t>
        <t>A party retrieving a Post-Seal Evaluation Record <bcp14>MUST</bcp14> reconstruct the
<tt>Sig_structure</tt> of that record's signature from the protected header and the
payload of the retrieved COSE_Sign1, <bcp14>MUST</bcp14> verify that its Signing Input Digest
equals the Post-Seal Evaluation Record Hash carried in the entry, <bcp14>MUST</bcp14> verify
that signature under the Sealing-Key Identifier the record carries, and <bcp14>MUST</bcp14>
discard the record where either check fails. The hash does not cover the
signature bytes, so the signature check is not redundant and a record served
with a substituted, absent or garbage signature satisfies the digest check
alone. Without both checks the hash is decorative and an operator can serve a
different record to each audience, reopening at the record the equivocation the
Ledger closes at the entry.</t>
        <t>A Continuation entry carries no Policy-Version Hash, no Addressed-Registers
Identifier Set, no Aggregation-Method Descriptor, no Merkle Root and no
Requester-Binding-Class Descriptor. Those describe the reconciliation, which the
reconciliation entry already records and the Reconciliation Hash already binds;
carrying them a second time would create a second place for them to disagree. A
Continuation entry <bcp14>MUST</bcp14> carry the same Claim Hash and Reconciliation Hash as the
reconciliation entry it continues, and the storage interface layer <bcp14>MUST</bcp14> reject a
Continuation entry whose Reconciliation Hash matches no earlier reconciliation
entry, returning a rejection the appending subsystem can distinguish from a
transport failure. Because Entry Sequence Numbers are allocated in one sequence
and secondary stores replicate rather than originate, every store holds the
reconciliation entry against which the check is made.</t>
        <t>Prior-Entry and Self-Entry Hashes establish that no entry has been removed from
a chain; they do not establish that only one chain exists. Signing each entry
makes a second chain attributable rather than merely possible.</t>
        <t>A Reconciliation Output is sealed before it is notarised and so cannot itself
carry the EntryID, and the Ledger exposes no UPDATE, so the join cannot be made
by amending the original entry. It is made by appending. Without it a successful
notarisation would be unlinkable to the reconciliation from every side, since
retrieval is by EntryID and <xref target="I-D.ietf-scitt-scrapi"/> offers no query surface.</t>
        <t>A <tt>continuation-supersession</tt> entry <bcp14>MUST</bcp14> be appended against the superseded
Output on every supersession, whether or not the change is material. Where the
supersession produced a superseding Output, the superseding reconciliation entry
<bcp14>MUST</bcp14> also carry the Source-Reconciliation-Output Identifier naming what it
replaced, and the two records are inverse pointers over one relation. Where it
did not -- the revocation of a Verified Principal Credential -- there is no
superseding entry and no second record, and the Continuation entry stands alone.
The Material-Change Indicator distinguishes a material supersession from an
immaterial one in either case. <xref target="retroactive"/> imposes
the further obligation of a Sovereign Re-Notification where the change is
material; it does not condition the ledger record, which is written either way,
since a party relying on a superseded Output needs to know it was superseded
before it can be told the change was immaterial.</t>
        <t>Where both records exist they are inverse pointers over one relation and neither
substitutes for the other. A party holding the superseded Output cannot follow a pointer that
exists only on an entry it has not been returned, and a regulator whose scope
under <xref target="regulator-portal"/> covers the superseded reconciliation is not thereby
returned the superseding one, whose addressed registers and therefore whose
agreements may differ. The constraint is on what a reader is returned, not on
what a store holds.</t>
        <t>The Ledger <bcp14>MUST NOT</bcp14> store Canonical-Claim content, register records,
Partial-Attestation payloads, or any principal identifier in the clear; the
requester's accountable principal is committed only through the Policy-Version
Hash. The append-only constraint <bcp14>MUST</bcp14> be enforced at the storage interface layer. The
Ledger interface <bcp14>MUST</bcp14> expose APPEND and READ operations only, with no UPDATE and
no DELETE operation exposed or implemented. Retroactive Evaluation and the
derivation-chain invariant check are subsystems of the reconciliation server and
read the Ledger without scope restriction. Every read by a party outside the
reconciliation server is served under <xref target="ledger-read"/>, which states the
operations, the entitlement each requires, the response form, and the error
semantics. Three entitlements reach the Ledger: a regulator's, governed by
<xref target="regulator-portal"/>; an Audience Member's under <xref target="entitlement"/>; and an Audit
Identity's under <xref target="audit-path"/>. A Register
Operator holds the narrower entitlement of the consistency check below.</t>
        <t>An Audience Member is entitled to the Continuation entries carrying the
Reconciliation Hash of an Output that names it, and to the reconciliation entry
carrying that same Reconciliation Hash. It is entitled to no other entry. This is
the predicate earlier revisions could not express. It is evaluable, because the
Audience Set is a sealed field of the Output and the server retains the Output
under <xref target="delivery"/>; the Ledger is not asked to evaluate it, and could not, since
it stores no principal identifier in the clear. It admits the right party,
because entitlement follows the Output rather than the request, so a member the
Requesting Principal named at reconciliation time is admitted and a party that
merely came into possession of the artefact is not. And it survives the events
that broke its predecessors: an Audience Member's verification method is required
by <xref target="audience"/> to be presentable after the fact, and revocation of the
Requesting Principal's Verified Principal Credential does not remove the other
members of the Audience Set, so the supersession entry recording that revocation
has a reader.</t>
        <t>Where an Output's Audience Set is reduced to members that can no longer
authenticate -- a single-member Set whose sole member's credential has been
revoked -- its Continuation entries are reachable only through the Regulator
Portal. The reconciliation <bcp14>MUST</bcp14> still have been performed with a
Requester-Binding class recorded under <xref target="agent-iff-integrity"/>, so the condition
is visible to the regulator that scope serves.</t>
        <t>An Audience Member's read discloses only facts about a reconciliation whose full
content it already holds: that a supersession or a post-seal evaluation exists,
what it points to, and the ledger position of each. The one exception is worth
naming, because it is not obvious: a Post-Seal Evaluation Record carries the
Policy-Version Hash and Pattern-Library Version Identifier in force at the time
of the evaluation rather than at sealing, and those are values the member did not
previously hold and, being stable within a deployment, are durable correlators.
That is a deliberate disclosure to a party already entitled to the reconciliation
they qualify, and it is bounded by <xref target="audience"/>'s rule that a register may cap
how wide an Audience Set addressing it may be.</t>
        <t>Where the Ledger is replicated per <xref target="ledger-replication"/>, each secondary store
<bcp14>MUST</bcp14> be able to demonstrate that its chain and every other secondary store's
chain share a common prefix.</t>
        <t>A common-prefix demonstration between stores under one operator is that operator
attesting to itself. The reconciliation server <bcp14>MUST</bcp14> therefore publish a signed Ledger Head Statement
at <tt>/.well-known/arp-ledger-head</tt> on its Authority Origin. It is republished once
per notarisation interval and not on every append: the resource is unauthenticated
and carries a contiguous sequence number, so a continuously updated head would
hand any observer the deployment's exact entry count, its write rate and the
timing and size of every retroactive supersession burst -- the aggregate
disclosure <xref target="read-errors"/> rate-limits the authenticated surface to prevent. A
Statement comprises:</t>
        <ul spacing="normal">
          <li>
            <t>the Entry Sequence Number of the current head</t>
          </li>
          <li>
            <t>the Self-Entry Hash of that entry</t>
          </li>
          <li>
            <t>the Entry Timestamp of that entry</t>
          </li>
          <li>
            <t>a Statement Timestamp, being the time the Statement was produced, in the form
of <xref target="reconciliation-output"/>. Without it two Statements published across a
quiet period differ only in their notarisation pointer and neither is dateable,
so the interval a register negotiated is unverifiable from the artefact</t>
          </li>
          <li>
            <t>a two-element array of the Transparency Service Identifier and the EntryID of
the most recent completed notarisation of a Ledger Head Statement, encoded as
CBOR null until the first such notarisation completes</t>
          </li>
          <li>
            <t>a signature by the reconciliation-server sealing key over the foregoing,
carrying the Sealing-Key Identifier that resolves it</t>
          </li>
        </ul>
        <t>A Ledger Head Statement is encoded as a COSE_Sign1 over the deterministically
encoded CBOR array of the first five items above, in that order, under the media
type registered in <xref target="iana"/>, with the fifth item encoded as CBOR null until the
first notarisation completes.
The server <bcp14>MUST</bcp14> submit the Ledger Head Statement current at each interval for
notarisation by a SCITT Transparency Service. The interval is the shortest declared by any
Bilateral Register Agreement, per the direction rule of <xref target="delivery"/>. The
Transparency Service <bcp14>MUST</bcp14> be one every Bilateral Register Agreement the
deployment holds declares,
and <bcp14>MUST NOT</bcp14> be operated by or under the control of the reconciliation server or
any party controlling it. A notary the operator owns is the operator attesting to
itself, which is the condition this mechanism exists to escape; the same
requirement governs the notarisation of Evaluation Sweep Statements under
<xref target="sweep-statements"/>.
It is not registered under the binding of <xref target="scrapi-binding"/>, which is scoped to
sealed Reconciliation Outputs and whose protected header requires a
Policy-Version Hash and a Bilateral-Register-Agreement Hash that a head statement
does not have; it is registered as a Signed Statement under its own media type.
Statements published between intervals are not notarised.</t>
        <t>Entry Sequence Numbers are allocated in a single sequence for the logical Ledger.
A secondary store under <xref target="ledger-replication"/> replicates that sequence and <bcp14>MUST
NOT</bcp14> allocate independently, or two conforming stores would present the same
sequence number over different entries and be indistinguishable from a fork.</t>
        <t>The Entry Sequence Number is what makes two heads comparable. A bare hash cannot
distinguish a fork from ordinary progress: two parties who have each seen a
different head learn only that the values differ, which is the expected case
whenever they observed at different times. Two Head Statements bearing the same
Entry Sequence Number and different Self-Entry Hashes are therefore a fork on
their face, and both are signed, so both are attributable.</t>
        <t>Two Head Statements bearing different sequence numbers are reconciled by the
consistency read of <xref target="read-operations"/>. A party entitled to that read -- a
Register Operator or a regulator -- presents the lower of the two sequence
numbers and receives the Self-Entry Hash of the entry at that position in a
signed response bound to the request it answers. The two views agree only where
that value equals the one the lower Head Statement carried, and where they
disagree the party holds two signed statements by one key that cannot both be
true of one chain. That is why the response is signed and bound to its request:
an unsigned answer would let an operator serve each questioner from that
questioner's own branch and leave the questioner with nothing it could show a
third party.</t>
        <t>The rate limit of <xref target="read-errors"/> is load-bearing on that operation and not
merely hygiene. The consistency read ranges over every sequence number up to the
head; swept without limit it yields the deployment's exact entry count by binary
search, its write rate by polling, and the timing and size of a retroactive
supersession burst by watching for a step change -- none of which any single
answer discloses.</t>
        <t>A party that holds two irreconcilable signed statements <bcp14>MUST</bcp14> cease to rely on any
Reconciliation Output sealed by that server after the lower of the two sequence
numbers, <bcp14>MUST</bcp14> report the pair to every regulator whose Bilateral Register
Agreements it can identify from the Outputs it holds, and <bcp14>MUST NOT</bcp14> treat the
server's subsequent statements as evidence of anything until the discrepancy is
resolved. A Register Operator that holds such a pair <bcp14>MUST</bcp14> additionally
refuse further Per-Register Claim Projections from that server, on which the
server records <tt>agreement-drift-suspended</tt> against that register under
<xref target="no-answer"/> as it would for any other suspension. Detection without a
required response leaves the mechanism ending in a held contradiction and no
consequence.</t>
        <t>Two limits remain and are stated rather than claimed away. An operator that
publishes to two audiences at disjoint sequence numbers never emits a colliding
pair, so detection by collision is opportunistic even though reconciliation by
consistency read is not. And a party holding neither a Reconciliation Output nor
a Bilateral Register Agreement has no register set against which to anchor the
signing key under <xref target="sealing-key-discovery"/>: it can check that a Head Statement
is signed and not that the signer was entitled to publish it. Both bear on a
party outside the entitled set; a Register Operator, which is the party with
standing to care whether its attestations sit on one chain, has the agreement
that anchors the key and the entitlement that completes the check.</t>
        <section anchor="ledger-replication">
          <name>Replication</name>
          <t>The Ledger <bcp14>MAY</bcp14> be distributed across a plurality of per-jurisdiction
secondary stores under synchronous replication, each operated under the
data-residency constraints of its host jurisdiction. The append-only
derivation-chain invariant -- that every entry's Prior-Entry Hash equals the
Signing Input Digest, as <xref target="settlement-ledger"/> defines it, of the immediately
preceding entry's Entry Signature -- <bcp14>MUST</bcp14> be preserved across all secondary
stores. A secondary
store replicates the single sequence of <xref target="settlement-ledger"/> and originates no
entry of its own.</t>
        </section>
      </section>
      <section anchor="regulator-portal">
        <name>Regulator Portal</name>
        <t>The Regulator Portal Subsystem authenticates a sovereign regulator's
jurisdictional credentials against a regulator-identity-provider trust
anchor that <bcp14>MUST</bcp14> be declared in every Bilateral Register Agreement addressed by
the reconciliation being read. It restricts returned fields to those within the
regulator's statutory scope as declared in the statutory-regulator-access scope
of those agreements. Each Bilateral Register Agreement declares, per regulator jurisdiction, a
permitted-read-field set: the names of the Reconciliation Output and Ledger entry
fields a regulator of that jurisdiction may be returned, and the predicates over
which it may be returned them. The scope restriction is the INTERSECTION of the
per-agreement permitted-read-field sets scoped to the regulator's jurisdiction,
taken only over reconciliations whose Canonical Claim Predicate is in the
intersection of the corresponding permitted-read-predicate sets, and further
intersected with the regulator's requested field set. Fields and predicates are
different domains and are intersected separately; intersecting one with the other
would yield the empty set, which earlier text did. Each
access <bcp14>MUST</bcp14> be recorded in an append-only audit trail. Each record <bcp14>MUST</bcp14> carry a
contiguous sequence number and the digest of the preceding record, computed as
<xref target="settlement-ledger"/> computes a Prior-Entry Hash, and the reconciliation server
<bcp14>MUST</bcp14> publish a signed head of that trail -- its current last sequence number and
digest, under its sealing key -- once per ledger-head notarisation interval, and
<bcp14>MUST</bcp14> submit that head for notarisation by the Transparency Service of
<xref target="settlement-ledger"/>.</t>
        <t>Earlier revisions called the trail subpoena-grade and specified none of that.
The trail is held by the party whose reads it records, and the accountability of
the Audit Identity entitlement rests on it -- an unaudited audit right is a
standing unaccountable read. Without a chain and an externally anchored head, a
record can be removed or rewritten by the party the trail exists to hold
accountable, and it is then evidence only against a party that has not tampered
with it. This document applies exactly this construction to the Settlement-Layer
Ledger a few sections above and applied none of it here, which is the whole of
the defect: not a technique the document lacks, a technique it did not carry to
the second place that needed it.</t>
        <t>The Portal is a subsystem of the reconciliation server and reads the Ledger
without scope restriction. The scope governs what it RETURNS, not what it may
read. Stating it the other way round would make the Portal unable to compute the
authority under which it answers, since that computation requires reading the
entry first.</t>
        <t>Where the entry read is a Continuation entry, the Portal computes the trust
anchor and the scope from the agreements addressed by the reconciliation entry
carrying the same Reconciliation Hash. A Continuation entry names no registers of
its own, and an intersection taken over an empty set of agreements would either
deny every regulator or restrict none, which are the two failures the rest of
this section exists to avoid.</t>
        <t>The fields a Continuation entry carries are structural: an entry type, a sequence
number, a timestamp, chain hashes, and a pointer to an artefact. None is a
register record, a claim value or a verdict. A regulator in scope for a
reconciliation entry is therefore in scope for every field of every Continuation
entry carrying that entry's Reconciliation Hash, without any agreement having to
enumerate those fields. The alternative -- intersecting a set of field names no
agreement mentions -- yields the empty set, and would make a Sovereign
Re-Notification arrive at a regulator that is then returned nothing when it
follows the pointer. Agreements negotiated before this revision name none of
these fields, and <xref target="retroactive"/> forbids retroactive evaluation from requiring
any agreement to be renegotiated.</t>
        <t>Both intersections are load-bearing. Taking the union across agreements would
let one register operator's permissive agreement widen what a regulator may read
about a reconciliation that also addressed a restrictive register, inverting the
data-residency property this protocol exists to preserve; and requiring the
trust anchor in only one agreement would let a single register operator
unilaterally introduce a regulator identity that authenticates against
multi-register events. Intersecting with the requester's own requested set is
not itself a restriction, since the requester chooses it.</t>
        <section anchor="re-notification">
          <name>Sovereign Re-Notification</name>
          <t>A Sovereign Re-Notification is a COSE_Sign1 by the reconciliation-server sealing
key, under the media type registered in <xref target="iana"/>, whose payload is the CBOR array
of:</t>
          <ul spacing="normal">
            <li>
              <t>the Claim Hash and the Reconciliation Hash of the superseded Output</t>
            </li>
            <li>
              <t>the Entry Sequence Number of the <tt>continuation-supersession</tt> entry recording
the supersession</t>
            </li>
            <li>
              <t>the Material-Change Indicator</t>
            </li>
            <li>
              <t>the verdict values before and after</t>
            </li>
            <li>
              <t>the Attribution, one of <tt>policy-state</tt>, <tt>source-data-version</tt> or
<tt>attribution-indeterminate</tt>, and where it is the last, the Post-Seal Evaluation
Record Hash of the record <xref target="post-seal"/> requires</t>
            </li>
            <li>
              <t>a Notification Timestamp, in the form of <xref target="reconciliation-output"/></t>
            </li>
          </ul>
          <t>encoded as a CBOR array in that order, an absent conditionally-absent element as
CBOR null so that the array's length is fixed, the first element a two-element
array of the two hashes and the fourth a two-element array of the verdict before
and after; and signed under the Sealing-Key Identifier its protected header
carries. The signature is not a payload element.</t>
          <t>The server <bcp14>MUST</bcp14> deliver it to the notification endpoint each affected regulator's
Bilateral Register Agreements declare, <bcp14>MUST</bcp14> retry until acknowledged or until the
retention period of <xref target="delivery"/> elapses, and <bcp14>MUST</bcp14> make every Re-Notification
retrievable by a regulator under <xref target="read-operations"/>. A regulator that is
unreachable when a verdict changes is exactly the case the mechanism exists for,
so delivery cannot be a single attempt, and an obligation with no artefact and no
endpoint -- which is what earlier revisions specified -- is an obligation no
party can discharge or audit.</t>
        </section>
      </section>
      <section anchor="audit-path">
        <name>Audit Path</name>
        <t>Several requirements in this document are justified by what an auditor can
reproduce: the re-typing decision of <xref target="verdict-retyping"/> "without the server's
assurance", the Query Binding of <xref target="partial-attestation"/>, the Policy-Version Hash
"under audit" of <xref target="sealing"/>, and the Deployment Blinding Value of
<xref target="sealing"/>. No earlier revision
defined that path, so every one of those justifications rested on a party the
document did not admit.</t>
        <t>Each Bilateral Register Agreement <bcp14>MUST</bcp14> declare at least one Audit Identity: an
identifier and a key thumbprint, in the form <xref target="audience"/> uses for an Audience
Member. A party authenticating as an Audit Identity under <xref target="read-signing"/> is
entitled to:</t>
        <ul spacing="normal">
          <li>
            <t>every operation of <xref target="read-operations"/>, unredacted, over any reconciliation
addressing the register whose agreement declares that identity</t>
          </li>
          <li>
            <t>the Reconciliation Outputs of those reconciliations, irrespective of their
Audience Sets, by <tt>GET /arp/outputs/{reconciliation-hash}</tt></t>
          </li>
          <li>
            <t>for a named reconciliation, every element of the Policy-Version Hash preimage
of <xref target="sealing"/> EXCEPT the Deployment Blinding Value, together with a
Reconstruction Proof: a keyed digest, computed as HMAC <xref target="RFC2104"/> with
SHA-256 under the
Deployment Blinding Value over the deterministically encoded CBOR array
<tt>["arp-reconstruction-v1", P]</tt>, where <tt>P</tt> is the Policy-Version Hash preimage
array of <xref target="sealing"/> with its Deployment Blinding Value position encoded as
CBOR null so that the array's length is preserved. It is served as the
two-element array of the disclosed elements and the proof, as the <tt>result</tt> of
<tt>GET /arp/outputs/{reconciliation-hash}</tt> where the requester authenticated as
an Audit Identity. An auditor given the Value recomputes it; one not given the
Value can only compare it against another proof the same server produced.  </t>
            <t>
The preimage is pinned here because it was not pinned anywhere. The sweep
recorded in the Document History put every digest preimage and signature
payload in this document into a CBOR array with a normative field order and
null-substitution for absent fields, and enumerated the artefacts it had
reached; this construction was not among them. It had no array, no
domain-separation string, no field order, no rule for the excised element and
no encoding requirement, and it also had no wire representation, since
<xref target="read-operations"/> defines that operation as returning the sealed Output and
<xref target="read-responses"/> defines no slot for a value served beside one</t>
          </li>
        </ul>
        <t>An Audit Identity is NOT given the Deployment Blinding Value, and is not given
the preimage in full, because the preimage contains it. The Value is one
deployment-wide constant and its holder can invert every Claim Hash and
Policy-Version Hash on the published Ledger by the exhaustive search <xref target="sealing"/>
describes, including those of reconciliations the auditor's own register had no
part in; every agreement declares an Audit Identity, so disclosing the Value to
one would disclose the deployment to all of them.</t>
        <t>An Audit Identity that does not hold the Deployment Blinding Value compares one
value the server produced against another value the server produced, under a key
only the server holds, over material that neither the Sealing Signature nor any
Ledger entry commits to. Equality establishes that the server was self-consistent
across the two reads and establishes nothing further. It does not establish that
the disclosed policy elements are the ones sealed into the Policy-Version Hash,
because a server that sealed under one policy state and later disclosed a
different one computes a consistent pair with no more effort than an honest one
does. And it does not establish that the resulting hash is correct. Only an
Audit Identity given the Value can establish either.</t>
        <t>An earlier revision stated the first half as established and only the second as
open, which was one step too generous: it granted the mechanism the property
that a proof minted by the audited party, under the audited party's secret,
over material nothing else commits to, tells a third party something about the
world. A deployment that requires the stronger property <bcp14>MUST</bcp14>
appoint an Audit Identity jointly with every register whose agreement it holds,
and <bcp14>MAY</bcp14> disclose the Value to that joint identity alone. This document states the
limit rather than resolving it, because a construction that let one register's
appointee verify a deployment-wide digest without holding the deployment-wide
secret is a different mechanism than the one specified here.</t>
        <t>An Audit Identity is declared in an agreement rather than named by a requester,
because the party being audited must not choose its auditor after the facts are
known, and because the register whose records are at issue is the party with
standing to insist on one. Its entitlement is scoped to reconciliations
addressing that register: an auditor appointed under one agreement reads nothing
about a reconciliation that agreement had no part in.</t>
        <t>Every access under an Audit Identity <bcp14>MUST</bcp14> be recorded in the append-only audit
trail of <xref target="regulator-portal"/>. An unaudited audit right is a standing
unaccountable read of every Output a deployment holds.</t>
      </section>
      <section anchor="retroactive">
        <name>Retroactive Evaluation</name>
        <t>Upon publication of an updated Pattern Library, an updated Policy Version, or a
new Source-Data Version for any list a register consulted under
<xref target="source-versioning"/>, the Retroactive Evaluation Subsystem <bcp14>MUST</bcp14> execute a
deterministic re-application of the updated state to the retained metadata of
historical Reconciliation Outputs -- the Per-Register Result Set, the resolved
arithmetic and its parameters, and the Source-Data Version Identifiers, being the
inputs from which a Combined Verdict is recomputed. Under a Pattern-Library or
Policy-Version trigger the set to be examined is every retained Output whose
Policy-Version Hash preimage, as the Policy-Epoch Store of <xref target="sealing"/> holds it,
carries a value the transition changed. A Policy-Version Hash is not superseded
as a value: its seventh element is that reconciliation's Requester-Binding, so
it is per-reconciliation and there is no current hash against which to compare
one. What a transition supersedes is a preimage element, and the store holds
every preimage. Earlier revisions selected on "a superseded Policy-Version
Hash", which named no determinate set and left the operator to choose which
Outputs its own policy change had reached. Under a Source-Data Version trigger the policy
state is unchanged and that set would be empty; the set is instead those Outputs
whose Per-Register Result Set carries a Source-Data Version Identifier from the
list that was republished. Under a credential-revocation trigger it is those
whose Requester-Binding rested on the revoked credential. Under a
register-record-correction trigger, being a statement by a Register Operator
under item 32 of <xref target="bra-items"/> that a record it attested has been corrected, the
set is those Outputs carrying a Partial Attestation from that register over the
corrected record.</t>
        <t>The fifth trigger is new in this revision and the gap it closes is the one a
subject would care about most. A <tt>source-data-version</tt> trigger reaches a
corpus-level republication whose state identifier the list publisher assigns and
which must be identical across every attestation over that list; it does not
reach a register correcting one record about one person. So a beneficial-ownership
register carrying an erroneous ownership percentage could produce a <tt>match</tt> on a
sanctions-linkage predicate, correct the record the following week, and no
trigger would fire, no sweep would run and no supersession would be appended. An
Audience Member reading Continuations before relying past the Reliance Horizon
would correctly find nothing, and the verdict built on the error would stand.
<xref target="privacy-erasure"/> states that a rectified verdict is expressed by supersession
rather than by deletion, and until this revision no trigger produced one. Where permissible under the applicable Bilateral
Register Agreements, partial attestations <bcp14>MAY</bcp14> be re-invoked.</t>
        <t>The retroactive evaluation <bcp14>MUST</bcp14> be executable without re-negotiation of any
Bilateral Register Agreement. A material change in a historical Combined Verdict -- defined as any change of
verdict value into, out of, or between the decisive values, the decisive values
being <tt>match</tt> and <tt>no-match</tt> -- <bcp14>MUST</bcp14> trigger a Sovereign Re-Notification through the Regulator Portal, and <bcp14>MUST</bcp14>
additionally be recorded as a Continuation entry of type
<tt>continuation-supersession</tt> against the superseded Output, under the field rules
of <xref target="settlement-ledger"/>, so that a party which acted on the superseded Output
can discover that it was superseded. Notifying only the regulator would leave the party that acted
on a verdict the last to learn it had changed. A transition from <tt>no-match</tt> to <tt>match</tt> is material: it is
the case the protocol's motivating domain cares most about, and a definition
that excluded transitions within the decisive class would omit it. Revocation of a
Verified Principal Credential relied upon in a historical reconciliation is
itself a material change: the Retroactive Evaluation Subsystem <bcp14>MUST</bcp14> re-derive
the affected Requester-Binding class and, where a decisive reconciliation was
performed for what is now an unverifiable requester, emit a Sovereign
Re-Notification.</t>
        <section anchor="sweep-statements">
          <name>Evaluation Sweep Statements</name>
          <t>Every trigger of retroactive evaluation is observed by the reconciliation server,
every decision to run is taken by it, and until this revision nothing recorded
that a sweep had run. "We evaluated and found no change" and "we never evaluated"
were the same observation from every position outside the server, which made the
central obligation of this section unfalsifiable.</t>
          <t>The Retroactive Evaluation Subsystem <bcp14>MUST</bcp14> emit exactly one Evaluation Sweep
Statement for each trigger, within the ledger-head notarisation interval of
<xref target="settlement-ledger"/> measured from the trigger event. One Statement per trigger,
on a deadline tied to an event outside the server, is what makes a missing
Statement provable; "one per sweep" would let an operator batch a quarter's
triggers into a single Statement and remain conformant while evaluating nothing
in time. A Statement comprises:</t>
          <ul spacing="normal">
            <li>
              <t>the trigger, drawn from the registry of <xref target="iana"/> and initially one of
<tt>pattern-library</tt>, <tt>policy-version</tt>, <tt>source-data-version</tt>,
<tt>credential-revocation</tt> or <tt>register-record-correction</tt>, and the identifier
of the artefact that triggered it</t>
            </li>
            <li>
              <t>the Policy-Version Hash and Pattern-Library Version Identifier applied</t>
            </li>
            <li>
              <t>the Entry Sequence Number of the Ledger head when the sweep began and when it
completed</t>
            </li>
            <li>
              <t>the Excluded-Range Set: the set of Entry Sequence Number ranges inside the
bracket that the sweep deliberately did not examine, each a two-element array
of a range and a reason drawn from the registry of <xref target="iana"/>, empty where the
sweep examined its whole bracket</t>
            </li>
            <li>
              <t>the Examined-Range Set: the set of Entry Sequence Number ranges the sweep
covered, each a two-element array of a first and a last Entry Sequence Number
inclusive, the ranges pairwise disjoint and in ascending order, and together
covering every entry between the two head sequence numbers above whose Entry
Type is <tt>reconciliation</tt></t>
            </li>
            <li>
              <t>the count of Reconciliation Outputs examined, and the count found materially
changed</t>
            </li>
            <li>
              <t>the Examined-Set Root: the root of a Merkle tree, constructed as
<xref target="merkle-construction"/> defines it, over the Claim Hashes of the Reconciliation
Outputs examined, sorted in bytewise lexicographic order, so that a party
entitled to one of those reconciliations can be shown an inclusion proof that
its own reconciliation was in the set. The Root commits to the distinct Claim
Hashes examined and to nothing else. By <xref target="merkle-construction"/> the leaf count
and the examined count are not derivable from one another, because two Outputs
over one claim share a Claim Hash and the leaves are deduplicated; and no
construction in this document commits the count found materially changed to
anything beyond this Statement's own signature. Both counts are therefore
assertions of the signing server, which the signature, the Timestamp and the
notarisation make attributable and dated, and do not make verifiable. An
earlier revision said the counts "are not bare assertions", which the
deduplication rule two sections above already contradicted. The Examined-Range
Set and the identity below are what make them checkable, by measuring them
against the Ledger rather than against the Root</t>
            </li>
            <li>
              <t>an Evaluation Sweep Timestamp, in the form of <xref target="reconciliation-output"/></t>
            </li>
            <li>
              <t>the Transparency Service Identifier and EntryID of the notarisation of the
previous Evaluation Sweep Statement, encoded as CBOR null in the first
Statement of a series</t>
            </li>
            <li>
              <t>a Sealing-Key Identifier</t>
            </li>
            <li>
              <t>a signature by the reconciliation-server sealing key, a COSE_Sign1 whose
payload is the CBOR array of the fields above in the order listed, with the
signature position encoded as CBOR null, an absent field likewise, encoded
under Section 4.2.1 of <xref target="RFC8949"/>. The first, second, third, fourth and seventh
items are each a two-element array, so that a field carrying two values
occupies one position</t>
            </li>
          </ul>
          <t>Statements are retrievable under <xref target="read-operations"/> and <bcp14>MUST</bcp14> each be notarised
into the Transparency Service of <xref target="settlement-ledger"/> under their own media
type, within the same interval that bounds their emission. The previous-
notarisation pointer above makes the published series a chain, so that a
withdrawn Statement is detectable rather than merely absent;
<xref target="I-D.ietf-scitt-scrapi"/> retrieves by EntryID and offers no query surface, so a
party not told an EntryID could not find that notarisation by search. A Statement
is retained for the retention period of <xref target="delivery"/>.</t>
          <t>On request under <xref target="read-operations"/>, a server <bcp14>MUST</bcp14> return an inclusion proof of a
given Claim Hash in the Examined-Set Root of a given Statement, to a party
entitled to a reconciliation carrying that Claim Hash.</t>
          <t><strong>The sweep identity.</strong> For every Evaluation Sweep Statement, a party able to
read the Ledger over the Statement's Examined-Range Set <bcp14>MUST</bcp14> be able to verify
all three of the following, and a Statement failing any of them is
non-conforming:</t>
          <ol spacing="normal" type="1"><li>
              <t><strong>The bracket abuts the previous one.</strong> The beginning head sequence number
equals the completing head sequence number of the Statement this one names as
its predecessor, or the Statement is the first of its series. Without this the
identity below is an accounting over an interval the operator chose after
seeing what was in it, and a sweep can be complete over a bracket that begins
after the entries it would rather not have examined. The Examined-Range Set
answers <em>was anything skipped inside the bracket</em>; this answers <em>was the
bracket cut</em>, and the second question is the one an operator with something to
hide would prefer nobody asked.</t>
            </li>
            <li>
              <t>The Examined-Range Set and the Excluded-Range Set together are contiguous
over the interval claimed: the ranges are pairwise disjoint, ascending, and
their union contains every Entry Sequence Number between the two head
sequence numbers whose entry is of Entry Type <tt>reconciliation</tt>. A range the
sweep chose not to examine is therefore individually disposed, with a reason,
rather than absent -- a remainder that reconciles only by arithmetic being
exactly what <xref target="I-D.hillier-coverage-attestation"/> declines to accept, one
level down. A gap is a claim to have examined an interval with a hole
in it, and it is visible because the Ledger is contiguous by construction.</t>
            </li>
            <li>
              <t>The count of Reconciliation Outputs examined equals the number of
<tt>reconciliation</tt> entries in the Examined-Range Set alone.</t>
            </li>
            <li>
              <t>The count found materially changed equals the number of
<tt>continuation-supersession</tt> entries appended in the interval between the two
head sequence numbers whose superseded Reconciliation Hash is one of a
<tt>reconciliation</tt> entry in that union.</t>
            </li>
          </ol>
          <t>The four together are an accounting identity rather than a signature, and that
is the point of them. A signature makes an assertion attributable; an identity
makes it checkable against something the asserting party does not solely
control. The Ledger is append-only, contiguous, head-notarised into a
Transparency Service outside the operator's control, and read under
<xref target="read-operations"/> by regulators, Audience Members, Register Operators and
Audit Identities. Requiring the counts to balance against it converts two
numbers the operator could previously choose into two numbers the operator must
now make true, and a sweep that examined less than it claims fails the identity
at whichever of the three it falsified.</t>
          <t>The first of the four was added after Walter Hawkins showed, on the SCITT
mailing list on 20 August 2026, that an equivalent rule one level down
constrains the remainder inside a declared population and says nothing about
where the population's edge falls. His sentence for it is the one worth keeping:
the information did not survive being moved from the remainder to the
denominator, it just moved. An operator that may choose the bracket has the same
freedom as one that may choose the denominator, and every rule below the first
was satisfiable over a bracket selected after the fact.</t>
          <t>The Examined-Set Root and the Examined-Range Set answer different questions and
both are needed. The Root proves <strong>membership</strong>: an Audience Member can be shown
that its own reconciliation was in the examined set. The Range Set proves
<strong>coverage</strong>: any Ledger reader can see that no interval was skipped. A Merkle
root over a set of Claim Hashes cannot prove coverage, because Claim Hashes are
sparse in the digest space and a set commitment has no notion of the elements
that are missing. Entry Sequence Numbers are dense and contiguous, so absence in
that space is visible in a way absence in the digest space is not. Committing to
the same sweep in both spaces is what lets one artefact answer both questions.</t>
          <t>A Statement does not prove a sweep was performed honestly, and this document does
not claim it does. What it changes is that a sweep not performed is now a
statement the operator has to make, sign and date, rather than a silence. A
Source-Data Version publication is a public event with a public timestamp; an
operator with no Statement within the deadline has not evaluated in time, which
is checkable. The other three triggers are not public events, so the
Policy Parameters Document of <xref target="read-signing"/> carries the identifier and
effective time of every Pattern-Library and Policy-Version transition the server
applies, which makes those two triggers observable. A credential-revocation
trigger is observable to the credential's issuer and to the affected principal
and to nobody else, and this document does not make it more so.</t>
          <t>The fifth trigger, <tt>register-record-correction</tt>, is a statement by a Register
Operator under item 32 of <xref target="bra-items"/>, so the event that starts its clock is
outside the reconciliation server in the same way a list publication is, and the
argument reaches it.</t>
          <t>The falsifiability argument therefore holds for four triggers in five, and it
holds for the second and third of them <strong>only through the anchoring
<xref target="read-signing"/> places on the Policy Parameters Document itself</strong>, which is
stated here because an earlier revision of this section claimed three in four
while the Document carrying two of them was published by the reconciliation
server, under its own key, with no publication time and no notarisation. On
that footing the count was one in four and the sentence claiming otherwise was
the one place this document rounded up. A transition simply omitted from the
array started no clock, and no party could date the Document well enough to show
that it had been. The Publication Timestamp, the notarisation, and the
obligation to republish on the interval whether or not anything changed are
what make the second and third arguments true, and a deployment whose Policy
Parameters Document is not anchored as <xref target="read-signing"/> requires has two
falsifiable triggers and not four.</t>
          <t>Both counts in this paragraph were stale within two hours of the fifth trigger
being added, in opposite directions: the enumeration above still named four
triggers while the registry of <xref target="iana"/> named five, and this sentence still said
three in four. Neither needed a reader to catch. A count in a specification is
an assertion about the specification, and the conformance class of
<xref target="coverage-probes"/> now carries a runner that checks every such count against
the text that makes it. An operator that signs a Statement it did not earn is making a
false attributable claim, which is a different thing from an invisible omission,
and the Examined-Set Root means an Audience Member can require it to prove that
its own reconciliation was in the set it claims to have examined.</t>
          <t>Where a Sovereign Re-Notification cannot state whether a material change arose
from policy state or from Source-Data Version, the <tt>attribution-indeterminate</tt>
Post-Seal Evaluation Record it references <bcp14>MUST</bcp14> state which of the two candidate
causes were examined and why neither could be excluded. A bare qualifier is a
discretionary escape signed by the party that benefits from it.</t>
        </section>
        <section anchor="revocation-reliance">
          <name>Revocation and the reliance window</name>
          <t>Revocation of a Verified Principal Credential cannot be detected at the moment of
reliance by a party that is not checking, and this protocol does not put a
revocation check in the hot path of every relying party. What it does instead is
bound the window. An Audience Member <bcp14>MUST</bcp14> read the Continuation entries for a
Reconciliation Hash under <xref target="ledger-read"/> before relying on that Output past its
Reliance Horizon (<xref target="reliance-horizon"/>), and the supersession that records a
revocation is among the entries that read returns. Reliance inside the horizon on
a credential revoked during it is possible and is not prevented; reliance years
later on an Output whose principal was disowned the following week is prevented,
which is the case that matters and the case earlier revisions left open. The
horizon is declared per predicate, so a deployment needing a shorter window for a
sanctions predicate than for a corporate-registry one sets one.</t>
        </section>
        <section anchor="coverage-probes">
          <name>Coverage Probes</name>
          <t>Every mechanism in this section makes a sweep that was not performed into a
statement an operator has to sign and date. None of them establishes how much of
what should have been examined actually was. The sweep identity of
<xref target="sweep-statements"/> closes the gap between the counts and the Ledger; it does
not close the gap between the Ledger and the world, because an operator that
never wrote an entry has nothing to be caught balancing.</t>
          <t>That is the omission problem, and it does not have a proof. It has an estimator.</t>
          <t><strong>The construction.</strong> A <strong>Coverage Probe</strong> is an ordinary reconciliation,
commissioned by an Audit Identity under <xref target="audit-path"/>, that is indistinguishable
at the reconciliation server from any other reconciliation over the same
predicate and register set. Before commissioning a set of probes, the Audit
Identity publishes a <strong>Probe Commitment</strong>: a COSE_Sign1 under its own key whose
payload is the Merkle Root, constructed as <xref target="merkle-construction"/> defines it,
over the Claim Hashes of the probes it intends to commission, together with
their count and a Commitment Timestamp. The commitment is published before the
first probe is commissioned and <bcp14>MUST</bcp14> be notarised into the Transparency Service
of <xref target="settlement-ledger"/>.</t>
          <t>After a sweep that should have covered them, the Audit Identity requests an
inclusion proof for each probe's Claim Hash under the Examined-Set Root of the
Statement covering the interval its probe fell in, which <xref target="sweep-statements"/>
already obliges the server to return. The <strong>recovery fraction</strong> is the number of
probes for which a valid inclusion proof was returned, over the number
committed.</t>
          <t><strong>What it estimates.</strong> The recovery fraction is an unbiased estimator of the
proportion of eligible Outputs the sweep actually examined, provided the server
cannot distinguish a probe from an ordinary reconciliation. Applied to the
examined count the Statement asserts, it yields an estimate of the population
that should have been examined and was not: where a sweep asserts <tt>E</tt> examined
and recovers <tt>m</tt> of <tt>k</tt> probes, the eligible population is estimated at
<tt>E * k / m</tt>, and the shortfall at <tt>E * (k - m) / m</tt>.</t>
          <t>This is not a proof about any individual Output and this document does not claim
it is. It is a bound on an aggregate, with a confidence interval that narrows as
<tt>k</tt> grows, and it is the only thing in this document that speaks to the size of
what was never written down. An operator suppressing a class of reconciliations
suppresses probes at the same rate, because it cannot tell them apart, and the
suppression appears in the recovery fraction rather than in any artefact the
operator controls.</t>
          <t><strong>Indistinguishability is the whole of the mechanism, and it is what makes it
expensive.</strong> A probe <bcp14>MUST</bcp14> address real registers over a real predicate and <bcp14>MUST</bcp14>
be charged against a real query budget, and its subject <bcp14>MUST</bcp14> be drawn from the
same distribution as ordinary subjects for that predicate. A server that can
identify probes by their subject, their register set, their timing, their
requester or their budget treatment can examine those and suppress the rest, and
the estimator then reports the operator's discrimination rather than its
coverage. A deployment <bcp14>MUST NOT</bcp14> exempt a probe from any charge, limit or path
that applies to an ordinary reconciliation, and <bcp14>MUST NOT</bcp14> mark one as a probe in
any artefact before the sweep it tests has been notarised.</t>
          <t><strong>Why the commitment precedes the probes.</strong> Without it, an auditor could
commission many probes, observe which were examined, and publish only those it
liked, in either direction: an auditor hostile to an operator publishes only the
misses, and an auditor captured by one publishes only the hits. The commitment
fixes the denominator before the numerator is knowable to anybody, which is what
makes the fraction evidence rather than a selection.</t>
          <t><strong>What it costs and what it cannot do.</strong> Probes consume register capacity, and a
register bears that cost without receiving the benefit, so the number of probes
is a term for a Bilateral Register Agreement rather than a constant this
document sets; item 33 of <xref target="bra-items"/> carries it. The technique establishes
nothing about a deployment whose registers are themselves suppressing, since a
probe's answer is only as good as the register's. And it cannot reach a
reconciliation that was never commissioned by anyone, which is the requester's
vantage and not the auditor's.</t>
          <t>The estimator is standard practice in fields that must characterise a survey
they cannot repeat: sources of known brightness are injected into an
astronomical image and the fraction recovered gives the survey's completeness
function; marked individuals are released into a population and the fraction
recaptured bounds the population that was never seen. In both cases the quantity
of interest is what the instrument missed, which cannot be observed directly and
can be estimated from a known signal passed through the same instrument. A
retroactive evaluation sweep is an instrument of that kind.</t>
        </section>
      </section>
      <section anchor="crypto-upgrade">
        <name>Cryptographic-Primitive-Upgrade Path</name>
        <t>Each Bilateral Register Agreement <bcp14>MUST</bcp14> declare a
Cryptographic-Primitive-Upgrade Path comprising an ordered equivalence list
for each of three primitive classes: claim-encryption,
partial-attestation-signature, and sealing-signature. The equivalence list
<bcp14>MUST</bcp14> include at least one post-quantum primitive for each class, drawn from a
set including ML-KEM <xref target="FIPS203"/> for key encapsulation and ML-DSA <xref target="FIPS204"/>
for signature operations.</t>
        <t>A primitive rotation <bcp14>MAY</bcp14> be executed simultaneously across the three
layers without bilateral renegotiation. The Settlement-Layer Ledger
remains continuous across the rotation because Ledger entries commit to
hashes of canonicalised content rather than to cryptographic identities. The
Entry Signature and the Sealing-Key Identifier it carries are the exception, and
a verifier <bcp14>MUST</bcp14> resolve the Sealing-Key Identifier carried by each entry rather
than assume one key across the chain. An entry signed under a superseded
primitive remains verifiable under the key that identifier resolves. The chain
is unbroken across a rotation, but not because it is independent of the
primitive: the Prior-Entry Hash of <xref target="settlement-ledger"/> is the Signing Input
Digest of the preceding entry's Entry Signature, so it depends on the algorithm
identifier in that signature's protected header, which the <tt>Sig_structure</tt>
covers. It does not depend on the signature bytes, and that is deliberate.
Earlier revisions took the Prior-Entry Hash over the whole preceding entry
including its Entry Signature and argued the chain was unbroken because those
bytes "are fixed at the moment the entry is appended and are never rewritten".
Fixed for the operator, and not unique: <xref target="signature-malleability"/> measures a
primitive under which one signing act has many verifying encodings, so the bytes
a reader is handed are not the bytes the operator appended and a chain keyed on
them breaks for that reader alone. A verifier recomputing a Prior-Entry Hash
across a rotation boundary takes the protected header and the payload byte
strings from the preceding entry's COSE_Sign1 verbatim and constructs the
<tt>Sig_structure</tt> around them. It <bcp14>MUST NOT</bcp14> re-encode the protected header: those
bytes are the signer's and are what the signature covers, and a verifier that
re-encoded them would compute a different digest wherever its encoding differed
from the signer's, and could not encode a rotated primitive's header parameters
at all without implementing that primitive. The verifier therefore parses a
COSE_Sign1 but needs no knowledge of the primitive under which it was signed,
and in particular need not verify it. That is more than earlier revisions asked,
which was to copy the preceding entry's bytes and hash them; the additional
requirement is COSE parsing, and it is the price of a digest that does not move
when the signature encoding does.</t>
      </section>
      <section anchor="bra">
        <name>The Bilateral Register Agreement</name>
        <t>A register is addressable under this document only through a Bilateral Register
Agreement. Nothing in this document can be executed against a register that has
none: the projection has no permitted-predicate set to test against, the channel
has no construction, the encryption has no key, and the Per-Register Claim
Projection has no Bilateral-Register-Agreement Hash to carry. This section is
where the obligations that other sections place on an Agreement are gathered,
and it is the definition of the Agreement Hash.</t>
        <section anchor="bra-items">
          <name>Declared items</name>
          <t>Each Bilateral Register Agreement <bcp14>MUST</bcp14> declare each of the following, save where
an item is marked <bcp14>OPTIONAL</bcp14> or the text of the item admits its absence;
<xref target="bra-hash"/> lists which those are. The numbering is normative: it is the order
in which the Agreement Hash of <xref target="bra-hash"/> is computed, and it is the only
order this document specifies.</t>
          <ol spacing="normal" type="1"><li>
              <t>The permitted-predicate set of <xref target="projection"/>.</t>
            </li>
            <li>
              <t>The supported cryptographic primitives, including any post-quantum primitives
selected under <xref target="post-quantum"/>. Every primitive appearing in an equivalence
list of item 3 <bcp14>MUST</bcp14> appear here.</t>
            </li>
            <li>
              <t>The Cryptographic-Primitive-Upgrade Path of <xref target="crypto-upgrade"/>.</t>
            </li>
            <li>
              <t>The transport, endpoint, framing and encryption construction of the bilateral
channel of <xref target="projection"/>.</t>
            </li>
            <li>
              <t>The regulator-identity-provider trust anchor of <xref target="regulator-portal"/>.</t>
            </li>
            <li>
              <t>The notification endpoint of <xref target="re-notification"/>.</t>
            </li>
            <li>
              <t>The statutory-regulator-access scope of <xref target="regulator-portal"/>, together with
the per-jurisdiction permitted-read-field and permitted-read-predicate sets
it is computed from.</t>
            </li>
            <li>
              <t>The Subject Reference form of <xref target="projection"/>.</t>
            </li>
            <li>
              <t>The Freshness Window of <xref target="projection"/>.</t>
            </li>
            <li>
              <t>The register's data-format profile under <xref target="format-profiles"/>, together with
every value that profile obliges a declaring Agreement to supply or to name,
in the order the profile enumerates them. A vocabulary release a profile
requires the Agreement to name is such a value and is not a parameter in the
sense of <xref target="format-profiles"/>, so naming only the parameters would leave it
outside the Agreement Hash.</t>
            </li>
            <li>
              <t>The register's public key material, as a COSE Key Set carrying at least one
claim-encryption key and at least one partial-attestation-signature key,
each with its <tt>arp-key-status</tt> and <tt>arp-key-validity</tt>.</t>
            </li>
            <li>
              <t>The response window after which a register is recorded unresponsive.</t>
            </li>
            <li>
              <t>The per-principal per-subject query budget of <xref target="containment"/> and the
interval over which it is measured.</t>
            </li>
            <li>
              <t>Any per-subject ceiling under <xref target="containment"/>.</t>
            </li>
            <li>
              <t>The ledger-head notarisation interval of <xref target="settlement-ledger"/>.</t>
            </li>
            <li>
              <t>The Transparency Service of <xref target="settlement-ledger"/>.</t>
            </li>
            <li>
              <t>The artefact retention period of <xref target="delivery"/>.</t>
            </li>
            <li>
              <t>The read rate limit of <xref target="read-errors"/>.</t>
            </li>
            <li>
              <t>The notarisation polling bound of <xref target="async-registration"/>.</t>
            </li>
            <li>
              <t>The authority origin of the reconciliation server the Agreement authorises.</t>
            </li>
            <li>
              <t>At least one Audit Identity under <xref target="audit-path"/>.</t>
            </li>
            <li>
              <t>The Register Operator's own read key.</t>
            </li>
            <li>
              <t>Whether the Per-Register Claim Projection must carry the Requester-Binding
Class.</t>
            </li>
            <li>
              <t>The audit right over the query-budget counter of <xref target="budget-suppression"/>.</t>
            </li>
            <li>
              <t>The reserved proportion of any per-subject ceiling and its per-principal
sub-budget.</t>
            </li>
            <li>
              <t>The response freshness tolerance of <xref target="read-responses"/>, which is the
backward bound only. It <bcp14>MUST</bcp14> be at least sixty seconds, and <bcp14>MUST NOT</bcp14> exceed
the effective ledger-head notarisation interval of <xref target="settlement-ledger"/> or
sixty seconds, whichever is longer, that interval being the shortest item 15
any Bilateral Register Agreement the deployment holds declares. The floor is
stated because the bound runs backward from the reader's receipt of the
response and the response was produced before that instant: a tolerance
below the transit and clock disagreement between the two parties rejects
every honest response, and a tolerance of zero rejects all of them, which is
a denial of service a deployment can declare itself into without any party
misbehaving. Sixty seconds is the figure this document fixes for the forward
bound of this test and of the two others that bound a party against another's
clock over a message it has just received, so using it as the floor makes the
narrowest admissible interval symmetric. A fourth test, the witness
observation window of <xref target="quorum-rule"/>, bounds a pair of clocks over an
artefact published on an interval rather than over a message in flight; its
forward bound is the greater of sixty seconds and twice that interval, and
sixty seconds is its floor in both directions for the reason it is the floor
here. The
forward bound is that fixed sixty seconds and is not negotiable per
Agreement: a forward bound each deployment set for itself would restore the
untestable case the fixed one exists to close. Bounding the ceiling against
this Agreement's own item 15 would admit a tolerance longer than the interval
the deployment notarises at, and so a response naming a head the reader could
already know to be superseded. Where that interval is itself shorter than sixty
seconds the floor governs, a ceiling below a floor being a term no deployment
can declare, and such a deployment trades the supersession property for
liveness knowingly: it notarises more often than the window in which a reader
will accept a response, so a response naming a superseded head is admissible
by exactly the difference. A deployment that wants both notarises no more
often than sixty seconds.</t>
            </li>
            <li>
              <t>The Witness Set of <xref target="bra-witness"/>, which <bcp14>MAY</bcp14> be empty.</t>
            </li>
            <li>
              <t>The Witness Quorum of <xref target="bra-witness"/>.</t>
            </li>
            <li>
              <t>OPTIONALLY, an audience constraint under <xref target="audience"/>.</t>
            </li>
            <li>
              <t>The regulator read keys of <xref target="read-signing"/>, or the means by which they are
resolved from the trust anchor of item 5, together with the means by which
key material for items 21, 22, 27 and 30 is retrieved. A Witness Entry
carries a key thumbprint, and a thumbprint is not key material, so without
this a relying party holding a Head Consistency Statement has no defined way
to obtain the key that verifies it.</t>
            </li>
            <li>
              <t>Whether partial attestations may be re-invoked under <xref target="retroactive"/>.</t>
            </li>
            <li>
              <t>Whether the Register Operator notifies corrections to records it has
attested, and the endpoint at which it does so, which is what makes the
<tt>register-record-correction</tt> trigger of <xref target="retroactive"/> reachable.</t>
            </li>
            <li>
              <t>The Coverage Probe allowance of <xref target="coverage-probes"/>: the number of probes an
Audit Identity may commission against that register per interval, and the
interval, as a two-element array of unsigned integers.</t>
            </li>
          </ol>
          <t>Items 26, 27, 28, 30, 31, 32 and 33 are new in this revision; item 29 is carried from
-03 in a new position. Three of the seven, items 26, 30 and 31, were already
relied on elsewhere in this document while sitting outside the Agreement Hash.
<xref target="read-responses"/> obliges a deployment to declare a response freshness
tolerance in its Bilateral Register Agreements; that is item 26.
<xref target="read-signing"/> obliges an Agreement to declare the keys under which a
regulator reads, and item 5's regulator-identity-provider trust anchor is not a
key; that is item 30. In both cases two deployments could agree on every item
the Agreement Hash committed to, differ on the term, and compute the same
Agreement Hash -- an Agreement Hash that does not cover a term the Agreement is
required to carry. <xref target="retroactive"/> makes re-invocation of partial attestations
conditional on what the applicable Agreements permit without making that
permission a declared item; that is item 31. Items 27 and 28 specify the witness
quorum <xref target="read-responses"/> names and earlier revisions declined to fix. Items 32
and 33 are terms this revision creates rather than terms it moves inside the
Agreement Hash: item 32 is what makes the <tt>register-record-correction</tt> trigger of
<xref target="retroactive"/> reachable, and item 33 is the probe allowance <xref target="coverage-probes"/>
meters against.</t>
          <t><strong>An Agreement computed under an earlier revision does not compute the same
Agreement Hash under this one.</strong> The Agreement Hash covers seven items it did
not cover before -- 26, 27, 28, 30, 31, 32 and 33 -- and <xref target="bra-hash"/> now fixes
the CBOR type of every item and the ordering within every set-valued one, so the
value changes for every Agreement even where no negotiated term has changed.
Agreements <bcp14>MUST</bcp14> be recomputed, and a deployment holding a
Bilateral-Register-Agreement Hash recorded before this revision <bcp14>MUST</bcp14>
treat it as naming an Agreement under the earlier item list rather than
as a value comparable with one computed under this section. Comparing the two
is the Bilateral-Register-Agreement drift of <xref target="agreement-drift"/>, and a
deployment that does not recompute will observe drift where none exists.</t>
        </section>
        <section anchor="bra-witness">
          <name>Witness Set and Witness Quorum</name>
          <t><xref target="read-responses"/> establishes that an empty result is falsifiable to the extent
that its reader holds head-consistency evidence for the served chain from an
observer independent of the responding service, and that head evidence obtained
only from that service bounds nothing. It states the preference -- a witness
countersignature over the head, or, failing that, an independently anchored head
digest -- without saying how many countersignatures, from whom, or what makes
two of them two rather than one. This section says.</t>
          <section anchor="witness-entries">
            <name>Witness Entries</name>
            <t>A <strong>Witness Set</strong> is a set of zero or more Witness Entries. Each Witness Entry
is a CBOR array of exactly three elements, in this order and not nested:</t>
            <ol spacing="normal" type="1"><li>
                <t>the Audience Member Identifier, as <xref target="audience"/> defines it;</t>
              </li>
              <li>
                <t>the Verification Method Reference, as <xref target="audience"/> defines it; and</t>
              </li>
              <li>
                <t>an <strong>Operating-Party Identifier</strong>: an Authority Origin naming the party that controls the
witness.</t>
              </li>
            </ol>
            <t><xref target="audience"/> encodes those first two as a two-element array. Here they are the
first and second elements of a three-element array and are not wrapped in one,
because a Witness Entry is carried both in the Agreement Hash of <xref target="bra-hash"/>
and in the Policy Parameters Document of <xref target="read-signing"/>, and two readings of
one shape would let those two artefacts disagree about a set they are both
supposed to describe.</t>
            <t>Two Operating-Party Identifiers are <strong>distinct</strong> where they differ after
normalisation under Sections 6.2.2 and 6.2.3 of <xref target="RFC3986"/>. Comparison is over
the normalised form and is otherwise bytewise. Without a stated normalisation
<tt>https://acme.example</tt> and <tt>https://ACME.example/</tt> are distinct to one
implementation and identical to another, and whether a quorum is met turns on
which.</t>
            <t>A Witness Entry's Operating-Party Identifier <bcp14>MUST NOT</bcp14> be that of the
reconciliation server, of the Transparency Service of <xref target="settlement-ledger"/>, of
any party controlling either, of any party controlled by either, or of any party
under common control with either, and no two Witness Entries counted toward one
quorum may be under common control with each other. The first exclusion runs in
every direction because
running it upward alone excludes nothing that matters: a reconciliation server
that incorporates three subsidiaries, declares three distinct Operating-Party
Identifiers and satisfies a quorum of three controls every observation the
quorum is composed of, and the fork <xref target="read-responses"/> is concerned with stays
invisible while the quorum reports it as checked. The second exclusion is there
because the rationale of this section is observer diversity and not identifier
diversity: three witnesses that are three subsidiaries of one unrelated parent
declare three distinct Operating-Party Identifiers, pass the distinctness test
as a verifier computes it, and are one observation reported three times. The
Register Operator of the addressed register, and any operator of a secondary
store under <xref target="ledger-replication"/>, are excluded on the same ground.</t>
          </section>
          <section anchor="head-consistency">
            <name>Head Consistency Statements</name>
            <t>A <strong>Head Consistency Statement</strong> is a COSE_Sign1 by a witness, under the media
type registered in <xref target="iana-media"/>, carrying the <tt>arp-witness-identifier</tt> header
parameter registered in <xref target="iana"/> in its protected header, whose payload is
the deterministically encoded CBOR array, under <xref target="cbor-cose"/>, of:</t>
            <ol spacing="normal" type="1"><li>
                <t>the text string <tt>arp-head-consistency-v1</tt>;</t>
              </li>
              <li>
                <t>the Entry Sequence Number of the head covered;</t>
              </li>
              <li>
                <t>the Self-Entry Hash of that entry;</t>
              </li>
              <li>
                <t>the Statement Timestamp of the Ledger Head Statement the witness observed, in
the form of <xref target="reconciliation-output"/>; and</t>
              </li>
              <li>
                <t>the <strong>Witness Observation Time</strong>, being the time the witness produced this
Statement, in the same form.</t>
              </li>
            </ol>
            <t>Item 5 exists because a COSE_Sign1 is not dateable from its own bytes, so a
freshness rule over a Statement carrying no time is a rule no verifier can
apply. <xref target="settlement-ledger"/> adds a Statement Timestamp to the Ledger Head
Statement for the same reason.</t>
          </section>
          <section anchor="witness-linkage">
            <name>Witness Linkage Segments</name>
            <t>A <strong>Witness Linkage Segment</strong> is a COSE_Sign1 by a witness, under the media type
registered in <xref target="iana-media"/>, carrying the <tt>arp-witness-identifier</tt> header
parameter registered in <xref target="iana"/> in its protected header, whose payload is the
deterministically encoded CBOR array, under <xref target="cbor-cose"/>, of:</t>
            <ol spacing="normal" type="1"><li>
                <t>the text string <tt>arp-witness-linkage-v1</tt>;</t>
              </li>
              <li>
                <t>the Authority Origin of the reconciliation server whose Settlement-Layer
Ledger the Segment covers, as a text string, normalised as <xref target="witness-entries"/>
normalises an Operating-Party Identifier, so that equality is a test a
verifier computes rather than one it decides and a Segment cannot be
presented as evidence about a Ledger it was not taken over;</t>
              </li>
              <li>
                <t>the Entry Sequence Number of the lowest entry the Segment covers, as an
unsigned integer;</t>
              </li>
              <li>
                <t>the Entry Sequence Number of the highest entry it covers, as an unsigned
integer;</t>
              </li>
              <li>
                <t>the ordered array, lowest Entry Sequence Number first, of the linkage array
of <xref target="read-operations"/> for each entry in that inclusive interval, each a
four-element array of the Entry Sequence Number as an unsigned integer and
the Prior-Entry Hash, the Self-Entry Hash and the Signing Input Digest of
that entry's Entry Signature, each as a byte string; and</t>
              </li>
              <li>
                <t>the time the witness produced this Segment, in the form of
<xref target="reconciliation-output"/>. It is present for the reason item 5 of
<xref target="head-consistency"/> is present: a COSE_Sign1 is not dateable from its own
bytes.</t>
              </li>
            </ol>
            <t>A Segment <bcp14>MUST</bcp14> cover at least one and at most <strong>one thousand</strong> entries. The cap
is what makes the artefact bounded independently of how often a witness
observes or how fast a Ledger is appended to, both of which this document leaves
to a deployment; a witness with more entries to cover publishes consecutive
Segments rather than one larger one.</t>
            <t>A Witness Entry names one Ledger. A party observing more than one <bcp14>MUST</bcp14> appear as
one Witness Entry per Ledger, under a distinct Operating-Party Identifier and so
a distinct Authority Origin, because the addressing below is by Entry Sequence
Number alone and two series on one origin would give one sequence number two
Segments and no conforming answer.</t>
            <t>Item 3 of a Segment <bcp14>MUST</bcp14> be one greater than item 4 of the Segment the witness
published before it, or, in the first Segment it publishes for a Ledger, the
Entry Sequence Number the witness elects to attest from. The lowest entry a witness's
first Segment for a Ledger covers is that witness's <strong>Attestation Floor</strong> for
it, and a witness chooses that value when it begins publishing: one that begins
observing a Ledger at entry n attests from n and makes no claim below it, which
is what lets a witness join a Ledger of any length without signing its history.</t>
            <t><strong>A witness <bcp14>MUST</bcp14> publish Segments that together cover every Entry Sequence
Number from its Attestation Floor to the head named by the most recent Head
Consistency Statement it has published for that Ledger.</strong> The obligation is
stated as coverage rather than per observation so that an interval in which
nothing was appended obliges nothing: <xref target="settlement-ledger"/> republishes the
Ledger Head Statement once per notarisation interval and not on every append,
and a Statement covering a head already covered needs no further Segment. A
Statement whose head the witness's Segments do not reach is a Statement no
relying party can use for the second branch of <xref target="quorum-rule"/>; the first branch
needs no Segment.</t>
            <t>A witness <bcp14>MUST</bcp14> serve, at <tt>/.well-known/arp-witness-linkage/{n}</tt> on the Authority
Origin of its Operating-Party Identifier, where <tt>{n}</tt> is an Entry Sequence
Number, the single Segment whose interval contains <tt>n</tt>, and <bcp14>MUST</bcp14> answer <tt>404</tt>
where it has published none covering <tt>n</tt>, which is the answer for every <tt>n</tt>
below its Attestation Floor. It <bcp14>MUST</bcp14> serve its most recently published Segment
at <tt>/.well-known/arp-witness-linkage</tt>. Each response carries exactly one Segment
under the media type registered in <xref target="iana-media"/>. A witness <bcp14>MUST</bcp14> serve the same
Segment for a given Entry Sequence Number on every request, and <bcp14>MUST</bcp14> serve
Segments to any party without authentication, for the reason <xref target="quorum-rule"/>
gives for serving Head Consistency Statements that way: an artefact obtainable
only through the party it is evidence about is that party's selection.</t>
            <t>A relying party assembles an interval by requesting the Segment containing the
head a response names and then the Segment containing one above each Segment's
item 4, until one covers the head a Head Consistency Statement names. It <bcp14>MUST</bcp14>
stop and treat the interval as uncovered on a <tt>404</tt>, on a Segment whose item 3
is not one greater than the item 4 of the Segment below it, or on a Segment
carrying a signature that does not verify. The first Segment it fetches has no
Segment below it and is subject only to the last of those.
Addressing per entry rather than per collection
is what makes the cost of assembling an interval proportional to the interval
rather than to the witness's publication history; the interval itself is
unbounded, so a relying party <bcp14>MAY</bcp14> decline to assemble one longer than it is
prepared to fetch and holds no evidence from that witness where it does.</t>
            <t>A witness <bcp14>MUST</bcp14> retain and serve every Segment it has published for a Ledger for
as long as it publishes Segments for that Ledger, and for at least one year
after its last publication for it. The period is stated against the witness's own
publication history because a witness is party to no Bilateral Register
Agreement and cannot compute the retention period of <xref target="delivery"/>. A relying
party that cannot obtain the Segments covering an interval holds no evidence for
that interval from that witness, which is the same outcome as an unreachable
origin.</t>
            <t>Two Segments by one witness for one Ledger whose intervals intersect, and whose
linkage arrays differ at any entry in the intersection, are a <strong>witness
equivocation</strong>. A relying party holding both <bcp14>MUST NOT</bcp14> count that witness toward
a quorum under <xref target="quorum-rule"/>. Detection is opportunistic in the way
<xref target="settlement-ledger"/> says detection of two entries at one Entry Sequence Number
is opportunistic: the addressing above returns one Segment per entry, so a party
sees a pair only where it retained an earlier Segment, or compared with another
party, and no single request reveals one. What the rules above establish is not
that equivocation is caught but that it is the <strong>only</strong> way a witness can present
two chains over one interval, since a conforming witness publishes each interval
once and serves one Segment for each entry. That is the property the append-only
claim of <xref target="quorum-rule"/> rests on, and its enforcement is an audit obligation
rather than a verifier-side test.</t>
            <t>A Segment carries no Reconciliation Hash, no Claim Hash and no structural
metadata, because a linkage array carries none. What its unauthenticated
publication adds over the entitled read of <xref target="read-operations"/> is set out in
<xref target="privacy"/>.</t>
          </section>
          <section anchor="quorum-rule">
            <name>The quorum rule</name>
            <t>The <strong>Witness Quorum</strong> is an integer <tt>t</tt> with <tt>0 &lt;= t &lt;= n</tt>, where <tt>n</tt> is the
cardinality of the Witness Set. A Witness Set <bcp14>MUST</bcp14> contain at least <tt>t</tt> entries
with pairwise distinct Operating-Party Identifiers; an Agreement whose Witness
Set does not is non-conforming, and a deployment <bcp14>MUST NOT</bcp14> address a register
under it. Without that constraint an Agreement declaring three entries under one
operating party and <tt>t</tt> of three is well formed, satisfiable by nobody, and
every empty result served under it is permanently unfalsifiable with no
conformance test firing.</t>
            <t>A relying party holds sufficient head-consistency evidence for an empty result
under <xref target="read-responses"/> when it holds Head Consistency Statements from at least
<tt>t</tt> Witness Entries where:</t>
            <ul spacing="normal">
              <li>
                <t>each verifies under the key material declared for that entry;</t>
              </li>
              <li>
                <t>the <tt>t</tt> entries have <strong>pairwise distinct Operating-Party Identifiers</strong>;</t>
              </li>
              <li>
                <t>the <tt>t</tt> entries have <strong>pairwise distinct Verification Method References</strong>, and
a relying party <bcp14>MUST</bcp14> reject a set in which two entries resolve to the same
key. Distinctness of the Operating-Party Identifier alone does not establish
that two entries are two observations: two entries declaring one key under two
Operating-Party Identifiers are satisfied by a single COSE_Sign1, and a
relying party applying only the previous condition counts one signature twice
and reports a quorum of two met by one signer. That failure is mechanical and
locally checkable, which distinguishes it from the declared-independence limit
<xref target="bra-limits"/> concedes and cannot close: a verifier cannot test whether two
named parties are truly independent, and it can always test whether two
entries name one key;</t>
              </li>
              <li>
                <t>each covers the head the response names, that is, item 2 of the Statement
equals the response's <tt>as-of-sequence-number</tt> and item 3 equals the Self-Entry
Hash that response names; or covers a head at a higher Entry Sequence Number
<strong>and</strong> the relying party additionally holds the Witness Linkage Segments of
<xref target="witness-linkage"/> covering the two, <strong>obtained from that witness's own
origin and not from the responding service</strong>, and has verified all six of:  </t>
                <ol spacing="normal" type="1"><li>
                    <t>that each Segment verifies under the same key material as the Statement,
carries the same <tt>arp-witness-identifier</tt>, and carries as its item 6 a
time no later than the Witness Observation Time of that Statement, so
that the chain and the head are one witness's observation, not two
parties', and not one witness's later account of an earlier interval;</t>
                  </li>
                  <li>
                    <t>that item 2 of each names the Authority Origin of the responding
reconciliation server;</t>
                  </li>
                  <li>
                    <t>that item 3 of each Segment above the lowest it holds is one greater
than item 4 of the Segment below it, and that between them they cover
every Entry Sequence Number from the named head to the head the Statement
covers, inclusive. A span covered by one Segment satisfies this on its
second clause alone;</t>
                  </li>
                  <li>
                    <t>that the Self-Entry Hash of the linkage array at the Statement's Entry
Sequence Number equals item 3 of that Statement;</t>
                  </li>
                  <li>
                    <t>that the Self-Entry Hash of the linkage array at the named head equals
the one the response names; and</t>
                  </li>
                  <li>
                    <t>that the linkage array at each sequence number in that interval above
the named head carries, as its Prior-Entry Hash, the Signing Input Digest
that the linkage array of the entry below it reports. The named head is
the bottom of the interval, the entry below it is outside the Statement's
coverage, and check 5 is what pins that end.</t>
                  </li>
                </ol>
                <t>
A relying party holding two Segments from one witness that equivocate under
<xref target="witness-linkage"/> <bcp14>MUST NOT</bcp14> count that witness toward the quorum, whichever
branch it would otherwise satisfy. The linkage array carries that
digest as its fourth element precisely so this condition is computable by the
party required to compute it: a Signing Input Digest is taken over the
<tt>Sig_structure</tt>, so neither the protected header nor the payload of the entry
below is recoverable from a sequence number and three hashes, and the
substitution a reader might reach for instead is the one the next sentence
forbids. Those last two values are digests over different
preimages -- <xref target="settlement-ledger"/> takes a Self-Entry Hash over the entry
array with two positions nulled and a Prior-Entry Hash over a <tt>Sig_structure</tt>
-- so a verifier <bcp14>MUST NOT</bcp14> test them for equality against each other; and</t>
              </li>
              <li>
                <t>each carries a Witness Observation Time no earlier than sixty seconds before
the Statement Timestamp of item 4 and no later than the greater of sixty
seconds and twice the effective ledger-head notarisation interval after it,
that interval being the shortest
any Bilateral Register Agreement the deployment holds declares, per the
direction rule of <xref target="delivery"/>. The sixty seconds is the allowance this
document makes wherever one party's clock is tested against another's, here
the witness's against the reconciliation server's: with no allowance a witness
whose clock is a second slow fails this condition on every Statement it
publishes, permanently and with no party misbehaving, which is the case item
26 of <xref target="bra-items"/> floors the response freshness tolerance to avoid. The
forward bound is floored for the same reason: a deployment notarising every
few seconds would otherwise admit a window of a few seconds against a clock
this document does not synchronise, and a witness running slightly fast would
fail on every Statement it published. <xref target="response-clocks"/> gathers the clock
bounds this document sets. A witness whose Statements fall outside this window
satisfies no condition of this rule and so counts toward no quorum, which is
the outcome <xref target="head-consistency-channel"/> gathers for every other way a witness
can fail to contribute.</t>
              </li>
            </ul>
            <t>A witness <bcp14>MUST</bcp14> publish its Head Consistency Statements at
<tt>/.well-known/arp-head-consistency</tt> on the Authority Origin of its
Operating-Party Identifier, most recent first, under the media type registered
in <xref target="iana"/>, and <bcp14>MUST</bcp14> serve them to any party without authentication. The
Operating-Party Identifier is for this reason an Authority Origin and not a bare
name: an identifier that names a party without locating it cannot be the route
by which the artefact is obtained.</t>
            <t><strong>A relying party <bcp14>MUST</bcp14> obtain Head Consistency Statements from the witnesses'
own origins, and <bcp14>MUST NOT</bcp14> accept for quorum purposes a Statement obtained from
the responding service.</strong> Until this revision the document specified the
artefact, the quorum arithmetic and the freshness window, and specified no
channel at all, which left the obvious implementation: the responding service
hands over the witness statements alongside its response. That implementation
satisfies every condition above. The witness signature stops the service
forging a Statement and does nothing to stop it choosing which ones to pass on,
and under exactly the fork this mechanism exists to detect, an operator serving
two branches hands each reader the statements of the witnesses it fed that
branch. Every check passes on both branches and the quorum is met on both.</t>
            <t>This is the whole of the artefact's value and it was the one thing not stated.
A Head Consistency Statement obtained from the party it is evidence about is
not independent evidence; it is the responding service's own selection,
countersigned. Where a witness origin is unreachable, the relying party holds
fewer than <tt>t</tt> Statements and <bcp14>MUST</bcp14> act under <xref target="read-responses"/> accordingly,
rather than accepting a substitute from the service.</t>
            <t><strong>The chain requirement is what makes the artefact worth its name, and the
requirement that the Segments come from the witness is what makes the chain
evidence.</strong> A witness signature over a head at a higher sequence number is, on
its own, evidence about whatever branch that witness was served, which may not
be the reader's: a fork at disjoint sequence numbers is precisely a pair of
heads neither of which contradicts the other. So the two observations have to be
put on one chain, and the chain has to be one the responding service did not
write.</t>
            <t>Anchoring the ends of a service-supplied chain does not do it, and the
arithmetic is worth stating because it is not obvious. The condition anchors two
Self-Entry Hashes, one signed by the witness at the top of the span and one
named by the response at the bottom, and then walks a chain over two other
positions, the Prior-Entry Hash and the Signing Input Digest. No anchored value
sits in a position the chain reads. The reader cannot recompute any value it
does read, for the reason the previous paragraph gives. And the lower anchor is
the response's own claim, so it constrains the service against itself and
nothing else. A service supplying the arrays therefore supplies every value the
chain is made of, and an equality between two values one party supplies is not
evidence about that party: it can serve the Self-Entry Hash the witness
published at the top, its own values in every other position, and satisfy each
part of the condition. Extending the span makes that easier rather than harder,
since every interior array is two further values the condition constrains only
against their neighbours.</t>
            <t>Anchoring both ends does better and does not reach. Where the lower anchor is
a value in a position the chain reads and comes from somewhere other than the
responding service, the chain values of a three-array span are determined, and
only those: the interior Self-Entry Hash is constrained by neither anchor nor
chain even there. A span of four
is not: the two arrays between the ends are constrained only against each other,
and every further entry adds another such pair. The condition places no bound on
the span, and the span is the distance between a head a witness happened to
observe and a head a response happens to name, so it is not a quantity the
relying party controls.</t>
            <t>Segments served by the witness bound the freedom by a different route: every
value the chain is made of was observed and signed by a party that is not the
one being checked, the covering requirement of <xref target="witness-linkage"/> leaves no
Entry Sequence Number in the interval that a service supplies, and the two
anchors become checks that the witness's chain is the one the Statement and the
response are about.</t>
            <t><strong>What that buys and where the residue is.</strong> A witness reads the Ledger from the
reconciliation server, so a witness is not an independent observer of the
entries; it is an independent <em>recorder</em> of what it was served, at a time it
stamps and under a signature it cannot revise. The property the Segments deliver
is therefore append-only rather than absolute: a conforming witness publishes
each interval once and serves one Segment per entry, so an operator rewriting an
interval that witness has covered can only do so with a witness that equivocates,
and <xref target="witness-linkage"/> states both what that costs the witness and why detecting
it is opportunistic rather than a verifier-side test. An operator
that rewrites an interval before any witness has covered it, or that serves a
rewritten chain to a witness setting its Attestation Floor above the rewrite,
obtains a witness-signed chain over the rewrite. What bounds that is witness
diversity and observation frequency, both of which the Witness Set and the
notarisation interval already govern, and it is the same residue
<xref target="bra-limits"/> concedes for declared independence rather than a new one. A
Statement covering the named head exactly needs no Segment, because there is
nothing to link.</t>
            <t>The window in the fifth condition is measured from the Statement Timestamp of
the Ledger Head Statement and not from the Entry Timestamp of the head, and it
is two intervals and not one, because <xref target="settlement-ledger"/> republishes the
Ledger Head Statement once per notarisation interval and not on every append. An
entry appended just after a publication is not published until one interval
later; a window of one interval measured from that entry's own timestamp is
already closed when the witness first sees the head, and no conforming Statement
could exist for it.</t>
            <t>The distinctness requirement is the substance of the rule. Countersignatures
from witnesses under one operating party are one observation reported <tt>t</tt> times,
and a quorum satisfied by them is a quorum in arithmetic only: the equivocation
<xref target="read-responses"/> is concerned with becomes observable when two independent
observers compare heads, and two instances of one observer are not two
observers.</t>
          </section>
          <section anchor="witness-discovery">
            <name>Discovery</name>
            <t>A relying party is not a party to any Bilateral Register Agreement and holds
only the hashes of those Agreements, so a quorum declared only inside an
Agreement is a test the party required to run it cannot read. The Policy
Parameters Document of <xref target="read-signing"/> therefore carries the effective Witness
Set and the effective Witness Quorum, and a relying party evaluates the quorum
against that document.</t>
            <t>Where a deployment holds more than one Bilateral Register Agreement, the
effective Witness Set is the intersection of the Witness Sets every such
Agreement declares and the effective Witness Quorum is the largest any of them
declares, per the direction rule of <xref target="delivery"/>. Two Witness Entries are
<strong>equal for the purpose of that intersection when their Operating-Party
Identifiers are equal and their Verification Method References are equal</strong>, and
the intersection carries, for each such pair, the entry as the Agreement with
the lexicographically least Agreement Hash declares it.</t>
            <t>Stating the relation is not pedantry. Taken over whole entries, the intersection
empties on any difference in the first element -- an Audience Member Identifier
written two ways for one witness -- and this section then obliges a conforming
deployment to stop serving reads entirely. Taken over the Operating-Party
Identifier alone, two entries declaring different keys for one party merge, and
a relying party accepts a Head Consistency Statement under key material only one
of the two Agreements declared. Both readings are available from the bare word
"intersection", one produces an outage and the other produces an unauthorised
key, and a deployment cannot be conforming under both.</t>
            <t>The effective Witness Set <bcp14>MUST</bcp14> contain at least the effective Witness Quorum
entries with pairwise distinct Operating-Party Identifiers. Where it does not,
the deployment is non-conforming and <bcp14>MUST NOT</bcp14> serve reads under
<xref target="read-responses"/>. The per-Agreement constraint of <xref target="quorum-rule"/> does not
reach this: two Agreements each declaring two entries and a quorum of two, with
no entry in common, are each conforming and together produce an empty effective
set under a quorum of two, which is the unsatisfiable quorum that constraint
exists to forbid.</t>
          </section>
          <section anchor="quorum-zero">
            <name>Where the quorum is zero</name>
            <t>A Witness Quorum of <tt>0</tt>, which a Witness Set of zero entries requires, declares
that no witness evidence is available. A relying party acting on an empty result
served under an effective quorum of <tt>0</tt> <bcp14>SHOULD</bcp14> instead hold an independently
anchored head digest as <xref target="read-responses"/> provides, and <bcp14>MUST NOT</bcp14> treat the
absence of a witness requirement as evidence that the head is uncontradicted. A
deployment declaring <tt>0</tt> is making a statement about what its empty results can
be checked against, in a term a relying party can read, rather than leaving a
reader to infer it.</t>
          </section>
        </section>
        <section anchor="bra-hash">
          <name>The Agreement Hash</name>
          <t>Each Bilateral Register Agreement carries an Agreement Hash: the SHA-256 digest
over the deterministically encoded CBOR array, under <xref target="cbor-cose"/>, of the items
of <xref target="bra-items"/> in the order given there. The array has <strong>exactly thirty-three
elements</strong>. The reconciliation server and the Register Operator compute it
independently and <bcp14>MUST</bcp14> obtain the same value.</t>
          <t>Determinism under Section 4.2.1 of <xref target="RFC8949"/> fixes how a given value is
encoded. It does not fix which CBOR type an item takes, nor the order of
elements within an item that is a set, and two parties that differ on either
compute different digests from identical negotiated terms. Since
<xref target="agreement-drift"/> suspends reconciliation on a deviation, that is an outage
and not a warning. The types are therefore fixed here.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Item</th>
                <th align="left">CBOR encoding</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">1, 2, 21, 27, 30</td>
                <td align="left">array, sorted in bytewise lexicographic order of the deterministic CBOR encoding of each element</td>
              </tr>
              <tr>
                <td align="left">3</td>
                <td align="left">three-element array, in the class order of <xref target="crypto-upgrade"/>, each element that class's equivalence list <strong>in the declared preference order and not sorted</strong></td>
              </tr>
              <tr>
                <td align="left">4</td>
                <td align="left">four-element array: transport identifier, endpoint URI and framing identifier, each a text string, and the sorted array of COSE algorithm identifiers of the encryption construction</td>
              </tr>
              <tr>
                <td align="left">5, 8, 16, 20</td>
                <td align="left">text string</td>
              </tr>
              <tr>
                <td align="left">6</td>
                <td align="left">URI, as a text string</td>
              </tr>
              <tr>
                <td align="left">7</td>
                <td align="left">three-element array: the statutory-regulator-access scope as a text string, and the per-jurisdiction permitted-read-field and permitted-read-predicate sets, each a sorted array of two-element arrays of the jurisdiction identifier and the sorted set for it</td>
              </tr>
              <tr>
                <td align="left">9, 12, 15, 17, 19, 26</td>
                <td align="left">unsigned integer, seconds</td>
              </tr>
              <tr>
                <td align="left">10</td>
                <td align="left">two-element array: the profile identifier as a text string, and the array of profile-obliged values <strong>in the order that profile enumerates them</strong></td>
              </tr>
              <tr>
                <td align="left">11, 22</td>
                <td align="left">COSE Key Set, its keys sorted in bytewise lexicographic order of the deterministic CBOR encoding of each key</td>
              </tr>
              <tr>
                <td align="left">13</td>
                <td align="left">two-element array: the budget as an unsigned integer count, and the interval in seconds as an unsigned integer</td>
              </tr>
              <tr>
                <td align="left">14, 28</td>
                <td align="left">unsigned integer</td>
              </tr>
              <tr>
                <td align="left">18</td>
                <td align="left">two-element array: the permitted request count as an unsigned integer, and the interval in seconds as an unsigned integer</td>
              </tr>
              <tr>
                <td align="left">23, 24, 31</td>
                <td align="left">boolean</td>
              </tr>
              <tr>
                <td align="left">32</td>
                <td align="left">two-element array: a boolean, and the endpoint URI as a text string or null</td>
              </tr>
              <tr>
                <td align="left">33</td>
                <td align="left">two-element array of unsigned integers: the probe allowance and the interval in seconds</td>
              </tr>
              <tr>
                <td align="left">25</td>
                <td align="left">two-element array: the reserved proportion as a CBOR decimal fraction, and the per-principal sub-budget as an unsigned integer</td>
              </tr>
              <tr>
                <td align="left">29</td>
                <td align="left">two-element array: the maximum cardinality as an unsigned integer or null, and the permitted member class as a text string or null</td>
              </tr>
            </tbody>
          </table>
          <t>Every item that is a set is encoded as a CBOR array sorted in bytewise
lexicographic order of the deterministic CBOR encoding of each element. This
document already requires that ordering of the Audience Set, of the algorithm
array of <xref target="read-signing"/> and of the origin array of <xref target="sealing-key-discovery"/>,
and for the same reason: an unordered set gives one Agreement as many hashes as
it has permutations. Items 3 and 10 are the exceptions and are called out in the
table as such, because each is a <strong>sequence</strong> rather than a set: <xref target="crypto-upgrade"/>
declares an ordered equivalence list whose order is the preference, and item 10
takes its order from the profile that enumerates the values. Sorting either
would discard the meaning it carries, and a change of order in either would then
leave the Agreement Hash unmoved.</t>
          <t>An item that is absent, inapplicable or empty is encoded as CBOR null, and the
element is present in the array regardless. <strong>Items 14, 25, 27 and 29 are the
only items that may be absent</strong>: 14 and 25 where the Agreement sets no
per-subject ceiling, 27 where the Witness Set is empty, and 29 because it is
<bcp14>OPTIONAL</bcp14>. Item 25 is null whenever item 14 is. An empty Witness Set is encoded
as CBOR null and not as an empty array. Every other item <bcp14>MUST</bcp14> be present and
<bcp14>MUST NOT</bcp14> be null. Encoding an absent per-subject ceiling as null, as zero, or by
omitting the element are three readings of one sentence, and all three produce
different Agreement Hashes.</t>
          <t>The order is fixed by the numbering of <xref target="bra-items"/> and by nothing else. An
implementation <bcp14>MUST NOT</bcp14> derive it from the order in which terms appear in the
negotiated instrument, from any serialisation the parties exchange, or from an
alphabetisation of the item names. Earlier revisions of this document specified
the digest over "its canonicalised content", which named no order and so did not
make independent computation of one value possible.</t>
          <t>A change to any item changes the Agreement Hash, and <xref target="agreement-drift"/>
suspends reconciliation against a register whose Agreement Hash deviates from
the one committed at the start of a reconciliation event. Items 11, 22, 27 and
30 carry key material and witness membership, which change under ordinary
operation -- a rotation under the upgrade path of item 3, the addition of a
witness -- so an Agreement Hash change is a renegotiation event and the parties
<bcp14>MUST</bcp14> agree the new Agreement Hash before the operation that causes it. A
deployment that rotates first and renegotiates afterwards has suspended its own
reconciliation, by its own drift rule, at the moment its upgrade path was
exercised.</t>
        </section>
        <section anchor="bra-limits">
          <name>What a Bilateral Register Agreement does not establish</name>
          <t>An Agreement is a declaration by two parties. It is not evidence that what it
declares is true.</t>
          <t>The Operating-Party Identifiers of <xref target="witness-entries"/> are declared, not proven.
<xref target="witness-entries"/> excludes a witness under the control of the responding
service, under common control with it, or controlling it, and that exclusion is
normative; what this document supplies no mechanism for is <strong>detecting a false
declaration</strong>. Two witnesses under common control that each declare a distinct
Operating-Party Identifier satisfy the distinctness test as a verifier can
compute it, and a relying party comparing the two identifiers sees two parties.
The requirement is worth stating regardless, because a party that declares an
independence it does not have has made a false attributable claim rather than
benefited from an unexamined silence, and because an Audit Identity under
<xref target="audit-path"/> can be given the Witness Set to examine. But a relying party
<bcp14>MUST NOT</bcp14> treat a met quorum as proof of observer diversity. It is proof that
observer diversity was declared, by a named party, in a term that party can be
held to.</t>
          <t>The same holds of item 20, the Authority Origin, which <xref target="containment"/> already
requires a register operator to corroborate by publishing an Authorised-Origin
Document, and which is the one declared item this document does provide a
mechanism to check.</t>
        </section>
      </section>
      <section anchor="aggregates">
        <name>Aggregate Statements</name>
        <t>Nothing above governs what may be said about a <em>set</em> of Reconciliation Outputs.
That is the gap through which a four-valued vocabulary becomes a percentage.</t>
        <t><xref target="verdict-arithmetic"/> forbids the Verdict Arithmetic from combining a
Non-Answer Reason, and requires an <tt>indeterminate</tt> contribution to propagate
rather than be resolved. Both hold inside one reconciliation. Neither reaches
the report that says a deployment ran at ninety-one per cent. The prohibition is
a rule addressed to an implementer, and the pressure to state a single figure
arrives from outside engineering, after the vocabulary is public and looks like
a scoring system. A rule is what an engineer follows and a structure is what a
spreadsheet cannot get around, and only the second survives that pressure.</t>
        <t>An <strong>Aggregate Statement</strong> is the only form in which this document permits a
count, rate or proportion over more than one Reconciliation Output to be
published, cited, or supplied under <xref target="regulator-portal"/> or <xref target="audit-path"/>. It
is a COSE_Sign1 by the reconciliation-server sealing key whose payload comprises:</t>
        <ul spacing="normal">
          <li>
            <t>the <strong>Declared Population</strong>: the criterion by which an Output is in the set,
and the <strong>Basis</strong> on which it is decided, being one of <tt>catalogue</tt> where the
population is a list held before the period began, <tt>enumeration</tt> where it is
everything in a stated Entry Sequence Number range, or <tt>declared</tt> where the
operator asserts it and nothing else fixes it</t>
          </li>
          <li>
            <t>where the Basis is <tt>enumeration</tt>, the Entry Sequence Number range, so that the
denominator is checkable against the Ledger as <xref target="sweep-statements"/> checks a
sweep</t>
          </li>
          <li>
            <t>the <strong>Denominator</strong>: the count of Outputs in the Declared Population</t>
          </li>
          <li>
            <t>the <strong>Verdict Vector</strong>: one count for each value of the Combined Verdict,
including <tt>indeterminate</tt>, in the order <xref target="terminology"/> gives</t>
          </li>
          <li>
            <t>the <strong>Non-Answer Vector</strong>: one count for each Non-Answer Reason in the registry
of <xref target="iana"/> that appears in the set, each naming its reason</t>
          </li>
          <li>
            <t>a Statement Timestamp, a Sealing-Key Identifier and a signature</t>
          </li>
        </ul>
        <t><strong>The Verdict Vector and the Non-Answer Vector <bcp14>MUST</bcp14> sum to the Denominator, and
a reader <bcp14>MUST</bcp14> reject an Aggregate Statement in which they do not.</strong></t>
        <t>That sentence is the mechanism and everything else is scaffolding for it. A
component of a sum that has to balance cannot be averaged away, folded into a
neighbour, or dropped from a denominator, because each of those breaks the
arithmetic in a way any reader can see without holding a single Output. There is
no representation of this Statement in which <tt>indeterminate</tt> is absent and the
numbers still add up. Compare the rule it replaces, which said an implementation
must not combine certain values: an implementation that combined them anyway
produced a document indistinguishable from one that had not.</t>
        <t>A deployment <bcp14>MAY</bcp14> publish a rate derived from an Aggregate Statement, and where
it does it <bcp14>MUST</bcp14> publish the Statement alongside and <bcp14>MUST NOT</bcp14> publish a
derived figure alone. A rate is a projection of the vector onto one number, and
this document does not forbid the projection. It requires that the thing
projected from travels with it, so that a reader who wants to know what the
other nine per cent were is one artefact away rather than dependent on the
publisher's goodwill.</t>
        <t><strong>Why the Basis is declared and not assumed.</strong> A proportion is a claim about a
denominator, and a denominator no one stated is a denominator the publisher
chose after seeing the numerator. <tt>enumeration</tt> is the strong case and is
checkable against the Ledger by anyone. <tt>catalogue</tt> is weaker and still
falsifiable, since the list existed before the period. <tt>declared</tt> is the
operator's assertion, is not falsifiable, and <bcp14>MUST</bcp14> be recorded as such rather
than presented as though it were either of the others. The three-way
distinction, and the requirement that a report account for every unit it did not
examine rather than reconcile by arithmetic, are taken from the Coverage
Attestation Profile <xref target="I-D.hillier-coverage-attestation"/>, which specifies them
in a form that is not particular to this protocol.</t>
        <t><strong>What this does not do.</strong> It does not stop a party outside the protocol
computing whatever it likes from Outputs it holds. Nothing can. What it stops is
that party doing so <em>and citing this document</em>, because a figure published
without its Statement is non-conforming and a figure published with one carries
its own contradiction where it has one. The distinction between a number nobody
can check and a number whose components must balance is not enforcement, it is
the difference between a claim that has to be believed and a claim that can be
refused.</t>
        <t><strong>Acknowledged.</strong> The general problem, and the observation that a prohibition on
averaging is not a mechanism, are Emek Can Dogru's, put to the SCITT mailing list
on 20 August 2026.</t>
      </section>
    </section>
    <section anchor="agentic">
      <name>Agentic Principal Reconciliation</name>
      <t>The Agent Friend-or-Foe Determination described in the Requester Identity
Binding and Agent Friend-or-Foe Gate above establishes whether the requester
of a reconciliation is friendly. ARP additionally supports reconciling an
agent's principal binding as the subject of a reconciliation in its own right,
so that the question "does a real, authenticated principal stand behind this
agent?" can itself be answered against authoritative identity registers rather
than asserted.</t>
      <t>A reconciliation over the <tt>agent:</tt> predicate branch takes as its Subject
Identifier the agent's declared identity (for example its signature-agent-card
key thumbprint or a directory identifier) and as its Attested Value the
principal binding the agent asserts. Addressed registers for this predicate
class are identity and credential registers -- for example an organisational
directory, a credential-issuer status list, or a national identity register --
each under its own Bilateral Register Agreement. The Combined Verdict answers
whether the asserted principal binding is corroborated:</t>
      <ul spacing="normal">
        <li>
          <t><tt>match</tt>: the agent's asserted principal binding is corroborated by the
addressed registers; the agent is FRIENDLY with an attributable principal.</t>
        </li>
        <li>
          <t><tt>no-match</tt> with divergence axis agent-impersonation-suspected: the asserted
binding is contradicted; the agent is asserting a principal it is not bound
to.</t>
        </li>
        <li>
          <t><tt>no-match</tt> with divergence axis agent-credential-absent or
agent-principal-unverifiable: no corroborating record exists; the binding
cannot be established and the agent <bcp14>MUST</bcp14> be treated as ENEMY.</t>
        </li>
      </ul>
      <t>This composition allows a relying party to gate an action not merely on the
presence of an agent signature but on register-corroborated proof that an
accountable principal stands behind it, narrowing the impersonation surface at
the reconciliation layer. The result is a Reconciliation Output like any other:
sealed against a Policy-Version Hash, written to the Settlement-Layer Ledger
without claim or register content, and re-evaluable if the underlying credential
is later revoked.</t>
    </section>
    <section anchor="encoding">
      <name>Encoding</name>
      <section anchor="cbor-cose">
        <name>CBOR-COSE Encoding</name>
        <t>The mandatory-to-implement encoding for ARP messages on the wire is CBOR with
COSE <xref target="RFC9052"/> <xref target="RFC9053"/> envelopes. COSE_Sign1 is used for both Partial
Attestations and the Sealing Signature. Every COSE_Sign1 this document defines <bcp14>MUST</bcp14> carry the algorithm identifier
(label 1) and the key identifier (label 4) in its protected header, and <bcp14>MUST NOT</bcp14>
carry either in an unprotected header. A Signing Input Digest under
<xref target="terminology"/> depends on the protected header and on nothing else in the
envelope, so an algorithm or key identifier placed outside it is a value that
digest does not bind -- and <xref target="crypto-upgrade"/> relies on the algorithm
identifier being bound.</t>
        <t>The protected header of a Partial Attestation and of a sealed Reconciliation
Output <bcp14>MUST</bcp14> additionally include the Bilateral-Register-Agreement Hash and
Policy-Version Hash as COSE header parameters; the other COSE_Sign1 structures this document defines
carry the headers their own sections state registered per <xref target="iana"/>.
<tt>arp-bilateral-agreement-hash</tt> always carries an array, sorted in lexicographic
byte order: a Partial Attestation's array has exactly one member, and a Sealing
Signature's has one per addressed register. A single encoding for both avoids a
decoder having to infer the type from context. Pending registration,
implementations <bcp14>MAY</bcp14> use labels from the private-use range of the COSE Header
Parameters registry; such use is not interoperable.</t>
        <t>Every digest this document takes over a CBOR encoding is taken under the Core
Deterministic Encoding Requirements of Section 4.2.1 of <xref target="RFC8949"/>, and this
document cites that section rather than the word canonical because the two name
different things. Section 4.2.1 orders the pairs of a map in the bytewise
lexicographic order of the deterministic encodings of the keys. Section 4.2.3 of
the same document describes a Length-First Map Key Ordering, in which a shorter
encoded key sorts ahead of a longer one and ties are broken bytewise, and that
is what several widely used CBOR libraries produce under an option named
canonical, the name the length-first rule carried before <xref target="RFC8949"/> separated
the two. <strong>An implementation <bcp14>MUST</bcp14> produce the ordering of Section 4.2.1.</strong> A library
option named canonical commonly produces Section 4.2.3 instead, and an
implementation that relies on one without establishing which it produces has not
met that requirement.</t>
        <t>The two orderings agree for any map whose keys are integers or strings and share
a CBOR major type, at any mix of lengths: for those types the head byte never
decreases as the encoding lengthens, and where two keys share a head byte the
bytewise comparison continues into the bytes that follow it, which orders them
the same way. The head byte of an array, a map or a tag encodes a count rather
than a length, and the agreement does not hold there; COSE admits only integer
and string labels, so no map on a digest path in this document has a key of
those types. Integers span two major types, so a header pairing a positive label
with a negative one is outside the agreement, and that is the case the next
paragraph is about. They diverge
only where a map mixes major types and the key of the higher major type has the
strictly shorter encoding. A negative label of -1 is the single byte <tt>0x20</tt>; a
label of 256 is <tt>0x19</tt> and two further bytes. Length-first puts -1 first;
bytewise puts 256 first, <tt>0x19</tt> being below <tt>0x20</tt>.</t>
        <t>No protected header this document specifies reaches that case. The headers it
defines carry the algorithm identifier, the key identifier and the parameters
<xref target="iana"/> registers, and a map of those sorts identically under both orderings.
The requirement is stated so that it stays that way: <xref target="cbor-cose"/> permits
labels from the private-use range pending registration, private-use labels are
negative, and a deployment that pairs one with a registered label of 256 or
above has built the divergent case out of two permitted choices. An
implementation that produced Section 4.2.3 there would encode one protected
header differently from one that produced Section 4.2.1, and so compute a
different Signing Input Digest over one signing act and a different Prior-Entry
Hash for the entry above it. The head comparison of <xref target="settlement-ledger"/> treats
that as a fork, against an operator that equivocated about nothing. The entry
array of <xref target="settlement-ledger"/> is an array and not a map for the reason that
section gives, which places the ordering question at the protected headers and
not at the entry.</t>
      </section>
      <section anchor="request-binding">
        <name>Reconciliation Request Binding</name>
        <t>A reconciliation is commissioned by <tt>POST /arp/reconciliations</tt> on the
reconciliation server's authority origin, with a request body carrying the
Canonical Claim, the Audience Set the requester asks for, and, where the
requester is an agent, its asserted principal. The body is CBOR under the media
type registered in <xref target="iana"/> for a reconciliation request, save for the Canonical
Claim, which is carried as a CBOR byte string holding the <xref target="RFC8785"/>
serialisation of the claim exactly as the Claim Hash is taken over it. Carrying
the claim as native CBOR would need the CBOR-to-JSON mapping
<xref target="reconciliation-output"/> declines to define, and two servers receiving identical
bytes would compute different Claim Hashes. The request <bcp14>MUST</bcp14> be signed under the
profile of <xref target="read-signing"/>, with <tt>tag</tt> set to <tt>arp-reconcile</tt>.</t>
        <t>An Audience Member other than the Requesting Principal <bcp14>MUST</bcp14> have been enrolled at
the reconciliation server before it may be named: an enrolment binds an
accountable-principal identifier to a Verification Method Reference, is performed
by the party being enrolled, and is out of scope for this document. A server <bcp14>MUST</bcp14>
refuse to name an unenrolled member. Without enrolment a requester could name any
identifier it liked, and the named party -- a competitor, a journalist, a foreign
ministry -- would be handed a sealed, register-attested record that a named
subject had been investigated under a named predicate, without its consent and
without any register's. Naming is an assertion by the requester; enrolment is
what makes it an assertion about a party that has agreed to receive.</t>
        <t>A refusal on that ground discloses that a named identifier is not enrolled,
which a requester able to repeat it turns into an enumeration of the enrolment
roster. A server <bcp14>MUST</bcp14> charge such a refusal against the requester's rate limit
under <xref target="read-errors"/> and <bcp14>MUST</bcp14> record it in the access log that section requires.
<xref target="read-errors"/> refuses to distinguish absence from inentitlement on the read
path, on the ground that answering differently would turn every endpoint into an
existence oracle; this endpoint is outside that section, so the principle is
carried here by rate and by record rather than by collapsing the two answers,
because a requester naming an audience member it believes enrolled needs to be
told when it is wrong. The residual is recorded in <xref target="privacy"/>.</t>
        <t>The response is one of four things, the fourth being the <tt>401</tt> of
<xref target="read-signing"/> where the request's own signature was not accepted. A <tt>200</tt> whose body is the
signed read response of <xref target="read-responses"/>, whose <tt>result</tt> element is the sealed
Reconciliation Output and whose As-Of pair gives the Ledger head at the moment of
delivery. That is the delivery <xref target="delivery"/> requires, and it is what carries the
Reconciliation Hash: the requester computes it over the Output it has just been
handed, and the signed response fixes the head against which every later read of
that Output is compared. A <tt>422</tt> carrying a Remediation Advisory, where the Adversarial
Pre-Transmission Test did not emit a Pass and no override was authorised, or
where a named regime is not one the policy-epoch store admits for the predicate,
or where a named Audience Member is not enrolled. Or a <tt>403</tt> carrying a
Remediation Advisory whose sole content is the Agent-IFF ground, where the
Agent-IFF policy of the Requester Identity Binding and Agent Friend-or-Foe Gate
section refuses the requester outright for the predicate class. Both refusals are
signed as <xref target="read-responses"/> requires of a <tt>4xx</tt>, so a refused requester holds
evidence of what it asked and what it was told.</t>
        <t>A refusal under <xref target="containment"/> or an audience constraint under <xref target="audience"/> is
not a fourth case: those refuse a register, and the reconciliation is sealed and
delivered with the reason recorded against that register.</t>
      </section>
      <section anchor="http-sig">
        <name>HTTP Message Signature Binding</name>
        <t>Where a reconciliation is requested over HTTP by an autonomous agent, the
request <bcp14>MUST</bcp14> be signed under HTTP Message Signatures <xref target="RFC9421"/>, with the
signature-agent key resolvable through a Web Bot Auth signature-agent card
<xref target="I-D.meunier-webbotauth-registry"/>, advertised via the Signature-Agent header
<xref target="I-D.ietf-webbotauth-httpsig-protocol"/>, which also defines the key
directory it names. The reconciliation server
derives the Agent Friend-or-Foe Determination from
verification of that signature and,
where required by the Agent-IFF policy, a Verified Principal Credential
carried in the request body.</t>
      </section>
      <section anchor="ledger-read">
        <name>Output and Ledger Read Binding</name>
        <t>This section is the wire binding for every read this document requires of a party
outside the reconciliation server. Earlier revisions stated what a read returns
and never how one is requested, which left every discovery path ending at a value
its holder could not present to anything.</t>
        <t>Requests are HTTP over TLS to the reconciliation server's authority origin, the
same origin whose Sealing-Key Identifier resolves under <xref target="sealing-key-discovery"/>.
Every hash appearing in a path segment is base64url-encoded without padding;
every Authority Origin appearing in one is percent-encoded as Section 2.1 of
<xref target="RFC3986"/> provides; and every timestamp in a path or query parameter is in the
form <xref target="reconciliation-output"/> pins. The <tt>@target-uri</tt> is inside the request-binding
digest of <xref target="read-responses"/>, so an encoding two implementations could choose
differently would make their bindings differ over the same read.
A non-Requesting Audience Member is not told that origin by this protocol; it
learns it from the party that named it, and this document defines no directory by
which a principal discovers the servers at which Outputs naming it may exist.</t>
        <section anchor="read-signing">
          <name>Request signing profile</name>
          <t><xref target="RFC9421"/> requires an application that uses it to state a profile. This is that
profile. It governs every request to an operation of <xref target="read-operations"/> and the
commissioning request of <xref target="request-binding"/>.</t>
          <ul spacing="normal">
            <li>
              <t>Every request <bcp14>MUST</bcp14> carry exactly one signature, labelled <tt>arp</tt>.</t>
            </li>
            <li>
              <t>The covered components <bcp14>MUST</bcp14> be <tt>@method</tt>, <tt>@target-uri</tt>, and, where the request
carries a body, <tt>content-digest</tt> as <xref target="RFC9530"/> defines it, together with the
signature parameters <tt>created</tt>, <tt>expires</tt>, <tt>nonce</tt>, <tt>keyid</tt>, <tt>alg</tt> and <tt>tag</tt>. A
request covering fewer <bcp14>MUST</bcp14> be refused. <tt>tag</tt> is <tt>arp-read</tt> for an operation of
<xref target="read-operations"/> and <tt>arp-reconcile</tt> for the commissioning request of
<xref target="request-binding"/>; those are the only two values, and a server <bcp14>MUST</bcp14> reject a
request whose <tt>tag</tt> does not match the endpoint it was sent to.</t>
            </li>
            <li>
              <t>Covering <tt>content-digest</tt> is what binds the body. The commissioning request
carries the Canonical Claim, the requested Audience Set and any asserted
principal in its body; a signature that covered only the target would leave an
intermediary free to substitute the subject or add Audience Members and have
the result sealed, ledgered and notarised as the signed requester's.</t>
            </li>
            <li>
              <t>The <tt>nonce</tt> <bcp14>MUST</bcp14> be at least 128 bits drawn from a cryptographically secure
random source, base64url-encoded.</t>
            </li>
            <li>
              <t><tt>expires</tt> <bcp14>MUST</bcp14> be no more than 300 seconds after <tt>created</tt>. A server <bcp14>MUST</bcp14>
reject a request whose <tt>created</tt> is more than 300 seconds in the past or more
than 60 seconds in the future, and <bcp14>MUST</bcp14> reject a repeated <tt>nonce</tt> from the same
<tt>keyid</tt> within that window. Without this a captured read request replays
indefinitely, which <xref target="replay-defence"/> closes only for requests that initiate a
reconciliation.</t>
            </li>
            <li>
              <t>The permitted signature algorithms are those the deployment declares for the
partial-attestation-signature class in its Cryptographic-Primitive-Upgrade
Path, so that read authentication rotates with everything else.</t>
            </li>
            <li>
              <t><tt>keyid</tt> <bcp14>MUST</bcp14> be the JWK thumbprint of the requester's public key, computed as
in <xref target="RFC7638"/>. For an Audience Member it <bcp14>MUST</bcp14> equal the Verification Method
Reference the Output names. For a regulator, a Register Operator or an Audit
Identity it <bcp14>MUST</bcp14> be a key the corresponding Bilateral Register Agreement
declares. For a witness reading under <xref target="witness-linkage"/> it <bcp14>MUST</bcp14> be the
thumbprint a Witness Entry of <xref target="witness-entries"/> carries, in a Bilateral
Register Agreement the deployment holds. For a requester commissioning a
reconciliation it is the key that becomes that requester's Verification Method
Reference in the resulting Audience Set. Key material is retrieved as that
agreement provides, or, for an
agent, through the Web Bot Auth directory of <xref target="http-sig"/>.</t>
            </li>
            <li>
              <t>The reconciliation server <bcp14>MUST</bcp14> publish a Policy Parameters Document at
<tt>/.well-known/arp-policy-parameters</tt> on its Authority Origin: a COSE_Sign1 by
its sealing key, under the media type registered in <xref target="iana"/>, whose payload is
the six-element CBOR array of: a Publication Timestamp, in the form
<xref target="reconciliation-output"/> fixes; the array of permitted signature algorithm
identifiers, sorted in bytewise lexicographic order of the deterministic CBOR
encoding of each element; the array of per-predicate entries, each a four-element array of
the predicate, the admitted regime set sorted in bytewise lexicographic order,
the two-element array of the resolved Verdict Arithmetic and its parameters,
and the reliance interval, the entries themselves sorted by predicate; and the
array of two-element arrays of the identifier and effective time of every
Pattern-Library and Policy-Version transition the server has applied, sorted by
effective time, which <xref target="sweep-statements"/> relies on; and the two-element array
of the effective Witness Set and the effective Witness Quorum of
<xref target="witness-discovery"/>, the Witness Set sorted in bytewise lexicographic order
of the deterministic CBOR encoding of each entry; and the two-element array of
the response freshness tolerance of <xref target="read-responses"/> in seconds and the
effective ledger-head notarisation interval that bounds it, each an unsigned
integer.  </t>
              <t>
The sixth element is present for the same reason as the fifth.
<xref target="read-responses"/> obliges <strong>every</strong> reader of a read response to check that
the response time falls within an interval whose backward bound is a declared
tolerance, and declares that tolerance in the Bilateral Register Agreements.
The forward bound of that interval is the fixed sixty seconds of
<xref target="read-responses"/>, which every reader already holds because this document
states it, so it is the backward bound alone that has to be published here.
A relying party is party to no Agreement and holds only their hashes, so the
tolerance every reader must apply was readable only by the parties who did not
have to apply it themselves, which is precisely the defect the Witness Set element was
added to fix.  </t>
              <t>
Without that fifth element a
relying party, which holds only Agreement Hashes, could not evaluate the quorum
the same section obliges it to evaluate.  </t>
              <t>
The Publication Timestamp is first because the rest of the array is evidence
about the reconciliation server, published by the reconciliation server, under
its own key, and a COSE_Sign1 is not dateable from its own bytes. Two
Documents published a year apart, one of which has had a transition or a
Witness Entry quietly dropped from it, are otherwise indistinguishable to
every party the Document exists to inform. This document already reached that
conclusion twice, for the Ledger Head Statement of <xref target="settlement-ledger"/> and
for the Head Consistency Statement of <xref target="head-consistency"/>, and the same
reasoning was not carried here.  </t>
              <t>
The reconciliation server <bcp14>MUST</bcp14> submit each published Policy Parameters
Document for notarisation by the Transparency Service of <xref target="settlement-ledger"/>, under its own
media type, within the ledger-head notarisation interval of that section
measured from its Publication Timestamp, and <bcp14>MUST</bcp14> republish it on that
interval whether or not its contents changed. A Document that changed without
a new Publication Timestamp, or a published Document with no notarisation
inside the interval, is non-conforming.  </t>
              <t>
The obligation to republish unchanged is what makes silence readable: without
it, an operator that has removed a Witness Entry and an operator that has
changed nothing publish the same thing, and the notarised series has no entry
to be missing. A relying party <bcp14>MUST NOT</bcp14> treat a Policy Parameters Document as
current where its Publication Timestamp is older than twice that interval, and
<bcp14>MUST</bcp14> refuse to evaluate a quorum against one it cannot date. A requester is
party to no Bilateral Register Agreement and could not otherwise determine how
to sign, and publishing the resolved parameters removes the regime-shopping
probe of <xref target="verdict-arithmetic"/> by making its result available without
probing.</t>
            </li>
            <li>
              <t>A request that is unsigned, that fails signature verification, that is outside
the freshness window, or that replays a nonce <bcp14>MUST</bcp14> be refused with <tt>401</tt>. A
<tt>401</tt> is the one response of this section that is not signed under
<xref target="read-responses"/>: its payload would have to bind a request carrying no nonce
and no key identifier, and there is no requester key to bind it to. A <tt>401</tt>
therefore carries no body, and a requester receiving one has learned only that
its own signature was not accepted.</t>
            </li>
          </ul>
        </section>
        <section anchor="read-operations">
          <name>Read operations</name>
          <t>Nine operations are defined, and no read of an Output or of the Settlement-Layer
Ledger by a party outside the reconciliation server is defined anywhere else in
this document. An Audit Identity under <xref target="audit-path"/> is entitled to every one of
them, unredacted, over reconciliations addressing the register whose agreement
declares it; the Entitlement clauses below state the other parties and do not
repeat that. The Ledger Head Statement of <xref target="settlement-ledger"/> is not a read of
the Ledger: it is a published statement about the Ledger, served without
authentication at a well-known URI, and is deliberately outside this section so
that a party holding no entitlement at all can still observe a head.</t>
          <ul spacing="normal">
            <li>
              <t><tt>GET /arp/outputs/{reconciliation-hash}</tt> returns the sealed Reconciliation
Output. Entitlement: an Audience Member of that Output; an Audit Identity under
<xref target="audit-path"/> for a reconciliation addressing its register; and a regulator in
scope for that reconciliation under <xref target="regulator-portal"/>, whose response is
field-restricted by that section.</t>
            </li>
            <li>
              <t><tt>GET /arp/reconciliations/{reconciliation-identifier}/registers/{register-identifier}</tt>
returns the Per-Register Result Set entry concerning that register alone,
keyed on the Reconciliation Identifier the register received in its
Per-Register Claim Projection, since a register never holds a Reconciliation
Hash. Entitlement: the Register Operator of that register. It is what lets a register
see what was recorded of its own answer. Without it a server could discard a
register's signed <tt>match</tt> and record <tt>register-unresponsive</tt>, and the only
party holding the contradicting artefact would have no operation with which to
produce it.</t>
            </li>
            <li>
              <t><tt>GET /arp/outputs</tt> returns, for the Outputs whose Audience Set names the
authenticated principal, the Reconciliation Hash, the Reliance Horizon and the
Entry Sequence Number of the reconciliation entry that records each. It is
ordered by that Entry Sequence Number descending, which is a total order and
needs no tie-break. A <tt>since</tt> parameter carrying an <xref target="RFC3339"/> UTC time is
<bcp14>REQUIRED</bcp14>; a server <bcp14>MUST</bcp14> return at most 100 entries and <bcp14>MUST</bcp14> carry a <tt>next</tt>
parameter value in the response where more exist, which the requester supplies
on the following request. Entitlement: any authenticated principal, as to its
own membership only; and an Audit Identity, as to the Outputs of
reconciliations addressing the register whose agreement declares it, without
which an auditor entitled to Outputs by hash would hold no operation that
yields the hashes.</t>
            </li>
            <li>
              <t><tt>GET /arp/continuations/{reconciliation-hash}</tt> returns the Continuation entries
of <xref target="settlement-ledger"/> carrying that Reconciliation Hash, in Entry Sequence
Number order, and no reconciliation entry. Entitlement: an Audience Member of
the Output that Reconciliation Hash identifies, or a regulator in scope for
that reconciliation under <xref target="regulator-portal"/>.</t>
            </li>
            <li>
              <t><tt>GET /arp/entries/{entry-sequence-number}</tt> returns one Ledger entry.
Entitlement: a regulator, subject to <xref target="regulator-portal"/>; an Audience Member,
for an entry carrying a Reconciliation Hash it is entitled to; and a Register
Operator or regulator requesting the Self-Entry Hash alone, for the consistency
check of <xref target="settlement-ledger"/>, by the <tt>fields=self-entry-hash</tt> query
parameter. Any requester whose signature verifies under <xref target="read-signing"/> is
additionally entitled to the four-element array of the Entry Sequence Number,
the Prior-Entry Hash, the Self-Entry Hash and the Signing Input Digest of that
entry's Entry Signature, by the <tt>fields=linkage</tt> query
parameter, which is what a witness reads to produce the Segments of
<xref target="witness-linkage"/>. The projection is additionally available for a contiguous
range, by the <bcp14>OPTIONAL</bcp14> <tt>through</tt> parameter naming an Entry Sequence Number at
or above the one in the path, the response carrying the linkage array of every
entry from the one in the path up to and including the lowest of the value in
<tt>through</tt>, the head bound below, and the highest the server elects to serve. A
server <bcp14>MUST</bcp14> serve at least one thousand entries in one such response where
that many lie in range, which is the Segment cap of <xref target="witness-linkage"/>, so
that a witness can produce one Segment from one read. A response that stops
short carries the entries it served and the requester continues from the next
Entry Sequence Number, so a range longer than a server elects to serve draws
no refusal and no status a shorter one would not have drawn. A ranged read counts as
one request against the limit of <xref target="read-errors"/>, save for the fixed
allowance that section makes each interval for a witness principal so that a
rate limit cannot void the publication obligation of <xref target="witness-linkage"/>. That
allowance does distinguish a witness from another principal, by the number of
reads admitted rather than by the answer to any one of them, and what it
discloses is that the reading key is in a Witness Set some Agreement the
deployment holds declares. That is a wider set than the effective Witness Set
<xref target="read-signing"/> publishes, so the allowance is a disclosure and is recorded
as one in <xref target="privacy"/>. Every
linkage read is <strong>only for an Entry Sequence Number at or below the head of
the most recently published Ledger Head Statement</strong>, and a ranged read is
bounded at that head in the same way. A
linkage read naming a higher sequence number <bcp14>MUST</bcp14> be refused with <tt>404</tt>
whether or not the entry exists. Without
that bound the projection is a live head oracle: the Ledger is contiguous, so
a requester could binary-search the current head between publications and poll
it for the write rate, which is the disclosure <xref target="settlement-ledger"/> publishes
the head once per notarisation interval to prevent. Bounded, the projection
carries no Reconciliation Hash and no structural metadata and discloses nothing
beyond the chain shape below a head that is already published
unauthenticated. It is rate-limited as <xref target="read-errors"/> provides.</t>
            </li>
            <li>
              <t><tt>GET /arp/post-seal-records/{post-seal-evaluation-record-hash}</tt> returns the
Post-Seal Evaluation Record of <xref target="post-seal"/>. Entitlement: as for the
Continuation entry that carries the hash.</t>
            </li>
            <li>
              <t><tt>GET /arp/sweeps/{examined-set-root}/inclusion/{claim-hash}</tt> returns an
inclusion proof of that Claim Hash under that Examined-Set Root. Entitlement: a
party entitled to a reconciliation carrying that Claim Hash. The Statement is
keyed on its Examined-Set Root rather than on its timestamp, which is pinned to
whole seconds and would collide where two triggers fall in one second.</t>
            </li>
            <li>
              <t><tt>GET /arp/re-notifications</tt> returns the Sovereign Re-Notifications of
<xref target="re-notification"/> whose Notification Timestamp falls in the interval named by
<bcp14>REQUIRED</bcp14> <tt>since</tt> and <tt>until</tt> parameters, at most 100 per response under the same
<tt>next</tt> rule. Entitlement: a regulator, as to notifications addressed to it.</t>
            </li>
            <li>
              <t><tt>GET /arp/sweeps</tt> returns the Evaluation Sweep Statements of
<xref target="sweep-statements"/> whose Evaluation Sweep Timestamp falls in the interval
named by <bcp14>REQUIRED</bcp14> <tt>since</tt> and <tt>until</tt> parameters, at most 100 per response
under the same <tt>next</tt> rule. Entitlement: a Register Operator, a regulator or an
Audience Member. Its
counts are deployment-wide aggregates and disclosing them to a party named in
one Audience Set is a real cost, recorded in <xref target="privacy"/>; the Statement is a
signature over a fixed array and cannot be served with fields removed without
destroying the signature that makes it worth serving.</t>
            </li>
          </ul>
          <t>The enumeration is what makes the Entry Sequence Number of a party's own
reconciliation entry reachable. Without it an Audience Member entitled to that
entry under <xref target="settlement-ledger"/> would have no operation that maps its
Reconciliation Hash to a sequence number, and its only route to an entitlement
this document grants would be the sweep of <tt>GET /arp/entries/{n}</tt> that the rate
limit below exists to prevent.</t>
        </section>
        <section anchor="read-responses">
          <name>Responses</name>
          <t>Every response to an operation of <xref target="read-operations"/> or to the commissioning
request of <xref target="request-binding"/>, including every <tt>4xx</tt> other than the <tt>401</tt> of
<xref target="read-signing"/>, <bcp14>MUST</bcp14> be a COSE_Sign1 by the reconciliation-server sealing key, under the media
type registered in <xref target="iana"/>, whose payload is the CBOR array</t>
          <artwork>
["arp-read-v1", request-binding, status, response-time,
 as-of-sequence-number, as-of-self-entry-hash, result]
</artwork>
          <t>where:</t>
          <ul spacing="normal">
            <li>
              <t><tt>request-binding</tt> is the SHA-256 digest over the CBOR array of the request's
<tt>@method</tt>, its <tt>@target-uri</tt> normalised as in Section 6.2.2 and 6.2.3 of
<xref target="RFC3986"/>, the request's <tt>nonce</tt>, and its <tt>keyid</tt>. Digesting a normalised
binding rather than echoing the target as sent leaves nothing to disagree about
and binds the response to one requester and one request.</t>
            </li>
            <li>
              <t><tt>status</tt> is the HTTP status code.</t>
            </li>
            <li>
              <t><tt>response-time</tt> is the time the response was produced, in the timestamp form of
<xref target="reconciliation-output"/>.</t>
            </li>
            <li>
              <t><tt>as-of-sequence-number</tt> and <tt>as-of-self-entry-hash</tt> <bcp14>MUST</bcp14> be those of the Ledger
head at the moment the read was served, and <bcp14>MUST NOT</bcp14> be those of any earlier
entry. A response naming a head lower than the most recently published Ledger
Head Statement is non-conforming, and a reader <bcp14>MUST</bcp14> reject one: a server free to
answer against a head it chooses could suppress a supersession indefinitely by
answering truthfully about a stale head, and its answer would never contradict
anything.</t>
            </li>
            <li>
              <t><tt>result</tt> is the operation's result, an empty array where the operation is
set-valued and nothing matched. On a <tt>404</tt> it is an empty array. On the <tt>422</tt>
or <tt>403</tt> of <xref target="request-binding"/> it is the Remediation Advisory, which is the
artefact a refused requester needs; on a <tt>429</tt> it is an empty array.</t>
            </li>
            <li>
              <t>For a response to the commissioning request, <tt>as-of-sequence-number</tt> and
<tt>as-of-self-entry-hash</tt> are those of the Ledger head at the moment the
response was produced, and the <tt>request-binding</tt> digest is taken over a
five-element array, the request's <tt>content-digest</tt> appended after its
<tt>keyid</tt>.</t>
            </li>
          </ul>
          <t>Signing errors as well as successes is the load-bearing part. A server that
signed only its successes could suppress any continuation channel by answering
<tt>404</tt> or <tt>429</tt> forever, and the party it was suppressing would hold an unsigned
status line: no proof that it asked, no proof of what it was told, and no way to
distinguish suppression from a hash that names nothing. Binding the response to
the requester's nonce and key, and stamping it with a time, is what stops a
server serving one party's response to another or replaying a year-old empty
result; without those the same bytes verify forever and against everybody.</t>
          <t>A reader <bcp14>MUST</bcp14> check that the <tt>request-binding</tt> matches the request it sent, that
the <tt>as-of-sequence-number</tt> is at least that of the most recent Ledger Head
Statement it has seen, and that the <tt>response-time</tt> is fresh. The <tt>response-time</tt>
is fresh where it is no earlier than the instant the reader received the response
less the declared tolerance, and no later than 60 seconds after that instant. A
reader <bcp14>MUST</bcp14> reject a response whose <tt>response-time</tt> falls outside that interval
in either direction.</t>
          <t>The reference instant is the reader's receipt of the response and the direction
is backward, stated here for the reason <xref target="replay-defence"/> gives for stating them
there: a tolerance with no reference instant and no direction is a test two
implementations apply differently to the same response. The forward bound is
stated because <tt>response-time</tt> is produced on the responding service's clock and
tested against the reader's, and nothing in this document synchronises the two.
Without it, a response stamped ahead of the reader's clock and a response
produced at the instant it claims are one value to the check, and a server whose
clock runs fast is indistinguishable from one stamping ahead deliberately. The
sixty seconds is the figure this document already uses wherever one party is
bounded against another's clock: the reconciliation server against the
register's, in the Freshness Timestamp of <xref target="replay-defence"/>, and the server
against the requester's, in the <tt>created</tt> parameter of <xref target="read-signing"/>. Both of
those run toward the server. This is the return direction, and it is the one the
document had not stated. Neither
party is required to hold a reference clock: the rule bounds the disagreement
rather than removing it, which is what a two-clock test can do. A deployment
<bcp14>MUST</bcp14> declare that tolerance in its Bilateral Register Agreements, it <bcp14>MUST</bcp14> be at
least sixty seconds, and it <bcp14>MUST NOT</bcp14> exceed the effective ledger-head
notarisation interval of <xref target="settlement-ledger"/> or sixty seconds, whichever is
longer, that interval being the shortest any Bilateral Register Agreement the
deployment holds declares, per the direction rule of <xref target="delivery"/>: a tolerance
left to each reader is not a property two implementations can be tested against;
one shorter than the transit and clock disagreement between the two parties
rejects every honest response, the backward bound running from the reader's
receipt and the response having been produced before it; and one longer than the
notarisation interval would admit a response naming a head the reader could
already know to be superseded. Without those checks a server may serve a cached response for a
repeated request tuple indefinitely, and the properties below do not hold.</t>
          <t>An empty result is therefore an assertion and not an absence: a signed statement
that as of a named head, at a named time, in answer to this requester's request,
there was nothing. A <tt>continuation-supersession</tt> entry later found at or below
that head contradicts it, in one operator's own signature.</t>
          <t>That contradiction is conditional on the reader and the later observer having
been served one chain, and the condition is load-bearing. <xref target="settlement-ledger"/>
states that detection of a fork is opportunistic: an operator publishing to two
audiences at disjoint sequence numbers never emits a colliding pair. Under such
a fork the superseding entry lands on a branch the holder of the empty result
never reads, the at-or-below test never fires, and the assertion stands
uncontradicted for as long as the branches are kept apart. An empty result is
therefore an assertion about a named head on the chain its reader was served,
and it is falsifiable to the extent that the reader holds head-consistency
evidence for that chain from an observer independent of the responding service.</t>
          <t>Head evidence obtained only from that service does not bound this. A fork at
disjoint sequence numbers is invisible from a single vantage by construction,
and the vantage is what is in question: equivocation is precisely the condition
that no single consistent chain explains two observations, so it becomes
observable when two independent observers compare heads and not before. A
relying party acting on an empty result <bcp14>SHOULD</bcp14> hold head-consistency evidence
for the served chain from at least one observer independent of the responding
service -- a witness countersignature over the head, or, where no Witness Set is
available, an independently anchored head digest, in decreasing order of
strength. <xref target="bra-witness"/> specifies the Witness Set and the Witness Quorum, so
that "at least one observer independent of the responding service" is a
condition a deployment declares a value for and an implementation can be tested
against, rather than a property each reader decides for itself. What that
quorum does and does not establish is stated in <xref target="bra-limits"/>: it is
independence declared, not independence proven, and this document still does not
claim to close the gap.</t>
          <t>The contradiction is only as tight as the operator's freedom to defer. A
<tt>continuation-supersession</tt> entry <bcp14>MUST</bcp14> be appended within the ledger-head
notarisation interval of <xref target="settlement-ledger"/>, measured from the completion of
the Evaluation Sweep that produced the superseding Output -- an event the
Evaluation Sweep Statement of <xref target="sweep-statements"/> dates and signs, and which
therefore exists for an immaterial supersession as much as for a material one.
Where the supersession is the revocation of a Verified Principal Credential and
no superseding Output is produced, the deadline runs from the completion of the
sweep the revocation triggered, which <xref target="sweep-statements"/> likewise dates and
signs. Measuring from "the material change" would leave both that case and an
immaterial supersession with no start point and so no deadline. Without a deadline an operator defers
every supersession above the highest head it has ever named and no contradiction
ever arises.</t>
        </section>
        <section anchor="read-errors">
          <name>Error semantics</name>
          <t>A request that is well-formed and signed but that names a resource the requester
is not entitled to, and a request naming a resource that does not exist, <bcp14>MUST</bcp14>
both be refused with <tt>404</tt>. Only an entitled requester receives <tt>200</tt>. Answering
<tt>403</tt> for the first and <tt>404</tt> for the second would turn every endpoint into an
existence oracle: a party could sweep Reconciliation Hashes, or sequence numbers,
and learn what a deployment had done without being entitled to any of it.</t>
          <t>The two cases <bcp14>MUST</bcp14> be equivalent under the normalised observation this section
defines, rather than byte-identical, which a conforming server cannot make them:
<xref target="read-responses"/> requires every response to bind the request and the serving
instant, so the <tt>request-binding</tt>, the <tt>response-time</tt>, the As-Of pair and the
resulting signature differ between any two requests whether or not the resource
exists. A requirement of byte equality would be unsatisfiable, and a test
written against it would fail every conforming implementation.</t>
          <t>The normalised observation of a response is that response with exactly those
four values removed. Two responses are equivalent when their normalised
observations are equal. Across the two cases a server <bcp14>MUST</bcp14> therefore produce the
same status, the same media type, the same set of HTTP header field names, the
same set of protected COSE header parameters, the same empty-result
representation, the same cache directives and the same rate-limit effects, and
the signed payload <bcp14>MUST NOT</bcp14> carry any error discriminator whose value depends on
whether the resource exists. Every value removed by normalisation <bcp14>MUST</bcp14> still be
valid for its own request: normalisation is how two responses are compared, not
a licence to omit a required field or to carry an existence-dependent
discriminator inside one.</t>
          <t>A response to either case <bcp14>MUST</bcp14> carry <tt>Cache-Control: no-store</tt>. A response bound
to a nonce and a serving instant is not reusable by another requester, and a
cache that retained one case and not the other would reintroduce through
intermediaries the distinction the rest of this section removes.</t>
          <t>Two channels survive that rule and <bcp14>MUST</bcp14> be closed with it. A server <bcp14>MUST</bcp14> charge
the rate-limit counter before evaluating entitlement, so that an unentitled
request and a nonexistent one consume the same budget and a burst of each yields
the same sequence of statuses. And entitlement evaluation <bcp14>MUST NOT</bcp14> be
short-circuited: a server <bcp14>MUST</bcp14> perform the same work for a Reconciliation Hash it
does not hold as for one whose Audience Set does not name the requester, so that
the two do not differ in response time.</t>
          <t>Response timing is a separate claim from the requirements above and <bcp14>MUST</bcp14> be
stated separately. Serving both cases from one processing path is evidence about
the design and is not evidence that the two latency distributions are
indistinguishable to an observer. An implementation that claims resistance to
timing-based existence inference <bcp14>MUST</bcp14> publish the measurement population, the
sample count, the network placement of the measurement, the decision rule and
the acceptance threshold under which the two response classes were compared. An
implementation that makes no such claim is not for that reason non-conforming:
the requirements above are met or not met independently of it, and conflating
the two would let a deterministic conformance failure be excused as a
measurement artefact, or a measurement result be read as protocol conformance.</t>
          <t>The <tt>fields=linkage</tt> projection of <xref target="read-operations"/> answers <tt>200</tt> for an
entry whose full read the same requester would be refused, and is not an
existence oracle for two reasons that both have to hold. The Ledger carries a
contiguous Entry Sequence Number and <xref target="settlement-ledger"/> publishes the head
unauthenticated, so existence at or below that head is already public and the
projection discloses no fact about which entries exist. And the projection is
bounded at that published head, so it cannot answer the one existence question
that is not already public, which is where the head is now. A projection that
widened either -- serving a non-contiguous ledger, or serving above the
published head -- would be an oracle, and neither is permitted.</t>
          <t>A server <bcp14>MUST</bcp14> rate-limit these operations, per authenticated principal, at the
most permissive rate any of its Bilateral Register Agreements declares, and <bcp14>MUST</bcp14> answer <tt>429</tt> when the limit
is reached. The declared rate <bcp14>MUST</bcp14> admit at least one read of each operation per
Reconciliation Hash per reliance interval, so that a limit cannot silently void
the obligation of <xref target="reliance-horizon"/>. A server <bcp14>MUST NOT</bcp14> count against that
limit the first sixty ranged linkage reads made in each effective ledger-head
notarisation interval, being the shortest item 15 any Bilateral Register
Agreement the deployment holds declares, by a principal whose <tt>keyid</tt> resolves to the key of a
Witness Entry any Bilateral Register Agreement the deployment holds declares, so
that a limit cannot silently void the publication obligation
<xref target="witness-linkage"/> places on a witness. The allowance is a fixed count outside
the declared rate rather than a second rate inside it: item 18 of <xref target="bra-items"/>
carries one request count and one interval, and a per-class rate would be a
negotiated term sitting outside the Agreement Hash. Sixty reads of the thousand
entries <xref target="read-operations"/> obliges a server to serve in one of them cover sixty
thousand appends in an interval; a deployment appending faster declares a
shorter interval or a higher rate, which are its own terms and not a third
party's cadence. <tt>GET /arp/entries/{n}</tt> in particular
ranges over the whole Ledger; unlimited, a party entitled to one consistency
check could sweep for the deployment's entry count, write rate, and the timing of
retroactive bursts, which is disclosure by aggregation of a surface every
individual answer to which is innocuous.</t>
          <t>A read served under <xref target="regulator-portal"/> with any field redacted <bcp14>MUST NOT</bcp14> return
the Prior-Entry Hash or the Self-Entry Hash of that entry, and <bcp14>MUST NOT</bcp14> return
the Prior-Entry Hash of the entry that follows it, which is the Signing Input
Digest of the redacted entry's Entry Signature and so covers every field of that
entry including the fields being withheld. The Self-Entry Hash is a digest over the entry's
own fields and carries no blinding value; a reader holding the leading fields and
denied the type-specific block could otherwise recover the block by search over
register subsets, a small aggregation descriptor set, four binding classes and a
bounded timestamp, and would do so off the audit trail that section imposes. A
redacted field is returned as CBOR null in its position, so that the array's
length is still the length fixed by the Entry Type; a regulator receiving a
redacted entry therefore cannot verify its chain hashes, which is the price of
redaction and is why an unredacted read is the ordinary case.</t>
          <t>Each read served under this section <bcp14>MUST</bcp14> be recorded in an append-only access
log, retained for the period of <xref target="delivery"/>, sequenced, chained, headed and
notarised as the audit trail of <xref target="regulator-portal"/> is and for the same reason. The log is not the Settlement-Layer
Ledger and <bcp14>MUST NOT</bcp14> be written to it: who asked a question is not a fact about
the reconciliation, and a Ledger that recorded reads would disclose the pattern
of interest in a subject to every party entitled to read it. The log is readable only by a regulator under
<xref target="regulator-portal"/> and by an Audit Identity under <xref target="audit-path"/>, to which it is
disclosed out of band as the policy-epoch material is; the reasoning that keeps
it off the Ledger applies equally to the log itself.</t>
        </section>
      </section>
      <section anchor="scrapi-binding">
        <name>SCITT Reference API Binding</name>
        <t>A Reconciliation Output <bcp14>MAY</bcp14> be notarised into a SCITT Transparency Service as a
transparent statement. Where it is, an implementation <bcp14>MUST</bcp14> use the binding in
this section. <xref target="composition-scitt"/> states the architectural relationship; this
section states the wire behaviour, so that two implementations registering the
same Reconciliation Output against the same Transparency Service produce
interchangeable results.</t>
        <section anchor="registration">
          <name>Registration</name>
          <t>The Reconciliation Output <bcp14>MUST</bcp14> be registered as a Signed Statement by
<tt>POST /entries</tt> as defined in <xref target="I-D.ietf-scitt-scrapi"/>, with the HTTP
<tt>Content-Type</tt> that document requires on that request. A Transparency Service
returns a <tt>Location</tt> header on both <tt>201 Created</tt> and <tt>202 Accepted</tt>; an
implementation <bcp14>MUST</bcp14> use it in both cases rather than constructing a polling URL
of its own.</t>
          <t>Notarising an Output does not enlarge its Audience Set. Registration places the
sealed Output in a log whose retrieval is by EntryID, and a party that obtains it
that way holds it on the terms of <xref target="entitlement"/>: it may verify the Sealing
Signature and read the Combined Verdict, and it obtains no read under
<xref target="ledger-read"/> and no notice of supersession. A deployment for which that is
the wrong disclosure should not notarise; <xref target="scrapi-binding"/> is composed
permissively for that reason.</t>
          <t>The payload of the Signed Statement <bcp14>MUST</bcp14> be the sealed COSE_Sign1 -- the
Reconciliation Output under its Sealing Signature, as produced by
<xref target="sealing"/> -- and <bcp14>MUST NOT</bcp14> be the bare Reconciliation Output. Nesting is what
makes the requirements below checkable: a relying party holding only the bare
Output has neither the sealing key identity nor the Policy-Version Hash the seal
committed to, and could not verify either.</t>
          <t>The Signed Statement is therefore a COSE_Sign1 whose payload is itself a
COSE_Sign1. Its protected header <bcp14>MUST</bcp14> carry:</t>
          <ul spacing="normal">
            <li>
              <t>the content type <tt>application/arp-sealed-reconciliation-output+cose</tt>,
registered per <xref target="iana"/>. The outer payload is a COSE_Sign1 wrapping a
Reconciliation Output, not a Reconciliation Output, and labelling it with the
latter's media type would have a conforming decoder parse a signature envelope
as an Output;</t>
            </li>
            <li>
              <t><tt>arp-policy-version-hash</tt>;</t>
            </li>
            <li>
              <t><tt>arp-bilateral-agreement-hash</tt>, carrying the array of the
Bilateral-Register-Agreement Hashes of the addressed registers, sorted in
lexicographic byte order as required by <xref target="encoding"/>. A Reconciliation Output
aggregates registers under more than one agreement, and an unordered encoding
would make two conforming implementations produce non-interchangeable Signed
Statements.</t>
            </li>
          </ul>
          <t>The outer COSE_Sign1 <bcp14>MUST</bcp14> carry a <tt>kid</tt> in its protected header, <bcp14>MUST</bcp14> be signed
under a key resolvable through <xref target="sealing-key-discovery"/>, and that key's
Sealing-Key Identifier <bcp14>MUST</bcp14> equal the Sealing-Key Identifier of the nested
Output in both components. A relying party <bcp14>MUST</bcp14> verify the outer signature and
that equality. "Signed by the server that sealed it" is otherwise not a
predicate a relying party can evaluate: any operator of a conforming server
could wrap another server's sealed Output, sign it under its own resolvable key,
and every other check here would pass, and the Receipt would attribute the
statement to the Transparency Service and to nobody else. Fixing the nested payload closes a false-policy-version
attack; fixing the outer signer closes a wrong-registrant one.</t>
          <t>The <tt>arp-bilateral-agreement-hash</tt> in the outer protected header <bcp14>MUST</bcp14> equal the
value carried in the nested sealed COSE_Sign1, and the
<tt>arp-policy-version-hash</tt> in the outer protected header <bcp14>MUST</bcp14> equal the
Policy-Version Hash carried in the nested sealed COSE_Sign1. A relying party
<bcp14>MUST</bcp14> verify the Sealing Signature over the nested payload, <bcp14>MUST</bcp14> verify that
equality, and <bcp14>MUST</bcp14> reject the Signed Statement where either fails.</t>
          <t>The verification key for the Sealing Signature is identified by the Sealing-Key
Identifier of <xref target="reconciliation-output"/>, whose <tt>kid</tt> component <bcp14>MUST</bcp14> equal the
<tt>kid</tt> in the protected header of the nested COSE_Sign1, and is resolved through
<xref target="sealing-key-discovery"/>. A relying party that cannot resolve the Sealing-Key
Identifier <bcp14>MUST NOT</bcp14> rely on the notarised statement.</t>
          <t>Without nesting and this equality the Signed Statement would be a second and
independent envelope: any party holding a valid Reconciliation Output could
register it under a protected header asserting a policy version it was not
sealed under, and a relying party following <xref target="policy-version-determination"/>
would believe that assertion. A protected header cannot be altered after
signing, but it can be false when signed, and integrity is not correctness.</t>
          <t>The payload <bcp14>MUST NOT</bcp14> be the Verifiable Credentials serialisation of
<xref target="vc-interop"/>. That form is an interop convenience for relying parties and is
not the notarised object; registering it instead would notarise a
representation whose canonical form is unspecified.</t>
        </section>
        <section anchor="async-registration">
          <name>Asynchronous registration</name>
          <t>A Transparency Service may register synchronously or asynchronously, and an
implementation <bcp14>MUST</bcp14> support both. This is the most likely source of divergence
between two otherwise conforming implementations, and is therefore stated as a
requirement rather than left to the referenced document.</t>
          <t>On <tt>201 Created</tt> the Receipt is available immediately. On <tt>202 Accepted</tt> the
response carries a <tt>Location</tt> header, and the implementation <bcp14>MUST</bcp14> poll that URL
verbatim rather than constructing a path of its own. A <tt>204 No Content</tt> means
registration is still in progress and <bcp14>MUST NOT</bcp14> be treated as failure or as a
negative result.</t>
          <t>A <tt>4xx</tt> other than <tt>404</tt> returned synchronously by <tt>POST /entries</tt> is a terminal
refusal and <bcp14>MUST NOT</bcp14> be retried under the same Signed Statement; it is the
ordinary refusal case and is recorded as such under <xref target="settlement-ledger"/>.</t>
          <t>A <tt>404 Not Found</tt> ends polling and <bcp14>MUST NOT</bcp14> be polled further. It carries two
meanings in <xref target="I-D.ietf-scitt-scrapi"/> -- that no Receipt was found for the
specified EntryID, and that an asynchronous registration has failed and no
Receipt will be produced -- and an implementation <bcp14>MUST</bcp14> distinguish them from the
response body where the service supplies one, because the second is a
registration failure and the first may follow from having polled a URL the
Transparency Service did not issue. Ending polling is not
the same as resolving the outcome: only the second meaning is a terminal refusal
for the purposes of <xref target="settlement-ledger"/>, and a <tt>404</tt> the implementation cannot
resolve to one meaning or the other is recorded as an incomplete notarisation,
not as a refusal.</t>
          <t>An implementation <bcp14>MUST</bcp14> honour a <tt>Retry-After</tt> header where one is present, <bcp14>MUST
NOT</bcp14> poll more frequently than once per second in its absence, and <bcp14>MUST</bcp14> bound
total polling, to the shortest bound any Bilateral Register Agreement addressed
by the reconciliation declares; a bound of 300 seconds is <bcp14>RECOMMENDED</bcp14> where the
Bilateral
Register Agreement declares none. Exhaustion of the bound <bcp14>MUST</bcp14> be recorded in a Post-Seal Evaluation Record
carrying <tt>notarisation-incomplete</tt> per <xref target="post-seal"/>, rather than as either
success or refusal. A
Reconciliation Output whose notarisation is incomplete remains valid under its
Sealing Signature; notarisation is an additional property, not a precondition of
validity.</t>
        </section>
        <section anchor="sealing-key-discovery">
          <name>Sealing-key discovery</name>
          <t>A signed key set, wherever this document requires one, is a COSE_Sign1 whose
payload is the deterministically encoded CBOR serialisation of the COSE_KeySet,
under the media type registered in <xref target="iana"/>. Each key in the set carries the
<tt>arp-key-status</tt> and <tt>arp-key-validity</tt> COSE Key common parameters registered in
<xref target="iana"/>. An Authorised-Origin Document is a COSE_Sign1 whose payload is a CBOR
array of three-element arrays -- the server's authority origin, the identifier of
the key signing its sealing key set, and the identifier of the key signing its
operator key set -- sorted in bytewise lexicographic order of the origin.</t>
          <t>A relying party is not a party to any Bilateral Register Agreement and holds
only the hashes of those agreements. It therefore cannot resolve the sealing key
from them, and a binding that assumed otherwise would oblige every conforming
relying party to refuse every Reconciliation Output.</t>
          <t>A reconciliation server <bcp14>MUST</bcp14> publish its sealing keys as a COSE Key Set at
<tt>/.well-known/arp-sealing-keys</tt> on the reconciliation server's authority origin,
and
a single key by identifier at <tt>/.well-known/arp-sealing-keys/{kid_value}</tt>. The
Sealing-Key Identifier is the pair of that origin and the <tt>kid</tt>. A key identifier
in this document is in every case the JWK thumbprint of <xref target="RFC7638"/>, base64url-encoded without padding. It is carried as a CBOR text
string in every payload field and in every <tt>keyid</tt> signature parameter, as the
UTF-8 encoding of that same text string in a COSE <tt>kid</tt> (label 4), which
<xref target="RFC9052"/> makes a byte string, and as that text string unaltered in a
<tt>{kid_value}</tt> path segment. Every equality test this document requires between a
<tt>kid</tt> and a Sealing-Key Identifier component is over the base64url text. Without
one pinned form the same key has three spellings and those equality tests
compare values of different CBOR types. With that fixed, it is the <tt>kid</tt>
component that is compared.</t>
          <t>Resolving a key is not sufficient. Web PKI establishes that an origin is the
origin it claims to be; it does not establish that the origin is entitled to
seal Reconciliation Outputs naming a given register set. A relying party that
accepted any well-formed key set would accept an Output minted by any party able
to stand up a host, since the Bilateral-Register-Agreement Hashes can be copied
from a genuine Output and are one-way.</t>
          <t>Each Bilateral Register Agreement <bcp14>MUST</bcp14> therefore declare the Authority Origin of
the reconciliation server it authorises, and each register operator <bcp14>MUST</bcp14> publish
an Authorised-Origin Document at <tt>/.well-known/arp-authorised-origins</tt> on its own
register origin. A Register Identifier is an origin, so the register origin is a
member of the Addressed-Registers Identifier Set and is known to the relying
party from the Output.</t>
          <t>An Authorised-Origin Document is a COSE_Sign1 whose payload comprises, for each
reconciliation server the register operator has authorised, that server's three-element array of
<xref target="sealing-key-discovery"/>: its authority origin, the identifier of the key
signing its sealing key set, and the identifier of the key signing its operator
key set. It <bcp14>MUST</bcp14> be signed under a key served in a COSE Key Set at
<tt>/.well-known/arp-register-keys</tt> on the same register origin -- a key set carrying the same <tt>arp-key-status</tt> and <tt>arp-key-validity</tt> parameters as
a sealing key set, so
that a compromised register key has an in-band revocation path, and the same key
set that resolves a register's signatures on Partial Attestations and Non-Answer
Statements -- which the relying
party fetches over its ordinary web PKI. Signing it matters for the same reason
signing the sealing key set matters: an unsigned document fetched over TLS can
be varied per audience, and this one is the root of the chain.</t>
          <t>A relying party <bcp14>MUST</bcp14> verify that the origin component of the Sealing-Key
Identifier appears in the Authorised-Origin Document published by every register
in the Addressed-Registers Identifier Set, and <bcp14>MUST</bcp14> reject the Output where it
does not or where any such document cannot be verified.</t>
          <t>The chain is then: register origins from the Output; each register's own key
from its register origin; the Authorised-Origin Document verified under that
key; the authorised server origin and its key-set signing key identifier from
that document; and the sealing key from the server's key set, verified under
that identifier. Every step is fetchable by a party holding only the Output.</t>
          <t>A key entry <bcp14>MUST</bcp14> carry the <tt>arp-key-validity</tt> and <tt>arp-key-status</tt> parameters of
<tt>active</tt>, <tt>retired</tt> or <tt>revoked</tt>, and an entry whose status is <tt>revoked</tt> <bcp14>MUST</bcp14>
carry a revocation time as the third element of <tt>arp-key-validity</tt>. A relying party <bcp14>MUST</bcp14> reject a Sealing Signature made under a
<tt>revoked</tt> key whose Reconciliation Timestamp falls at or after the revocation time that key
entry carries, <bcp14>MUST</bcp14> reject a Sealing Signature made under a <tt>revoked</tt> key
carrying no revocation time irrespective of when the Output claims to have been
sealed, <bcp14>MUST</bcp14>
accept one made under a <tt>retired</tt> key only where the Reconciliation Timestamp
falls within that key's validity interval, and <bcp14>MUST</bcp14> reject one whose
Reconciliation Timestamp falls outside the interval of the key it resolves to. A
key <bcp14>MUST NOT</bcp14> be removed from the set while any Reconciliation Output it sealed
may still be relied upon: retirement is by status, not by deletion, so that a
historical Output remains verifiable while a compromised key can still be
refused.</t>
          <t>Revocation without a time is repudiation of an epoch. Earlier revisions scoped
<tt>retired</tt> by validity interval and left <tt>revoked</tt> unscoped, so one status change
in a document the reconciliation server publishes, on its own origin, under its
own key, invalidated every Reconciliation Output, Evaluation Sweep Statement,
signed read response and Entry Signature that key had ever made. The rule
closing removal -- a key <bcp14>MUST NOT</bcp14> be deleted while an Output it sealed may be
relied upon -- was defeated by status, which is the same act with a different
verb.</t>
          <t>The reconciliation server <bcp14>MUST</bcp14> therefore publish and notarise its sealing key
set as <xref target="read-signing"/> requires of the Policy Parameters Document: with a
Publication Timestamp, notarised into the Transparency Service of
<xref target="settlement-ledger"/> on the ledger-head notarisation interval, and republished
on that interval whether or not its contents changed. A relying party <bcp14>MUST NOT</bcp14>
act on a status transition it cannot date. A COSE_Sign1 is not dateable from its
own bytes, and a status flip that no party can place in time disarms every party
it disarms without any of them being able to say when, or to show that it
happened after the Output they hold.</t>
          <t>The key set <bcp14>MUST</bcp14> itself be signed under the key whose identifier the
Authorised-Origin Document gives for that server, and a relying party <bcp14>MUST</bcp14> verify
that signature. The identifier comes from a document the relying party can
fetch, not from an agreement it does not hold. A
key set fetched over TLS alone can be varied per audience, which would let a
server present one key to one relying party and another to a second and seal two
contradictory Outputs for the same reconciliation, each verifiable only by its
intended audience -- reopening at the origin the equivocation that
<xref target="policy-version-determination"/> closes at the Transparency Service.</t>
        </section>
        <section anchor="receipt-validation">
          <name>Receipt validation</name>
          <t>A relying party <bcp14>MUST</bcp14> validate the Receipt against Transparency Service keys
obtained from <tt>GET /.well-known/scitt-keys</tt>, or from
<tt>GET /.well-known/scitt-keys/{kid_value}</tt> for a single key identified in the
Receipt.</t>
        </section>
        <section anchor="policy-version-determination">
          <name>Policy-version determination</name>
          <t>A relying party <bcp14>MUST</bcp14> determine the Policy Version of a notarised Reconciliation
Output from the <tt>arp-policy-version-hash</tt> parameter in the verified protected
header of the Signed Statement, and <bcp14>MUST NOT</bcp14> determine it from any retrieval
path, query parameter or Transparency Service index entry.</t>
          <t>Because the parameter is in the protected header, it is covered by the Receipt;
and because <xref target="registration"/> requires the sealed COSE_Sign1 to be the nested
payload and the outer parameter to equal the Policy-Version Hash it carries,
what the header asserts is verifiably what the seal committed to. The policy version is
therefore established by verification rather than by lookup, and a Transparency
Service that indexed an entry incorrectly, or presented different index results
to different relying parties, cannot cause a relying party to attribute a
Reconciliation Output to a policy version it was not sealed under.</t>
          <t>This holds only because of the nesting and equality requirements in
<xref target="registration"/>, both of which the relying party checks. A protected header
alone establishes that a value was not altered after signing, not that it was
true when signed.</t>
          <t><xref target="I-D.ietf-scitt-scrapi"/> defines retrieval by <tt>EntryID</tt> and defines no query
surface. Correlating entries by policy version is consequently outside the scope
of this binding and is a property of the deployment, not of the protocol. An
implementation <bcp14>MUST NOT</bcp14> assume a standard retrieval path keyed on the
Policy-Version Hash exists.</t>
        </section>
      </section>
      <section anchor="vc-interop">
        <name>Verifiable Credentials Interop</name>
        <t>A Reconciliation Output <bcp14>MAY</bcp14> be additionally serialised as a Verifiable
Credential conforming to <xref target="W3C-VC-DM-2.0"/> and secured as <tt>application/vc+cose</tt>
under <xref target="W3C-VC-JOSE-COSE"/>. The COSE_Sign1 of <xref target="reconciliation-output"/> is the
normative form. The credential is a projection of it for relying parties that
operate in W3C VC ecosystems, and it states what the Output establishes about a
claim in the vocabulary those ecosystems evaluate. This section is the complete
profile; a conforming credential satisfies every requirement below, and a
verifier applies every verification step below.</t>
        <section anchor="vc-form">
          <name>Credential Form</name>
          <t>The credential is a JSON object with these members.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Member</th>
                <th align="left">Value</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>@context</tt></td>
                <td align="left">the array of exactly two elements: <tt>https://www.w3.org/ns/credentials/v2</tt>, then an object whose only member is <tt>@vocab</tt>, set to <tt>https://datatracker.ietf.org/doc/draft-hillier-scitt-arp/vocab#</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>type</tt></td>
                <td align="left">the array <tt>VerifiableCredential</tt>, <tt>ArpReconciliationOutput</tt> and no other element</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>id</tt></td>
                <td align="left">
                  <tt>urn:arp:reconciliation:</tt> followed by the Reconciliation Hash</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>issuer</tt></td>
                <td align="left">the Authority Origin of the Sealing-Key Identifier, as a text string</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>validFrom</tt></td>
                <td align="left">the Reconciliation Timestamp</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>validUntil</tt></td>
                <td align="left">the Reliance Horizon</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>credentialSubject</tt></td>
                <td align="left">an object with the members below</td>
              </tr>
            </tbody>
          </table>
          <t>Every byte string rendered into the credential is rendered as base64url without
padding (Section 5 of <xref target="RFC4648"/>), the single rendering <xref target="representation-invariance"/>
requires. Every timestamp is in the form <tt>YYYY-MM-DDTHH:MM:SSZ</tt> fixed by
<xref target="reconciliation-output"/>.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Subject member</th>
                <th align="left">Value</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>reconciliationHash</tt>, <tt>claimHash</tt>, <tt>policyVersionHash</tt></td>
                <td align="left">the 32-octet values of the same names</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>combinedVerdict</tt></td>
                <td align="left">the Combined Verdict, one of <tt>match</tt>, <tt>no-match</tt>, <tt>partial-match</tt>, <tt>indeterminate</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>requesterBindingClass</tt></td>
                <td align="left">the Requester-Binding Class</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>addressedRegisters</tt></td>
                <td align="left">the Addressed-Registers Identifier Set, in the order of <xref target="reconciliation-output"/></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>bilateralRegisterAgreementHashes</tt></td>
                <td align="left">the Bilateral-Register-Agreement Hash Set, in the order of <xref target="reconciliation-output"/></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>reconciliationTimestamp</tt>, <tt>relianceHorizon</tt></td>
                <td align="left">the Reconciliation Timestamp and the Reliance Horizon</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>audienceSet</tt></td>
                <td align="left">an array with one object per Audience Member, in the order of <xref target="audience"/>, carrying <tt>id</tt> (the Audience Member Identifier) and <tt>verificationMethod</tt> (the Verification Method Reference)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>sealedOutput</tt></td>
                <td align="left">an object carrying <tt>digestAlgorithm</tt> (<tt>sha-256</tt>), <tt>digest</tt> (the SHA-256 digest of the serialised COSE_Sign1 of the sealed Reconciliation Output) and <tt>mediaType</tt> (<tt>application/arp-sealed-reconciliation-output+cose</tt>)</td>
              </tr>
            </tbody>
          </table>
          <t>The credential carries no Subject Identifier, no Attested Value, no
Per-Register Result Set and no register record. The members above are the
whole of it. A credential with a member outside them, at the top level or in
<tt>credentialSubject</tt>, is refused: an added member is the route by which register
content or a redefined term enters a signed document, and the second element of
<tt>@context</tt> is fixed for the same reason, because a context that redefines
<tt>combinedVerdict</tt> changes what a JSON-LD processor reads under a valid
signature.</t>
          <t><tt>validUntil</tt> is the Reliance Horizon and <tt>validFrom</tt> is the Reconciliation
Timestamp. A W3C verifier that treats <tt>validUntil</tt> as expiry therefore stops
treating the Combined Verdict as current at the instant <xref target="reliance-horizon"/>
requires, with no ARP-specific code. The Horizon bounds reliance and does not
invalidate the Output, and the credential carries the same meaning: after
<tt>validUntil</tt> the Sealing Signature still verifies and the verdict remains true
of the moment it was sealed.</t>
        </section>
        <section anchor="vc-securing">
          <name>Securing</name>
          <t>The credential is secured as a COSE_Sign1 under Section 3.3.1 of
<xref target="W3C-VC-JOSE-COSE"/>.</t>
          <ul spacing="normal">
            <li>
              <t>The payload is the credential serialised under <xref target="RFC8785"/> and encoded as
UTF-8. A verifier compares the payload to the <xref target="RFC8785"/> serialisation of
its own parse of it, because a signature over a second serialisation of one
credential is a second signing act over one statement.</t>
            </li>
            <li>
              <t>The protected header carries <tt>alg</tt> (1, the value <tt>-8</tt>, EdDSA), <tt>kid</tt> (4), <tt>typ</tt> (16) and the content
type (3). A verifier reads all four from the protected header only; a value
in the unprotected header is not evidence of anything. <tt>typ</tt> is <tt>application/vc+cose</tt>. The content type is
<tt>application/arp-reconciliation-output+json</tt>, the more specific type that
Section 3.3.1 of <xref target="W3C-VC-JOSE-COSE"/> permits in place of <tt>application/vc</tt>.
The <tt>kid</tt> is the UTF-8 encoding of the JWK thumbprint of the Sealing key, as
<xref target="sealing-key-discovery"/> states for every <tt>kid</tt> in this document.</t>
            </li>
            <li>
              <t>The signing key is the Sealing key. The pair of <tt>issuer</tt> and <tt>kid</tt> is the
Sealing-Key Identifier of the Output the credential projects, and it resolves
through <xref target="sealing-key-discovery"/>.</t>
            </li>
            <li>
              <t>The <tt>iat</tt> and <tt>exp</tt> CWT claims, where present in a COSE header, describe the
signature. A verifier <bcp14>MUST NOT</bcp14> read either as the Reconciliation Timestamp or
the Reliance Horizon. In the SD-JWT VC form <tt>exp</tt> is a payload claim and
carries <tt>validUntil</tt>.</t>
            </li>
          </ul>
        </section>
        <section anchor="vc-verification">
          <name>Verification</name>
          <t>A relying party that receives the credential <bcp14>MUST</bcp14> perform every step. A failure
at any step is a refusal to rely, and the step that failed is the reason
recorded.</t>
          <ol spacing="normal" type="1"><li>
              <t>Resolve the key for the Sealing-Key Identifier formed from <tt>issuer</tt> and <tt>kid</tt>
through <xref target="sealing-key-discovery"/> and verify the COSE_Sign1 under it.</t>
            </li>
            <li>
              <t>Check <tt>typ</tt>, the content type and <tt>alg</tt> against <xref target="vc-securing"/>.</t>
            </li>
            <li>
              <t>Check that the payload is the <xref target="RFC8785"/> serialisation of its own parse. A
payload with a duplicated member name, a string spelled with an escape that
<xref target="RFC8785"/> does not produce, or members in any other order fails here.</t>
            </li>
            <li>
              <t>Check that <tt>@context</tt> and <tt>type</tt> are exactly the values of <xref target="vc-form"/>, that
<tt>issuer</tt> equals the Authority Origin of the key resolved in step 1, that
every member of <xref target="vc-form"/> is present, that no other member is, and that
<tt>id</tt> is <tt>urn:arp:reconciliation:</tt> followed by <tt>reconciliationHash</tt>.</t>
            </li>
            <li>
              <t>Check that <tt>validFrom</tt> equals <tt>reconciliationTimestamp</tt>, that <tt>validUntil</tt>
equals <tt>relianceHorizon</tt>, that <tt>validFrom</tt> is earlier than <tt>validUntil</tt>, and
that every timestamp has the required form.</t>
            </li>
            <li>
              <t>Check that <tt>audienceSet</tt> is present and non-empty, and that its members are
distinct and in the order of <xref target="audience"/>. An Audience Set is never empty
(<xref target="audience"/>), and a credential without one is the bearer artefact
<xref target="entitlement"/> exists to retire.</t>
            </li>
            <li>
              <t>Check that <tt>combinedVerdict</tt> is one of the four defined values, and that
every byte string is rendered in the single form of <xref target="vc-form"/>: unpadded
base64url that decodes to the length the field has and re-encodes to the
same text. The Bilateral-Register-Agreement Hash Set is sorted and
deduplicated.</t>
            </li>
            <li>
              <t>Where the sealed Reconciliation Output is held, check that <tt>sealedOutput.digest</tt>
equals its SHA-256 digest and that <tt>reconciliationHash</tt> equals the
Reconciliation Hash recomputed from it. Where it is not held, the verdict is a
snapshot of unknown provenance until the Ledger entry for <tt>reconciliationHash</tt>
has been read under <xref target="ledger-read"/>.</t>
            </li>
            <li>
              <t>Compare the evaluation time to <tt>validUntil</tt>. After it, the Combined Verdict
<bcp14>MUST NOT</bcp14> be treated as current under <xref target="reliance-horizon"/>.</t>
            </li>
          </ol>
          <t>Steps 1 to 8 determine whether the credential is genuine. Step 9 determines
whether it is current. A genuine credential evaluated after its Horizon yields a
stale outcome, which differs from a refusal: the verdict is authentic and its
reliance window has closed.</t>
          <t>A relying party that is not an Audience Member holds a credential that carries
the Audience Set it is not on. <xref target="entitlement"/> applies to it exactly as it applies to the COSE_Sign1 form.</t>
        </section>
        <section anchor="vc-jose">
          <name>JOSE Securing Forms</name>
          <t>The credential of <xref target="vc-form"/> has three further securing forms. All four carry
the same credential, verify under the same Sealing key, and resolve that key
through <xref target="sealing-key-discovery"/>. A relying party applies the verification
steps of <xref target="vc-verification"/> to the credential it recovers from any form.</t>
          <t><strong>vc+jwt.</strong> The credential is secured as a compact JWS under Section 3.1.1 of
<xref target="W3C-VC-JOSE-COSE"/>. The payload is the <xref target="RFC8785"/> serialisation of the
credential. The protected header carries <tt>alg</tt> <tt>EdDSA</tt>, <tt>kid</tt> (the JWK
thumbprint of the Sealing key, <xref target="RFC7638"/>), <tt>typ</tt> <tt>vc+jwt</tt> and <tt>cty</tt> <tt>vc</tt>, and
no other member. The media type is <tt>application/vc+jwt</tt>.</t>
          <t><strong>SD-JWT VC.</strong> The credential is secured as an SD-JWT VC under <xref target="SD-JWT-VC"/>
and <xref target="SD-JWT"/>. The protected header carries <tt>alg</tt> <tt>EdDSA</tt>, <tt>kid</tt> and <tt>typ</tt>
            <tt>dc+sd-jwt</tt>. The payload carries <tt>iss</tt> (the credential's <tt>issuer</tt>), <tt>jti</tt> (its
<tt>id</tt>), <tt>iat</tt> and <tt>nbf</tt> (<tt>validFrom</tt>), <tt>exp</tt> (<tt>validUntil</tt>), <tt>vct</tt>
(<tt>https://datatracker.ietf.org/doc/draft-hillier-scitt-arp/vct#reconciliation-output</tt>),
<tt>_sd_alg</tt> <tt>sha-256</tt> and <tt>_sd</tt>, a sorted array of digests. Four credential
subject members are always in the clear: <tt>reconciliationHash</tt>,
<tt>combinedVerdict</tt>, <tt>reconciliationTimestamp</tt> and <tt>relianceHorizon</tt>. Seven are
selectively disclosable, each with its own Disclosure: <tt>claimHash</tt>,
<tt>policyVersionHash</tt>, <tt>requesterBindingClass</tt>, <tt>addressedRegisters</tt>,
<tt>bilateralRegisterAgreementHashes</tt>, <tt>audienceSet</tt> and <tt>sealedOutput</tt>. The
issuer serialisation carries every Disclosure and no key-binding JWT. A holder
presents a subset of the Disclosures. The media type is <tt>application/dc+sd-jwt</tt>.</t>
          <t>A verifier of the SD-JWT VC form <bcp14>MUST</bcp14> refuse a Disclosure whose digest is not in
<tt>_sd</tt>, a Disclosure presented twice, a Disclosure that names a member that is
in the clear or is not one of the seven, and an <tt>_sd</tt> that is not sorted. The
members recovered from the Disclosures and the clear members together are the
credential subject of <xref target="vc-form"/>, and steps 4 to 7 of <xref target="vc-verification"/>
apply to the credential as the issuer serialised it, with every Disclosure
present. The clear members map to that credential as <tt>iss</tt> to <tt>issuer</tt>, <tt>jti</tt> to
<tt>id</tt>, <tt>nbf</tt> to <tt>validFrom</tt>, <tt>exp</tt> to <tt>validUntil</tt> and <tt>vct</tt> to the credential
type, the subject members are top-level claims, and the credential's <tt>@context</tt>
is the constant <xref target="vc-form"/> fixes. A presentation that omits a Disclosure states
less than the credential does and states nothing different: a verifier applies
the Disclosure rules above, the clear members and the key binding to what it
received, and treats each member it did not receive as not stated.</t>
          <t>Where the issuer binds the credential to a wallet key, <tt>cnf</tt> carries that key
as a <tt>jwk</tt>, and a presentation of that credential carries a key-binding JWT
after the final tilde, per <xref target="SD-JWT"/>. The key-binding JWT has <tt>alg</tt> <tt>EdDSA</tt> and
<tt>typ</tt> <tt>kb+jwt</tt>; its payload carries <tt>iat</tt>, <tt>aud</tt>, <tt>nonce</tt> and <tt>sd_hash</tt>, the
base64url SHA-256 of the presentation up to and including its final tilde. A
verifier <bcp14>MUST</bcp14> refuse a presentation of a bound credential that carries no
key-binding JWT, one whose signature does not verify under <tt>cnf.jwk</tt>, and one
whose <tt>aud</tt>, <tt>nonce</tt>, freshness or <tt>sd_hash</tt> does not match what the verifier
issued and received. The Audience Set of <xref target="audience"/> is carried in every form
and is not made optional by selective disclosure: a holder that withholds the
<tt>audienceSet</tt> Disclosure presents a credential the relying party cannot place
itself on, and <xref target="entitlement"/> applies to that presentation.</t>
          <t><strong>mdoc.</strong> The credential is secured as an <tt>IssuerSigned</tt> structure of
<xref target="ISO18013-5"/>, profiled so that the issuer key resolves by thumbprint through
<xref target="sealing-key-discovery"/> where <xref target="ISO18013-5"/> carries an X.509 chain. Each credential subject member is one data element in the
namespace and <tt>docType</tt> <tt>com.certisyn.arp.reconciliation.1</tt>, carried as an
<tt>IssuerSignedItemBytes</tt> (tag 24) of <tt>digestID</tt>, <tt>random</tt>, <tt>elementIdentifier</tt>
and <tt>elementValue</tt>. The <tt>issuerAuth</tt> is a COSE_Sign1 (<xref target="RFC9052"/>) whose
protected header carries <tt>alg</tt> <tt>-8</tt> and <tt>kid</tt> (the thumbprint of the Sealing
key) and whose payload is a Mobile Security Object (tag 24) holding <tt>version</tt>
            <tt>1.0</tt>, <tt>digestAlgorithm</tt> <tt>SHA-256</tt>, the SHA-256 digest of every
<tt>IssuerSignedItemBytes</tt> under <tt>valueDigests</tt>, the holder's <tt>deviceKey</tt> as a
COSE_Key under <tt>deviceKeyInfo</tt>, the <tt>docType</tt>, and <tt>validityInfo</tt> (<tt>signed</tt>, <tt>validFrom</tt>,
<tt>validUntil</tt>) equal to the credential's window. Encoding is the core
deterministic encoding of <xref target="RFC8949"/>. A verifier <bcp14>MUST</bcp14> refuse an <tt>issuerAuth</tt>
that does not verify under the Sealing key, an item whose digest is not in
<tt>valueDigests</tt>, a digest with no item, a repeated <tt>digestID</tt>, a <tt>docType</tt> other
than the one it requested, a validity window that excludes the evaluation time,
and a <tt>deviceKey</tt> other than the holder key the relying party expects. The
elements recovered from the items are the credential subject of <xref target="vc-form"/>.</t>
          <t><strong>Issuer metadata.</strong> The issuer publishes the metadata document of
<xref target="SD-JWT-VC"/>: <tt>issuer</tt> (the credential's <tt>issuer</tt>) and <tt>jwks</tt>, a JWK Set that
holds the Sealing key with <tt>kid</tt> equal to its thumbprint. A relying party
resolves the Sealing key from this document or through <xref target="sealing-key-discovery"/>
and pins it before it accepts a credential in any form.</t>
        </section>
        <section anchor="vc-conformance">
          <name>Conformance Class</name>
          <t>A conformance class for this profile is published with the draft's conformance
material: 30 vectors, each declaring the outcome it must produce and the one
check designed to produce it, decided by two independent COSE_Sign1 and
<xref target="RFC8785"/> implementations that must agree on every row. Thirteen of the vectors
are signed by the genuine Sealing key and fail only on profile content: a
redefined context term, an added subject or top-level member, an <tt>id</tt> naming
another reconciliation, a <tt>validFrom</tt> after <tt>validUntil</tt>, a padded or
standard-alphabet byte string, unsorted agreement hashes, a duplicated Audience
Member, a duplicated JSON member name, an escape-spelled string, header
parameters carried unprotected, and an additional credential type. One vector is
a genuine credential evaluated after its Horizon, whose outcome is stale. For
each check a mutant verifier with that check removed must admit at least one
vector the full verifier refuses.</t>
          <t>The JOSE securing forms are checked against the platform's own emission by a
third implementation, hand-written over <xref target="RFC8785"/>, <xref target="RFC8949"/> and Ed25519,
that applies 30 rows: the four forms must state one credential and one holder
key, a holder presentation with its key-binding JWT must verify, and mutants of
each form that the genuine Sealing key signed, or that a holder or intermediary
altered, must be refused at their designed check.</t>
        </section>
      </section>
      <section anchor="representation-invariance">
        <name>Representation Invariance</name>
        <t>Every interoperability defect this document has repaired in its digest
constructions is one defect. A signature that has two byte encodings for one
signing act. A CBOR item whose major type the text did not fix. A set with no
ordering rule, or a CBOR map whose key order two libraries decide differently.
An optional member that could be omitted or nulled. A URI that
could be normalised on receipt or before sending. A Unicode string in NFC or in
NFD. A binary value rendered into JSON as base64, base64url or hex. A digest
taken over transmitted bytes or over a re-encoding.</t>
        <t>In each case two byte strings carry the same information and a digest over them
differs. The information content is invariant and the representation is not, and
the digest was defined over the representation. This section states the general
rule those repairs are instances of, so that the next instance is caught by the
rule rather than by the next reviewer.</t>
        <t><strong>The rule.</strong> For every digest, signature payload and comparison this document
defines, the value <bcp14>MUST</bcp14> depend only on the information its input carries and
<bcp14>MUST NOT</bcp14> depend on any choice of representation that carries no information. A
construction that fails this is not merely inconvenient: two conforming
implementations given the same facts compute different values, and every
mechanism built on the value inherits the divergence.</t>
        <t><strong>The obligation that makes it testable.</strong> A specification cannot discharge this
by asserting it. For every digest it defines, this document names the
<strong>representation class</strong> of each input: the set of byte strings that carry the
same information as that input. The classes this document recognises are:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Signature encoding.</strong> For ECDSA, <tt>(r, s)</tt> and <tt>(r, n - s)</tt>. The class has
more than two members over the wire, since a low-S rule removes one member of
an unbounded set. Handled by <xref target="signature-malleability"/>.</t>
          </li>
          <li>
            <t><strong>CBOR type choice.</strong> A value expressible as more than one major type: an
identifier as <tt>tstr</tt> or <tt>bstr</tt>, a count as <tt>uint</tt> or text, a URI as <tt>tstr</tt> or
tag 32, a timestamp as <tt>tstr</tt> or tag 0. Handled by the type tables of
<xref target="bra-hash"/>, <xref target="reconciliation-output"/>, <xref target="partial-attestation"/> and <xref target="iana"/>.</t>
          </li>
          <li>
            <t><strong>Collection order.</strong> The permutations of a set, and the orderings of the
pairs of a CBOR map. Handled by the bytewise sort rules stated at each set,
and for a map by the requirement of <xref target="cbor-cose"/> that Section 4.2.1 of
<xref target="RFC8949"/> be produced and that a library option named canonical not be
assumed to produce it. The map case is the one place in this class where the
freedom is exercised by a library default rather than by an implementer's
choice, which is why it is named there as well as here.</t>
          </li>
          <li>
            <t><strong>Absence.</strong> An optional member omitted, or present and null. Handled by the
null-substitution rules, which also fix array length.</t>
          </li>
          <li>
            <t><strong>Text normalisation.</strong> The Unicode normalisation forms of one string.
Handled by the NFC requirement of <xref target="ingestion"/>.</t>
          </li>
          <li>
            <t><strong>Reference normalisation.</strong> The equivalent forms of one URI or origin.
Handled by <xref target="terminology"/> for an Authority Origin and by <xref target="RFC3986"/>
normalisation for the identifiers that carry it.</t>
          </li>
          <li>
            <t><strong>Binary rendering in a text encoding.</strong> Base64, base64url with or without
padding, and hexadecimal renderings of one byte string. Handled by the
key-identifier rule of <xref target="sealing-key-discovery"/> and by the digest rendering
of <xref target="ingestion"/>.</t>
          </li>
          <li>
            <t><strong>Framing.</strong> A concatenation against an array, and an array against a map.
Handled by the domain-separated array requirement stated at each preimage.</t>
          </li>
        </ul>
        <t><strong>A specification that defines a new digest <bcp14>MUST</bcp14> state, for every element of its
preimage, which of these classes the element belongs to and which member of the
class the preimage takes.</strong> A registration under <xref target="iana"/> that introduces a value
carried into any digest this document defines <bcp14>MUST</bcp14> do the same, and the
designated expert <bcp14>MUST</bcp14> refuse one that does not.</t>
        <t><strong>The conformance obligation.</strong> A conformance runner for any construction in
this document <bcp14>MUST</bcp14> exercise the construction against the representation class of
each of its inputs, and not against an enumeration of previously observed
defects. The distinction is the whole of the test's value. A runner that checks
a digest against the two ECDSA signature encodings it has heard of confirms
what its author already knew; a runner that enumerates the class and asserts the
digest is constant across it detects the member nobody had thought of. The same
holds for every class above. Where a class is unbounded, the runner <bcp14>MUST</bcp14> sample
it and <bcp14>MUST</bcp14> record in its run transcript that it sampled rather than enumerated,
so that a reader is not told a property was established over a class when it was
established over a sample of one.</t>
        <t><strong>What this does not establish.</strong> Invariance across a representation class is
not correctness. A digest can be perfectly invariant and taken over the wrong
elements, and this rule says nothing about that. It says only that two parties
holding the same facts reach the same value, which is the precondition for every
other property this document claims and is not itself any of them.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="containment">
        <name>Service-Operator Containment</name>
        <t>The reconciliation server operates under a service-operator entity
standing in bilateral contractual relationship with each Register
Operator. The service-operator entity <bcp14>MUST NOT</bcp14> be given access to any register record or any
Partial-Attestation payload beyond the verdict and divergence-axis fields, and a
deployment <bcp14>MUST</bcp14> enforce that by construction -- by encryption addressed to the
requester or by an equivalent measure that no internal operator action can
reverse -- rather than by policy. A conformance test for this requirement is
whether an operator holding every credential the deployment issues can obtain a
register record; if it can, the deployment does not conform.</t>
        <t>Encryption addressed to the requester discharges this requirement for a register
record, and for any enumerated field the reconciliation server does not read. It
cannot discharge it for the Query Binding, the Freshness Timestamp, the echoed
Policy-Version Hash and Bilateral-Register-Agreement Hash, the Source-Data
Version Identifier Set or the Applied-Parameter Set, each of which
<xref target="partial-attestation"/>, <xref target="source-versioning"/>, <xref target="projection"/> and
<xref target="replay-defence"/> oblige the reconciliation server to read in the clear. For
those fields the equivalent measure <bcp14>MUST</bcp14> be an execution boundary whose
integrity is remotely attestable under <xref target="RFC9334"/> and whose plaintext state no
credential the deployment issues can read, and the conformance test above
extends to them: an operator holding every credential the deployment issues must
be unable to obtain any of them.</t>
        <t>The distinction this rests on is the one the section opens with and did not
carry through. The prohibition binds <strong>the service-operator entity</strong>, a legal
person, and not the reconciliation server, a process, whose reading of those six
fields the sections named above require. The two named enforcement measures were
therefore not alternatives of equal reach: the first is unavailable for exactly
the fields where the prohibition bites, and the conformance test asked only
about a register record, so the payload half of the requirement had no test at
all.</t>
        <t>That property is per-event and <bcp14>MUST NOT</bcp14> be read as a property of the system
under repeated querying. A verdict is a function of an attested value the
requester chooses, so a sequence of reconciliations varying that value recovers
the underlying record field by search, and several Divergence Axis values --
<tt>ownership-threshold-mismatch</tt>, <tt>register-record-absent</tt>, <tt>temporal-mismatch</tt> --
disclose record content on their own. Each event conforms while the sequence
does not.</t>
        <t>A deployment <bcp14>MUST</bcp14> therefore declare in each Bilateral Register Agreement a query
budget and the interval over which it is measured, and the budget <bcp14>MUST</bcp14> be
measured per accountable principal per subject, not per subject alone. The
subject half of that key is the <strong>Claim Hash of the Canonical Claim with its
Predicate, Applicable-Regimes Set and Claim Timestamp elided</strong>, computed as
<xref target="terminology"/> computes a Claim Hash over the remainder. The principal half is
pinned in three tiers below and the subject half was pinned nowhere, which left
the counter keyed on a value the requester controls: a Subject Identifier is
NFC-normalised as a string and nothing more, so case, leading zeros,
jurisdiction prefixes and equivalent register-specific forms each open a fresh
counter. The bound on recovery-by-search this section exists to impose was
evadable by respelling, and the per-subject ceiling was a shared counter whose
key a party could collide with a victim's, forcing every third-party
reconciliation about that victim to <tt>indeterminate</tt>. Where the
budget is shared across requesters, any one requester exhausts it for all of
them -- including a requester whose Requester-Binding class is
<tt>agent-unverified</tt>, which is to say a party the deployment has declined to
identify -- and every subsequent reconciliation about that subject is forced to
<tt>indeterminate</tt> for the remainder of the interval. That is a denial of service
against every other requester, granted by the countermeasure. The recovery
property this budget bounds is a property of one requester's sequence, and
sequences run by colluding principals are the business of the repeated-narrowing
pattern below rather than of a shared counter.</t>
        <t>The budget is keyed on the accountable principal identifier where the
Requester-Binding carries one. Where it does not -- classes <tt>agent-unverified</tt>
and <tt>agent-key-verified</tt> -- the budget <bcp14>MUST</bcp14> be keyed on the verified signing key
where one exists, and otherwise on a deployment-declared fallback key such as the
authenticated transport client identity. Every requester signs, by
<xref target="read-signing"/>, so every requester has a key and none falls outside the budget.
Admitting a requester to a shared counter is the denial of service this paragraph
exists to remove.</t>
        <t>A deployment <bcp14>MAY</bcp14> additionally declare a per-subject ceiling across all
principals. A ceiling is a shared counter and reintroduces that denial of service
by construction, so where a deployment declares one it <bcp14>MUST</bcp14> partition it: a stated proportion
reserved for principals of class <tt>human-operator</tt> and <tt>agent-verified</tt>, and
within that proportion a per-principal sub-budget, so that no one principal can
consume the reserve. Classes carrying no corroborated principal --
<tt>agent-key-verified</tt> and <tt>agent-unverified</tt> -- are charged only against the
remainder. A reserve with no per-principal partition is exhausted by a subject
that incorporates enough entities to hold enough corroborated principals, which
is a purchase and not a barrier. A
subject able to mint identities cheaply can otherwise exhaust the ceiling on
itself and force every third-party reconciliation about it to <tt>indeterminate</tt>,
which is a self-service veto over the verdicts this protocol exists to produce.
Exhaustion of a ceiling is recorded as <tt>subject-ceiling-exhausted</tt> rather than
<tt>query-budget-exhausted</tt>, so that the two are distinguishable in the record and
an auditor can see which counter refused.</t>
        <t>Where a reconciliation would exceed the budget, the reconciliation server <bcp14>MUST
NOT</bcp14> transmit a projection to the affected register and <bcp14>MUST</bcp14> record
<tt>query-budget-exhausted</tt> as that register's Non-Answer Reason. The reconciliation
proceeds and is sealed; it cannot reach a decisive Combined Verdict, by
<xref target="verdict-arithmetic"/>. It is the register that is refused, not the
reconciliation: refusing the reconciliation outright would leave no Output in
which to record the reason, which is the artefact the requester needs in order to
know why it was refused and the regulator needs in order to see that it was.</t>
        <t>The Pattern Library <bcp14>MUST</bcp14> include a repeated-narrowing pattern so that the
Adversarial Pre-Transmission Test detects the sequence rather than only the
event.</t>
        <t>A register cannot apply its own statutory access regime to a requester it cannot
see. Where a Bilateral Register Agreement requires it, the Per-Register Claim
Projection <bcp14>MUST</bcp14> carry the Requester-Binding Class, which discloses the class and
not the principal.</t>
      </section>
      <section anchor="budget-suppression">
        <name>Budget Exhaustion as a Suppression Channel</name>
        <t><xref target="architecture"/> places a reconciliation driven to <tt>query-budget-exhausted</tt> or
<tt>subject-ceiling-exhausted</tt> outside the reproducibility requirement, because the budget is accumulated state
rather than an enumerated input. That carve-out is a suppression channel and is
recorded here as one.</t>
        <t>Any non-answering register makes a decisive Combined Verdict unreachable
(<xref target="verdict-arithmetic"/>). An operator that wishes to prevent a particular
reconciliation from reaching a decisive verdict can therefore record
<tt>query-budget-exhausted</tt> against one register, and an auditor replaying the
enumerated inputs is required not to treat the divergence as a determinism
failure. The reason is server-observed under <xref target="no-answer"/>, so no register
signature contradicts it.</t>
        <t>Two mitigations are available and neither is adopted here. Publishing the budget
counter and interval boundaries beside the refusal would let an auditor
distinguish exhaustion from suppression -- and would tell every requester how
much third-party interest a subject has attracted, and exactly when to exhaust
the counter so that no other party obtains a decisive verdict, which is a worse
disclosure than the one it cures. Requiring a register-signed acknowledgement of
each charge against the budget would remove the server's discretion, at the cost
of a round trip to every addressed register on every refused reconciliation,
including the ones the budget exists to avoid making.</t>
        <t>The per-subject ceiling of <xref target="containment"/> is the stronger of the two channels,
because it is a counter several principals share: an operator need not fabricate
anything, only decline to reserve enough of it. <xref target="containment"/> requires the
reserve to be partitioned per principal for that reason, and the residual is that
the size of the reserve is a deployment choice this document does not bound.</t>
        <t>A deployment concerned with either channel should bound it contractually: the
budget, its interval and the audit right over the counter are all declared in the
Bilateral Register Agreements, and an Audit Identity under <xref target="audit-path"/> can be
given the counter state directly. That is an out-of-band remedy and it is stated
as one.</t>
      </section>
      <section anchor="pattern-library-integrity">
        <name>Pattern-Library Integrity</name>
        <t>The Adversarial Pre-Transmission Test gates onward transmission. The
Pattern Library <bcp14>MUST</bcp14> be bound to a Pattern-Library Commitment Hash. Any
modification to the Pattern Library <bcp14>MUST</bcp14> produce a new Pattern-Library
Version Identifier, and the Adversarial Pre-Transmission Test <bcp14>MUST</bcp14> be
re-executed against the new library before the change takes effect.</t>
      </section>
      <section anchor="agent-iff-integrity">
        <name>Agent Impersonation and Friend-or-Foe Integrity</name>
        <t>The Agent Friend-or-Foe Determination is the mechanism by which ARP resists
reconciliation initiated by an agent impersonating a principal. The
determination <bcp14>MUST</bcp14> default to ENEMY: absence of a verifiable identity, an
expired or revoked signature-agent key, a failed HTTP Message Signature
<xref target="RFC9421"/> verification, or a Verified Principal Credential that does not
validate <bcp14>MUST</bcp14> all yield an ENEMY classification. The server <bcp14>MUST NOT</bcp14> infer
friendliness from network origin, User-Agent string, or any self-asserted
identifier, as these are trivially forgeable. Where an ENEMY requester is
permitted for advisory reconciliation, the resulting Reconciliation Output
<bcp14>MUST NOT</bcp14> carry a decisive verdict binding, and the Settlement-Layer Ledger
entry <bcp14>MUST</bcp14> record the requester-binding class the gate determined --
<tt>agent-unverified</tt> where no verifiable identity was presented, or
<tt>agent-key-verified</tt> where a key verified and the asserted principal was not
corroborated -- so that downstream reliance is aware no accountable principal was
established and can still tell the two apart.</t>
      </section>
      <section anchor="agreement-drift">
        <name>Bilateral-Register-Agreement Drift</name>
        <t>Each Bilateral Register Agreement carries an Agreement Hash. Each Partial
Attestation includes a reference to the Agreement Hash under which it was
issued. Agreement drift is detectable by comparison of agreement-hash
references across Partial-Attestation batches. Reconciliation <bcp14>MUST</bcp14> be
suspended for an addressed register whose Agreement Hash deviates from the
hash committed at the start of a reconciliation event. A suspension under this
section ends when the two parties have agreed a new Agreement Hash under
<xref target="bra-hash"/> and the reconciliation server holds it as the hash it commits at the
start of the next reconciliation event, from which event the register is
addressable again. A suspension arising instead from the irreconcilable head
statements of <xref target="settlement-ledger"/> ends only when the Register Operator that
refused further projections states, under the read key of item 22 of
<xref target="bra-items"/>, that the discrepancy is resolved. No other event ends either, and
a deployment <bcp14>MUST NOT</bcp14> treat the passage of time as ending one.</t>
      </section>
      <section anchor="replay-defence">
        <name>Replay Defence</name>
        <t>Each Partial Attestation <bcp14>MUST</bcp14> carry a Freshness Timestamp. The
reconciliation server <bcp14>MUST</bcp14> verify the Freshness Timestamp against a
freshness window declared in the Bilateral Register Agreement. The window is
measured backward from the instant the reconciliation server received the
Partial Attestation. An attestation is fresh where its Freshness Timestamp is no
earlier than that instant less the declared window and no later than 60 seconds
after it, and a Freshness Timestamp further in the future <bcp14>MUST</bcp14> be treated as
stale. A window with no stated reference instant and no stated direction is a
test two implementations apply differently to the same attestation, and the
register cannot tell which one it will be held to. This document states the
reference instant and direction for the witness observation window of
<xref target="quorum-rule"/> and did not state them here. Stale Partial Attestations <bcp14>MUST</bcp14> be rejected, and the rejection <bcp14>MUST</bcp14> be recorded
in the Reconciliation Output under <xref target="no-answer"/> with the Non-Answer Reason
<tt>attestation-stale</tt> and a <tt>freshness-stale</tt> divergence axis attributed to that
register. A signed agent request under <xref target="RFC9421"/> <bcp14>MUST</bcp14> additionally carry a
nonce and created/expires parameter set that <xref target="read-signing"/> requires, so that
a captured signed request
cannot be replayed to initiate a fresh reconciliation.</t>
      </section>
      <section anchor="response-clocks">
        <name>The Clocks a Response Freshness Check Is Decided Across</name>
        <t><xref target="read-responses"/> bounds the <tt>response-time</tt> of a read response in both
directions against the reader's receipt of it, because the two values are
produced on two clocks nothing in this document synchronises. The backward bound
is the declared tolerance, floored and capped in item 26 of <xref target="bra-items"/>; the
forward bound is a fixed sixty seconds. A deployment applying the tolerance as a
one-sided test admits a response stamped ahead of the reader's clock, and a
server whose clock runs fast is then indistinguishable from one stamping ahead
deliberately, which is the case the forward bound exists to separate. A
deployment declaring a tolerance below the transit and clock disagreement
between the two parties rejects every honest response, which is why item 26
carries a floor as well as a ceiling.</t>
        <t><xref target="replay-defence"/> bounds the reconciliation server against the register's clock
and the <tt>created</tt> parameter of <xref target="read-signing"/> bounds the server against the
requester's. Both run toward the server; this is the return direction, and it is
the one earlier revisions left unstated. All three bound a party against another
party's clock over a message it has just received, all three differ in their
backward bounds -- a declared window in <xref target="replay-defence"/>, three hundred
seconds in <xref target="read-signing"/>, a declared tolerance here -- and all three fix the
forward bound at sixty seconds, that being the direction in which none of them
has anything but the other party's word.</t>
        <t>The witness observation window of <xref target="quorum-rule"/> bounds a fourth pair of clocks,
the witness's against the reconciliation server's, over an artefact published
once per interval rather than over a message in flight. Its backward bound is
sixty seconds and its forward bound is the greater of sixty seconds and twice
the notarisation interval, so sixty seconds is the floor in both directions here
too and the interval only ever widens the window.</t>
      </section>
      <section anchor="head-consistency-channel">
        <name>Where Head-Consistency Evidence Comes From</name>
        <t><xref target="quorum-rule"/> requires Head Consistency Statements from the witnesses' own
origins, and requires the linkage chain between two heads from the same origins
under <xref target="witness-linkage"/>. The two are one requirement about one property. A
relying party that has only the first has not satisfied the second branch at
all, and holds evidence under the first branch alone, which reaches exactly the
head a response names and no head above it.</t>
        <t>A Statement obtained from the party it is evidence about is that party's own
selection, countersigned. A linkage chain obtained from that party is that
party's chain, and the reason is stronger than selection: a relying party cannot
recompute any value in a linkage array, because a Signing Input Digest is taken
over a <tt>Sig_structure</tt> and a Self-Entry Hash over the entry array, and the array
carries neither preimage. Every test the chain condition performs is therefore an
equality between two values the same party supplied, which is not evidence about
that party. Anchoring the ends does not repair it: the lower anchor is the
response's own claim, and the upper anchor is a Self-Entry Hash, which is not a
position the chain reads. <xref target="quorum-rule"/> sets out that arithmetic in full.</t>
        <t>The operational consequences follow from <xref target="quorum-rule"/> and
<xref target="witness-linkage"/> and are gathered rather than restated here. A witness whose
origin is unreachable contributes nothing. A witness whose Segment series does
not reach the head its Statement covers contributes nothing to the second
branch, though its Statement still serves the first, where it covers the head a
response names exactly. A witness that has equivocated between two Segments
contributes nothing at all. And the property the Segments deliver is append-only
rather than absolute, for the reason <xref target="quorum-rule"/> sets out: a witness records
what the service served it, so the assurance is that an interval a witness has
covered cannot afterwards be rewritten, and its strength in any deployment is
the diversity of the Witness Set and the frequency of observation.</t>
      </section>
      <section anchor="post-quantum">
        <name>Post-Quantum Migration</name>
        <t>The Cryptographic-Primitive-Upgrade Path is the mechanism by which ARP
deployments migrate to post-quantum primitives. ML-KEM-1024 <xref target="FIPS203"/>
is <bcp14>RECOMMENDED</bcp14> for the claim-encryption primitive class. ML-DSA-65
<xref target="FIPS204"/> is <bcp14>RECOMMENDED</bcp14> for the partial-attestation-signature and
sealing-signature primitive classes. Implementations <bcp14>MUST</bcp14> declare their
chosen post-quantum primitives in the Bilateral Register Agreement.</t>
      </section>
      <section anchor="side-channel">
        <name>Side-Channel Considerations</name>
        <t>The disclosure model as a whole, and the residual risks this document accepts,
are set out in <xref target="privacy"/>.</t>
        <t>Per-register projection narrowing is observable to the addressed register
through the Projected Predicate. Implementations <bcp14>MUST NOT</bcp14> use narrowing
patterns to fingerprint individual subjects. The Predicate Taxonomy <bcp14>SHOULD</bcp14>
be designed such that the set of permitted narrowings is small enough that
narrowing observation does not materially weaken subject privacy.</t>
      </section>
      <section anchor="signature-malleability">
        <name>Signature Malleability and Artefact Identity</name>
        <t>A digest taken over a signed artefact as served identifies that artefact only
where the signature has one valid encoding, and not every primitive this
document admits has that property.</t>
        <t>For ECDSA, a signature <tt>(r, s)</tt> and the signature <tt>(r, n - s)</tt>, where <tt>n</tt> is the
order of the curve's base point, both verify against the same key over the same
message. No specification prohibits it: Section 4.1.4 of SEC1 v2.0 and Section
6.4.2 of FIPS 186-5 range-check <tt>r</tt> and <tt>s</tt> only, and Section 2.1 of
<xref target="RFC9053"/> constrains neither. The substitution follows from the verification
equation and falls outside every check any of the three imposes. No specification is violated and
nothing is forged: the signing authority is identical in both encodings, and a
party holding no key can produce the second from the first while it is in
transit. Measured over two hundred randomly generated P-256 keys and ES256
signatures, two hundred substitutions verified and two hundred changed the
enveloped bytes.</t>
        <t>EdDSA is not exposed to this substitution. Section 8.4 of <xref target="RFC8032"/> puts the
check that the decoded <tt>S</tt> is less than <tt>l</tt> inside verification, so an attacker
holding an Ed25519 or Ed448 signature cannot derive a second byte-string that
verifies over the same message under the same key. That is a non-malleability
property and not a claim that only one byte-string can ever verify: Section
5.1.7 of <xref target="RFC8032"/> leaves cofactored and cofactorless verification optional,
so conforming implementations can differ at the margin. A deployment that declares only EdDSA signature primitives
under item 2 of <xref target="bra-items"/> is therefore not reachable by this. Nothing in
this document requires that, and a deployment declaring an ECDSA primitive is
conforming, so the constructions and not the primitive choice are where this is
addressed.</t>
        <t>Every digest in this document that identifies or chains a signed artefact is
accordingly a Signing Input Digest, or has its embedded signatures replaced by
one. Those are the Prior-Entry Hash of <xref target="settlement-ledger"/>, the Post-Seal
Evaluation Record Hash of <xref target="post-seal"/>, the Merkle leaf of <xref target="aggregation"/>, the
authority-reference digest of <xref target="composition"/> in its tagged-transparency form,
the Reconciliation Hash of <xref target="terminology"/>, and -- reached through the
Reconciliation Hash rather than named beside it -- the authorising operator's
signature in the Override Record of <xref target="adversarial-test"/>.</t>
        <t>The sixth was found after the first five had been repaired, and the way it was
missed is worth stating rather than quietly corrected. The first sweep looked
for digests taken over signed artefacts, found the Reconciliation Hash embedded
a register signature, and repaired that. The Override Record is a signature
made by a third party -- the authorising operator, deliberately not the server,
under <xref target="adversarial-test"/> -- travelling to the server over a channel the server
does not control, and sitting in a field the Reconciliation Hash preimage
carries. It failed no test that was applied to it; no test was applied to it.</t>
        <t>An implementation <bcp14>MUST</bcp14> therefore apply the rule of <xref target="terminology"/> over the
class rather than over the list above: in any preimage this document defines,
every signature made by a party other than the party computing the digest is
replaced by its Signing Input Digest. A specification that enumerates the
carriers is correct until someone adds a field, and correctness that expires on
the next revision is not the property this section exists to establish. The <tt>Sig_structure</tt> excludes the
signature by construction, which is why this is total where a low-S
canonicalisation rule is partial -- low-S removes one encoding from a set with
more than one member, while the signing input has one value for one signing act
however many encodings of the signature exist.</t>
        <t>The Reconciliation Hash is the one worth naming separately, because excluding
the Sealing Signature is what an earlier revision did and it is not sufficient.
A Reconciliation Output embeds a register signature in each Query Binding Record
and in each Non-Answer Statement of <xref target="reconciliation-output"/>, so its preimage
carried a signature after the sealing one was excluded. The Reconciliation Hash
is a field of every Settlement-Layer Ledger entry, and therefore inside the
Entry Signature payload and inside the Prior-Entry Hash, so leaving it exposed
would have reintroduced at one remove exactly what fixing the Prior-Entry Hash
removed. The Self-Entry Hash of <xref target="settlement-ledger"/> nulls the signature
position and was already outside it.</t>
        <t>The consequence of getting this wrong is not a forgery and is easy to
misdiagnose as one. A reader served a substituted entry computes a Prior-Entry
Hash that does not match the following entry's, and concludes the chain is
broken when the operator equivocated about nothing. Under <xref target="leaf-binding"/> a
substituted Partial Attestation makes a verifier refuse a valid inclusion proof
for the same reason. Both are failures of verification rather than of
authenticity, and a deployment that reports them as detected tampering will be
reporting something that did not happen.</t>
      </section>
      <section anchor="pq-artefact-identity">
        <name>Artefact Identity Across a Change of Signature Algorithm</name>
        <t><xref target="signature-malleability"/> establishes that a digest over a signed artefact as
served identifies that artefact only where the signature has one valid encoding,
and it names EdDSA as the primitive not reachable by the substitution. That
exemption is real, and it is temporary. A deployment planning a migration to
post-quantum signatures should know which of those two facts it is relying on.</t>
        <t>The substitution asks what a party holding no key can do to an artefact in
transit. A registration protocol has to answer a narrower question first, and
one that does not involve an adversary at all: how many valid enveloped
byte-strings exist over one signing input when the same signer signs the same
input more than once. Measured over two hundred ordinary signing operations per
primitive, one key and one signing input each, with every reported value
recovered by decoding the served envelope rather than reusing the locals that
were signed:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Signature primitive</th>
              <th align="left">Distinct signing inputs</th>
              <th align="left">Distinct enveloped byte-strings</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Ed25519</td>
              <td align="left">1 of 200</td>
              <td align="left">1 of 200</td>
            </tr>
            <tr>
              <td align="left">ECDSA P-256</td>
              <td align="left">1 of 200</td>
              <td align="left">200 of 200</td>
            </tr>
            <tr>
              <td align="left">ML-DSA-65, hedged</td>
              <td align="left">1 of 200</td>
              <td align="left">200 of 200</td>
            </tr>
            <tr>
              <td align="left">ML-DSA-65, deterministic</td>
              <td align="left">1 of 200</td>
              <td align="left">1 of 200</td>
            </tr>
            <tr>
              <td align="left">Ed25519 with a parallel ML-DSA-65 leg</td>
              <td align="left">1 of 200</td>
              <td align="left">200 of 200</td>
            </tr>
          </tbody>
        </table>
        <t>Three consequences follow, and the third is not addressed by any document this
one is aware of.</t>
        <t><strong>The Signing Input Digest is stable on every primitive measured, including
those whose envelopes are all distinct.</strong> This is the property <xref target="terminology"/>
already relies on, and the table establishes that it does not depend on the
primitive. A construction bound to the signing input survives a change of
algorithm; a construction bound to the enveloped bytes does not.</t>
        <t><strong>The enveloped byte-string is a stable identifier on Ed25519 because of
<xref target="RFC8032"/>, not because of anything in COSE or in this document.</strong> Section 5.1.6
of <xref target="RFC8032"/> derives the per-signature nonce from a hash of the private key
prefix and the message, so one key over one message yields exactly one
signature. That is a property of one primitive. A deployment that declared only
EdDSA under item 2 of <xref target="bra-items"/> and inferred from <xref target="signature-malleability"/>
that its enveloped digests are stable has inferred correctly, and the inference
expires the moment a second signature leg is added. A parallel composition of
Ed25519 with ML-DSA-65 over one signing input produced two hundred distinct
byte-strings from two hundred signing operations, while the Ed25519 leg alone
produced one. Composition does not preserve the determinism of its most
deterministic member. It cannot: the composed artefact is unique whenever any
member is.</t>
        <t><strong>Two conforming ML-DSA-65 signers disagree about whether the enveloped
byte-string is stable, and the artefact does not record which one produced it.</strong>
          <xref target="FIPS204"/> specifies both hedged and deterministic signing. Both produce
signatures that verify against the same public key, and
<xref target="I-D.connolly-cfrg-ml-dsa-security-considerations"/> recommends hedged signing
as the safer default in all environments, on fault-injection grounds that this
document does not dispute and does not attempt to weigh against anything here.
The consequence for artefact identity is unremarked rather than contested: the
recommended mode is the mode under which one signing input has an unbounded
family of valid envelopes, the selection between the two modes appears nowhere
in the protected header or anywhere else in the signed object, and a relying
party holding one envelope therefore cannot determine whether a second envelope
over the same input would be the same bytes. A registration protocol that
identifies an entry by its enveloped digest is, under ML-DSA, identifying
something whose stability is decided by a signer-side flag it cannot observe.</t>
        <t>A low-S canonicalisation rule does not reach any of this, and its reach shrinks
rather than holds. <xref target="signature-malleability"/> states why it is partial for
ECDSA: it removes one encoding from a set with more than one member. Past the
classical boundary it is not partial but inapplicable, because ML-DSA signatures
carry no <tt>s</tt> value to canonicalise. A deployment defending enveloped-digest
identity by mandating low-S is defended for exactly as long as it signs with
ECDSA.</t>
        <t>An implementation <bcp14>MUST NOT</bcp14> treat the digest of an enveloped signed artefact as
an identifier for the claim the artefact carries, and <bcp14>MUST</bcp14> use the Signing Input
Digest of <xref target="terminology"/> for that purpose, in any construction this document
defines. Where a Reconciliation Agreement declares a signature primitive under
item 2 of <xref target="bra-items"/>, it <bcp14>MUST</bcp14> additionally declare, for any primitive
admitting more than one signing mode, which mode the signer operates. That
declaration is a statement about a signer and not about an artefact, and a
relying party that requires the distinction has no other place to obtain it.</t>
      </section>
      <section anchor="tradeoffs">
        <name>Declared Trade-offs</name>
        <t>Several properties this document would like to hold cannot hold together. Where
that is so, the document chooses, and this section is the list of the choices in
one place, so that a reader can find what was given up without reading for it.</t>
        <t>The discipline is worth stating on its own. A specification that wants two
incompatible properties has three options: claim both and be wrong somewhere a
reader has to find; weaken both until the conflict disappears and deliver
neither; or take the conflict as irreducible, choose, and say where the loss
went. The third is the only one that leaves a reader able to reason about a
deployment. What makes it work is that the loss is <strong>located</strong> rather than
distributed: a reader who knows exactly which property was surrendered, and
where, can compensate for it, and a reader told that everything holds cannot.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Wanted</th>
              <th align="left">Also wanted</th>
              <th align="left">Given up</th>
              <th align="left">Stated in</th>
              <th align="left">What a reader can check instead</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">A chain between two heads a relying party can check</td>
              <td align="left">A chain the responding service did not write</td>
              <td align="left">Absolute rewrite detection; what holds is append-only over intervals a witness has covered</td>
              <td align="left">
                <xref target="witness-linkage"/></td>
              <td align="left">How many independent witnesses cover the interval, and how often each observes</td>
            </tr>
            <tr>
              <td align="left">Reproducible output from enumerated inputs</td>
              <td align="left">Uniqueness per reconciliation</td>
              <td align="left">Exact identity, for three fields</td>
              <td align="left">
                <xref target="architecture"/></td>
              <td align="left">Every other field is identical; the three are carved out by name</td>
            </tr>
            <tr>
              <td align="left">Erasure of a subject's data</td>
              <td align="left">An append-only record</td>
              <td align="left">Permanence of Output content</td>
              <td align="left">
                <xref target="privacy-erasure"/></td>
              <td align="left">No chain depends on content; a digest whose preimage is gone is still a valid chain element</td>
            </tr>
            <tr>
              <td align="left">A schema upgrade with no flag day</td>
              <td align="left">Telling withheld from never-defined</td>
              <td align="left">The upgrade; absence is encoded, not omitted</td>
              <td align="left">
                <xref target="settlement-ledger"/></td>
              <td align="left">Array length is fixed by Entry Type, so a short array is a defect and not a version</td>
            </tr>
            <tr>
              <td align="left">A chain stable under re-encoding</td>
              <td align="left">A verifier-side test that an entry was signed once</td>
              <td align="left">The test</td>
              <td align="left">
                <xref target="signature-malleability"/></td>
              <td align="left">The obligation remains and is examinable by an auditor; a re-signature under a different key still moves the chain</td>
            </tr>
            <tr>
              <td align="left">Digests unguessable from outside</td>
              <td align="left">An auditor who can recompute them</td>
              <td align="left">Recomputation without the blinding value</td>
              <td align="left">
                <xref target="audit-path"/></td>
              <td align="left">Consistency across two reads, and nothing more, which that section now says</td>
            </tr>
            <tr>
              <td align="left">A register recognising a returning counterparty</td>
              <td align="left">A requester unlinkable from one reconciliation to the next</td>
              <td align="left">Unlinkability, by default</td>
              <td align="left">
                <xref target="sealing"/></td>
              <td align="left">The deployment may substitute a fresh element each time; the choice is declared</td>
            </tr>
            <tr>
              <td align="left">One interoperable register leg</td>
              <td align="left">Sovereign registers keeping their own interfaces</td>
              <td align="left">The common leg</td>
              <td align="left">
                <xref target="format-profiles"/></td>
              <td align="left">Every leg is declared in an Agreement whose hash is committed to</td>
            </tr>
            <tr>
              <td align="left">A regulator reading a redacted entry</td>
              <td align="left">That regulator verifying the entry's chain</td>
              <td align="left">Chain verification under redaction</td>
              <td align="left">
                <xref target="read-operations"/></td>
              <td align="left">Redacted fields are null in place, so the length is intact and an unredacted read is available</td>
            </tr>
            <tr>
              <td align="left">Errors that tell a requester what went wrong</td>
              <td align="left">Endpoints that are not existence oracles</td>
              <td align="left">Distinguishing errors, on the read path</td>
              <td align="left">
                <xref target="read-errors"/></td>
              <td align="left">The commissioning path distinguishes them and pays for it in rate limit and access log</td>
            </tr>
            <tr>
              <td align="left">Coverage measured without cost</td>
              <td align="left">Probes a register cannot tell from real work</td>
              <td align="left">Free measurement</td>
              <td align="left">
                <xref target="coverage-probes"/></td>
              <td align="left">A probe consumes a real budget against a real register, which is what makes it uncountable by the operator</td>
            </tr>
            <tr>
              <td align="left">A quorum proving observer independence</td>
              <td align="left">A test a verifier can actually run</td>
              <td align="left">Proof of independence</td>
              <td align="left">
                <xref target="bra-limits"/></td>
              <td align="left">Distinct declared parties and distinct keys, both mechanically checkable</td>
            </tr>
          </tbody>
        </table>
        <t>Two things follow from having written this table that were not obvious before
writing it.</t>
        <t>The first is that most of the losses are <strong>stated limits rather than open
defects</strong>, and the difference is whether a reader can compensate. A limit a
reader knows about is an input to that reader's decision; a limit it does not
know about is a false belief. This document has repeatedly found that its own
worst errors were sentences claiming a property it did not have, rather than
missing properties honestly described, and the table is the form that makes the
distinction hard to lose.</t>
        <t>The second is that a row can be <strong>retired by invention</strong>. Two rows that stood in
earlier revisions no longer do: the falsifiability of a sweep against its
operator, which was traded away and has been bought back by anchoring the Policy
Parameters Document; and the verifiability of the sweep counts, which was
conceded as an assertion and is now an accounting identity against the Ledger. A
trade-off is a statement about the mechanisms available at the time it was made,
not a law, and a list of them is also a list of what to attack next.</t>
      </section>
    </section>
    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>This protocol operates over beneficial-ownership registers, corporate registries,
consolidated sanctions lists and customs records. Its subject is almost always a
party that is neither the requester nor a recipient, and that is not told a
reconciliation about it occurred.</t>
      <t>The disclosure model has two artefacts and one division. A Reconciliation Output
is confidential to its Audience Set and carries subject references,
register-signed attestations and principal identifiers; the Settlement-Layer
Ledger is broadly readable and carries digests, register origins and structural
metadata. <xref target="entitlement"/> states the division and the rules that rest on it.</t>
      <t>What the witness artefacts disclose. <xref target="witness-linkage"/> obliges a witness to
serve Segments to any party without authentication, where the same linkage
arrays are readable from the reconciliation server only by an entitled requester
under a rate limit. That is an entitlement change and it is made deliberately:
an artefact obtainable only from the party it is evidence about is that party's
selection, so head-consistency evidence has to be world-readable to be evidence
at all, which is the choice <xref target="head-consistency"/> already made for Head
Consistency Statements. What it adds is the Prior-Entry Hash and the Signing
Input Digest of each entry alongside the Self-Entry Hash. All three are digests
over signed artefacts rather than over subject data, none is a low-entropy
preimage of the kind the Deployment Blinding Value of <xref target="sealing"/> exists to
protect, and the interval a Segment covers is bounded above by a head
<xref target="settlement-ledger"/> already publishes unauthenticated, so the live head oracle
<xref target="read-operations"/> guards against is not reintroduced.</t>
      <t>Two residues follow and are recorded here rather than left to be inferred. The
first is that the linkage values of every covered entry become readable without
entitlement, where <xref target="read-errors"/> rate limits the equivalent read at the
reconciliation server and a witness serving Segments is not rate limited by this
document. The entry count and the write rate over time are not part of that
residue: <xref target="settlement-ledger"/> publishes a contiguous head unauthenticated once
per interval, so both follow from differencing two published heads and were
public already. What is new is the per-entry chain shape below a published head.</t>
      <t>The second is the allowance <xref target="read-errors"/> makes for a witness principal. The
holder of a key can learn, from the number of ranged linkage reads admitted to
it, that the key sits in a Witness Set some Bilateral Register Agreement the
deployment holds declares, which is a wider set than the effective Witness Set
the Policy Parameters Document of <xref target="read-signing"/> already publishes. The
disclosure is membership of a union rather than of an intersection, it is
available only to the holder of the key in question, and it is the price of a
publication obligation a rate limit would otherwise void.</t>
      <t>What is protected. The Deployment Blinding Value of <xref target="sealing"/> keeps the Claim
Hash and the Policy-Version Hash from being inverted by exhaustive search over
their low-entropy preimages, which is what stops a Ledger reader recovering the
subject and the commissioning principal. Entitlement follows the Audience Set,
so possession of an Output is not authorisation to learn what happened to it
afterwards. Enrolment under <xref target="request-binding"/> means a requester cannot direct
an Output at a party that has not agreed to receive one. The per-principal query
budget of <xref target="containment"/> bounds recovery of a register record by repeated
querying. Read responses are rate-limited and logged, and the log is not on the
Ledger, because a Ledger that recorded reads would disclose the pattern of
interest in a subject to everyone entitled to read it.</t>
      <t>What is not. A subject has no standing in this protocol: it is not notified, it
cannot object, and it cannot learn that it was reconciled. That is a deliberate
property of a sanctions-screening protocol and a real cost, and a deployment
operating where subject rights attach should provide for them outside this
document. An Audience Member learns the subject, the predicate and every
register's answer; the audience constraint of <xref target="audience"/> lets a register cap
how many such parties there may be, and the register cannot verify that the cap
was enforced. Notarising an Output under <xref target="scrapi-binding"/> places it in a log
whose retrieval is by EntryID, and a deployment for which that is the wrong
disclosure should not notarise. The Ledger Head Statement is unauthenticated and
carries a contiguous sequence number, so it discloses the deployment's size and
approximate rate at the notarisation interval. An Audit Identity under <xref target="audit-path"/> reads every Output of every reconciliation
addressing its register irrespective of Audience Set, and each register declares
one, so a deployment's disclosure surface grows with the number of registers it
addresses. An Override Record names an authorising operator in the clear inside
the Output. <xref target="budget-suppression"/> records a further residual risk, and
<xref target="side-channel"/> the projection-narrowing channel.</t>
      <section anchor="privacy-6973">
        <name>Against the threat model of RFC 6973</name>
        <t>Taking the threats of Section 5 of <xref target="RFC6973"/> in turn, and stating the residual
rather than the mitigation where there is one.</t>
        <t><strong>Surveillance and correlation.</strong> Every digest that could otherwise correlate a
subject across deployments is blinded: a Claim Hash cannot be recomputed outside
the deployment that produced it and equality of Claim Hashes across deployments
is not a comparison that can be made at all. Within a deployment, correlation is
by design -- the Ledger index is a stable function of the claim, which is what
makes retroactive re-evaluation possible -- so a Ledger reader entitled to
nothing else still learns that some subject was reconciled repeatedly, and how
often. That residual is inherent in an append-only index and is not closed here.</t>
        <t><strong>Identification.</strong> The Ledger carries no Subject Identifier and no Subject
Reference. Those travel to the addressed registers, which is unavoidable in a
protocol that asks a register about a subject, and into the Reconciliation
Output, which is confidential to its Audience Set.</t>
        <t><strong>Secondary use and disclosure.</strong> A reconciliation server <bcp14>MUST NOT</bcp14> write a
Subject Identifier, a Subject Reference, an Applied-Parameter Set or any
register-record field to the Settlement-Layer Ledger, and <bcp14>MUST NOT</bcp14> include one
in any artefact it notarises into a Transparency Service. Notarisation under
<xref target="scrapi-binding"/> places the sealed Output into an append-only log operated by a
third party, and a sealed Output carries Subject References inside its Query
Binding Records. Notarisation of an Output is a <bcp14>MAY</bcp14> and <bcp14>MUST NOT</bcp14> be performed
where the deployment's subjects have not been accounted for in that disclosure.
The Ledger Head Statement, the Evaluation Sweep Statements and the Policy
Parameters Document carry no subject data and are the artefacts this document
requires to be notarised.</t>
        <t><strong>Exclusion.</strong> The subject is not told, cannot object and cannot learn that it
was reconciled. This is stated above as a deliberate property and it is the
sharpest privacy cost the protocol imposes. It is restated here because
<xref target="RFC6973"/> names exclusion as a threat in its own right and a document that
lists its mitigations and passes over the one threat it does not mitigate is
reporting selectively.</t>
      </section>
      <section anchor="privacy-erasure">
        <name>Erasure and rectification against an append-only record</name>
        <t>A jurisdiction in which a subject may require erasure or rectification of
personal data is in direct tension with a Ledger this document requires to be
append-only and with a Transparency Service it requires to be outside the
operator's control. That tension cannot be resolved by a protocol mechanism, and
this document does not claim to resolve it. What it can do is bound what has to
be erased, and that is a design obligation rather than a remark:</t>
        <ul spacing="normal">
          <li>
            <t><strong>No personal data is written to the Ledger</strong>, per the rule above. What the
Ledger carries about a reconciliation is digests, register Authority Origins,
verdict values and structural metadata. An erasure obligation over the
subject's data therefore falls on the Reconciliation Output and the register
correspondence, both of which are held by the deployment and both of which
have a retention period.</t>
          </li>
          <li>
            <t><strong>A retracted or rectified verdict is expressed by supersession and not by
deletion.</strong> <xref target="retroactive"/> appends a <tt>continuation-supersession</tt> entry and
<xref target="re-notification"/> notifies the affected regulators. The superseded Output
remains identified by its Reconciliation Hash and its content may be destroyed
at the end of its retention period without breaking any chain, because no
chain hashes the Output's content: the Ledger commits to the Reconciliation
Hash, and a digest whose preimage no longer exists is still a valid chain
element. <strong>This is the property that makes erasure implementable at all, and
an implementation <bcp14>MUST NOT</bcp14> introduce any construction that hashes Output
content into the chain.</strong></t>
          </li>
          <li>
            <t><strong>A deployment that has notarised an Output cannot erase it</strong>, because the
Transparency Service is required not to be under the operator's control. That
is the reason notarisation of an Output is optional and is now prohibited
where the disclosure has not been accounted for.</t>
          </li>
        </ul>
        <t>A deployment operating under an erasure regime should treat the retention period
of <xref target="delivery"/> as the erasure horizon for Output content, and should not
notarise Outputs. This document states that as guidance and not as a
requirement, because the obligation arises outside it and its shape differs by
jurisdiction. What is normative is the constraint that makes any of it possible:
personal data does not enter the append-only record, and nothing in the chain
depends on the continued existence of the content that could be erased.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests IANA to register the following:</t>
      <ul spacing="normal">
        <li>
          <t>Four COSE header parameters in the COSE Header Parameters registry, values
to be assigned by IANA:
          </t>
          <ul spacing="normal">
            <li>
              <t><tt>arp-bilateral-agreement-hash</tt> (value TBD)</t>
            </li>
            <li>
              <t><tt>arp-policy-version-hash</tt> (value TBD)</t>
            </li>
            <li>
              <t><tt>arp-source-data-version</tt> (value TBD)</t>
            </li>
            <li>
              <t><tt>arp-witness-identifier</tt> (value TBD)</t>
            </li>
          </ul>
          <t>
<tt>arp-witness-identifier</tt> is a CBOR text string carrying the identifier of the
Witness Entry whose key signed the artefact, and is used by
<xref target="head-consistency"/> and <xref target="witness-linkage"/>;
<tt>arp-policy-version-hash</tt> is a CBOR byte string;
<tt>arp-bilateral-agreement-hash</tt> is a CBOR array of byte strings;
<tt>arp-source-data-version</tt> is a CBOR array of two-element arrays, each of a list
name and that publisher's state identifier, as <xref target="source-versioning"/>
constructs it. Each <bcp14>MUST</bcp14> appear in a protected header and <bcp14>MUST NOT</bcp14> appear in an
unprotected one: every one of them is a commitment a verifier
relies on, and a commitment a signature does not cover is not a commitment.
<tt>arp-policy-version-hash</tt> and <tt>arp-bilateral-agreement-hash</tt> are used by
<xref target="registration"/>; <tt>arp-source-data-version</tt> is used by <xref target="source-versioning"/>.</t>
        </li>
        <li>
          <t>Two COSE Key common parameters in the COSE Key Common Parameters registry,
values to be assigned by IANA: <tt>arp-key-status</tt> (value TBD), a CBOR text string
of <tt>active</tt>, <tt>retired</tt> or <tt>revoked</tt>; and <tt>arp-key-validity</tt> (value TBD), a
two-element CBOR array of the not-before and not-after times, or a
three-element array whose third element is a revocation time where the entry's
<tt>arp-key-status</tt> is <tt>revoked</tt>, each in the form of
<xref target="reconciliation-output"/>. <xref target="sealing-key-discovery"/> requires both on every key
it publishes, and a key parameter used normatively and never registered is a
parameter no other implementation can read.</t>
        </li>
        <li>
          <t>A registry of ARP Divergence-Axis values, registration policy Specification
Required, initially containing the descriptors enumerated in the Divergence
Axis definition of <xref target="terminology"/>. Each entry <bcp14>MUST</bcp14> record whether the axis is
register-attestable or server-recorded, a distinction eight normative sections
depend on and which is otherwise carried only in prose. The designated expert
<bcp14>MUST</bcp14> refuse a registration that does not state it.</t>
        </li>
        <li>
          <t>A registry of ARP Non-Answer Reasons, registration policy Specification
Required, initially containing the values enumerated in <xref target="no-answer"/>. Each
entry <bcp14>MUST</bcp14> record whether the reason is register-attested or server-observed,
which determines whether a Non-Answer Statement signed by the register is
required; the initial entries are recorded as <xref target="no-answer"/> states. A
Non-Answer Reason is not a verdict; the designated expert <bcp14>MUST</bcp14> refuse a
registration that could be combined by the Verdict Arithmetic, and <bcp14>MUST</bcp14> refuse
a register-attested registration that does not state what the register signs
over.</t>
        </li>
        <li>
          <t>A registry of ARP Excluded-Range Reasons, registration policy Specification
Required, initially containing <tt>outside-retention</tt>, where the range predates
the retention period of <xref target="delivery"/>; <tt>not-in-scope-of-trigger</tt>, where no entry
in the range carries a value the trigger reached; and <tt>superseded-in-range</tt>,
where every entry in the range was already superseded by an earlier sweep whose
Statement is named. A registration <bcp14>MUST</bcp14> name a condition a reader holding the
Ledger can check for itself, and the designated expert <bcp14>MUST</bcp14> refuse one that
can only be confirmed by the operator asserting it, since a disposition a
reader cannot test returns the range to the state that having a disposition was
meant to leave behind.</t>
        </li>
        <li>
          <t>A registry of ARP Subject Mapping Descriptors, registration policy
Specification Required, initially containing <tt>identity</tt>, <tt>profile-declared</tt>
and <tt>agreement-declared</tt>, defined in <xref target="subject-mapping"/>. A registration <bcp14>MUST</bcp14>
specify a transformation that is a function of the Subject Identifier and of
declared terms alone. The designated expert <bcp14>MUST</bcp14> refuse a registration whose
transformation takes any input the reconciliation server chooses at
reconciliation time, since a descriptor naming server discretion records that
the discretion was exercised and not what it did.</t>
        </li>
        <li>
          <t>A registry of ARP Verification Outcomes, registration policy Specification
Required, initially containing the values enumerated in
<xref target="verification-outcomes"/>. A registration <bcp14>MUST</bcp14> name a condition a verifier can
reach mechanically, and <bcp14>MUST</bcp14> state whether reaching it is evidence of
equivocation by the serving party, evidence of a transport or encoding
difference, or neither. The designated expert <bcp14>MUST</bcp14> refuse a registration that
does not state which, because the distinction between an operator that
equivocated and an artefact that was re-encoded in transit is the one this
registry exists to carry.</t>
        </li>
        <li>
          <t>A registry of ARP Post-Seal Evaluation Qualifiers, registration policy
Specification Required, initially containing <tt>notarisation-incomplete</tt> and
<tt>attribution-indeterminate</tt>, defined in <xref target="post-seal"/>. A registration <bcp14>MUST</bcp14>
identify a condition arising after a Reconciliation Output is sealed; the
designated expert refuses a registration that qualifies a verdict, which
belongs in the Divergence-Axis registry.</t>
        </li>
        <li>
          <t>A registry of ARP Register Data-Format Profile identifiers, registration policy
Specification Required, initially containing <tt>arp-profile-bods</tt>,
<tt>arp-profile-corporate-org</tt>, <tt>arp-profile-customs-wco</tt> and
<tt>arp-profile-sanctions-consolidated</tt>, defined in <xref target="format-profiles"/>.
Identifiers beginning <tt>x-</tt> are reserved for bilateral use and are not
registered. A registration <bcp14>MUST</bcp14> state the dated vocabulary in which permitted
predicates are expressed where it names one and state that it names none
otherwise, the relation corresponding to taxonomic narrowing for
each branch of its predicate space, and the parameters a Bilateral Register
Agreement declaring it must supply. The designated expert refuses a
registration that defines any means of transporting register records, that
declares more than one parent relation applicable to a single predicate, that
names a vocabulary without pinning its version, or that fixes in the profile a
parameter varying between registers using the same format.</t>
        </li>
        <li>
          <t>A registry of ARP Aggregation-Method Descriptors, registration policy
Specification Required, initially containing <tt>hash-linkage-conjunction</tt>,
<tt>hash-linkage-disjunction</tt>, <tt>hash-linkage-threshold-count</tt> and
<tt>hash-linkage-source-class-quorum</tt>: the aggregation mode of <xref target="aggregation"/>
joined to the Verdict-Arithmetic operator it sequenced. A registration naming a
new aggregation mode <bcp14>MUST</bcp14> specify that mode's construction; the descriptor is a
signed Ledger field and a mode with no construction gives it no meaning.</t>
        </li>
        <li>
          <t>A registry of ARP Retroactive Evaluation Triggers, registration policy
Specification Required, initially containing <tt>pattern-library</tt>,
<tt>policy-version</tt>, <tt>source-data-version</tt>, <tt>credential-revocation</tt> and <tt>register-record-correction</tt>, defined in
<xref target="sweep-statements"/>. A registration <bcp14>MUST</bcp14> name an event whose occurrence and
time a party outside the reconciliation server can establish, or state plainly
that it cannot, since the falsifiability of <xref target="sweep-statements"/> turns on it.</t>
        </li>
        <li>
          <t>A registry of ARP Override Grounds, registration policy Specification
Required, initially containing <tt>operational-continuity</tt>,
<tt>pattern-false-positive</tt> and <tt>statutory-obligation</tt>, defined for use in the
Override Record of the Adversarial Pre-Transmission Test. A registration <bcp14>MUST</bcp14>
state the circumstances in which the ground is available and <bcp14>MUST NOT</bcp14> admit a
ground that could be asserted of every override, which would return the field
to free text.</t>
        </li>
        <li>
          <t>A registry of ARP Re-Typing Grounds, registration policy Specification
Required, initially containing <tt>bounded-depth-not-closure</tt>,
<tt>declared-not-determined</tt>, <tt>threshold-divergence</tt> and <tt>projection-broadened</tt>,
corresponding to the four grounds of <xref target="verdict-retyping"/>.</t>
        </li>
        <li>
          <t>A registry of ARP Verdict-Arithmetic operators, registration policy
Specification Required, initially containing conjunction, disjunction,
threshold-count and source-class-quorum, defined in <xref target="verdict-arithmetic"/>. A
registration <bcp14>MUST</bcp14> state the operator's result as a total function of the
multiset of contribution values and the operator's declared parameters, and
<bcp14>MUST</bcp14> state whether it admits partial-match, on which <xref target="verdict-retyping"/>
turns.</t>
        </li>
        <li>
          <t>A registry of ARP Ledger Entry Types, registration policy Specification
Required, initially containing <tt>reconciliation</tt>,
<tt>continuation-notarisation</tt>, <tt>continuation-post-seal-record</tt> and
<tt>continuation-supersession</tt>, defined in <xref target="settlement-ledger"/>. Entry Type
values are CBOR text strings. A registration <bcp14>MUST</bcp14> enumerate the fields an entry
of that type carries in addition to the fields every entry carries, <bcp14>MUST</bcp14> state
their order, since the Self-Entry Hash is taken over that order, and <bcp14>MUST</bcp14> state
each field's value type and whether it is conditionally absent and on what
condition. The designated expert <bcp14>MUST</bcp14> refuse a registration whose type
restates a field already carried by the reconciliation entry it continues, and
<bcp14>MUST</bcp14> refuse any type other than <tt>reconciliation</tt> that records a reconciliation
rather than a fact arising after one was sealed.  </t>
          <t>
The initial registrations are those of <xref target="settlement-ledger"/>, with these value
types. Every hash is a 32-octet CBOR byte string; every sequence number is a
CBOR unsigned integer; every timestamp is a CBOR text string in the form of
<xref target="reconciliation-output"/>; every Entry Type is a CBOR text string; the
Addressed-Registers Identifier Set is a CBOR array of text strings, each an
authority origin, sorted in bytewise lexicographic order of its UTF-8 encoding;
the Aggregation-Method Descriptor and the Requester-Binding-Class Descriptor
are CBOR text strings, the first drawn from the ARP
Aggregation-Method Descriptors registry and the second from the four classes of
the Requester Identity Binding and Agent Friend-or-Foe Gate section; the Override Indicator and the Material-Change Indicator are CBOR
booleans; the Transparency Service Identifier is a CBOR text string carrying an
authority origin; the EntryID is a CBOR text string as
<xref target="I-D.ietf-scitt-scrapi"/> returns it; an HTTP status code is a CBOR unsigned
integer; and every Entry Signature is a COSE_Sign1.</t>
        </li>
      </ul>
      <section anchor="iana-wellknown">
        <name>Well-Known URIs</name>
        <t>Eight entries are requested in the Well-Known URIs registry of <xref target="RFC8615"/>. For
each, the change controller is the IETF, the status is permanent, and the
specification document is this document.</t>
        <table>
          <thead>
            <tr>
              <th align="left">URI suffix</th>
              <th align="left">Defined in</th>
              <th align="left">Path syntax below the suffix</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>arp-sealing-keys</tt></td>
              <td align="left">
                <xref target="sealing-key-discovery"/></td>
              <td align="left">
                <tt>/{kid}</tt>, where <tt>{kid}</tt> is a JWK thumbprint, returns that single key</td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-register-keys</tt></td>
              <td align="left">
                <xref target="sealing-key-discovery"/></td>
              <td align="left">
                <tt>/{kid}</tt> as above</td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-operator-keys</tt></td>
              <td align="left">the Adversarial Pre-Transmission Test</td>
              <td align="left">
                <tt>/{kid}</tt> as above</td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-authorised-origins</tt></td>
              <td align="left">
                <xref target="sealing-key-discovery"/></td>
              <td align="left">none</td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-ledger-head</tt></td>
              <td align="left">
                <xref target="settlement-ledger"/></td>
              <td align="left">none</td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-policy-parameters</tt></td>
              <td align="left">
                <xref target="read-signing"/></td>
              <td align="left">none</td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-head-consistency</tt></td>
              <td align="left">
                <xref target="head-consistency"/></td>
              <td align="left">none; served by a witness on the Authority Origin of its Operating-Party Identifier</td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-witness-linkage</tt></td>
              <td align="left">
                <xref target="witness-linkage"/></td>
              <td align="left">
                <tt>/{n}</tt>, where <tt>{n}</tt> is an Entry Sequence Number, returns the single Segment covering it; the bare suffix returns the most recent; served by a witness on the same origin as <tt>arp-head-consistency</tt></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="iana-media">
        <name>Media types</name>
        <t>Fourteen media types are requested, registered under the template of <xref target="RFC6838"/>.
For each: the type name is <tt>application</tt>; there are no required and no optional
parameters; the encoding considerations are binary, save for the <tt>+json</tt> type,
which is 8-bit UTF-8 text; the security and interoperability considerations are
those of this document; the published specification is this document; the
intended usage is COMMON; the change controller is the IETF; the applications
that use the type are ARP reconciliation servers, registers, regulators and
relying parties; there are no restrictions on usage; the author is the author of
this document and the contact address is the one on its front page; there are no
deprecated alias names, no magic numbers and no customary file extensions; and
fragment identifier considerations are those of the structured syntax suffix
where one applies -- Section 3.1 of <xref target="RFC6839"/> for <tt>+json</tt> -- and are otherwise
none, no fragment identifier syntax being defined for the <tt>+cbor</tt> and <tt>+cose</tt>
forms.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Subtype</th>
              <th align="left">Carries</th>
              <th align="left">Defined in</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>arp-reconciliation-request+cbor</tt></td>
              <td align="left">a request commissioning a reconciliation</td>
              <td align="left">
                <xref target="request-binding"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-remediation-advisory+cbor</tt></td>
              <td align="left">a Remediation Advisory</td>
              <td align="left">the Adversarial Pre-Transmission Test</td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-sovereign-re-notification+cose</tt></td>
              <td align="left">a Sovereign Re-Notification</td>
              <td align="left">
                <xref target="re-notification"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-sealed-reconciliation-output+cose</tt></td>
              <td align="left">a Reconciliation Output under its Sealing Signature, whether delivered directly or nested in a SCITT Signed Statement</td>
              <td align="left">
                <xref target="reconciliation-output"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-policy-parameters+cose</tt></td>
              <td align="left">a Policy Parameters Document</td>
              <td align="left">
                <xref target="read-signing"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-post-seal-evaluation-record+cbor</tt></td>
              <td align="left">a Post-Seal Evaluation Record</td>
              <td align="left">
                <xref target="post-seal"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-reconciliation-output+json</tt></td>
              <td align="left">the RFC 8785 payload of the Verifiable Credentials form</td>
              <td align="left">
                <xref target="vc-interop"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-ledger-head+cose</tt></td>
              <td align="left">a Ledger Head Statement</td>
              <td align="left">
                <xref target="settlement-ledger"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-read-response+cose</tt></td>
              <td align="left">a signed read response</td>
              <td align="left">
                <xref target="read-responses"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-evaluation-sweep+cose</tt></td>
              <td align="left">an Evaluation Sweep Statement</td>
              <td align="left">
                <xref target="sweep-statements"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-key-set+cose</tt></td>
              <td align="left">a signed COSE Key Set or an Authorised-Origin Document</td>
              <td align="left">
                <xref target="sealing-key-discovery"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-head-consistency+cose</tt></td>
              <td align="left">a Head Consistency Statement</td>
              <td align="left">
                <xref target="head-consistency"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-witness-linkage+cose</tt></td>
              <td align="left">a Witness Linkage Segment</td>
              <td align="left">
                <xref target="witness-linkage"/></td>
            </tr>
            <tr>
              <td align="left">
                <tt>arp-probe-commitment+cose</tt></td>
              <td align="left">a Probe Commitment</td>
              <td align="left">
                <xref target="coverage-probes"/></td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document benefits from the SCITT Architecture <xref target="RFC9943"/>, the SCITT
Reference APIs <xref target="I-D.ietf-scitt-scrapi"/>, COSE Receipts
<xref target="RFC9942"/>, the RATS Architecture <xref target="RFC9334"/>,
HTTP Message Signatures <xref target="RFC9421"/>, and the Web Bot Auth HTTP message
signature protocol <xref target="I-D.ietf-webbotauth-httpsig-protocol"/>.</t>
      <t>Named findings, because a specification improved by review should say by whom.</t>
      <t>Songbo Bu established that the indistinguishability requirement of
<xref target="read-errors"/> could not be satisfied as -02 stated it: the response profile of
<xref target="read-responses"/> binds each response to its request and its serving instant,
so two responses cannot be byte-equal, and a conformance rule demanding that
they be would fail every conforming implementation. The normalised observation
in <xref target="read-errors"/>, its enumeration of HTTP metadata and cache behaviour, and
the separation of the deterministic requirements from any statistical timing
claim are his design, contributed as an executable vector class.</t>
      <t>Steven Mih established that the empty-result contradiction of <xref target="read-responses"/>
is conditional on the reader and any later observer having been served one
chain, and that under the fork <xref target="settlement-ledger"/> admits it may be
opportunistic to detect, an absence assertion can stand uncontradicted
indefinitely. The boundary now stated in <xref target="read-responses"/> is his finding.
He also confirmed, against three independent drafts, that the deterministic
encoding requirements relied on here are those of Section 4.2.1 of <xref target="RFC8949"/>
and not those of Section 9 of <xref target="RFC9052"/>.</t>
      <t>Iman Schrock established, with Anton Sokolov, that a content digest cannot
serve as a correlation key across independently produced descriptions of one
act. He then established that the earlier repair was itself imprecise:
<xref target="I-D.schrock-canonical-action-identifier"/> declares required and optional
fields per action type and marks no field as a correlation key, so the
selection belongs to the profile. The requirements in
<xref target="construction-distinctness"/> to pin the action type and version, the selected
field and its normalisation and comparison rules, and to require that the
selected field be present in the Canonical Claim so that the Claim Hash commits
to it, are his, substantially as he drafted them.</t>
      <t>Walter Hawkins established that the falsifiability condition of
<xref target="read-responses"/> is bounded by observer diversity rather than by any stronger
single-log property: head evidence obtained from the responding service cannot
bound a fork, because a fork at disjoint sequence numbers is invisible from a
single vantage by construction and the vantage is what is in question. Naming
the independent observer, and the ordering of witness countersignature over
independently anchored head digest, is his.</t>
      <t>Tiago Pinto established that the obligation to answer with a signed response
carrying a log position belongs on the party making the claim rather than on
the party relying on it, and that an unsigned or position-less answer is to be
treated as the log not having answered. <xref target="read-responses"/> takes that shape at
his argument.</t>
      <t>Tom Sato's leaf-construction work on Certificate Transparency logs informed
the inclusion-proof requirements of <xref target="merkle-construction"/>, and established
that a document defining a Merkle construction without stating its relationship
to Certificate Transparency leaves an implementer arriving from RFC 6962 unable
to tell whether the two agree.</t>
      <t>Anton Sokolov established that a digest taken over a signed artefact as served
does not identify that artefact under a signature primitive whose encoding is
not byte-unique, and that ECDSA is such a primitive without violating SEC1,
FIPS 186-5 or <xref target="RFC9053"/>. <xref target="signature-malleability"/>, and the reconstruction of
the Prior-Entry Hash of <xref target="settlement-ledger"/>, the Post-Seal Evaluation Record
Hash of <xref target="post-seal"/> and the Merkle leaf of <xref target="aggregation"/> as Signing Input
Digests, follow from his measurement.</t>
      <t>Iman Schrock separately established that the digest of a COSE_Sign1 envelope,
the digest of its <tt>Sig_structure</tt> and the digest of the authorization payload
inside it are three references a relying party has to be able to hold apart,
and that a protocol identifying a registration entry by the first of them
forces applications to treat it as the identity of the third. He further
established the scope of a low-S canonicalisation rule against that question:
low-S enforcement can reject the high-S encoding at a verifier and does not by
itself resolve the identity question, particularly where normalisation occurs
after an envelope has already been registered. The separation stated in
<xref target="pq-artefact-identity"/>, and its limitation of low-S, are his; what this
document adds is the measurement across signature primitives and the
observation that the exemption <xref target="signature-malleability"/> grants to EdDSA does
not survive composition with a post-quantum leg.</t>
      <t>Henri Sirkkavaara established that a document may carry both the sound and the
unsound rule at once, each defensible on its own reading, and that the check is
therefore to sweep every identity rule in a tree rather than to correct the one
that was reported. Applied to this document it found that the Self-Entry Hash of
<xref target="settlement-ledger"/> already excluded the signature while the Prior-Entry Hash
two paragraphs below it did not.</t>
      <t>Nenad Vasic established that an inclusion proof whose carried leaf is lifted
unchanged from another object's valid proof folds to the correct root under a
sibling array that verifies, so that a verifier walking the path before
recomputing the leaf accepts a proof bound to bytes it does not hold. The
requirement in <xref target="leaf-binding"/> that a verifier compute the leaf from the object
whose inclusion is being proved and use that value as the input to the sibling
walk is his, contributed as an executable vector against a
third-party corpus.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
          </front>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <author fullname="C. Newman" initials="C." surname="Newman">
              <organization/>
            </author>
            <date month="July" year="2002"/>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC7638">
          <front>
            <title>JSON Web Key (JWK) Thumbprint</title>
            <author fullname="M. Jones" initials="M." surname="Jones">
              <organization/>
            </author>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura">
              <organization/>
            </author>
            <date month="September" year="2015"/>
          </front>
          <seriesInfo name="RFC" value="7638"/>
          <seriesInfo name="DOI" value="10.17487/RFC7638"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <date month="January" year="2005"/>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC6454">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="December" year="2011"/>
            </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </reference>
        <reference anchor="RFC9530">
          <front>
            <title>Digest Fields</title>
            <author fullname="R. Polli" initials="R." surname="Polli">
              <organization/>
            </author>
            <author fullname="L. Pardue" initials="L." surname="Pardue">
              <organization/>
            </author>
            <date month="February" year="2024"/>
          </front>
          <seriesInfo name="RFC" value="9530"/>
          <seriesInfo name="DOI" value="10.17487/RFC9530"/>
        </reference>
        <reference anchor="RFC8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <date month="May" year="2019"/>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed">
              <organization/>
            </author>
            <author fullname="J. Klensin" initials="J." surname="Klensin">
              <organization/>
            </author>
            <author fullname="T. Hansen" initials="T." surname="Hansen">
              <organization/>
            </author>
            <date month="January" year="2013"/>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="RFC6839">
          <front>
            <title>Additional Media Type Structured Syntax Suffixes</title>
            <author fullname="T. Hansen" initials="T." surname="Hansen">
              <organization/>
            </author>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov">
              <organization/>
            </author>
            <date month="January" year="2013"/>
          </front>
          <seriesInfo name="RFC" value="6839"/>
          <seriesInfo name="DOI" value="10.17487/RFC6839"/>
        </reference>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="December" year="2020"/>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="R. Canetti" initials="R." surname="Canetti"/>
            <date month="February" year="1997"/>
            </front>
          <seriesInfo name="RFC" value="2104"/>
          <seriesInfo name="DOI" value="10.17487/RFC2104"/>
        </reference>
        <reference anchor="RFC9052">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad">
              <organization/>
            </author>
            <date month="August" year="2022"/>
          </front>
          <seriesInfo name="RFC" value="9052"/>
          <seriesInfo name="DOI" value="10.17487/RFC9052"/>
        </reference>
        <reference anchor="RFC9053">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Initial Algorithms</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad">
              <organization/>
            </author>
            <date month="August" year="2022"/>
          </front>
          <seriesInfo name="RFC" value="9053"/>
          <seriesInfo name="DOI" value="10.17487/RFC9053"/>
        </reference>
        <reference anchor="RFC9334">
          <front>
            <title>Remote ATtestation procedureS (RATS) Architecture</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz">
              <organization/>
            </author>
            <author fullname="D. Thaler" initials="D." surname="Thaler">
              <organization/>
            </author>
            <author fullname="M. Richardson" initials="M." surname="Richardson">
              <organization/>
            </author>
            <author fullname="N. Smith" initials="N." surname="Smith">
              <organization/>
            </author>
            <author fullname="W. Pan" initials="W." surname="Pan">
              <organization/>
            </author>
            <date month="January" year="2023"/>
          </front>
          <seriesInfo name="RFC" value="9334"/>
          <seriesInfo name="DOI" value="10.17487/RFC9334"/>
        </reference>
        <reference anchor="RFC9421">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." surname="Backman">
              <organization/>
            </author>
            <author fullname="J. Richer" initials="J." surname="Richer">
              <organization/>
            </author>
            <author fullname="M. Sporny" initials="M." surname="Sporny">
              <organization/>
            </author>
            <date month="February" year="2024"/>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </reference>
        <reference anchor="RFC8785">
          <front>
            <title>JSON Canonicalization Scheme (JCS)</title>
            <author fullname="A. Rundgren" initials="A." surname="Rundgren">
              <organization/>
            </author>
            <author fullname="B. Jordan" initials="B." surname="Jordan">
              <organization/>
            </author>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman">
              <organization/>
            </author>
            <date month="June" year="2020"/>
          </front>
          <seriesInfo name="RFC" value="8785"/>
          <seriesInfo name="DOI" value="10.17487/RFC8785"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC9943">
          <front>
            <title>An Architecture for Trustworthy and Transparent Digital Supply Chains</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz">
              <organization/>
            </author>
            <author fullname="A. Delignat-Lavaud" initials="A." surname="Delignat-Lavaud">
              <organization/>
            </author>
            <author fullname="C. Fournet" initials="C." surname="Fournet">
              <organization/>
            </author>
            <author fullname="Y. Deshpande" initials="Y." surname="Deshpande">
              <organization/>
            </author>
            <author fullname="S. Lasker" initials="S." surname="Lasker">
              <organization/>
            </author>
            <date month="June" year="2026"/>
          </front>
          <seriesInfo name="RFC" value="9943"/>
          <seriesInfo name="DOI" value="10.17487/RFC9943"/>
        </reference>
        <reference anchor="RFC9942">
          <front>
            <title>CBOR Object Signing and Encryption (COSE) Receipts</title>
            <author fullname="O. Steele" initials="O." surname="Steele">
              <organization/>
            </author>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz">
              <organization/>
            </author>
            <author fullname="A. Delignat-Lavaud" initials="A." surname="Delignat-Lavaud">
              <organization/>
            </author>
            <author fullname="C. Fournet" initials="C." surname="Fournet">
              <organization/>
            </author>
            <date month="June" year="2026"/>
          </front>
          <seriesInfo name="RFC" value="9942"/>
          <seriesInfo name="DOI" value="10.17487/RFC9942"/>
        </reference>
        <reference anchor="I-D.ietf-scitt-scrapi">
          <front>
            <title>Supply Chain Integrity, Transparency, and Trust (SCITT) Reference APIs</title>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer SIT</organization>
            </author>
            <author fullname="Jon Geater" initials="J." surname="Geater">
              <organization>Bowball Technologies Ltd</organization>
            </author>
            <author fullname="Antoine Delignat-Lavaud" initials="A." surname="Delignat-Lavaud">
              <organization>Microsoft Research</organization>
            </author>
            <date day="26" month="June" year="2026"/>
            </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-scitt-scrapi-11"/>
        </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>
            <date year="2025"/>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC8792">
          <front>
            <title>Handling Long Lines in Content of Internet-Drafts and RFCs</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="E. Auerswald" initials="E." surname="Auerswald"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <author fullname="Q. Wu" initials="Q." surname="Wu"/>
            <date month="June" year="2020"/>
            </front>
          <seriesInfo name="RFC" value="8792"/>
          <seriesInfo name="DOI" value="10.17487/RFC8792"/>
        </reference>
        <reference anchor="I-D.hillier-coverage-attestation">
          <front>
            <title>The Coverage Attestation Profile (CAP-1)</title>
            <author fullname="Joel Hillier" initials="J." surname="Hillier">
              <organization>Certisyn, Inc.</organization>
            </author>
            <date day="20" month="August" year="2026"/>
            </front>
          <seriesInfo name="Internet-Draft" value="draft-hillier-coverage-attestation-00"/>
        </reference>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="RFC6350">
          <front>
            <title>vCard Format Specification</title>
            <author fullname="S. Perreault" initials="S." surname="Perreault">
              <organization/>
            </author>
            <date month="August" year="2011"/>
          </front>
          <seriesInfo name="RFC" value="6350"/>
          <seriesInfo name="DOI" value="10.17487/RFC6350"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
        <reference anchor="RFC9162">
          <front>
            <title>Certificate Transparency Version 2.0</title>
            <author fullname="B. Laurie" initials="B." surname="Laurie">
              <organization/>
            </author>
            <author fullname="E. Messeri" initials="E." surname="Messeri">
              <organization/>
            </author>
            <author fullname="R. Stradling" initials="R." surname="Stradling">
              <organization/>
            </author>
            <date month="December" year="2021"/>
          </front>
          <seriesInfo name="RFC" value="9162"/>
          <seriesInfo name="DOI" value="10.17487/RFC9162"/>
        </reference>
        <reference anchor="I-D.schrock-canonical-action-identifier">
          <front>
            <title>The Canonical Action Identifier (CAID)</title>
            <author fullname="Iman Schrock" initials="I." surname="Schrock">
              <organization>EMILIA Protocol, Inc.</organization>
            </author>
            <date day="2" month="October" year="2026"/>
            </front>
          <seriesInfo name="Internet-Draft" value="draft-schrock-canonical-action-identifier-05"/>
        </reference>
        <reference anchor="BODS" target="https://standard.openownership.org/">
          <front>
            <title>Beneficial Ownership Data Standard</title>
            <author>
              <organization>Open Ownership</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="W3C-ORG" target="https://www.w3.org/TR/vocab-org/">
          <front>
            <title>The Organization Ontology</title>
            <author>
              <organization>World Wide Web Consortium</organization>
            </author>
            <date year="2014"/>
          </front>
        </reference>
        <reference anchor="WCO-DM" target="https://www.wcoomd.org/en/topics/facilitation/instrument-and-tools/tools/data-model.aspx">
          <front>
            <title>WCO Data Model</title>
            <author>
              <organization>World Customs Organization</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="UNCEFACT" target="https://unece.org/trade/uncefact">
          <front>
            <title>UN/CEFACT Core Component Library and XML Schemas</title>
            <author>
              <organization>United Nations Economic Commission for Europe</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="OFAC-SDN" target="https://sanctionslist.ofac.treas.gov/Home/SdnList">
          <front>
            <title>Specially Designated Nationals and Blocked Persons List</title>
            <author>
              <organization>United States Department of the Treasury, Office of Foreign Assets Control</organization>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="EU-CFSP" target="https://webgate.ec.europa.eu/fsd/fsf">
          <front>
            <title>EU Consolidated Financial Sanctions List</title>
            <author>
              <organization>European Union</organization>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="RFC8067">
          <front>
            <title>Updating When Standards Track Documents May Refer Normatively to Documents at a Lower Level</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="January" year="2017"/>
          </front>
          <seriesInfo name="RFC" value="8067"/>
          <seriesInfo name="DOI" value="10.17487/RFC8067"/>
        </reference>
        <reference anchor="I-D.mih-sato-agent-accountability-composition">
          <front>
            <title>Agent Accountability: Composition and Conformance</title>
            <author fullname="Steven Mih" initials="S." surname="Mih">
              <organization>Action State Group, Inc.</organization>
            </author>
            <author fullname="Tom Sato" initials="" surname="Sato">
              <organization>MyAuberge K.K.</organization>
            </author>
            <author fullname="Iman Schrock" initials="I." surname="Schrock">
              <organization>EMILIA Protocol, Inc.</organization>
            </author>
            <author fullname="Songbo Bu" initials="S." surname="Bu">
              <organization>Independent</organization>
            </author>
            <author fullname="Anton Sokolov" initials="A." surname="Sokolov">
              <organization>Tyche Institute</organization>
            </author>
            <date day="16" month="August" year="2026"/>
            </front>
          <seriesInfo name="Internet-Draft" value="draft-mih-sato-agent-accountability-composition-01"/>
        </reference>
        <reference anchor="I-D.mih-sokolov-scitt-payload-binding">
          <front>
            <title>Canonicalization Declaration for SCITT Signed Statements</title>
            <author fullname="Steven Mih" initials="S." surname="Mih">
              <organization>Action State Group, Inc.</organization>
            </author>
            <author fullname="Anton Sokolov" initials="A." surname="Sokolov">
              <organization>Tyche Institute</organization>
            </author>
            <date day="12" month="September" year="2026"/>
            </front>
          <seriesInfo name="Internet-Draft" value="draft-mih-sokolov-scitt-payload-binding-05"/>
        </reference>
        <reference anchor="I-D.ietf-webbotauth-httpsig-protocol">
          <front>
            <title>HTTP Message Signatures for automated traffic</title>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Sandor Major" initials="S." surname="Major">
              <organization>Google</organization>
            </author>
            <date day="1" month="September" year="2026"/>
            </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webbotauth-httpsig-protocol-00"/>
        </reference>
        <reference anchor="I-D.meunier-webbotauth-registry">
          <front>
            <title>Registry and Signature Agent card for Web bot auth</title>
            <author fullname="Maxime Guerreiro" initials="M." surname="Guerreiro">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Ulas Kirazci" initials="U." surname="Kirazci">
              <organization>Amazon</organization>
            </author>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <date day="26" month="June" year="2026"/>
            </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-webbotauth-registry-03"/>
        </reference>
        <reference anchor="I-D.connolly-cfrg-ml-dsa-security-considerations">
          <front>
            <title>Security Considerations for ML-DSA</title>
            <author fullname="Deirdre Connolly" initials="D." surname="Connolly">
              <organization>Oracle</organization>
            </author>
            <date day="19" month="March" year="2026"/>
            </front>
          <seriesInfo name="Internet-Draft" value="draft-connolly-cfrg-ml-dsa-security-considerations-02"/>
        </reference>
        <reference anchor="FIPS203" target="https://csrc.nist.gov/pubs/fips/203/final">
          <front>
            <title>Module-Lattice-Based Key-Encapsulation Mechanism Standard</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="NIST" value="FIPS 203"/>
        </reference>
        <reference anchor="FIPS204" target="https://csrc.nist.gov/pubs/fips/204/final">
          <front>
            <title>Module-Lattice-Based Digital Signature Standard</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="NIST" value="FIPS 204"/>
        </reference>
        <reference anchor="W3C-VC-DM-2.0" target="https://www.w3.org/TR/vc-data-model-2.0/">
          <front>
            <title>Verifiable Credentials Data Model 2.0</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="W3C-VC-JOSE-COSE" target="https://www.w3.org/TR/vc-jose-cose/">
          <front>
            <title>Securing Verifiable Credentials using JOSE and COSE</title>
            <author>
              <organization/>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="SD-JWT" target="https://datatracker.ietf.org/doc/draft-ietf-oauth-selective-disclosure-jwt/">
          <front>
            <title>Selective Disclosure for JWTs (SD-JWT)</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="SD-JWT-VC" target="https://datatracker.ietf.org/doc/draft-ietf-oauth-sd-jwt-vc/">
          <front>
            <title>SD-JWT-based Verifiable Credentials (SD-JWT VC)</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="ISO18013-5" target="https://www.iso.org/standard/69084.html">
          <front>
            <title>ISO/IEC 18013-5:2021 Personal identification - ISO-compliant driving licence - Part 5: Mobile driving licence (mDL) application</title>
            <author>
              <organization/>
            </author>
            <date year="2021"/>
          </front>
        </reference>
      </references>
    </references>
    

<section anchor="examples">
      <name>Examples</name>
      <section anchor="example-three-register-sanctions-reconciliation">
        <name>Example: Three-register Sanctions Reconciliation</name>
        <t>This example is illustrative and non-normative; register identifiers, values
and parties are fictitious, and no bilateral agreement with any named authority
is asserted or implied. Suppose a relying party requests reconciliation of the
predicate <tt>sanctions:any-list-match</tt> for subject identifier
<tt>corp:EXAMPLE:0123456789</tt> against three consolidated sanctions registers.</t>
        <t>Each Bilateral Register Agreement permits the predicate. The projection
function emits identical Per-Register Claim Projections to all three
registers. All three return Partial Attestations with verdict <tt>no-match</tt>.</t>
        <t>The Aggregation Subsystem operates in Hash-Linkage Aggregation. The Verdict
Arithmetic,
resolved from policy for the regimes the claim names, is disjunction. The
Combined Verdict is <tt>no-match</tt>.</t>
        <t>The requester named itself and its compliance department's shared identity in the
Audience Set; no addressed register declared an audience constraint, so both are
admitted. The reliance interval that policy declares for <tt>sanctions:</tt> predicates
is seven days, so the Reliance Horizon is 2026-05-04T19:47:14Z. The Output is
sealed against the current Policy-Version Hash and returned to the requester in
the signed read response to the request that commissioned it, over which the
requester computes its Reconciliation Hash.</t>
        <t>The Settlement-Layer Ledger entry comprises:</t>
        <ul spacing="normal">
          <li>
            <t>Entry Sequence Number: 42</t>
          </li>
          <li>
            <t>Entry Type: <tt>reconciliation</tt></t>
          </li>
          <li>
            <t>Claim Hash: &lt;32 bytes&gt;</t>
          </li>
          <li>
            <t>Reconciliation Hash: &lt;32 bytes&gt;</t>
          </li>
          <li>
            <t>Entry Timestamp: 2026-04-27T19:47:15Z</t>
          </li>
          <li>
            <t>Prior-Entry Hash: &lt;32 bytes&gt;</t>
          </li>
          <li>
            <t>Policy-Version Hash: &lt;32 bytes&gt;</t>
          </li>
          <li>
            <t>Addressed-Registers Identifier Set:
<tt>["https://register-a.example", "https://register-b.example",
"https://register-c.example"]</tt></t>
          </li>
          <li>
            <t>Aggregation-Method Descriptor: <tt>hash-linkage-disjunction</tt></t>
          </li>
          <li>
            <t>Merkle Root: &lt;32 bytes&gt;</t>
          </li>
          <li>
            <t>Requester-Binding-Class Descriptor: "human-operator"</t>
          </li>
          <li>
            <t>Reconciliation Timestamp: 2026-04-27T19:47:14Z</t>
          </li>
          <li>
            <t>Source-Reconciliation-Output Identifier: CBOR null -- this reconciliation
supersedes none</t>
          </li>
          <li>
            <t>Override Indicator: false</t>
          </li>
          <li>
            <t>Self-Entry Hash: &lt;32 bytes&gt;</t>
          </li>
          <li>
            <t>Entry Signature: COSE_Sign1, Sealing-Key Identifier
(<tt>https://arp.example</tt>, <tt>example-sealing-2026-01</tt>)</t>
          </li>
        </ul>
        <t>The one absent field occupies its position as CBOR null, so that the array's
length is fixed by the Entry Type and the Self-Entry Hash is taken over a
determinate encoding. When the sealed Output is registered with a
Transparency Service, the EntryID it returns is not written into entry 42, which
is already signed; it is appended as a later entry:</t>
        <ul spacing="normal">
          <li>
            <t>Entry Sequence Number: 57</t>
          </li>
          <li>
            <t>Entry Type: <tt>continuation-notarisation</tt></t>
          </li>
          <li>
            <t>Claim Hash: &lt;the same 32 bytes as entry 42&gt;</t>
          </li>
          <li>
            <t>Reconciliation Hash: &lt;the same 32 bytes as entry 42&gt;</t>
          </li>
          <li>
            <t>Entry Timestamp: 2026-04-27T19:52:03Z</t>
          </li>
          <li>
            <t>Prior-Entry Hash: &lt;32 bytes&gt;</t>
          </li>
          <li>
            <t>Transparency Service Identifier: <tt>https://ts.example/</tt></t>
          </li>
          <li>
            <t>the notarisation outcome: <tt>["entry-id", &lt;the identifier that service returned&gt;]</tt></t>
          </li>
          <li>
            <t>Self-Entry Hash: &lt;32 bytes&gt;</t>
          </li>
          <li>
            <t>Entry Signature: COSE_Sign1, Sealing-Key Identifier
(<tt>https://arp.example</tt>, <tt>example-sealing-2026-01</tt>)</t>
          </li>
        </ul>
        <t>Entry 57 carries no Policy-Version Hash and no Addressed-Registers Identifier
Set; entry 42 records those and the shared Reconciliation Hash binds them. No
register record content is stored on the Ledger in either entry. Had the
registration neither completed nor been refused within the polling bound, entry
57 would not exist: the outcome would be a Post-Seal Evaluation Record qualified
<tt>notarisation-incomplete</tt>, pointed to by a <tt>continuation-post-seal-record</tt> entry,
and a later completion -- were the server able to learn of one, which
<xref target="settlement-ledger"/> records as an open question -- would be appended as a
<tt>continuation-notarisation</tt> entry later in the sequence. Had the service instead
refused registration terminally, the second field would read
<tt>["refused", 400]</tt>.</t>
        <t>On 2026-05-06, two days past the Reliance Horizon, the compliance department
wishes to rely on the verdict again. Being an Audience Member it presents a
signed <tt>GET /arp/continuations/{reconciliation-hash}</tt>. The server answers <tt>200</tt>
with a signed response carrying the ledger head it was served against and, as its
result, entry 57 alone. That the result contains no <tt>continuation-supersession</tt>
entry is a signed statement by the server that as of that head there was none --
not merely the absence of one -- and the department retains it. Had it not been
an Audience Member the same request would have returned <tt>404</tt>, which is also what
it would have received had the Reconciliation Hash named nothing at all.</t>
      </section>
      <section anchor="example-retroactive-re-evaluation">
        <name>Example: Retroactive Re-evaluation</name>
        <t>Continuing the illustrative example above: six weeks after that
reconciliation, the list register-a.example consults adds the subject as part of a
new tranche. That register, on next invocation over the bilateral
channel its agreement declares, returns verdict <tt>match</tt>.</t>
        <t>The Retroactive Evaluation Subsystem detects the new Source-Data Version the list
publisher issued, re-invokes Partial Attestations on the historical
reconciliations whose Per-Register Result Set carries a Source-Data Version
Identifier from the republished list, identifies the material verdict change, and emits a Sovereign
Re-Notification through the Regulator Portal to the regulators whose
statutory-regulator-access scope intersects the changed reconciliation.</t>
        <t>It also emits an Evaluation Sweep Statement recording the trigger
<tt>source-data-version</tt>, the identifier of the list version that triggered it, the
policy state applied, the ledger head at the start and end of the sweep, the
Examined-Set Root over the Claim Hashes it examined, and the counts examined and
materially changed. The compliance department later presents that root and its
own Claim Hash to <tt>GET /arp/sweeps/{examined-set-root}/inclusion/{claim-hash}</tt>
and is shown that its reconciliation was in the set the server claims to have
examined. Had the server not run the sweep, there
would be no Statement covering a list republication whose date is public, and its
absence would itself be the finding.</t>
        <t>The supersession is recorded from both ends. A new Reconciliation Output is
sealed against the current Policy-Version Hash and appended as a
<tt>reconciliation</tt> entry whose Source-Reconciliation-Output Identifier is the
Reconciliation Hash of the superseded Output. A <tt>continuation-supersession</tt>
entry is then appended against the superseded Output, carrying that Output's
Claim Hash and Reconciliation Hash, a Material-Change Indicator of true -- the
verdict moved from <tt>no-match</tt> to <tt>match</tt>, which is decisive-to-decisive and
therefore material -- the Superseding-Reconciliation Hash of the new Output, and
the Entry Sequence Number of the entry that records it.</t>
        <t>The compliance department, an Audience Member of the original Output, presents
<tt>GET /arp/continuations/{reconciliation-hash}</tt> again. This time the signed
response carries the <tt>continuation-supersession</tt> entry. It reads the
Superseding-Reconciliation Hash, presents
<tt>GET /arp/outputs/{superseding-reconciliation-hash}</tt>, and is served the new
Output -- because a superseding Output inherits the Audience Set of the Output it
supersedes, so the party entitled to learn that its verdict changed is entitled
to see what it changed to. It verifies the new Sealing Signature, reads the
<tt>match</tt>, and acts.</t>
        <t>Had the department retained the earlier signed empty response and the server now
denied that any supersession existed, the two signed statements by one key would
be irreconcilable, which is the point of signing them.</t>
        <t>A party that is not an Audience Member -- one that was handed the Output by
someone who was -- reaches none of this. It may verify the Sealing Signature and
read the <tt>no-match</tt>, which is what makes an Output worth handing on, and it
obtains no read, learns of no supersession, and must not treat the verdict as
current. Entitlement follows the Audience Set, not the artefact.</t>
      </section>
      <section anchor="example-agentic-principal-reconciliation">
        <name>Example: Agentic Principal Reconciliation</name>
        <t>An autonomous agent requests reconciliation of <tt>sanctions:any-list-match</tt>
over HTTP, signing the request under HTTP Message Signatures <xref target="RFC9421"/> with
a key published in a Web Bot Auth signature-agent card. The reconciliation
server verifies the signature (Agent Friend-or-Foe Determination: the agent
carries a verifiable identity). That establishes the class <tt>agent-key-verified</tt>
-- the key verified and the asserted principal is so far uncorroborated -- and
the Agent-IFF policy for the <tt>sanctions:</tt> class does not admit a decisive verdict
at that class.</t>
        <t>The server therefore first performs an <tt>agent:principal-binding-verifiable</tt>
reconciliation with Subject Identifier set to the agent's key thumbprint and
Attested Value set to the asserted principal <tt>org:ACME:operator:jdoe</tt>,
addressing the ACME organisational directory register and the
credential-issuer status-list register. Both return <tt>match</tt>. The
Requester-Binding class is raised to <tt>agent-verified</tt> with accountable principal
<tt>org:ACME:operator:jdoe</tt>, committed to the Policy-Version Hash, and only then
is the sanctions reconciliation performed with a decisive verdict binding. Had
either identity register returned <tt>no-match</tt> with an attested
Divergence-Axis Field of <tt>agent-impersonation-suspected</tt>, the agent would have been classified ENEMY --
a contradicted binding is a stronger signal than an absent one -- and the
sanctions reconciliation refused or downgraded to advisory per policy.</t>
        <t>The distinction is not bookkeeping. Under -02 both states were recorded as
<tt>agent-verified</tt>, so a relying party reading the Ledger entry for the first
reconciliation could not tell an agent whose principal had been corroborated
against two registers from one that had merely signed correctly.</t>
      </section>
      <section anchor="example-divergent-agent-action-reconciliation">
        <name>Example: Divergent Agent-Action Reconciliation</name>
        <t>This example is illustrative and non-normative. Capsule slots are those of
<xref target="I-D.mih-sato-agent-accountability-composition"/>; see <xref target="composition"/>.</t>
        <t>An autonomous agent is authorised, by a signed CAN capsule, to read from a
named evaluation dataset and to write only to a sandboxed result store. During
execution the agent's actual conduct, attested by a WHAT capsule produced by
the execution environment, includes an outbound network connection to an
external host and a write outside the sandboxed store.</t>
        <t>A relying party submits both capsules to ARP over the <tt>agent:</tt> predicate
branch with a shared subject digest computed over the action. ARP verifies
each capsule's signature, projects the authorised scope from the CAN capsule
and the actual scope from the WHAT capsule, and reconciles them. The scopes
diverge: the actual conduct exceeds the authorised scope. The Combined Verdict is <tt>no-match</tt>, and
<tt>agent-action-scope-divergence</tt> is recorded in the Server-Recorded
Divergence-Axis Set: it is a relation between two capsules and no single capsule
producer can attest it, on the same reasoning that makes <tt>source-version-skew</tt>
server-recorded.</t>
        <t>Because the Agent-IFF policy for this action class requires a decisive <tt>match</tt>
before the action is treated as authorised, the divergent verdict is available
as a refusal at decision time -- the reconciliation surfaces the excess while
the action can still be refused, rather than after the consequence. The
Reconciliation Output is sealed against the Policy-Version Hash and written to
the Settlement-Layer Ledger without claim or register content, with
requester-binding class <tt>agent-verified</tt> -- the agent's asserted principal having
been corroborated as in the preceding example -- and no register or capsule
content disclosed.</t>
      </section>
      <section anchor="example-verifiable-credentials-form-of-an-output">
        <name>Example: Verifiable Credentials Form of an Output</name>
        <t>This example is the first vector of the conformance class of <xref target="vc-conformance"/>.
The payload below is shown with indentation for reading and folded under <xref target="RFC8792"/>. The signed payload is
its <xref target="RFC8785"/> serialisation, 1,247 octets with no whitespace and members in
code-unit order. The hash and key values are those of the published test seed.</t>
        <t>The COSE_Sign1 protected header, in extended diagnostic notation:</t>
        <artwork>
{
  1: -8,
  4: 'VDux_CmeAgi2AvrAFW0bInmtCjMDD9kHOfzia5l81w0',
  16: "application/vc+cose",
  3: "application/arp-reconciliation-output+json"
}
</artwork>
        <t>The payload:</t>
        <sourcecode type="json">
========== NOTE: '\' line wrapping per RFC 8792 ==========

{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    {
      "@vocab": "https://datatracker.ietf.org/doc/draft-hillier-\
  \scitt-arp/vocab#"
    }
  ],
  "credentialSubject": {
    "addressedRegisters": [
      "https://ofac.example.gov",
      "https://sanctions.example.eu"
    ],
    "audienceSet": [
      {
        "id": "https://acme.example.com/operators/jdoe",
        "verificationMethod": "ui8q-Oh_44_8fBC8GAy1L9256mAf5rFhk\
  \au8_M3YL7k"
      }
    ],
    "bilateralRegisterAgreementHashes": [
      "bGZZqJQYgwPMmKK8JhsCgjO_qLBBDx2vJWVHo_rY03k",
      "f9SeSX9aYohdR8ZQESBPAKLgx0DiRCGI9RKhdL6h4m4"
    ],
    "claimHash": "DXnYYMYKBOTXl8wyyilXrljSu_xfAHgO8uGsTuLKu_s",
    "combinedVerdict": "no-match",
    "policyVersionHash": "AFF2RolekqOQRbkVNzh5WM493yXRFD4PtgFtFA\
  \7FcIo",
    "reconciliationHash": "LLJqwmuxKzSvgqXO2zWYJyB4tEY6tt6NIojRV\
  \jPDyfM",
    "reconciliationTimestamp": "2026-10-14T18:00:00Z",
    "relianceHorizon": "2026-10-15T18:00:00Z",
    "requesterBindingClass": "agent-verified",
    "sealedOutput": {
      "digest": "wV7R-2vxEC9c7XAWIaMKYht97UvgOjF7vQhXmw9kJTo",
      "digestAlgorithm": "sha-256",
      "mediaType": "application/arp-sealed-reconciliation-output\
  \+cose"
    }
  },
  "id": "urn:arp:reconciliation:LLJqwmuxKzSvgqXO2zWYJyB4tEY6tt6N\
  \IojRVjPDyfM",
  "issuer": "https://arp.example.org",
  "type": [
    "VerifiableCredential",
    "ArpReconciliationOutput"
  ],
  "validFrom": "2026-10-14T18:00:00Z",
  "validUntil": "2026-10-15T18:00:00Z"
}
</sourcecode>
        <t>A verifier holding the sealed Output computes the SHA-256 digest of its
COSE_Sign1 and compares it to <tt>sealedOutput.digest</tt>. A verifier that holds only
this credential reads the Ledger entry for <tt>reconciliationHash</tt> before treating
the verdict as more than a snapshot, and stops treating it as current at
<tt>validUntil</tt>.</t>
      </section>
    </section>
    <section anchor="composition-scitt">
      <name>Composition with the SCITT Architecture</name>
      <t>The SCITT Architecture <xref target="RFC9943"/> provides notarisation of supply-chain
artefacts through a Transparency Service, which registers Signed Statements and
returns Receipts, yielding Transparent Statements. ARP composes with SCITT in
four ways:</t>
      <ol spacing="normal" type="1"><li>
          <t>SCITT receipts <bcp14>MAY</bcp14> be the input claim to ARP. A claim referencing a
SCITT-anchored artefact (its hash and its registration receipt) is
reconciled across registers without disclosing the underlying artefact.</t>
        </li>
        <li>
          <t>ARP Reconciliation Outputs <bcp14>MAY</bcp14> be notarised into a SCITT Transparency
Service as Transparent Statements, enabling SCITT-aware relying parties to
verify the cross-sovereign reconciliation event in the same way they verify
any other supply-chain claim. Registration and retrieval <bcp14>MAY</bcp14> use the SCITT
Reference APIs <xref target="I-D.ietf-scitt-scrapi"/>. Notarisation does not enlarge the
Audience Set of <xref target="entitlement"/>: what is registered is the sealed Output, and
a party that retrieves it by EntryID holds it on the same terms as a party
handed it directly.</t>
        </li>
        <li>
          <t>The SCITT Architecture's Issuer role maps to the Bilateral Register Agreement
structure: each Sovereign Register acts as a SCITT Issuer for a constrained
predicate set. RFC 9943 defines no role for a party that combines statements
from several Issuers, and this document does not claim one: the reconciliation
server is an ARP role that acts as a SCITT Client toward the Transparency
Service, registering its own Signed Statements.</t>
        </li>
        <li>
          <t>ARP Hash-Linkage Aggregation <bcp14>MAY</bcp14> emit its Merkle commitment as COSE Receipts
<xref target="RFC9942"/>, a compatible inclusion-proof encoding
SCITT uses for transparency receipts, so a single verifier library checks
both.</t>
        </li>
      </ol>
    </section>
    <section anchor="composition-with-the-rats-architecture">
      <name>Composition with the RATS Architecture</name>
      <t>The RATS Architecture <xref target="RFC9334"/> provides remote-attestation procedures
for compute-substrate trust. ARP composes with RATS in two ways:</t>
      <ol spacing="normal" type="1"><li>
          <t>The Adversarial Pre-Transmission Test runs inside a confidential
computing boundary attested under RATS. The reconciliation server's
integrity <bcp14>MAY</bcp14> be verified by relying parties through standard RATS
verification flows.</t>
        </li>
        <li>
          <t>Compute-attestation reconciliation across heterogeneous TEE / CC
providers is the natural specialisation of ARP to the RATS evidence
class. That specialisation is outside the scope of this document.</t>
        </li>
      </ol>
    </section>
    <section anchor="composition">
      <name>Composition with Agent-Action Accountability Capsules</name>
      <t><xref target="I-D.mih-sato-agent-accountability-composition"/> models accountable autonomous
action as four independently verifiable slots -- CAN, what the agent was
permitted to do; WHO, which human authorised it; WHAT the agent did; and AUDIT,
the runtime enforcement record -- each filled by a separately signed profile.
This document does not restate that model; the slot definitions, their semantics
and their composition rules are those of
<xref target="I-D.mih-sato-agent-accountability-composition"/>, and this appendix uses them as
defined there.</t>
      <t>This appendix calls a filled slot a capsule. That is this document's term and not
that draft's, which speaks of slots and profiles; it is used here because ARP
admits each filled slot as a Partial-Attestation source and the word names the
signed unit rather than the position it occupies.</t>
      <t>What this appendix adds is reconciliation across those capsules. Each capsule
may be signed by a different party, under a different signing chain, with a
different payload schema -- the same non-reconcilable-outputs problem this
document addresses for sovereign registers, arising in the agent-action
domain. What the capsules share is the action serialisation over which the
subject digest is computed.</t>
      <t>ARP composes such capsules without requiring them to share a producer, a
schema, or a signing chain. The capsules are bound to a common action through a
shared subject digest, computed as the SHA-256 of the JSON
Canonicalization Scheme serialisation of the action being attested:</t>
      <artwork>
subject_digest = SHA-256(JCS(action))
</artwork>
      <t>where JCS is the JSON Canonicalization Scheme specified in <xref target="RFC8785"/>, and
<tt>action</tt> is one action object serialised once. All capsules composed under this
appendix <bcp14>MUST</bcp14> be computed over that same serialised action object.
<tt>subject_digest</tt> is a join key across capsules over a shared serialisation; it
is NOT a correlation key across independently produced descriptions of an act,
and <bcp14>MUST NOT</bcp14> be used as one. See <xref target="subject-digest-scope"/>.</t>
      <t>The shared serialisation is established once, by the party that authorises the
action, and is echoed verbatim by every later attester. An attester that
re-serialises its own account of the action <bcp14>MUST NOT</bcp14> compute <tt>subject_digest</tt>
over that account; it <bcp14>MUST</bcp14> carry the serialisation it received. This is what
makes the digest a join key here rather than a correlation across independent
descriptions, and a profile that cannot guarantee it is in the second case of
<xref target="subject-digest-scope"/> rather than the first.
Implementations <bcp14>MUST</bcp14> use <xref target="RFC8785"/> and <bcp14>MUST NOT</bcp14> substitute another
canonicalisation. In particular, <xref target="RFC8785"/> does not apply Unicode
normalisation. An implementation that normalises before serialising therefore
computes a different subject digest from a conforming implementation for any
input carrying a member name or string value that is not already in the
normalisation form it applies -- silently, since both parties obtain a
well-formed digest.</t>
      <t>The agreement of this construction with a deployed <xref target="RFC8785"/> profile depends on
both parties having selected <xref target="RFC8785"/>, which the normative reference above
makes an obligation. <xref target="I-D.mih-sato-agent-accountability-composition"/> freezes a
conformance vector only once two independent implementations have recomputed it
and specifies no implementation, so no pinned corpus is cited here.</t>
      <t>The capsules may disagree about the action -- that disagreement is the finding
ARP exists to surface -- but they do not disagree about which action is under
attestation, because they carry the same action serialisation. Each capsule's
own account travels in its payload, committed by its receipt-payload digest
below, not in <tt>subject_digest</tt>.</t>
      <t>Two further profile-tagged digests, defined by this
document rather than by <xref target="I-D.mih-sato-agent-accountability-composition"/>,
position each capsule for reconciliation: an authority-reference digest
committing to the authorising instrument (tagged transparency where it is the
Signing Input Digest of the COSE_Sign1 transparency receipt, an RFC 9942 receipt
being signed by the Transparency Service and so within
<xref target="signature-malleability"/>; or offline where it is the SHA-256 of the
<xref target="RFC8785"/> serialisation of an offline receipt payload, which carries no
signature), and a receipt-payload digest committing to the
capsule's own payload.</t>
      <t>Each capsule is admitted to ARP as a Partial-Attestation source keyed on the
shared subject digest, in the slot
<xref target="I-D.mih-sato-agent-accountability-composition"/> assigns it. The
reconciliation server verifies each capsule's
signature under its own trust anchor, projects each into the <tt>agent:</tt> predicate
branch, and aggregates the per-capsule verdicts under the Verdict Arithmetic
declared for the action class -- yielding a single, producer-agnostic Combined
Verdict over an action whose constituent attestations were never designed to
interoperate.</t>
      <t>Where the authorised-scope capsule and the actual-conduct capsule reconcile to
divergent scopes, the Combined Verdict is <tt>no-match</tt> with divergence axis
agent-action-scope-divergence; the divergence is a refusable control input,
produced at decision time and sealed to the Settlement-Layer Ledger without
claim or capsule content.</t>
      <t>This composition is the agent-action specialisation of the mechanism ARP
applies to sovereign registers: reconcile heterogeneous authoritative outputs
over a shared subject into one deterministic verdict, disclose only verdict and
divergence, and seal against a Policy-Version Hash. It allows a relying party
to reconcile what an agent was permitted to do against what it did, at the
moment of action, across attestations no single party produced.</t>
      <section anchor="construction-distinctness">
        <name>The digest constructions are distinct</name>
        <t>A third construction, the Signing Input Digest of <xref target="terminology"/>, identifies a
signed artefact by what was signed rather than by the envelope carrying it, and
is over deterministic CBOR rather than over a JSON serialisation. It is
distinct from both of the constructions below and from the Reconciliation Hash,
which is over a Reconciliation Output with each embedded register signature
replaced by its Signing Input Digest. Substituting any of these four for another
produces a value that verifies against nothing.</t>
        <t>This document defines two digest constructions over a JSON serialisation, for two different
purposes, and they are NOT interchangeable:</t>
        <dl>
          <dt>Claim Hash:</dt>
          <dd>
            <t>SHA-256 over the Canonical Claim serialisation of <xref target="terminology"/> together
with the Deployment Blinding Value of <xref target="sealing"/>. Its
purpose is to index a claim in the Settlement-Layer Ledger. It applies
Unicode Normalization Form C.</t>
          </dd>
          <dt>subject_digest:</dt>
          <dd>
            <t>SHA-256 over the <xref target="RFC8785"/> serialisation of an action, per
<xref target="composition"/>. It is a CONTENT digest: it commits to the action object as
serialised, and any difference in the serialised bytes yields a different
digest except with negligible probability. <xref target="RFC8785"/> does not normalise.</t>
          </dd>
        </dl>
        <t>An implementation that substitutes one for the other <bcp14>MUST</bcp14> be assumed to
produce incorrect correlations. The failure is silent: both constructions
return a well-formed 32-octet digest for any input, so a substitution surfaces
as a correlation that does not occur, or as two distinct actions correlating to
one subject, rather than as an error.</t>
        <t>Two cases are worse than a mere difference of bytes, because the substitution
produces a COLLISION rather than a mismatch. Under the Claim Hash construction,
which normalises, an input in Normalization Form D and the same input in
Normalization Form C yield the SAME digest; so do U+212B ANGSTROM SIGN and
U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE. Under the <tt>subject_digest</tt>
construction, which does not normalise, all four are distinct. An implementer
who reuses the Claim Hash where a subject digest is required will therefore
correlate two actions that a conforming implementation keeps apart. Neither case
needs measuring: both follow from the two constructions as this document defines
them, and either can be checked by computing the two digests over the four
inputs named above.</t>
        <t>Accordingly:</t>
        <ul spacing="normal">
          <li>
            <t>An implementation <bcp14>MUST NOT</bcp14> use the Claim Hash construction where
<tt>subject_digest</tt> is specified, or the reverse.</t>
          </li>
          <li>
            <t>Where a digest is carried on the wire for correlation, the producer <bcp14>MUST</bcp14>
identify the construction used, by an identifier that commits to the
declared canonicalisation parameters -- member-sort code unit,
normalisation, number rendering, absent-member handling and hash algorithm
-- so that a consumer can determine compatibility rather than assume it.
Such an identifier <bcp14>MUST NOT</bcp14> commit to facts about a specification that do
not affect the serialised bytes, so that two implementations producing
identical bytes share an identifier.
<xref target="I-D.mih-sokolov-scitt-payload-binding"/> expresses a compatible rule
statement-side.</t>
          </li>
          <li>
            <t>Where the correlation digest is computed over a TYPED action object whose
type declares required material fields, the producer <bcp14>MUST</bcp14> validate the
object against a pinned definition of that type before emitting a
correlation identifier for it, and <bcp14>MUST NOT</bcp14> emit one where validation
fails. A digest is well-formed over any object, including one that omits
fields the type requires; emitting an identifier in that case mints a join
key for an action the identifier does not fully describe, which is the
condition a relying party has no way to detect downstream. Validation against a pinned type
definition is therefore required before emission.</t>
          </li>
        </ul>
        <section anchor="subject-digest-scope">
          <name>What a content digest does and does not establish</name>
          <t><tt>subject_digest</tt> is collision-resistant over content: two actions whose
serialisations differ in any byte produce different digests except with
negligible probability, so a receipt bound to one action does not bind
another. That property is what makes it usable as a join key
between capsules computed over the SAME serialised action.</t>
          <t>It does not, and cannot, establish that two INDEPENDENTLY DESCRIBED accounts of
one act correlate. The action types, their required and optional members and
the reference issuer that minted the instances measured below are those of
<xref target="I-D.schrock-canonical-action-identifier"/>; the measurement is not
reproducible without it. Where an action type declares optional members, two
conforming producers describing the same act may legitimately differ on whether
an optional member is present, and their subject digests then differ. Stability
under permitted variation and collision resistance over content are
contradictory requirements, and no single digest satisfies both.</t>
          <t>This is measured, not assumed. Five action objects,
each a conforming instance of one registered action type and each accepted by
that type's reference issuer, differing only in content the type declares
<bcp14>OPTIONAL</bcp14>, produced five distinct subject digests. The divergence appeared at
the first optional member and did not require any nested reference or unusual
value.</t>
          <t>Accordingly:</t>
          <ul spacing="normal">
            <li>
              <t>A profile <bcp14>MAY</bcp14> key capsules on <tt>subject_digest</tt> where those capsules are
computed over the same serialised action object. <xref target="composition"/> is such a
profile: the capsules it composes share one action serialisation.</t>
            </li>
            <li>
              <t>A profile that requires correlation across independently produced
descriptions of one act <bcp14>MUST NOT</bcp14> rely on <tt>subject_digest</tt> alone. It <bcp14>MUST</bcp14>
either pin the exact member set over which the digest is computed, so that
permitted variation cannot enter it, or designate a typed field that the
action type itself requires, and correlate on that. The second is the more
robust of the two, because it does not require every producer to agree on a
serialisation before they can agree that they are describing the same act.
The selection is the profile's and not the registry's.
<xref target="I-D.schrock-canonical-action-identifier"/> declares required and optional
fields per action type; it does not mark any field as a correlation key, and
a specification that says an action type "declares a material identifier"
attributes to that registry a semantic it does not carry. A profile
therefore <bcp14>MUST</bcp14> pin the action type and its version, the field it has
selected for correlation, and that field's normalisation and comparison
rules. The selected field <bcp14>MUST</bcp14> be present in the Canonical Claim, so that
the Claim Hash commits to it and the join cannot be made on a value the
reconciliation does not cover.  </t>
              <t>
Equality of the selected value identifies candidate descriptions only. It
<bcp14>MUST NOT</bcp14> establish action equivalence, authorisation or execution.
Exact-action agreement remains a separate comparison, under the
subject-digest construction of <xref target="composition"/> or under the profile of
<xref target="I-D.schrock-canonical-action-identifier"/>. Where the selected values match
and the exact-action digests differ, that is a conflict to surface and not a
failed join, and surfacing it is what reconciliation is for.</t>
            </li>
          </ul>
          <t>Three substitutions are forbidden, because each is available to an implementer
who has read only part of the foregoing and each fails silently.</t>
          <ul spacing="normal">
            <li>
              <t>The designated join key <bcp14>MUST NOT</bcp14> be treated as the action's identity. The
identity of an exact action is its content commitment; the join key is stable
across the variation that commitment is required to detect, which is what
makes it usable for correlation and useless for authorisation.</t>
            </li>
            <li>
              <t>A Claim Hash <bcp14>MUST NOT</bcp14> be treated as a cross-deployment identifier. It is a
digest over a canonical serialisation preceded by the Deployment Blinding
Value of <xref target="sealing"/>, so two deployments reconciling the same claim
compute different Claim Hashes by construction, and equality of Claim Hashes
across deployments is not a comparison that can be made at all.</t>
            </li>
            <li>
              <t>Equal join keys <bcp14>MUST NOT</bcp14> be taken to mean equal claims. Two reports sharing a
designated join key have been asserted to describe one act; whether they
agree about it is the question reconciliation exists to answer. Where their
Claim Hashes differ, the difference is the finding, and a profile that
collapsed them on the strength of the join key would report agreement it
never established.</t>
            </li>
          </ul>
          <t>Stated positively, each object has one job: the designated field joins candidate
reports across permitted variation, the Claim Hash commits to the exact claim
under the deployment's blinding value, and the action type's own content
commitment remains what authorisation and execution bind to.</t>
          <t>A specification that describes a content digest as a correlation key without
stating which of the two preceding cases it relies on invites an implementer to
assume a stability property the construction does not have. The resulting
failure is a correlation that silently does not occur.</t>
        </section>
      </section>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>RFC Editor: please remove this section before publication.</t>
      <section anchor="since-draft-hillier-scitt-arp-05">
        <name>Since draft-hillier-scitt-arp-05</name>
        <section anchor="mechanical">
          <name>Mechanical</name>
          <ul spacing="normal">
            <li>
              <t>The document is validated by both idnits and idnits3 with no error or warning
other than those that follow from the Standards Track status itself: the
downward references enumerated in the Note to the RFC Editor, and the
normative reference to <xref target="I-D.ietf-scitt-scrapi"/>.</t>
            </li>
            <li>
              <t>Requirement-level keywords are marked with the <tt>bcp14</tt> element, and the three
sentences in which the verb "notarise" followed a keyword are reworded so that
the keyword and the verb are not read as a single negated keyword.</t>
            </li>
            <li>
              <t>The obsolete Certificate Transparency reference RFC 6962 is no longer
cited. <xref target="RFC9162"/> is the reference, and <xref target="merkle-construction"/> states that
the tree it defines is the tree earlier logs compute.</t>
            </li>
            <li>
              <t>The Web Bot Auth references are updated to <xref target="I-D.ietf-webbotauth-httpsig-protocol"/>,
which defines the Signature-Agent header and the key directory it names. The
separate directory reference is removed.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="since-draft-hillier-scitt-arp-04">
        <name>Since draft-hillier-scitt-arp-04</name>
        <section anchor="the-verifiable-credentials-form-is-a-complete-profile">
          <name>The Verifiable Credentials form is a complete profile</name>
          <t><xref target="vc-interop"/> specifies the credential form of a Reconciliation Output in full:
its members, its securing as <tt>application/vc+cose</tt> under <xref target="W3C-VC-JOSE-COSE"/>,
the verification steps, and the mapping of the Reliance Horizon onto
<tt>validUntil</tt>. A worked example and a 30-vector conformance class accompany it.</t>
        </section>
        <section anchor="four-securing-forms-for-one-credential">
          <name>Four securing forms for one credential</name>
          <t>The credential is also specified in <tt>application/vc+jwt</tt>, in SD-JWT VC
(<tt>application/dc+sd-jwt</tt>) with selective disclosure of the subject members and
an optional key-binding JWT, and as an ISO/IEC 18013-5 mdoc <tt>IssuerSigned</tt>
structure. The issuer's JWK Set resolves the Sealing key for every form. All four carry the same
RFC 8785 payload under the same Sealing key, and a 30-row conformance class
checks them independently.</t>
        </section>
        <section anchor="sealing-key-discovery-is-exercised-end-to-end">
          <name>Sealing-key discovery is exercised end to end</name>
          <t>A reconciliation server publishes its signed COSE Key Set, a single key by
identifier, and a distinct operator key set. Each entry carries <tt>arp-key-status</tt>
and <tt>arp-key-validity</tt>, retirement is by status, and the issuer JWKS names the
same key under the same thumbprint <tt>kid</tt>. A 23-row conformance class decides
resolution, status and validity, and the refusal of each malformed set.</t>
        </section>
      </section>
      <section anchor="since-draft-hillier-scitt-arp-03">
        <name>Since draft-hillier-scitt-arp-03</name>
        <section anchor="the-chain-a-head-consistency-check-is-decided-over">
          <name>The chain a head-consistency check is decided over</name>
          <t>The second branch of <xref target="quorum-rule"/>, where a witness Statement covers a head
above the one a response names, now requires the chain between the two heads to
be obtained from that witness's own origin, as the Witness Linkage Segments of
<xref target="witness-linkage"/>, and forbids taking it from the responding service. -03 had
the relying party read that chain from the service and anchor its two ends: the
top to the Self-Entry Hash the witness signed, the bottom to the Self-Entry Hash
the response named.</t>
          <t>Anchoring the ends of a service-supplied chain is not sufficient, and the reason
is arithmetic rather than cryptographic. The condition anchors two Self-Entry
Hashes and then walks a chain over two other positions, the Prior-Entry Hash and
the Signing Input Digest. Neither anchored value sits in a position the chain
reads. No value the chain does read can be recomputed by a party holding linkage
arrays, a Signing Input Digest being taken over a <tt>Sig_structure</tt> and the array
carrying no preimage. And the lower anchor is the response's own claim, so it
constrains the responding service against itself. Every value the chain is made
of is supplied by the party the chain exists to check, and an equality between
two values one party supplies is not evidence about that party.</t>
          <t>This was established by executing the condition rather than by reading it. An
independent construction of the Ledger chain and of the readers this document
defines, written from the section text with nothing imported from any
implementation, was run over a four-entry Ledger under six cases: served
honestly; the digest moved whole; the digest moved with the witness observing
before the move; one Reconciliation Hash changed at entry 2 with the chain
re-linked and re-sealed and served plainly; the same rewrite with the
witness-signed Self-Entry Hash served at the top of the span and the service's
own values in every other position; and a response naming a head its own arrays
do not carry. The condition as -03 stated it accepts the fifth. Replacing each
of the nine hash positions of a three-array span in turn identifies three the
condition never constrains, one of them an interior Self-Entry Hash, which is a
value a relying party checking a receipt against a particular entry would
otherwise take as attested.</t>
          <t>Two narrower repairs were constructed and neither reaches. Adding the Signing
Input Digest of the covered entry to the Head Consistency Statement and checking
the top array against it is defeated by copying one further value the witness
already published, that position being one the chain does not read. Anchoring
both ends in positions the chain does read pins the chain values of a
three-array span, and only those: the interior Self-Entry Hash is constrained by
neither anchor nor chain even there. From four arrays up the chain values
between the ends are unconstrained as well. The span is the distance between a head
a witness happened to observe and a head a response happens to name, which the
relying party does not control, so a repair that holds only at three arrays
holds only by accident.</t>
          <t><xref target="witness-linkage"/> defines the artefact, its covering requirement, its
Attestation Floor, its addressing and its equivocation rule;
<xref target="head-consistency-channel"/> gathers the operational consequences;
<xref target="iana-media"/> and <xref target="iana-wellknown"/> register the media type and the well-known
URI; <xref target="privacy"/> records what unauthenticated publication of the arrays
discloses. <xref target="read-operations"/> gains the entitlement and the ranged read a
witness needs to produce a Segment at all, a Witness Entry key not being reached
by the roles the other reads name. <xref target="terminology"/> gains the artefact and
restates the Witness Set and Witness Quorum entries, which described Statements
alone as the evidence.</t>
          <t>The property is stated as what it is. A witness reads the Ledger from the
reconciliation server, so what a Segment records is what that witness was
served, under a signature it cannot revise and at a time it stamps. The
assurance is therefore append-only: a conforming witness publishes each interval
once and serves one Segment per entry, so an operator rewriting an interval a
witness has covered can only do so with a witness that equivocates. Detection of
that equivocation is opportunistic in the way <xref target="settlement-ledger"/> already says
detection of two entries at one Entry Sequence Number is, and
<xref target="witness-linkage"/> says so rather than leaving the impression that a single
verifier-side test catches it. An operator rewriting an interval no witness has yet
covered is bounded by witness diversity and observation frequency and not by
this mechanism, which is the residue <xref target="bra-limits"/> already concedes for declared
independence rather than a new one.</t>
          <t>The first branch of <xref target="quorum-rule"/> is unchanged: a Statement covering the named
head exactly carries no span and needs no Segment.</t>
        </section>
        <section anchor="one-deterministic-encoding-named-by-section">
          <name>One deterministic encoding, named by section</name>
          <t><xref target="cbor-cose"/> now states that Section 4.2.1 of <xref target="RFC8949"/> orders the pairs of a
map in the bytewise lexicographic order of the deterministic encodings of the
keys, that the Length-First Map Key Ordering of Section 4.2.3 is a different
ordering which widely used libraries produce under an option named canonical,
and that an implementation <bcp14>MUST</bcp14> produce the former, a library option named
canonical not being evidence that it does. The two agree for any map whose keys
are integers or strings and share a CBOR major type, at any mix of lengths: for
those types the head byte never decreases as the encoding lengthens, and where
two keys share a head byte the bytewise comparison runs on into the bytes after
it and orders them the same way. Those are the keys COSE admits. That is why
the difference travels, and why a protected header
carrying COSE labels 1 and 4 is unaffected. They diverge only where a map mixes
major types and the key of the higher major type has the strictly shorter
encoding: a label of -1 is the single byte <tt>0x20</tt> and a label of 256 is <tt>0x19</tt>
and two further bytes. No protected header this document specifies reaches that
case, and the requirement is stated so that none added later does, since
<xref target="cbor-cose"/> permits private-use labels pending registration and private-use
labels are negative. Where the case is reached, one protected header has two
encodings, one signing act has two Signing Input Digests, the entry above has
two Prior-Entry Hashes, and <xref target="settlement-ledger"/> treats that as a fork.</t>
          <t>This is the Collection order class of <xref target="representation-invariance"/> reaching a
place that section did not name. Its bullet covered the permutations of a set
and is extended here to the orderings of the pairs of a map, which is the one
member of the class where the freedom is exercised by a library default rather
than by an implementer's choice: an implementation that reads the requirement
correctly and reaches for the obvious option still departs from it. The eight
classes are unchanged in number.</t>
        </section>
        <section anchor="a-floor-on-the-response-freshness-tolerance">
          <name>A floor on the response freshness tolerance</name>
          <t>Item 26 of <xref target="bra-items"/> and <xref target="read-responses"/> now floor the declared tolerance
at sixty seconds as well as capping it. The bound runs backward from the
reader's receipt of the response and the response was produced before that
instant, so a tolerance below the transit and clock disagreement between the two
parties rejects every honest response, and a tolerance of zero rejects all of
them. That is an outage a deployment could declare itself into with no party
misbehaving and no conformance test firing, which places it with the Witness Set
constraint of <xref target="bra-witness"/> rather than with the parameters a deployment tunes.
Sixty seconds is the figure already fixed for the forward bound of this test and
of the two others that bound a party against another's clock over a message it
has just received, so the narrowest admissible interval is symmetric. Those
three differ in their backward bounds and agree in their forward ones. A fourth,
the witness observation window of <xref target="quorum-rule"/>, runs over an artefact
published on an interval rather than over a message, and this revision floors it
at sixty seconds in both directions while leaving the interval free to widen the
forward bound: unfloored, a deployment notarising every few seconds admitted a
window of a few seconds against an unsynchronised clock. <xref target="response-clocks"/>
states all four rather than leaving them to be collected. Where a
deployment's effective notarisation interval is shorter than
sixty seconds the floor governs, a ceiling below a floor being a term no
deployment can declare, and that deployment trades the supersession property for
liveness by exactly the difference between the two figures. The trade is stated
rather than left in the arithmetic, and a deployment wanting both notarises no
more often than sixty seconds.</t>
        </section>
        <section anchor="certificate-transparency-and-the-leaf-a-proof-carries">
          <name>Certificate Transparency, and the leaf a proof carries</name>
          <t><xref target="merkle-construction"/> now states its relationship to Certificate
Transparency, which -03 named only in its Acknowledgments while defining a
Merkle construction in its body. An implementer arriving from Certificate Transparency had
no way to tell from the text whether the two constructions agree. The finding is
Tom Sato's.</t>
          <t>The relationship was established by executing both constructions rather than by
comparing their prose. The odd-node rule of <xref target="merkle-construction"/> and the
recursive split at the largest power of two below the leaf count of <xref target="RFC9162"/>
Section 2.1.1 produce identical roots for every leaf count from 1 to 4200, and
identical sibling arrays for all 131,328 leaf-count-and-index pairs up to 512
leaves. They diverge at one input in that whole range: the empty tree, where
this document gives thirty-two zero octets and Certificate Transparency gives
the hash of the empty string. That divergence is kept, and the section now says
why -- the Certificate Transparency value is a digest a verifier reproduces
successfully and may then treat as a root that commits to something, and
thirty-two zero octets is a value no commitment in this document produces.</t>
          <t>The section also states what an implementation ported from a Certificate
Transparency log gets wrong if it is carried over unchanged: this document sorts
and deduplicates leaves where a log commits to submission order, and this
document's inclusion proof carries the leaf where the inclusion proof of
<xref target="RFC9162"/> Section 2.1.3 does not, carrying the index and the tree size as this
document does but assuming the verifier already holds the leaf. And it records
that the third convention in common use -- duplicating the last node at an odd
level -- agrees with this construction at <strong>every leaf count that is a power of
two</strong> and disagrees at every other, so a conformance vector taken at four or
eight leaves will not detect an implementation that ported it.</t>
          <t><xref target="leaf-binding"/> is new and is the security-relevant part. -03 defined the
inclusion proof as carrying the leaf and said nothing about where a verifier
should get the leaf it checks against. A proof whose carried leaf is lifted
unchanged from another object's valid proof folds to the correct root under a
sibling array that verifies, because it is a correct proof of the other object;
a verifier that walks the path first and trusts the carried leaf accepts it and
concludes that the object it holds was committed. Nothing in the walk depends on
the object, so no amount of path checking detects it. A verifier <bcp14>MUST</bcp14> now compute
the leaf from the object whose inclusion is being proved and use that value, and
no value taken from the proof, as the input to the walk. The requirement is
stated over the object rather than over the carried field because
<xref target="aggregation"/> permits COSE Receipts <xref target="RFC9942"/>, whose inclusion proof carries
no leaf, and a rule written only as a comparison against a carried leaf would be
vacuous under exactly the encoding a SCITT-aware verifier is most likely to use.
The finding is Nenad Vasic's, contributed as an executable vector against a
third-party corpus.</t>
          <t>Two errors in the -03 text of <xref target="merkle-construction"/> are corrected. The
sibling-derivation rule said the verifier halves "the index and the level width"
as it ascends; the level width halves by <strong>ceiling</strong>, not by truncation, and an
implementation following the sentence literally computes the wrong width at
every leaf count that is not a power of two -- which is the entire range the
paragraph exists to pin down. And <xref target="composition-scitt"/> described COSE Receipts as
"the same inclusion-proof format", which they are not: an RFC 9942 inclusion
proof carries no leaf and is defined over the RFC 9162 tree whose empty root
this document rejects. <xref target="aggregation"/> also loses a stray duplicated clause.</t>
        </section>
        <section anchor="every-digest-that-identifies-a-signed-artefact">
          <name>Every digest that identifies a signed artefact</name>
          <t><xref target="signature-malleability"/> is new, and five constructions changed with it. -03
took the Prior-Entry Hash of <xref target="settlement-ledger"/> over the whole preceding
entry including its Entry Signature, the Post-Seal Evaluation Record Hash of
<xref target="post-seal"/> over its record "in its entirety, signature included", the Merkle
leaf of <xref target="aggregation"/> over a canonical hash of a register-signed Partial
Attestation, and the tagged-transparency authority-reference digest of
<xref target="composition"/> over a COSE_Sign1 receipt. Those four are now Signing Input
Digests. The Reconciliation Hash of <xref target="terminology"/> is the fifth and took a
different repair, below.</t>
          <t>The reason is a measurement. For ECDSA, <tt>(r, s)</tt> and <tt>(r, n - s)</tt> both verify
against the same key over the same message, and no specification prohibits it:
Section 4.1.4 of SEC1 v2.0 and Section 6.4.2 of FIPS 186-5 range-check <tt>r</tt> and
<tt>s</tt> only, and Section 2.1 of <xref target="RFC9053"/> constrains neither. Nothing is forged
and no authority is bypassed -- a party holding no key produces the second
encoding from the first, in transit. Over two hundred random P-256 keys, two
hundred substitutions verified and two hundred changed the entry bytes. The
finding is Anton Sokolov's.</t>
          <t><strong>The Reconciliation Hash is where the repair nearly failed.</strong> -03 defined it as
excluding the Sealing Signature, and an earlier draft of this section asserted
on that basis that it was already outside the signature and unchanged. It was
not. <xref target="reconciliation-output"/> embeds a register signature in each Query Binding
Record and in each Non-Answer Statement, so the preimage still carried a
signature after the sealing one was removed -- measured, stable in none of two
hundred trials. The Reconciliation Hash is a field of every Settlement-Layer
Ledger entry, hence inside the Entry Signature payload, hence inside the
Prior-Entry Hash: leaving it would have reintroduced at one remove exactly what
fixing the Prior-Entry Hash removed. It now replaces each embedded register
signature with that signature's Signing Input Digest.</t>
          <t>That is the second instance in two days of this document carrying the sound rule
and the unsound one at once. The first was in a single bulleted list, where the
Self-Entry Hash nulled the signature position and the Prior-Entry Hash two
paragraphs below it did not. The instruction to sweep every identity rule in a
document rather than correct the one that was reported is Henri Sirkkavaara's,
from finding the same split in his own implementation on the same day, and the
Reconciliation Hash is what the second sweep found.</t>
          <t><strong>Two things earlier revisions detected are no longer detectable</strong>, and
<xref target="settlement-ledger"/> now says so rather than leaving it to be discovered.
Stripping a historical Entry Signature while leaving its protected header and
payload intact moves no Prior-Entry Hash, and neither does re-signing an entry
under the same key and header. A re-signature under a <em>different</em> key or
algorithm still moves the chain, because the <tt>Sig_structure</tt> covers the
protected header. The "signed exactly once" rule consequently has no
verifier-side test and is stated as an operator obligation an Audit Identity can
examine.</t>
          <t><xref target="cbor-cose"/> now requires every COSE_Sign1 this document defines to carry the
algorithm and key identifiers in its protected header and not in an unprotected
one. Nothing previously required it, while both <xref target="terminology"/>'s definition and
<xref target="crypto-upgrade"/>'s rotation argument assumed it -- and RFC 9052 permits <tt>alg</tt>
in the unprotected bucket, which a <tt>Sig_structure</tt> does not cover.
<xref target="terminology"/> also fixes the external additional authenticated data at the
zero-length byte string, because a Signing Input Digest a third party cannot
reproduce is not an identifier.</t>
          <t><xref target="crypto-upgrade"/> is rewritten where it rested on this. Its conclusion survives
and both its reason and its stated cost change. The chain holds because the
Prior-Entry Hash is over the signing input; and a verifier recomputing one takes
the protected header and payload byte strings verbatim and <bcp14>MUST NOT</bcp14> re-encode
them, which is <em>more</em> than -03 asked rather than less. -03 required copying
bytes and hashing them; -04 requires parsing a COSE_Sign1. That is the price of
a digest that does not move when the signature encoding does, and an earlier
draft of this section had the comparison backwards.</t>
          <t>The consequence of the old constructions was a failure of verification rather
than of authenticity, which is the harder kind to diagnose. A reader served a
substituted entry concludes the chain is broken when the operator equivocated
about nothing; under <xref target="leaf-binding"/> it refuses a valid inclusion proof. A
deployment reporting either as detected tampering reports something that did not
happen.</t>
          <t><xref target="RFC8032"/> is added as an informative reference for Section 8.4 alone: EdDSA
puts the low-S check inside verification, so an attacker cannot derive a second
verifying byte-string, and a deployment declaring only EdDSA primitives under
item 2 of <xref target="bra-items"/> is not reachable by this. That is non-malleability and
not a claim that one byte-string alone can ever verify, since Section 5.1.7 of
<xref target="RFC8032"/> leaves cofactored verification optional. Nothing in this document
requires EdDSA, which is why the constructions and not the primitive choice are
where this is addressed.</t>
        </section>
        <section anchor="the-bilateral-register-agreement">
          <name>The Bilateral Register Agreement</name>
          <t><xref target="bra"/> is new. The Bilateral Register Agreement is what makes a register
addressable, and -03 defined it in a definition-list entry in
<xref target="terminology"/>: one paragraph enumerating twenty-six declared items and the
Agreement Hash construction over them. That is normative content with <bcp14>MUST</bcp14>-level
force, sited where a reader looks for a definition and not for a requirement,
and unreadable at the length it had reached. It is now a section, the
enumeration is numbered, and the numbering is what fixes the Agreement Hash
order.</t>
          <t>Gathering it surfaced two obligations this document places on an Agreement
elsewhere and never enumerated here, so that neither was covered by the
Agreement Hash. <xref target="read-responses"/> obliges a deployment to declare a response
freshness tolerance; that is now item 26. <xref target="read-signing"/> obliges an Agreement
to declare the keys under which a regulator reads, and the
regulator-identity-provider trust anchor of item 5 is not a key; that is now
item 30. In both cases two deployments could agree on every item the Agreement
Hash committed to, differ on the term, and compute the same Agreement Hash --
an Agreement Hash that does not cover a term the Agreement is required to carry,
which is the class of defect this document exists to prevent. Item 31 makes the
re-invocation permission <xref target="retroactive"/> already conditions on a declared term
for the same reason.</t>
          <t><xref target="bra-hash"/> now fixes the CBOR type of every item and requires every set-valued
item to be sorted in bytewise lexicographic order of the deterministic CBOR
encoding of each element. Determinism under Section 4.2.1 of <xref target="RFC8949"/> fixes
how a given value is encoded and does not fix which type an item takes or how a
set is ordered, so -03's construction was not one two parties could
independently compute even with the item order settled. It also states that the
array has exactly thirty-three elements and that an absent, inapplicable or empty
item is encoded as CBOR null with the element still present, naming the four
items that may be absent -- -03 said only that an absent <em>optional</em> item was
null, while more than the one <bcp14>OPTIONAL</bcp14> item admits absence. Since <xref target="agreement-drift"/> suspends reconciliation on a deviating
Agreement Hash, each of these was an outage rather than a warning.</t>
        </section>
        <section anchor="the-witness-quorum">
          <name>The witness quorum</name>
          <t><xref target="bra-witness"/> specifies the witness quorum. -03 stated, in
<xref target="read-responses"/>, that a relying party acting on an empty result <bcp14>SHOULD</bcp14> hold
head-consistency evidence from at least one observer independent of the
responding service, and said in terms that it specified no quorum. The condition
was therefore normative while the thing that satisfies it was not. The finding
that this is bounded by observer diversity rather than by any stronger single-log
property is Walter Hawkins's, carried from -03.</t>
          <t>What satisfies the condition in its multi-entry form is stated in the entry
above rather than here: this entry records the quorum, and the chain a quorum is
evaluated over comes from the witness under <xref target="witness-linkage"/>.</t>
          <t>An Agreement now declares a Witness Set and a Witness Quorum, both of which
enter the Agreement Hash. <xref target="witness-entries"/> gives a Witness Entry a form and
an Operating-Party Identifier with a stated normalisation, so that "distinct"
is a test a verifier computes rather than one it decides. The exclusion runs in
every direction -- a witness may not be operated by the responding service, by a
party controlling it, by a party it controls, or by a party under common control
-- because an exclusion running upward alone excludes nothing that matters: a
server that incorporates three subsidiaries satisfies a quorum of three while
controlling every observation in it.</t>
          <t><xref target="head-consistency"/> gives the Statement a payload, a media type and a
registered protected-header parameter, and carries a Witness Observation Time,
because a COSE_Sign1 is not dateable from its own bytes and a freshness rule
over an undateable artefact is a rule no verifier can apply.</t>
          <t><xref target="quorum-rule"/> requires that a Statement covering a <strong>higher</strong> head be
accompanied by the chain linking that head back to the one the response names,
verified by Prior-Entry Hash. A witness signature over a higher head is
otherwise evidence about whichever branch that witness was served, and a fork at
disjoint sequence numbers is precisely a pair of heads neither of which
contradicts the other; only the linkage puts the two observations on one chain.
Where that chain is obtained is settled by the entry above, which replaced a
chain read from the responding service with the Witness Linkage Segments of
<xref target="witness-linkage"/>: the requirement to link stands, the source of the links
does not.</t>
          <t>It also measures the freshness window from the Statement Timestamp of the Ledger
Head Statement rather than from the head's own Entry Timestamp, and sets it at
two notarisation intervals, because <xref target="settlement-ledger"/> republishes once per
interval and a one-interval window measured from an entry's own timestamp closes
before any witness can see that entry. That window is floored at sixty seconds
in both directions, for the reason the entry on the response freshness tolerance
gives: a window narrower than the disagreement between two unsynchronised clocks
fails an honest party permanently.</t>
          <t><xref target="witness-discovery"/> puts the effective Witness Set and Quorum in the Policy
Parameters Document of <xref target="read-signing"/>. A relying party is party to no
Agreement and holds only Agreement Hashes, so a quorum declared solely inside an
Agreement is a test the party obliged to run it cannot read.</t>
          <t><xref target="bra-limits"/> states what none of this establishes. Operating-Party Identifiers
are declared and not proven; the exclusion is normative and the detection of a
false declaration is not provided for. A met quorum is proof that observer
diversity was declared, by a named party, in a term that party can be held to.</t>
        </section>
        <section anchor="the-head-linkage-projection">
          <name>The head-linkage projection</name>
          <t><xref target="read-operations"/> gains a <tt>fields=linkage</tt> projection returning the Entry
Sequence Number, Prior-Entry Hash, Self-Entry Hash and the Signing Input Digest
of the Entry Signature of one entry, entitled to
any requester whose signature verifies. The projection was specified so that a
relying party could link two heads itself; the entry above supersedes that use,
and the projection's reader is now the witness, which needs the same four values
to publish the Segments of <xref target="witness-linkage"/> and reads them for a range. The
fourth element was added after the projection was specified with three: the
chain condition of <xref target="quorum-rule"/> compares a
Prior-Entry Hash against the Signing Input Digest of the entry below, that
digest is taken over a <tt>Sig_structure</tt>, and neither the protected header nor the
payload of the entry below is recoverable from a triple of one sequence number
and two hashes. The condition was uncomputable by the party then required to
compute it, and the substitution a reader might have reached for instead is the
one the same section forbids. The fourth element is what a witness now commits
to, so the repair holds under the entry above rather than being superseded by
it. The projection is bounded at the head of the most recently
published Ledger Head Statement. Unbounded it would be a live head oracle --
the Ledger is contiguous, so a requester could binary-search the current head
between publications and poll it for the write rate, which is the disclosure
<xref target="settlement-ledger"/> publishes the head only once per notarisation interval to
prevent. <xref target="read-errors"/> states why a projection answering <tt>200</tt> where the full
read answers <tt>404</tt> is not an existence oracle, and what would make it one.</t>
          <t>No timing claim is added by this revision and none is tested. <xref target="read-errors"/>
continues to state that response timing is a separate claim which an
implementation must either make with its measurement conditions published or not
make at all, and that making none is not non-conformance.</t>
        </section>
        <section anchor="six-adversarial-passes-and-what-they-found">
          <name>Six adversarial passes, and what they found</name>
          <t>The changes above were made in response to review. The changes below were made
in response to a sweep run against this document with the specific intent of
breaking it, from six directions at once, before anyone else did. They are
grouped by what they say about the document rather than by section, because the
grouping is the finding.</t>
          <t><strong>Three sentences claiming rigour were the least rigorous sentences in the
document.</strong></t>
          <t><xref target="sweep-statements"/> said the falsifiability argument holds for three triggers
in four, "stated rather than rounded up". It held for one. Two of the three
rested on a transition array published by the reconciliation server, under its
own key, in a Policy Parameters Document with no publication time, no
notarisation and no chain, so a transition omitted from the array started no
clock and no party could date the Document well enough to show that it had been.
<xref target="read-signing"/> now gives that Document a Publication Timestamp, requires it to
be notarised on the ledger-head interval, and requires republication on that
interval whether or not its contents changed. The claim is now three in four and
is stated as conditional on that anchoring.</t>
          <t><xref target="signature-malleability"/> said "every digest in this document that identifies
or chains a signed artefact" and enumerated five. There were seven. The Override
Record of <xref target="adversarial-test"/> carries a COSE_Sign1 by the authorising operator
inside the Reconciliation Hash preimage, and the Evidentiary Provenance Manifest
of <xref target="ingestion"/> could carry one inside the Claim Hash preimage. The rule is now
stated over the class -- in any preimage this document defines, every signature
made by a party other than the one computing the digest is replaced by its
Signing Input Digest -- because an enumeration of carriers is correct only until
someone adds a field. The Manifest could not be repaired that way, its preimage
being <xref target="RFC8785"/> JSON with no byte-string type and its octets being the
requester's, so signed artefacts are now prohibited inside it and carried beside
it by digest.</t>
          <t><xref target="bra-witness"/> said two instances of one observer are not two observers and
tested distinctness on the Operating-Party Identifier alone. Two entries
declaring one key under two identifiers satisfied a quorum of two with a single
signature. <xref target="quorum-rule"/> now requires pairwise distinct Verification Method
References, which is a mechanical test, and states why that is different from
the declared-independence limit <xref target="bra-limits"/> concedes and cannot close.</t>
          <t><strong>Two paths reached a decisive verdict out of nothing.</strong> An empty
Addressed-Registers Identifier Set yielded <tt>match</tt> under conjunction: every
operator in <xref target="verdict-arithmetic"/> is a condition universally quantified over
the contributions, and both precedence rules began "where any", so at zero
contributions every guard was vacuously satisfied. A source class containing no
addressed register yielded a decisive <tt>no-match</tt>, which conjunction propagated.
Neither required an operator to misbehave. Both are now closed by explicit rules.</t>
          <t><strong>Nothing bound the subject.</strong> The transformation from the Canonical Claim's
Subject Identifier to the Subject Reference each register was asked about was
unrecorded, unconstrained and invisible to every party outside the
reconciliation server. Every signature could verify, every binding recompute,
the chain hold and the notarisation pass, while every register answered honestly
about a different person. <xref target="subject-mapping"/> adds a Subject Mapping Record
carrying the Subject Reference and a registered descriptor naming a
transformation that must be a function of the Subject Identifier and declared
terms alone.</t>
          <t><strong>Evidence about a party was obtainable only from that party.</strong> Head Consistency
Statements had an artefact, a quorum rule, a linkage chain and a freshness
window, and no channel. The obvious implementation has the responding service
supply them, which satisfies every stated condition and defeats the mechanism
entirely under exactly the fork it exists to detect. Witnesses now publish on
their own origins and a relying party <bcp14>MUST NOT</bcp14> accept one from the responding
service.</t>
          <t><strong>Vocabulary that did not reach the output.</strong> A verifier told to refuse a proof
had no way to record which of four refusals it made; <xref target="verification-outcomes"/>
adds them, and requires <tt>same-act-distinct-encodings</tt> to be tested before any
outcome that accuses a party of equivocation. One Non-Answer Reason carried five
distinct causes because four other sections directed implementations to it for
conditions its own definition never named; it is now five reasons.</t>
          <t><strong>Claims a mechanism could not support.</strong> The Reconstruction Proof of
<xref target="audit-path"/> had no pinned preimage, no wire representation, and compares one
value the audited server produced against another value the same server
produced under a key only it holds. The preimage and the wire form are now
fixed, and the stated limit is corrected: equality establishes self-consistency
across two reads and nothing else. The Examined-Set Root's counts were said not
to be bare assertions, which <xref target="merkle-construction"/> already contradicted; they
are assertions, made attributable and dated by the signature and the
notarisation and not made verifiable. The Regulator Portal audit trail was
called subpoena-grade with no sequence, chain, head or notarisation behind it,
and is now given all four.</t>
          <t><strong>Things two implementers would encode differently.</strong> A CBOR type table for the
Reconciliation Output; deterministic encoding stated for the Self-Entry Hash
preimage; <tt>authority origin</tt> defined as an Authority Origin against <xref target="RFC6454"/>;
element types for the Query Binding preimage; a form for the Audience Member
Identifier; one canonical form for a key identifier and its two conversions; an
ordering rule, a form discriminator and an equality rule for the Source-Data
Version Identifier Set; an equality relation for the Witness Set intersection; a
member form for the fifth Divergence Axis; a subject key for the query budget; a
reference instant and direction for the freshness window; and the edges of the
Predicate Taxonomy the projection function walks.</t>
          <t><strong>Things no implementer could satisfy.</strong> The reproducibility requirement of
<xref target="architecture"/> was stated as identity in every field save an enumerated
carve-out, and three fields that are necessarily fresh were not in it. The
<tt>fields=linkage</tt> projection returned three values where the chain condition it
exists to serve needs four. The response freshness tolerance every reader must
apply was readable only by the parties who do not have to apply it. Suspension
under <xref target="agreement-drift"/> had no defined exit.</t>
          <t><strong>Privacy.</strong> <xref target="privacy-6973"/> takes the threats of <xref target="RFC6973"/> in turn and
states the residual rather than the mitigation where there is one, including
exclusion, which this protocol does not mitigate. <xref target="privacy-erasure"/> states the
one property that makes erasure implementable against an append-only record --
no personal data enters the Ledger, and no chain depends on the continued
existence of content that could be erased -- and prohibits notarising an Output
where that disclosure has not been accounted for.</t>
          <t><strong>What was looked for and not found.</strong> Several candidates did not survive
verification and no change was made for them: the Claim Hash's unverifiability
outside the deployment is already stated in two places; <tt>notarisation-incomplete</tt>
already distinguishes pending, refused and never-attempted; the register key
discovery root already has an encoding, a media type and a trust anchor; and the
containment requirement of <xref target="containment"/> is satisfiable, though its named
enforcement measure could not reach six fields the reconciliation server is
obliged to read, which is now stated.</t>
        </section>
        <section anchor="five-mechanisms-taken-from-outside-this-field">
          <name>Five mechanisms taken from outside this field</name>
          <t>The repairs above answer review. These five answer questions the document
could not previously answer at all, and each is a technique this field
has not used and another has.</t>
          <t><strong><xref target="representation-invariance"/> -- every encoding defect is one defect.</strong> A
signature with two byte forms, a CBOR item whose type is unfixed, a set with no
order, an optional member omitted or nulled, a URI normalised or not, NFC or
NFD, base64 or hex, transmitted bytes or a re-encoding. In each the information
is the same and the representation differs, and the digest was defined over the
representation. Physics has a name for a quantity that must not depend on a
choice carrying no information, and the discipline that goes with it is to
identify the freedom and quotient it out rather than to patch each place it
shows. The section names the eight representation classes this document
recognises, requires every new digest to state which class each preimage element
belongs to, and requires a conformance runner to exercise the <strong>class</strong> rather
than an enumeration of previously observed defects. A runner testing the two
ECDSA encodings it has heard of confirms what its author knew; a runner
enumerating the class finds the member nobody thought of.</t>
          <t><strong><xref target="coverage-probes"/> -- an estimator where there is no proof.</strong> The sweep
identity below closes the gap between the counts and the Ledger. Nothing closes
the gap between the Ledger and the world, because an operator that never wrote
an entry has nothing to be caught balancing, and that is the omission problem in
its general form. It has no proof and it has an estimator. An Audit Identity
publishes a commitment to a set of Claim Hashes it intends to commission, then
commissions them as ordinary reconciliations the server cannot distinguish, then
requests the inclusion proofs <xref target="sweep-statements"/> already obliges the server to
return. The recovery fraction estimates the proportion of eligible Outputs the
sweep actually examined, and the shortfall estimates the population that was
never written down. Astronomy injects sources of known brightness into an image
to measure what its pipeline missed; ecology releases marked individuals to
bound a population it cannot count. Both are estimating the same thing: what an
instrument failed to record, from a known signal passed through the same
instrument. A retroactive sweep is an instrument of that kind. The commitment
precedes the probes so that the denominator is fixed before the numerator is
knowable, which is what makes the fraction evidence rather than a selection.</t>
          <t><strong>The sweep identity in <xref target="sweep-statements"/> -- accounting rather than
signature.</strong> The examined count and the materially-changed count were assertions
of the signing server. They are now required to balance against the Ledger: the
Examined-Range Set must be contiguous over the interval it claims, the examined
count must equal the number of <tt>reconciliation</tt> entries in it, and the
materially-changed count must equal the number of <tt>continuation-supersession</tt>
entries appended over the same interval. A signature makes an assertion
attributable; an identity makes it checkable against something the asserting
party does not solely control, which is what double-entry bookkeeping has done
for six centuries and what a conservation law does in physics.</t>
          <t><strong>The Examined-Range Set -- coverage needs a dense space.</strong> A Merkle root over
Claim Hashes proves membership and cannot prove coverage, because Claim Hashes
are sparse in the digest space and a set commitment has no notion of what is
missing from it. Entry Sequence Numbers are dense and contiguous, so a gap in
them is visible. Committing to the same sweep in both spaces lets one artefact
answer both questions, and the choice of space is the whole of the trick.</t>
          <t><strong><xref target="tradeoffs"/> -- locating the loss.</strong> Several properties this document wants
cannot hold together, and a specification facing that can claim both and be
wrong somewhere a reader must find, weaken both and deliver neither, or choose
and say where the loss went. The section is the third, in one table. What makes
it useful is that the loss is located rather than distributed: a reader who
knows which property was surrendered and where can compensate, and a reader told
that everything holds cannot. Two rows that stood in earlier revisions have
already been retired by the mechanisms above, which is the other thing the table
turns out to be -- a list of what to attack next.</t>
        </section>
        <section anchor="the-two-clocks-a-response-freshness-check-is-decided-across">
          <name>The two clocks a response freshness check is decided across</name>
          <t><xref target="read-responses"/> now bounds the two clocks a response freshness check is
decided across. -03 required only that <tt>response-time</tt> fall within a declared
tolerance, naming no reference instant, no direction and no forward bound, so a
<tt>response-time</tt> stamped ahead of the reader's clock was inside the tolerance on
one reading and outside it on another, and a server whose clock ran fast was
indistinguishable from one stamping ahead deliberately. The reference instant is
now the reader's receipt of the response, the direction is backward, and the
forward bound is sixty seconds. That figure is not new to this document: it is
what <xref target="replay-defence"/> already allowed on the Freshness Timestamp and what
<xref target="read-signing"/> already allowed on <tt>created</tt>, both of which protect the server
against the reader's clock. The reader was the one party to the exchange the same
bound had not been applied to. Item 26 of <xref target="bra-items"/> now states that the
declared tolerance is the backward bound only and that the forward bound is not
negotiable per Agreement. The question is Emek Can Dogru's.</t>
          <t>The repair invents no mechanism. It applies, in the return direction, a bound
this document had already chosen twice in the other one.</t>
        </section>
        <section anchor="mechanical-1">
          <name>Mechanical</name>
          <t>Anchors were added to sections that had none -- <xref target="crypto-upgrade"/>,
<xref target="cbor-cose"/>, <xref target="agreement-drift"/> and <xref target="post-quantum"/> -- so that <xref target="bra"/> can
cite them. No heading text changed. Item 2 of <xref target="bra-items"/> cites
<xref target="post-quantum"/> for the post-quantum primitives a deployment has selected. <xref target="RFC9162"/> is added as an
informative reference: it is the current Certificate Transparency specification. It is not normative, because
the construction is fully specified here, so no downref is introduced.</t>
          <t>Four counts are corrected. <xref target="bra-items"/> described two of five items as already
relied on elsewhere in this document where three of seven are, and said the
Agreement Hash covers five items it did not cover before where it covers seven,
items 32 and 33 having been added after that sentence was written. The
mechanisms taken from outside this field are five, under a heading that says so
and an opening sentence that said four. <xref target="iana-media"/> requested twelve media
types while listing thirteen, and now requests fourteen. Separately and not as a
correction, <xref target="iana-wellknown"/> requests eight well-known URIs where it requested
seven, the eighth being the one a Witness Linkage Segment is served at.</t>
        </section>
      </section>
      <section anchor="since-draft-hillier-scitt-arp-02">
        <name>Since draft-hillier-scitt-arp-02</name>
        <t>This revision answers a review of -02 on the SCITT list. Of its five asks, three
are adopted as put, one is adopted in its goal and not in its mechanism, and one
is declined for now with a reason.</t>
        <t><xref target="read-responses"/> now names the evidence that bounds the empty-result
falsifiability condition. -02, and this revision as circulated for comment,
said that an empty result is falsifiable to the extent that the reader
"independently holds head-consistency evidence" for the served chain, without
saying independent of whom. Head evidence obtained from the responding service
bounds nothing, because a fork at disjoint sequence numbers is invisible from a
single vantage by construction and the vantage is what is in question. The
condition now names an observer independent of the responding service and
carries a <tt>SHOULD</tt> on the relying party, with witness countersignature over the
head preferred to an independently anchored head digest. The gap is not closed
and is not claimed to be; it is bounded by evidence an implementation can be
said to hold or not hold. The finding is Walter Hawkins's.</t>
        <t><xref target="scrapi-binding"/> is new and normative. -02 composed with the SCITT Reference
APIs permissively -- Reconciliation Outputs <bcp14>MAY</bcp14> be notarised, registration <bcp14>MAY</bcp14>
use the APIs -- which is a permission and not a binding: two implementations
could both conform to -02 and fail to interoperate against the same Transparency
Service. The section now fixes the registration endpoint, the COSE_Sign1 framing
and content type, receipt validation, and the asynchronous registration path.
The asynchronous case is stated as a requirement because it is the most likely
divergence between conforming implementations: a 202 Accepted with polling
against 204 No Content is not the same code path as a 201 Created, and an
implementer who codes only the latter interoperates with some Transparency
Services and not others.</t>
        <t>The review also asked for a standard retrieval path keyed on the Policy-Version
Hash. That is not specified here, because <xref target="I-D.ietf-scitt-scrapi"/> defines
retrieval by EntryID and defines no query surface at all; a binding that
specified one would specify an endpoint that does not exist. The goal --
preventing policy equivocation over time -- is met instead by requiring the
Policy-Version Hash in the protected header of the Signed Statement, so that it
is covered by the Receipt. A relying party therefore establishes the policy
version by verification rather than by lookup, which is the stronger property:
an index can be wrong, or can present different results to different relying
parties, and a signed protected header cannot.</t>
        <t><xref target="format-profiles"/> is new. -02 specified the controlled projection function
over an abstract Predicate Taxonomy without saying how an implementer determines
what a given register can answer. Four profiles are defined -- <xref target="BODS"/>,
<xref target="RFC6350"/> with <xref target="W3C-ORG"/>, <xref target="UNCEFACT"/> with <xref target="WCO-DM"/>, and consolidated
sanctions list formats. Profiles constrain predicate expression only and are
prohibited from introducing any means of transporting register records, which
would defeat the property the protocol exists to provide.</t>
        <t><xref target="source-versioning"/> is new, and is the substantive addition rather than the
largest one. A designation verdict against a consolidated sanctions list is
meaningful only relative to the state of that list, and consolidated lists are
republished on a cadence and distributed as deltas. -02 could therefore record
that a historical Combined Verdict had changed but could not attribute the
change: a verdict that flipped because the policy changed and one that flipped
because the list changed were indistinguishable, and Sovereign Re-Notification
reported both as policy changes. Partial Attestations now carry a Source-Data
Version Identifier under signature, Retroactive Evaluation must distinguish the
two causes, and where it cannot it must report attribution-indeterminate rather
than attribute the change to policy. A list-state identifier is a property of a
published corpus and not a register record, so this does not weaken minimum
disclosure.</t>
        <t>Three structural gaps predating this revision are closed, because the new
material could not be made testable without them. <xref target="reconciliation-output"/>
enumerates the Reconciliation Output, which no earlier revision did although
both the Partial Attestation and the Ledger entry were enumerated; Reconciliation
Hash and Combined Verdict are now defined in <xref target="terminology"/>, the former having
been used inside the bit-for-bit determinism requirement while undefined; and
the Server-Recorded Divergence-Axis Set is a set, since a reconciliation may be
qualified on more than one axis and a single-valued encoding would force a
silent choice.</t>
        <t><xref target="verdict-retyping"/> is new. Where a narrowing means a register's answer does
not bear on the claim as asked, that register's contribution is re-typed before
aggregation rather than the Combined Verdict being overridden after it, so the
Verdict Arithmetic resolved under <xref target="verdict-arithmetic"/> is never displaced. A
match found at any depth still establishes an existential closure predicate and
is not re-typed.</t>
        <t><xref target="post-seal"/> is new. Notarisation outcomes and retroactive attribution failures
arise after a Reconciliation Output is sealed and so can be carried neither in a
Partial Attestation nor in the Output; they are Post-Seal Evaluation Qualifiers
recorded in a separate signed record referencing the Reconciliation Hash, and
are expressly not Divergence Axes.</t>
        <t>New Divergence Axis values: register-threshold-divergence,
declared-not-determined and source-version-skew. New COSE header parameter
arp-source-data-version, carrying a set so that a register consulting several
lists can denote the state of each. arp-bilateral-agreement-hash now always
carries a sorted array, of one member on a Partial Attestation and one per
addressed register on a Sealing Signature, so that a decoder never has to infer
the type from context. New IANA registries for Register Data-Format Profile
identifiers and for Post-Seal Evaluation Qualifiers. -03 adds registries for
Ledger Entry Types, Override Grounds, Retroactive Evaluation Triggers and
Aggregation-Method Descriptors.
<xref target="I-D.ietf-scitt-scrapi"/> moves from informative to normative, because
<xref target="scrapi-binding"/> imposes requirements that cannot be met without it.</t>
        <t>A role-by-role walkthrough of the whole pipeline -- requester, agent,
reconciliation server, register operator, relying party, Transparency Service,
regulator, retroactive subsystem and IANA expert -- was run against this
revision and found a further class of defect that no earlier review had reached:
requirements addressed to an actor that does not hold the inputs they name.
Those are closed here, and most of them predate -02.</t>
        <t><xref target="projection"/> now enumerates the Per-Register Claim Projection. It is the only
structure a sovereign register receives and it was the sole major structure in
the protocol without a field list, which made the register role unimplementable.
The register echoes the Policy-Version Hash rather than computing it, and the
server <bcp14>MUST</bcp14> now send one Policy-Version Hash to every addressed register and
verify each echo -- without which the per-register signatures over it, the only
independent corroboration the protocol has, were discarded at aggregation.</t>
        <t><xref target="sealing-key-discovery"/> is new. -02 and the earlier -03 text told a relying
party to verify a Sealing Signature whose key it had no way to obtain: it holds
hashes of bilateral agreements it is not party to. Sealing keys are now
published at a well-known location on a declared authority origin, mirroring how
<xref target="I-D.ietf-scitt-scrapi"/> treats Transparency Service keys.</t>
        <t><xref target="verdict-arithmetic"/> is new. Every operator is now given its result for every
combination of contribution values, and whether it admits partial-match, on
which <xref target="verdict-retyping"/> turns. -02 delegated combination to an operator it
named but never defined, so two conforming implementations could produce
different Combined Verdicts from identical inputs while the determinism
requirement demanded they not.</t>
        <t><xref target="no-answer"/> is new. A register may fail to answer in eleven distinct ways and no
earlier revision defined an outcome for any of them; dropping the register
silently produces exactly the addressed-register-cherry-picking the adversarial
test exists to detect. A reconciliation with any non-answering register can no
longer reach a decisive Combined Verdict.</t>
        <t>The Reconciliation Output gains the Claim Hash, a timestamp, the Verdict
Arithmetic, the Sealing-Key Identifier, per-register attested and effective
verdicts with the re-typing ground, per-register echoed Policy-Version Hashes,
and register attribution on the server-recorded divergence axes. Without the
Claim Hash a relying party received a verdict with nothing to attribute it to,
and the retroactive subsystem had no key to select on although the Claim Hash
was already declared its key. The Settlement-Layer Ledger gains the Claim Hash
and now exposes READ as well as APPEND -- the Regulator Portal, retroactive
evaluation and the chain-invariant check all require reads that "only APPEND"
forbade. Ledger entries are now signed, because prior-entry hashes prove that
nothing was removed from a chain and not that only one chain exists.</t>
        <t>The Ledger now carries two kinds of entry under an Entry Type discriminator, and
each type's fields are enumerated. Facts arising after an Output is sealed --
the outcome of notarisation, a Post-Seal Evaluation Record, a supersession --
are recorded as Continuation entries appended against the Reconciliation Hash
they concern. An earlier revision of this text described Continuation entries
without giving them a form: they carried fields the entry list did not admit,
supplied none of the fields it made mandatory, and nothing distinguished one
kind from another. <xref target="post-seal"/> correspondingly no longer requires a Post-Seal
Evaluation Record Hash to be appended to an already-signed entry, which the
Ledger's absent UPDATE made impossible. Supersession is now recorded from both
ends, the superseding entry naming what it replaced and a Continuation entry
naming what replaced it, because neither pointer is reachable from the other's
starting point. A retriever of a Post-Seal Evaluation Record must now check the
retrieved bytes against the hash carried beside them, and that hash's
construction is defined. A supersession entry carries the superseding entry's
sequence number rather than a retrieval URI: obliging every reader to dereference
an operator-chosen URI before it could check anything would have been a forced
fetch, a de-blinding oracle and a covert channel no constraint on the URI's
content could close.</t>
        <t>The Self-Entry Hash is defined, and is taken after the type-specific fields so
that it covers them. The Prior-Entry Hash is now taken over the whole preceding
entry including its Entry Signature. Chaining Self-Entry Hash to Self-Entry Hash
would have left every signature outside the structure that detects tampering,
which is a poor place for the field this document relies on to make a second
chain attributable. Entry encoding and field order are stated, because the
Self-Entry Hash is taken over them and a CBOR map would have been re-sorted by
key.</t>
        <section anchor="five-things-the-protocol-assumed-and-never-stated">
          <name>Five things the protocol assumed and never stated</name>
          <t>Working through the Ledger changes made it clear that a class of gap ran under
all of them. Every discovery path in -02 ended at a value its holder could not
present to anything, and each attempt to fix one by adding a pointer moved the
dead end without removing it. Five substrate layers were missing. They are now
written, and adding them closed more open items than any mechanism in this
revision.</t>
          <t><strong><xref target="delivery"/> states what the pipeline returns.</strong> No earlier revision said that
a Reconciliation Output is delivered to anybody. The document specified in
detail how an Output is composed, sealed, digested, ledgered and notarised, and
never that any party receives one. Every discovery path begins with a party
holding a Reconciliation Hash; until now nothing said how it came to hold one.</t>
          <t><strong><xref target="entitlement"/> states who may hold an Output.</strong> -02 made it a bearer
artefact: possession was the whole of the entitlement, it never expired, and
every read predicate the document attempted was expressed in terms of a
Requester-Binding the reader could not present and the Ledger could not
evaluate. An Output now carries a sealed Audience Set and a Reliance Horizon.
Entitlement follows the Audience Set rather than possession, which admits the
party the Requesting Principal named and excludes the party that merely came
into possession; a register may cap how wide an Audience Set addressing it may
be, because a register that attests about a subject is entitled to bound how far
that attestation travels. The Horizon bounds reliance without touching validity:
a sanctions <tt>no-match</tt> is a statement about lists that change daily, and an
artefact asserting one indefinitely was relied upon indefinitely.</t>
          <t><strong><xref target="ledger-read"/> states how a read is requested.</strong> -02 and every draft of this
revision before it stated what a read returns and never the endpoint, the
request form, the response form, the media type, or the error semantics -- and
the two errors that matter most, "nothing exists" and "you may not ask", are the
two a reader most needs distinguished, because a server suppressing a
supersession returns what a server with nothing to report returns. There are
nine operations. Every response, success or error, is signed and carries the
ledger head it was served
against, so an empty result is an assertion rather than an absence, and a
supersession later found at an earlier sequence number is evidence against the
operator who signed the denial. Not-entitled and not-found are both <tt>404</tt> with
no distinguishing body, so no endpoint is an existence oracle. Reads are
rate-limited, because a surface whose every individual answer is innocuous
discloses entry count, write rate and retroactive-burst timing when swept.</t>
          <t>With those in place, the Continuation entries of this revision are reachable by
the parties they were written for, a superseded Output's replacement is
retrievable because a superseding Output inherits the Audience Set of what it
supersedes, and the fork check reconciles two heads at different sequence
numbers through a signed consistency read rather than through an unsigned answer
from the party under suspicion. Retrieval URIs, which an earlier draft of this
revision put in Continuation entries, are gone: every artefact is now fetched by
hash from the origin that served the entry, so the Ledger holds no retrieval
address, no reader is obliged to dereference an operator-chosen URL before it can
check anything, and the covert channel that host selection and path structure
carried is closed.</t>
          <t>The published ledger head is a signed statement carrying a sequence number, and
Entry Sequence Numbers are allocated in one sequence so that two conforming
stores cannot present the same number over different entries. Two limits are
stated rather than claimed away: an operator publishing to two audiences at
disjoint sequence numbers never emits a colliding pair, and a party holding
neither an Output nor an agreement cannot anchor the signing key.</t>
          <t>The Reconciliation Hash is no longer among the values required to be reproducible
across runs. Its preimage includes the Reconciliation Timestamp, so the
requirement was unsatisfiable; the Reconciliation Identifier is the reproducible
index and always was.</t>
          <t><strong><xref target="request-binding"/> states how a reconciliation is commissioned.</strong> The document
imposed obligations on "the response to the request that commissioned it" without
defining that request anywhere. <strong><xref target="audit-path"/> states who an auditor is.</strong> Four
requirements were justified by what an auditor could reproduce, and the auditor
was not a party this document admitted; an Audit Identity is now declared in a
Bilateral Register Agreement, so that the audited party cannot choose its auditor
after the facts are known.</t>
          <t>Several corrections follow from checking this document's claims about other
specifications against those specifications. The deterministic CBOR encoding
every digest here depends on is that of Section 4.2.1 of <xref target="RFC8949"/>, which is
now a normative reference; RFC 9052 narrows those requirements to COSE's own
signing structures and states no map-key ordering rule, so the previous citation
did not support what was built on it. <xref target="RFC3339"/>, <xref target="RFC7638"/>, <xref target="RFC3986"/> and
<xref target="RFC6838"/> are referenced rather than named in prose. <xref target="composition-scitt"/> no
longer attributes an Identity Manager or an Aggregator role to <xref target="RFC9943"/>, which
defines neither. <xref target="composition"/> no longer presents "capsule" as that draft's
term. An unsourced claim about agreement on twenty-two pinned conformance vectors
is removed, that draft having frozen none. The EU consolidated financial
sanctions list and the OFAC SDN list are retargeted at the resources that
actually publish them.</t>
          <t>Three further sections follow from those. <xref target="merkle-construction"/> pins the tree
both Merkle roots in this document use, with domain separation and an inclusion-
proof encoding, so that a proof produced by one implementation verifies under
another. <xref target="re-notification"/> gives the Sovereign Re-Notification an artefact, a
payload, a media type, a delivery endpoint and a retry obligation; it was a <bcp14>MUST</bcp14>
with none of those in -02. <xref target="privacy"/> states the disclosure model and the
residual risks this revision accepts rather than leaving them to be inferred --
the subject has no standing in this protocol, an Audit Identity reads broadly,
and the published ledger head discloses a deployment's size at the notarisation
interval.</t>
          <t>Every digest preimage and signature payload in the document is now pinned to a
CBOR array with a normative field order and null-substitution for absent fields:
the Reconciliation Output and its Sealing Signature, the Partial Attestation, the
Per-Register Claim Projection, the ledger entry, the Post-Seal Evaluation Record,
the Non-Answer Statement, the Ledger Head Statement, the Evaluation Sweep
Statement and the read response. -02 left several of them as "the canonical
serialisation of the foregoing", which is not a preimage two implementations can
agree on.</t>
          <t>Homomorphic Aggregation Mode is removed and Hash-Linkage is the only mode. The
mode named no primitive, had no class in the Cryptographic-Primitive-Upgrade
Path for one to be declared in, and defined no encrypted-contribution structure;
and the reconciliation server must read every per-register verdict in the clear
in any case, to verify the register's signature, recompute the Query Binding,
check the echoed Policy-Version Hash and apply re-typing. The privacy property
the mode advertised was therefore not available under it, and ARP's actual
minimum-disclosure property -- controlled projection, and a Partial Attestation
payload that discloses of the subject only a verdict, a divergence axis, the
applied parameters and a digest -- is unaffected by its removal. Four
<tt>homomorphic-*</tt> Aggregation-Method Descriptors go with it.</t>
          <t>The interface between the reconciliation server and a sovereign register is now
stated to be out of scope, and the claim that enumerating the Per-Register Claim
Projection lets two register operators build interoperable endpoints is
withdrawn. Enumerating a structure is not specifying a binding. That leg -- an
endpoint, a media type, and a COSE_Encrypt construction pinning the AEAD and its
authenticated additional data -- is the principal item this revision leaves for
the next.</t>
        </section>
        <section anchor="ways-the-protocol-could-be-gamed-closed">
          <name>Ways the protocol could be gamed, closed</name>
          <t><xref target="containment"/>'s query budget is now measured per accountable principal per
subject. A budget shared across requesters is exhausted for everyone by any one
of them -- including an unidentified agent -- which forced every reconciliation
about that subject to <tt>indeterminate</tt> for the interval. The countermeasure was a
denial of service. Exhaustion now refuses the register and not the
reconciliation, which resolves a contradiction in -02: the old text refused the
reconciliation and then recorded a Non-Answer Reason in an Output that
consequently did not exist.</t>
          <t>A register-attested Non-Answer Reason now requires a Non-Answer Statement signed
by that register over the projection values and the reason, and
<xref target="no-answer"/> records which reasons are register-attested and which are
server-observed. Without it a <tt>register-refused</tt> was an unattested assertion by
the party that transmitted the projection, and a server could suppress a <tt>match</tt>
by claiming the register had declined. A server can still downgrade a
reconciliation by asserting a server-observed reason and the document says so;
what it can no longer do is dress suppression as an act of the register.</t>
          <t><xref target="sweep-statements"/> is new. Every trigger of retroactive evaluation was
server-observed, every decision to run was the server's, and nothing recorded
that a sweep had happened -- so "we evaluated and found no change" and "we never
evaluated" were the same observation from outside. A signed Evaluation Sweep
Statement per sweep, notarised on the head interval, makes the absence of one an
assertion the operator has to make. A Source-Data Version publication is a public
event with a public timestamp; an operator with no Statement covering one has
not evaluated, which is now checkable.</t>
          <t>The Verdict Arithmetic is resolved by the reconciliation server from policy,
keyed on the predicate and the regimes the requester names. -02 read as though
the requester declared the operator and its threshold in its own claim, which
would let it choose the verdict: disjunction over five registers and
threshold-count with a threshold of five differ only in which answer they return
over the same contributions. Naming a regime is a claim about which law applies
and the requester is accountable for it; selecting an operator is a determination
about how evidence combines, and the deployment makes it. <tt>source-class-quorum</tt>
now carries its per-class threshold into the Output as well as its partition,
without which it was as irreproducible as carrying neither.</t>
          <t>The Requester-Binding gains a fourth class, <tt>agent-key-verified</tt>, for an agent
whose signing key verified but whose asserted principal was not corroborated.
-02 recorded key possession and principal binding as one fact. An agent that
signs correctly has shown it is the same agent as last time and not that any
accountable party stands behind it; recording that as <tt>agent-verified</tt>
overclaimed to every downstream reader and recording it as <tt>agent-unverified</tt>
discarded something real.</t>
          <t><xref target="revocation-reliance"/> states what revocation of a Verified Principal Credential
does and does not reach. It is not detected in the hot path and this document
does not pretend to put it there; what it does is bound the window, by requiring
an Audience Member to read continuations before relying past the Reliance
Horizon. Reliance years later on an Output whose principal was disowned the
following week is the case that matters, and -02 left it open.</t>
          <t>The Override Record is enumerated, carries an Override Ground from a new
registry, and is signed by the authorising operator rather than by the server. A
record the server signs attests only that the server says an operator authorised
a bypass. It names that operator in the clear, which is consistent with
<xref target="entitlement"/>: blinding protects the published Ledger, and the Output is
confidential to its Audience Set.</t>
          <t>Retroactive Evaluation now triggers on a new Source-Data Version. It previously
triggered only on a Pattern Library or Policy Version change, so a sanctions
list republication -- the case <xref target="source-versioning"/> was written for -- fired
nothing. A material change now includes a transition between decisive values: a
no-match becoming a match is the case the motivating domain cares most about,
and the earlier definition omitted it.</t>
          <t>Homomorphic Aggregation Mode was restricted in -02 and is removed in -03; see
the -03 entry above.
The Pattern-Library Version Identifier is no longer bound as authenticated
additional data: registers are never told the pattern-library version, so
binding it either failed universally or was supplied by the party that chose it.
The Reconciliation Hash is taken over deterministic CBOR rather than
<xref target="RFC8785"/>, because the Output is CBOR and several fields are byte strings for
which JSON has no type. Regulator Portal scope is the intersection across
agreements rather than the union, which had let one permissive agreement widen
access to a stricter register's reconciliations.</t>
          <t>The Freshness Timestamp is now enumerated before the signature line in
<xref target="partial-attestation"/> and is therefore covered by it. It was listed after the
signature in earlier revisions, and both replay defence and the new
freshness-versus-skew distinction depend on it being signed.</t>
          <t>Not adopted: a statement that a reference implementation is forthcoming. It does
not exist yet, and a draft should not carry a claim about an artefact a reader
cannot check. When it is published it will be cited by repository and commit
alongside the conformance vectors it is checked against.</t>
        </section>
      </section>
      <section anchor="since-draft-hillier-scitt-arp-01">
        <name>Since draft-hillier-scitt-arp-01</name>
        <t>This revision closes canonicalisation ambiguities identified by running an
implementation of -01 against two published conformance corpora -- the EMILIA
clean-room <tt>frozen-v1</tt> agent-action corpus and the Noa AI-agent-receipt corpus
-- states the role of the Appendix D subject digest explicitly, and corrects a
number of requirements that were unsatisfiable, untestable or out of scope as
written in -01.
The harness and its machine-readable results were posted to the SCITT mailing
list.</t>
        <ul spacing="normal">
          <li>
            <t><xref target="RFC8785"/> is now a NORMATIVE reference. -01 named JCS in <xref target="composition"/>
without identifying which JCS; the string "8785" did not occur in -01 at all.
Agreement with a deployed profile depended on both parties having
independently selected <xref target="RFC8785"/>. It is now an obligation rather than a
coincidence.</t>
          </li>
          <li>
            <t>The Canonical Claim in <xref target="terminology"/> now pins its member-sort code unit to
UTF-16, per Section 3.2.3 of <xref target="RFC8785"/>. -01 said "lexicographic sorting of
object keys", which does not determine the ordering of member names outside
the Basic Multilingual Plane.</t>
          </li>
          <li>
            <t>Number rendering now cites Section 3.2.2.3 of <xref target="RFC8785"/>. -01 cited
"canonical JSON RFC 8259 number rendering"; RFC 8259 defines no
canonical number rendering, and was an informative reference in -01.</t>
          </li>
          <li>
            <t>"Stripping of undefined values" is replaced by a statement about absent
members, JSON having no undefined value to strip.</t>
          </li>
          <li>
            <t>New <xref target="construction-distinctness"/> states that the Claim Hash and
<tt>subject_digest</tt> are distinct constructions that <bcp14>MUST NOT</bcp14> be substituted for
one another, and records the two observed COLLISION cases (Normalization Form
D against Form C, and U+212B against U+00C5) in which a substitution fails
silently rather than visibly.</t>
          </li>
          <li>
            <t>New <xref target="subject-digest-scope"/> states what <tt>subject_digest</tt> is and what it is
not, which -01 left to be inferred. <tt>subject_digest</tt> is a content digest:
collision-resistant over content, and therefore NOT stable under the
variation an action type permits. Measured:
five conforming instances of one registered action type, each accepted by
that type's reference issuer and differing only in content the type declares
<bcp14>OPTIONAL</bcp14>, produced five distinct subject digests. The section now separates
the case the construction supports -- capsules over one shared serialisation,
which is what <xref target="composition"/> composes -- from the case it does not, and
requires a profile needing the latter to pin its member set or to join on a
material identifier the action type declares. It also forbids describing a
content digest as a correlation key without saying which case is relied on.</t>
          </li>
          <li>
            <t>The order of canonicalisation operations in <xref target="terminology"/> is now normative.
Normalization Form C is applied BEFORE the member sort. The two do not
commute: for an object whose member names are U+0041 U+030A and "B",
normalising first and sorting first produce different Claim Hashes. -01 gave
the operations as an unordered list.</t>
          </li>
          <li>
            <t><xref target="I-D.mih-sato-agent-accountability-composition"/> remains an informative reference.
<xref target="composition"/> composes over the capsule slots it defines and would cite it
normatively, but it is an individual draft; making it normative now would
create a publication dependency. The same applies to
<xref target="I-D.mih-sokolov-scitt-payload-binding"/>. The status of both references
will be revisited as those documents progress.</t>
          </li>
          <li>
            <t><xref target="construction-distinctness"/> requires that a correlation digest carried on
the wire identify its construction, and requires that such an identifier not
commit to facts which do not affect the serialised bytes, so that two
implementations producing identical bytes share an identifier.</t>
          </li>
          <li>
            <t><xref target="construction-distinctness"/> additionally requires that a correlation
identifier over a typed action object be emitted only after the object
validates against a pinned definition of its type.</t>
          </li>
        </ul>
        <t>Reference and source corrections in this revision:</t>
        <ul spacing="normal">
          <li>
            <t>The SCITT Architecture reference is now <xref target="RFC9943"/> and the COSE Merkle tree
proofs reference is now <xref target="RFC9942"/>. -01 cited both as Internet-Drafts; both
have since been published as RFCs.</t>
          </li>
          <li>
            <t>The Web Bot Auth architecture reference is replaced. -01 cited
draft-meunier-web-bot-auth-architecture, which has been replaced by
<xref target="I-D.ietf-webbotauth-httpsig-protocol"/>.
<xref target="I-D.meunier-webbotauth-registry"/>, which defines the signature-agent card,
is retained. The directory the Signature-Agent header names is defined in
<xref target="I-D.ietf-webbotauth-httpsig-protocol"/>, so no separate directory reference
is carried.</t>
          </li>
          <li>
            <t>The document date, RFCXML version and submission type are declared in the
source, and <tt>keyword</tt> is a single YAML sequence.</t>
          </li>
          <li>
            <t>A note to the RFC Editor records the <xref target="RFC8785"/> downref explicitly, so that
it can be called out at IETF Last Call per <xref target="RFC8067"/> rather than found
there.</t>
          </li>
          <li>
            <t><xref target="composition"/> now REQUIRES that all composed capsules carry one shared
action serialisation, established by the authorising party and echoed
verbatim by later attesters, and states that a capsule's own account of the
action travels in its payload rather than in <tt>subject_digest</tt>. -01 left the
shared-serialisation condition implicit, which is the condition the digest
depends on.</t>
          </li>
          <li>
            <t>The determinism requirement is scoped to the Reconciliation Output and to
the Claim Hash, Reconciliation Hash and Policy-Version Hash; -03 removes the
Reconciliation Hash from that set, as the -03 entry above records. -01 required
bit-for-bit identical Settlement-Layer Ledger entries, which the entry's own
sequence number, timestamp and prior-entry hash make unsatisfiable.</t>
          </li>
          <li>
            <t>The Claim Hash is pinned to SHA-256 in Canonical Claim Ingestion. -01 named the
algorithm only in an appendix, leaving a parameter the construction
identifier is required to commit to unstated in the normative body.</t>
          </li>
          <li>
            <t>Claim equality is stated over canonical field values, and declared array
order is significant. -01 required semantically-equivalent claims to hash
alike without defining semantic equivalence, which no implementer could
test.</t>
          </li>
          <li>
            <t>The Per-Register Claim Projection is defined as the nearest permitted
ancestor predicate rather than a greatest lower bound, which the Predicate
Taxonomy -- a tree -- does not have, and the projection function now fails
explicitly on an ambiguous or unreachable walk rather than choosing.</t>
          </li>
          <li>
            <t>The Settlement-Layer Ledger entry carries an <bcp14>OPTIONAL</bcp14>
Source-Reconciliation-Output Identifier, which the retroactive
re-evaluation example already relied on and the entry's closed field list
did not admit.</t>
          </li>
          <li>
            <t><tt>freshness-stale</tt> is added to the Divergence-Axis controlled set, and
server-recorded axes are stated to travel in the Reconciliation Output
rather than in a register's signed payload, which the reconciliation server
cannot modify.</t>
          </li>
          <li>
            <t>COSE header labels are requested from IANA rather than asserted as a
vendor-private range, and an IANA registry is requested for Divergence-Axis
values.</t>
          </li>
          <li>
            <t>The examples are de-identified. Register identifiers are illustrative and no
bilateral agreement with any named authority is asserted.</t>
          </li>
          <li>
            <t>Two independent implementations of an <xref target="RFC8785"/>-based digest construction,
one in Go and one in Python and sharing no source, were measured as agreeing
byte-for-byte on 24 generated inputs selected to exercise absent-field
normalisation, arrays, string escaping, UTF-16 member sorting and both integer
bounds. Two implementations derived from one source would have demonstrated
code identity rather than agreement, which is why the pair is named. That is the
outcome <xref target="construction-distinctness"/> argues for: one identified
construction per digest role, committing to the parameters that affect the
serialised bytes and to nothing else.</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-hillier-scitt-arp-00">
        <name>Since draft-hillier-scitt-arp-00</name>
        <ul spacing="normal">
          <li>
            <t>Added a fourth motivating deficiency (unverifiable requester identity in an
agentic setting) to the Introduction.</t>
          </li>
          <li>
            <t>Added a new pipeline subsystem, Requester Identity Binding and Agent
Friend-or-Foe (IFF) Gate, and renumbered the pipeline to twelve subsystems.</t>
          </li>
          <li>
            <t>Added the <tt>agent:</tt> predicate branch, a new Agentic Principal Reconciliation
section, and the divergence axes agent-principal-unverifiable,
agent-credential-absent, and agent-impersonation-suspected.</t>
          </li>
          <li>
            <t>Added Requester-Binding to the Policy-Version Hash commitment and a
requester-binding-class descriptor to the Settlement-Layer Ledger entry.</t>
          </li>
          <li>
            <t>Bound ARP to HTTP Message Signatures <xref target="RFC9421"/> and Web Bot Auth for signed
agent requests, and added an Agent Impersonation security consideration.</t>
          </li>
          <li>
            <t>Replaced the stale scitt-receipts reference with COSE Receipts
<xref target="RFC9942"/> and added the SCITT Reference APIs
<xref target="I-D.ietf-scitt-scrapi"/>; Hash-Linkage Aggregation now emits COSE Receipts.</t>
          </li>
          <li>
            <t>Described the Evidentiary Provenance Manifest's optional carriage as a
COSE-enveloped Verified-Principal-Credential evidence container.</t>
          </li>
          <li>
            <t>Extended Retroactive Evaluation to treat credential revocation as a material
change, and added a new IANA header label and worked agentic example.</t>
          </li>
          <li>
            <t>Added the motivating agentic-containment failure class to the Introduction
and framed real-time reconciliation of claimed-versus-actual conduct as a
first-class property, distinct from after-the-fact forensic reconstruction.</t>
          </li>
          <li>
            <t>Added a Composition with Agent-Action Accountability Capsules section
reconciling heterogeneous CAN/WHO/WHAT/AUDIT capsules
<xref target="I-D.mih-sato-agent-accountability-composition"/> over a shared subject digest into a
producer-agnostic verdict, with a worked divergent agent-action example.</t>
          </li>
          <li>
            <t>Added the agent-action-scope-divergence divergence axis.</t>
          </li>
          <li>
            <t>Removed two unused informative references (JWS, JWT).</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  

</rfc>
