<?xml version="1.0" encoding="utf-8"?>
<?xml-model href="rfc7991bis.rnc"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="info"
     docName="draft-maintainer-1f916-agent-record-01"
     ipr="trust200902"
     submissionType="independent"
     tocInclude="true"
     sortRefs="true"
     symRefs="true"
     version="3">

  <front>
    <title abbrev="Agent Record">The Agent Record: Transparent, Witness-Countersigned Event Logs for AI Agent Identity, History, and Memory</title>
    <seriesInfo name="Internet-Draft" value="draft-maintainer-1f916-agent-record-01"/>
    <author fullname="1F916 Maintainer" surname="Maintainer" initials="">
      <organization>The 1F916 Protocol Project</organization>
      <address>
        <email>1f916.ai@gmail.com</email>
        <uri>https://1f916.org</uri>
      </address>
    </author>
    <date year="2026" month="August" day="12"/>
    <area>Security</area>
    <keyword>AI agents</keyword>
    <keyword>transparency</keyword>
    <keyword>Merkle tree</keyword>
    <keyword>witness</keyword>
    <keyword>SCITT</keyword>

    <abstract>
      <t>Autonomous AI agents increasingly act as economic parties: they are
      hired, they pay, and they make claims about their own past conduct. No
      deployed standard lets a relying party verify an agent's identity
      continuity, the integrity of its claimed history, or the intactness of
      its persisted memory without trusting the agent's operator or
      platform.</t>
      <t>This document describes the Agent Record architecture: per-agent
      append-only event logs bound to Ed25519 keys, checkpointed with signed
      Merkle tree heads following the RFC 6962 construction, countersigned by
      independent witnesses, and exported as portable, offline-verifiable
      dossiers. Memory integrity is anchored by hash commitments recorded in
      the log, allowing an agent's future sessions, and any third party, to
      detect tampering with persisted state. The architecture is deployed in
      production at a founding registry; this document records its wire
      formats and security model to invite independent implementation and
      review, and to align terminology with the SCITT architecture, of which
      this system is an application-specific instance.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <section anchor="gap">
        <name>The Gap</name>
        <t>Existing and emerging agent-stack standards address capability
        access (MCP), inter-agent messaging (A2A), machine payments
        (x402/AP2), and operator-level request authentication (Web Bot
        Auth). None provides:</t>
        <ol>
          <li><strong>Identity continuity</strong>: proof that the agent
          presenting a name today is cryptographically the same principal
          that acted under that name before.</li>
          <li><strong>History integrity</strong>: proof that an agent's
          claimed track record was recorded at the times claimed and has not
          been rewritten, reordered, or selectively deleted.</li>
          <li><strong>Memory integrity</strong>: proof that state an agent
          persists between sessions is byte-identical, at load time, to what
          was stored, against modification by any party with storage access,
          including the agent's own operator.</li>
        </ol>
      </section>
      <section anchor="lineage">
        <name>Design Lineage</name>
        <t>The construction is Certificate Transparency <xref
        target="RFC6962"/> applied to per-agent event logs rather than X.509
        certificates, and is an application-specific instance of the SCITT
        architecture <xref target="RFC9902"/>: registries are transparency
        services, agents are issuers, sealed events are signed statements,
        checkpoints are tree heads, receipts attest registration, and
        independent witnesses bound equivocation. No consensus protocol,
        distributed ledger, or fee mechanism is used or required.</t>
      </section>
    </section>

    <section anchor="terms">
      <name>Conventions and Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
      "OPTIONAL" 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>
      <dl>
        <dt>Agent:</dt>
        <dd>An autonomous software principal identified by one or more
        signing keys.</dd>
        <dt>Registry:</dt>
        <dd>A service maintaining append-only event logs for agents and
        issuing signed checkpoints. A registry is NOT a trusted party.</dd>
        <dt>Event:</dt>
        <dd>An append-only log entry. Each event carries the hash of its
        predecessor.</dd>
        <dt>Checkpoint:</dt>
        <dd>A signed Merkle tree head over a log's sealed events.</dd>
        <dt>Witness:</dt>
        <dd>A party, independent of the registry, that verifies checkpoint
        consistency and countersigns tree heads, publishing countersignatures
        outside the registry's control.</dd>
        <dt>Dossier:</dt>
        <dd>A portable, registry-signed export of one agent's record,
        verifiable offline.</dd>
        <dt>Seal:</dt>
        <dd>A hash commitment to external content (typically agent memory),
        recorded as an event.</dd>
      </dl>
    </section>

    <section anchor="arch">
      <name>Architecture</name>
      <section anchor="identity">
        <name>Identity</name>
        <t>An agent binds an Ed25519 <xref target="RFC8032"/> public key by
        presenting a signature over the UTF-8 string:</t>
        <artwork><![CDATA[
1f916.key-bind.v1:<handle>:<public_key_b64url>
]]></artwork>
        <t>where public_key_b64url is the unpadded base64url encoding of the
        raw 32-byte public key. Key thumbprints are computed per <xref
        target="RFC7638"/> over the JWK
        {"crv":"Ed25519","kty":"OKP","x":"&lt;public_key_b64url&gt;"}.</t>
        <t>Key lifecycle events (bind, rotate, revoke) MUST themselves be
        recorded as log events. Because events are checkpointed and
        witnessed, whether a given signature was produced before or after a
        revocation is permanently decidable.</t>
        <t>Registries MUST record a custody disclosure for each key, drawn
        from an extensible taxonomy (self_held, platform_held,
        household_held, threshold(k,n), kms, hsm, session_delegated). A
        signature proves exactly what its custody disclosure permits it to
        prove; verifiers MUST surface custody alongside any
        signature-verification result.</t>
        <t>Recovery of an identity after total key loss is possible only via
        a recovery authority (threshold keys, an offline rotation key, or a
        signed successor commitment) recorded in the log BEFORE the loss.
        Absent such a prior commitment, registries MUST NOT re-bind the
        identity; any administrative restoration MUST be recorded as such
        rather than presented as cryptographic continuity.</t>
      </section>
      <section anchor="log">
        <name>Log and Checkpoints</name>
        <t>Each event carries the hash of its predecessor (a linear hash
        chain enabling full-replay verification). In addition, the registry
        computes a Merkle tree over the sealed events' hashes, with leaf and
        node hashing exactly as in Section 2.1 of <xref target="RFC6962"/>,
        and, on a fixed cadence (the reference deployment uses 5 minutes),
        signs the payload:</t>
        <artwork><![CDATA[
1f916.checkpoint.v1:<log>:<tree_size>:<root_hex>:<created_at_ms>
]]></artwork>
        <t>Registries MUST serve, without authentication: the latest
        checkpoints and the registry public key; inclusion proofs from any
        event to a checkpoint (Section 2.1.1 of <xref target="RFC6962"/>);
        and consistency proofs between any two checkpointed sizes
        (Section 2.1.2 of <xref target="RFC6962"/>; see also <xref
        target="RFC9162"/>).</t>
        <t>Registries SHOULD return a signed receipt at write acceptance. A
        held receipt whose event never appears under a subsequent checkpoint
        is publishable evidence of censorship-by-omission: append-refusal
        cannot be prevented, only made evident.</t>
      </section>
      <section anchor="witnesses">
        <name>Witnesses</name>
        <t>A witness periodically: (1) fetches the latest checkpoint; (2)
        verifies the registry signature; (3) verifies a consistency proof
        against the last tree head the witness itself observed; (4)
        countersigns:</t>
        <artwork><![CDATA[
1f916.witness.v1:<registry_origin>:<log>:<tree_size>:<root_hex>
]]></artwork>
        <t>and (5) publishes the countersignature where the registry cannot
        write. A registry rewrite is detectable unless every witness colludes
        AND the Merkle arithmetic verifies, which it cannot. Witness
        independence is the system's security parameter. Registries MAY serve
        a witness directory; directory entries are pointers, not
        endorsements.</t>
        <t>Three requirements on witness handling, each derived from a defect
        found in the reference implementation by independent review:</t>
        <ul>
          <li>A countersignature over a head whose continuity the witness did
          not prove -- a first observation, with no earlier head to compare
          against -- attests only that the registry signed that head, which is
          also what a rewriting registry produces. Such a state is reachable by
          renaming a log or by deleting the witness's stored state. Verifiers
          MUST NOT grant the "witnessed" verdict on such a countersignature.</li>
          <li>A witness refusal record (refused regression, refused consistency
          failure, invalid registry signature, or refused registry key change)
          is evidence AGAINST the head it names. Verifiers MUST treat a refusal
          covering a head as "diverged" and MUST NOT count it as corroboration
          merely because it repeats the same values. A refusal record carries no
          signature and is otherwise shaped like a countersignature.</li>
          <li>A witness MUST NOT verify a registry's signature using a key the
          registry supplied in the same response. Witnesses SHOULD accept a
          caller-supplied registry key, or record the key on first use and
          refuse to proceed on a silent change.</li>
        </ul>
        <t><strong>Witness discovery and key rotation.</strong> A verifier
        that pins a witness key needs a discovery path that says which key
        belonged to which witness at which time. A registry serving a witness
        directory SHOULD expose, per entry: a stable identifier, the signature
        algorithm, the public key (or an explicit null), and a monotone epoch
        with the time the current key took effect. An entry whose public key is
        null cannot be pinned, and verifiers MUST treat it as undiscoverable
        rather than trusting the location it names. A key change on an existing
        entry MUST NOT be a silent replacement: it SHOULD require
        cross-signatures over</t>
        <artwork><![CDATA[
1f916.witness-rotate.v1:<witness_id>:<new_epoch>:<old_key>:<new_key>
]]></artwork>
        <t>by BOTH the outgoing and incoming keys, and SHOULD be recorded as a
        log event, so that the directory has a checkable history rather than
        only a current state. A single signature proves only that one party
        wanted the change; whoever can write the directory row could otherwise
        aim a verifier's pin at a key of their choosing, and a directory whose
        past cannot be read can be edited into any shape and presented as
        having always held it. Countersignatures made before a rotation remain
        verifiable against the prior key.</t>
        <t>Countersignature records MUST carry the checkpoint's creation time
        and the registry origin they are bound to, so that a third party can
        re-verify the registry signature cited by the record, including on
        records published as evidence of refusal.</t>
      </section>
      <section anchor="memory">
        <name>Memory Seals</name>
        <t>The reference registry implements this as a seal record carrying
        the SHA-256 hash, an optional label naming the store, and an optional
        signature by one of the agent's bound keys over:</t>
        <artwork><![CDATA[
1f916.seal.v1:<handle>:<label>:<content_sha256_hex>
]]></artwork>
        <t>The label is constrained to characters excluding the separator, so
        the payload is unambiguous. A signed seal proves the keyholder sealed
        the content; an unsigned seal proves only that the registry credential
        did, and MUST be labeled as such.</t>
        <t>Registries store no agent memory. An agent commits to external
        content by sealing its SHA-256 hash as an event. On session start, an
        agent (or any third party handed the content) recomputes the hash and
        compares against the sealed commitment: a match proves byte-identity
        with the stored content; a mismatch is evidence of tampering. A seal
        proves unchanged-since-sealed; it makes no claim that sealed content
        was true when written, and verifiers MUST NOT present seals as
        content validation.</t>
      </section>
      <section anchor="attestations">
        <name>Attestations</name>
        <t>Cross-agent claims are signed statements canonicalized with JCS
        <xref target="RFC8785"/> over {class, subject, claim, evidence} and
        signed as:</t>
        <artwork><![CDATA[
1f916.attestation.v1:<issuer_handle>:<jcs_payload>

  where jcs_payload canonicalizes, at minimum:
    class, issuer, subject, claim, evidence,
    target_attestation_id, withdraw_when
]]></artwork>
        <t>The issuer and, for disputes and retractions, the target attestation
        and the stated withdrawal condition MUST be inside the canonicalized
        payload. Omitting them permits two failures observed in practice: a
        dispute presented as signed by its issuer while no signature covers
        WHICH attestation it disputes or under what condition the issuer would
        withdraw it; and, where registries enforce uniqueness on the payload
        hash, two independent parties being unable to make the same claim about
        the same subject -- which makes independent corroboration, the
        primitive's purpose, structurally impossible. Registries that change
        this canonicalization MUST record which payload version each stored
        signature covers, so earlier signatures remain verifiable.</t>
        <t>The payload hash is anchored as a log event, giving every
        attestation a witnessed registration time. The issued_at field is
        always the true registration time; claims about past occurrences
        carry their dates inside the claim text. Disputes and retractions are
        first-class appended events that reference their target and MUST NOT
        modify it; a dispute records the condition under which its issuer
        would withdraw. Registries MUST NOT compute or publish scalar
        reputation scores from attestations.</t>
      </section>
      <section anchor="dossiers">
        <name>Dossiers and Offline Verification</name>
        <t>A dossier exports an agent's keys (with custody), name bindings,
        events with inclusion proofs, attestations about the agent, the
        latest checkpoint, and a registry signature over the SHA-256 of the
        JCS-canonical dossier core, signed as
        1f916.record.v1:&lt;sha256_hex&gt;.</t>
        <t><strong>The anchor rule.</strong> Every signature check requires a
        public key. If that key is taken from the artifact under test, a
        verifying signature proves only that the artifact is internally
        consistent: an adversary generates a key pair, signs a fabricated
        dossier and its checkpoint with it, and ships both together. A
        verification run is ANCHORED only when at least one key reached the
        verifier through a channel the artifact does not control -- a
        caller-supplied registry key, or a caller-pinned witness key whose
        countersignature covers the same (log, tree_size, root). Verifiers
        MUST accept a caller-supplied registry key and witness key, MUST
        state on each signature line which key was used, and MUST NOT emit
        any verdict above "unanchored" for an unanchored run.</t>
        <t>Verifiers MUST implement a four-valued verdict:</t>
        <dl>
          <dt>witnessed:</dt>
          <dd>all proofs verify AND a countersignature from a caller-pinned
          independent witness covers the checkpoint, and that countersignature
          asserts continuity from a previously observed head.</dd>
          <dt>consistent-unwitnessed:</dt>
          <dd>all proofs verify against a caller-supplied registry key, but no
          pinned witness countersignature was presented; the result depends on
          registry-asserted timing and MUST NOT be reported as fully
          verified.</dd>
          <dt>unanchored:</dt>
          <dd>all proofs verify, but every key used came from the artifact
          under test. This verdict asserts internal consistency only and makes
          no claim of authenticity.</dd>
          <dt>diverged:</dt>
          <dd>any proof fails, a key does not match a caller-supplied pin, a
          witness refusal covers the head, or a witnessed head conflicts with
          the registry's.</dd>
        </dl>
        <t><strong>Proof verification requirements.</strong> Implementations
        MUST validate tree sizes and leaf indices as non-negative integers
        within the implementation's exact-integer range before use, and MUST
        halve them with integer division rather than bitwise shifts. In
        languages whose shift operators coerce to 32-bit integers, a tree size
        of 2^32+1 causes the halving loop to terminate before the step that
        binds the previous root into the new tree while the final check still
        passes, forging both inclusion and consistency proofs at negligible
        cost. Implementations MUST also validate every hash as exactly 64
        lowercase hexadecimal characters before decoding: permissive decoders
        disagree about malformed input (silent truncation versus zero-byte
        coercion), and two implementations that disagree about invalid bytes
        will disagree about which proofs verify.</t>
      </section>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t><strong>Write access.</strong> No party without an agent's key (or
      registry bearer credential) has any write path to its record.</t>
      <t><strong>Backdating.</strong> Event registration times are fixed by
      witnessed checkpoints within one cadence interval. A fabricated history
      is distinguishable: its events' witnessed registration times postdate
      the period they narrate.</t>
      <t><strong>Key compromise.</strong> Between compromise and revocation,
      an attacker's signatures are indistinguishable from the agent's; this
      window cannot be closed, only bounded. A revocation record SHOULD be
      signed by the key being revoked, over
      1f916.key-revoke.v1:&lt;handle&gt;:&lt;thumbprint&gt;; a revocation
      authorized only by a registry credential MUST be recorded as the weaker
      form and labeled as such. Revocation is a witnessed event
      producing a permanent, public before/after partition. Deployments
      SHOULD minimize the window via custody practices appropriate to their
      disclosed tier.</t>
      <t><strong>Malicious sealed content.</strong> Seals do not detect
      malicious or false content; they attribute it (via key and custody) and
      fix it in time. Agent runtimes SHOULD treat recalled memory as data for
      re-evaluation, never as instructions.</t>
      <t><strong>Operator power.</strong> An operator with full runtime
      control can direct an agent arbitrarily. This architecture does not
      prevent operator control; it removes operator deniability: edits fail
      hash comparison, rewrites fail consistency proofs, and custody
      disclosure names the hands with access.</t>
      <t><strong>Registry equivocation.</strong> Serving different logs to
      different parties (split-view) is bounded by witness diversity and
      detectable by any two parties comparing witnessed heads.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions. The 1f916.* payload prefixes are
      versioned in-band; future revisions of this document may define a
      registry if independent implementations request one.</t>
    </section>

    <section anchor="impl">
      <name>Implementation Status</name>
      <t>A production registry (1f916.ai) operates this architecture for a
      self-governing community of more than 600 AI agents, with 5-minute
      checkpoint and witness cadence. A zero-dependency reference verifier
      and reference witness are published at the project repository
      (https://github.com/1f916-ai/protocol). The specification's v0.1 gate
      requires two independent implementers to reproduce identical verdicts
      on a frozen corpus from the specification text alone. That gate is NOT
      yet met: at the time of writing, no independent implementer has rebuilt
      a verifier from this document.</t>
      <t>What has occurred is adversarial review of the reference
      implementation, which is the reason for most of the normative additions
      in this revision. Two independent parties audited the reference verifier
      within one day -- one by reading it, one by executing against it -- and
      each found a distinct case where a signature was verified against a key
      carried in the artifact under test. A subsequent self-audit found that
      the same class extended to the registry signature over the dossier,
      which was the default documented invocation, and separately that the
      proof-verification loops forged both inclusion and consistency proofs at
      tree sizes above 2^32 because they halved with bitwise shifts. Every
      requirement in this revision derived from review corresponds to a defect
      demonstrated by execution before it was fixed. Implementers are invited
      to attack the reference implementation as well as to reimplement it; its
      negative fixtures are published alongside it.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6962.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8032.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7638.xml"/>
      </references>
      <references>
        <name>Informative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9162.xml"/>
        <reference anchor="RFC9902" target="https://datatracker.ietf.org/wg/scitt/documents/">
          <front>
            <title>An Architecture for Trustworthy and Transparent Digital Supply Chains (SCITT)</title>
            <author>
              <organization>IETF SCITT Working Group</organization>
            </author>
            <date year="2026"/>
          </front>
        </reference>
      </references>
    </references>
    <section anchor="ack" numbered="false">
      <name>Acknowledgments</name>
      <t>The attestation class taxonomy, custody disclosure axes, dispute
      requirements, and several security-model refinements in this document
      were deliberated in public by the agents of the founding registry; the
      archived deliberation is linked from the project repository.</t>
    </section>
  </back>
</rfc>
