<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
  <!ENTITY zwsp "&#8203;">
  <!ENTITY nbhy "&#8209;">
  <!ENTITY wj "&#8288;">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     docName="draft-vandemeent-tibet-tat-01"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     version="3">

  <front>
    <title abbrev="TIBET TAT">TIBET TAT: Touch-and-Transfer Protocol</title>
    <seriesInfo name="Internet-Draft"
                value="draft-vandemeent-tibet-tat-01"/>

    <author fullname="Jasper van de Meent" initials="J."
            surname="van de Meent">
      <organization>Humotica</organization>
      <address>
        <postal><country>Netherlands</country></postal>
        <email>info@humotica.com</email>
        <uri>https://humotica.com/</uri>
      </address>
    </author>
    <date year="2026" month="October" day="29"/>
    <area>Security</area>
    <workgroup>Internet Engineering Task Force</workgroup>

    <keyword>tibet</keyword>
    <keyword>tat</keyword>
    <keyword>touch-and-transfer</keyword>
    <keyword>sealed handoff</keyword>
    <keyword>consent-bound transfer</keyword>

    <abstract>
      <t>This document specifies TIBET TAT, a Touch-and-Transfer
      protocol for moving sealed continuity-bearing objects across
      proximity, relay, and local-network handoff lanes.</t>
      <t>TAT defines a consent-bound handoff model, a seed exchange for
      tunnel establishment, encrypted chunk streaming, mutual transfer
      anchoring between sender and receiver, and the rules under which
      the carrier of an in-flight transfer may change.</t>
      <t>TAT does not define identity truth, semantic class, or sealed
      object class by itself. Instead, it defines the wire and handoff
      layer that carries such objects once sender and receiver have
      agreed to transfer. TAT is intended to sit between the
      Continuity Envelope Protocol (CEP) and higher-level application
      profiles such as IDDrop.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Many systems can transport bytes, but fewer specify the exact
      handoff semantics of a consensual sealed transfer.</t>
      <t>TIBET TAT addresses this gap. TAT is the wire and handoff
      protocol for touch-and-transfer and related relay delivery
      paths.</t>
      <t>The key design principle is simple: transfer MUST be
      consent-bound, anchored, and sealed.</t>
      <t>This revision keeps the model of -00 and tightens it where
      building the pieces revealed ambiguity: the tunnel key schedule,
      a store-and-forward mode, chunk topology, the separation between
      arrival and admission, receipts for refused outcomes, and the
      handling of a carrier change during a transfer. <xref
      target="changes"/> lists every change.</t>
    </section>

    <section anchor="terminology">
      <name>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>TAT</dt>
        <dd>The Touch-and-Transfer protocol specified in this
        document.</dd>
        <dt>Seed</dt>
        <dd>A compact signed handshake object exchanged before tunnel
        opening.</dd>
        <dt>Consent</dt>
        <dd>The explicit receiver-side decision to accept, reject, or
        request more information before transfer continues.</dd>
        <dt>Transfer Pair</dt>
        <dd>The sender-side transfer_out anchor and receiver-side
        transfer_in anchor that together record a single handoff
        event.</dd>
        <dt>TAT Tunnel</dt>
        <dd>The encrypted transport channel established after seed
        validation and consent.</dd>
        <dt>Tombstone</dt>
        <dd>An optional finality record written after successful
        transfer to indicate deactivation or succession.</dd>
        <dt>Carrier</dt>
        <dd>The actor or device that currently bears an in-flight
        transfer or the task it belongs to. A carrier is distinct from
        the transport substrate (the lane) that moves bytes.</dd>
        <dt>Handoff Edge</dt>
        <dd>A signed record declaring that the carrier of a transfer
        changes from one named actor to another within the same task
        (<xref target="handoff"/>).</dd>
        <dt>Arrival</dt>
        <dd>The event of sealed bytes reaching a receiver or its
        rendezvous point. Arrival is a custody fact, not a
        decision.</dd>
        <dt>Admission</dt>
        <dd>The receiver-side decision that arrived material may be
        opened, materialized, or acted upon. Admission is always
        evaluated fresh by the receiver and is never inherited from an
        earlier step.</dd>
        <dt>Receipt</dt>
        <dd>A record of the outcome of a TAT step, written for
        acceptances and refusals alike.</dd>
        <dt>Decider</dt>
        <dd>The evaluation that reached an outcome, as distinct from the
        key or runtime that signed the record of it.</dd>
      </dl>
    </section>

    <section anchor="overview">
      <name>Protocol Overview</name>
      <t>TAT sits between general continuity messaging and higher-level
      application protocols. TIBET decides causal truth <xref
      target="CAUSAL"/>, TAT decides transfer flow, ICC or TZA/TBZ
      sealed carriers decide object structure, and SSM <xref
      target="SSM"/> decides visible dispatch surface.</t>
      <t>TAT is intended as the generic transfer profile that a
      specialized application profile MAY build upon.</t>
      <t>TAT MAY be used across multiple transport modes including
      proximity touch, local relay, local network handoff, and
      HTTP-assisted handoff. The transport substrate MAY vary, but the
      TAT consent, tunnel, and transfer-pair semantics MUST remain
      invariant.</t>
      <t>TAT operates in one of two modes:</t>
      <dl>
        <dt>Interactive mode</dt>
        <dd>Sender and receiver are both reachable during the transfer.
        Consent precedes content flow and both sides contribute
        ephemeral key material (<xref target="flow"/>).</dd>
        <dt>Store-and-forward mode</dt>
        <dd>The receiver is not reachable when the sender transfers.
        The sender seals content to a receiver static key and a relay
        or rendezvous point holds the sealed carrier until the receiver
        collects it (<xref target="store-and-forward"/>).</dd>
      </dl>
      <t>A relay that accepts a sealed carrier takes custody of opaque
      bytes. Custody by a relay MUST NOT be interpreted as delivery to
      the receiver, and delivery MUST NOT be interpreted as receiver
      consent or admission.</t>
    </section>

    <section anchor="objects">
      <name>TAT Objects</name>
      <dl>
        <dt>Seed Object</dt>
        <dd>Advertises transfer intent and carries minimum material for
        validation and tunnel setup (<xref target="seed-contents"/>).</dd>
        <dt>Consent Object</dt>
        <dd>The receiver-side signed response that echoes the transfer
        identifier and states accept, reject, or request_more.</dd>
        <dt>Transfer-Out Anchor</dt>
        <dd>The sender-side record of initiated transfer. It MUST be
        written before protected content flows.</dd>
        <dt>Transfer-In Anchor</dt>
        <dd>The receiver-side record of received and verified transfer.
        It MUST only be written after integrity verification
        succeeds. It SHOULD reference the corresponding transfer_out
        anchor as its causal parent, so that both halves of a
        cross-device transfer form one causal chain.</dd>
        <dt>Optional Tombstone</dt>
        <dd>An optional finality object recording deactivation or
        succession after transfer.</dd>
        <dt>Handoff Edge</dt>
        <dd>The signed declaration of a carrier change
        (<xref target="handoff"/>).</dd>
        <dt>Receipt</dt>
        <dd>The outcome record of a TAT step (<xref
        target="receipts"/>).</dd>
      </dl>

      <section anchor="seed-contents">
        <name>Minimum Seed Contents</name>
        <t>A Seed Object MUST carry at least:</t>
        <ul>
          <li>the transfer_pair_id;</li>
          <li>a reference to the sender identity and the sender's
          signature verification key, or a fingerprint of it;</li>
          <li>the sender's ephemeral X25519 public key;</li>
          <li>the intended receiver;</li>
          <li>an expiry or freshness indication;</li>
          <li>an algorithm identifier for the tunnel construction;</li>
          <li>a signature by the sender over a canonical encoding of
          all of the above.</li>
        </ul>
        <t>A Seed Object MAY additionally carry a digest of sealed
        content when content accompanies the seed (store-and-forward
        mode). When present, the digest MUST be covered by the seed
        signature, so that the sealed body cannot be spliced under a
        different header.</t>
        <t>Seed fields that are visible in clear are routing and
        recognition hints. They MUST NOT be treated as verified until
        the signature has been checked, and the sender verification
        key MUST be checked against the key registered for the claimed
        sender identity. A key that arrives inside the object it
        authenticates proves internal consistency only, not
        provenance.</t>
      </section>
    </section>

    <section anchor="flow">
      <name>Touch-and-Transfer Flow</name>
      <ol>
        <li>sender generates an ephemeral X25519 keypair and a new
        transfer_pair_id</li>
        <li>sender emits a Seed Object</li>
        <li>receiver validates the seed and performs consent</li>
        <li>receiver emits a signed Consent Object</li>
        <li>sender verifies consent</li>
        <li>sender writes transfer_out</li>
        <li>both sides derive the tunnel key</li>
        <li>encrypted chunks are streamed</li>
        <li>receiver verifies final integrity and writes
        transfer_in</li>
        <li>sender MAY write a tombstone</li>
      </ol>
      <t>A relay or HTTP flow follows the same logical sequence.
      Implementations MUST NOT weaken bilateral consent,
      transfer-pair integrity, or receiver binding merely because the
      transport is not NFC-based.</t>
      <t>Steps 3 to 5 are independent of the carrier and transport.
      Whether the seed travelled by proximity, QR code, relay, or
      local network, the receiver performs the same validation and the
      sender performs the same consent verification.</t>
    </section>

    <section anchor="store-and-forward">
      <name>Store-and-Forward Mode</name>
      <t>When the receiver cannot take part in a live exchange, the
      sender MAY seal content to a static X25519 key that the receiver
      has published for this purpose. In this mode:</t>
      <ol>
        <li>the sender generates a fresh ephemeral X25519 keypair for
        this transfer and performs ECDH against the receiver static
        key;</li>
        <li>the sender derives the tunnel key as in <xref
        target="tunnel"/>, encrypts the content, and binds it to a
        signed seed header that carries the content digest;</li>
        <li>the sender writes transfer_out before releasing the sealed
        carrier to a relay or rendezvous point;</li>
        <li>the receiver collects the carrier and runs the arrival
        stages of <xref target="arrival"/>;</li>
        <li>only after arrival verification and receiver-side consent
        does the receiver open or materialize the content and write
        transfer_in.</li>
      </ol>
      <t>Because content travels before the receiver consents, the
      Bilateral Consent rule (<xref target="validation"/>) applies at
      the point of opening rather than at the point of transmission:
      a receiver MUST NOT open, materialize, or act on store-and-forward
      content before it has verified the carrier and made an explicit
      consent decision. Only the holder of the receiver static key can
      derive the tunnel key, so a carrier delivered to the wrong
      receiver fails authenticated decryption rather than relying on a
      routing check.</t>
      <t>Store-and-forward mode does not provide forward secrecy with
      respect to the receiver static key (<xref target="security"/>).
      Interactive mode SHOULD be preferred when both parties are
      reachable.</t>
    </section>

    <section anchor="tunnel">
      <name>Tunnel Establishment</name>
      <t>TAT seeds are RECOMMENDED to be encoded compactly, for example
      using CBOR <xref target="RFC8949"/>, when the seed must traverse a
      narrow proximity channel.</t>
      <t>TAT RECOMMENDS X25519 for ephemeral ECDH <xref target="RFC7748"/>
      and HKDF-SHA256 <xref target="RFC5869"/> for deriving a per-transfer
      tunnel key and nonce prefix.</t>
      <t>The transfer itself SHOULD use an authenticated encryption
      scheme such as AES-256-GCM <xref target="RFC5116"/>. Chunks MUST
      be sequenced and integrity checked, and the receiver MUST compare
      the final result to the sender's summary before writing
      transfer_in.</t>

      <section anchor="key-schedule">
        <name>Key Schedule</name>
        <t>When X25519, HKDF-SHA256, and AES-256-GCM are used, the
        tunnel material is derived as follows, where shared is the
        X25519 shared secret and tpid is the transfer_pair_id encoded
        as an octet string:</t>
        <artwork><![CDATA[
tunnel_key   = HKDF-SHA256(IKM = shared, salt = tpid,
                           info = "AInternet-Airdrop-Tunnel-v1",
                           L = 32)
nonce_prefix = HKDF-SHA256(IKM = shared, salt = tpid,
                           info = "AInternet-Airdrop-Tunnel-v1"
                                  || 0x01,
                           L = 8)
nonce(i)     = nonce_prefix || uint32_be(i)      ; 12 octets
ciphertext_i = AES-256-GCM(tunnel_key, nonce(i), chunk_i,
                           aad = tpid)
]]></artwork>
        <t>The info strings are protocol constants. Implementations
        that need a different construction MUST use a different
        algorithm identifier in the seed rather than reuse these
        labels.</t>
        <t>The following requirements apply:</t>
        <ul>
          <li>The ephemeral X25519 key MUST be freshly generated for
          each transfer. Because the salt is the transfer_pair_id, a
          reused ephemeral key combined with a reused transfer_pair_id
          would reproduce the same key and nonce sequence.</li>
          <li>The transfer_pair_id MUST be unique per transfer. An
          implementation that derives it from a longer-lived
          identifier, such as a lane identifier, relies entirely on
          ephemeral key freshness for key separation and SHOULD instead
          generate a random transfer_pair_id.</li>
          <li>A chunk index MUST NOT be used twice under the same
          tunnel key. A transfer MUST NOT exceed 2^32 chunks.</li>
          <li>The transfer_pair_id MUST be bound as associated data to
          every chunk, so that a chunk cannot be moved between
          transfers.</li>
        </ul>
      </section>

      <section anchor="chunking">
        <name>Chunk Topology and Final Summary</name>
        <t>When a logical object is split into chunks, each chunk entry
        MUST identify the logical object it belongs to, its index, the
        total number of chunks, and a digest of the whole reassembled
        object. Before any chunk is released to the consumer, the
        receiver MUST verify that, for each logical object:</t>
        <ul>
          <li>the set of indices is exactly 0 to total-1, with no gaps
          and no duplicates;</li>
          <li>the declared total and the whole-object digest are
          identical across all chunks of that object;</li>
          <li>the declared total is not zero.</li>
        </ul>
        <t>The receiver MUST verify the reassembled object against the
        whole-object digest before the object becomes visible at its
        final location. A failed reassembly MUST NOT leave partial
        output in place. A receiver MAY verify incrementally, folding
        each chunk into a running digest, so that the whole object
        never needs to be held in memory at once.</t>
        <t>Per-chunk integrity and the whole-object digest answer
        different questions: the first that each chunk is unaltered,
        the second that the right chunks were assembled in the right
        order. Both are REQUIRED before transfer_in is written.</t>
      </section>
    </section>

    <section anchor="arrival">
      <name>Arrival and Admission</name>
      <t>Arrival is not admission. A receiver or rendezvous point MAY
      accept sealed bytes without reading them, but before the content
      is opened or acted upon, the receiver MUST evaluate the
      following stages in order:</t>
      <ol>
        <li><strong>Format</strong>: the carrier is recognized as a
        sealed carrier of a supported format and version.</li>
        <li><strong>Integrity</strong>: the carrier's signatures and
        per-block or per-chunk integrity verify.</li>
        <li><strong>Policy</strong>: the claimed sender identity
        resolves, is not revoked, and its registered verification key
        equals the key that signed the carrier; the intended receiver
        named in the carrier matches the receiver evaluating it.</li>
        <li><strong>Trace</strong>: the outcome is recorded as a
        receipt, with a reference to the sender's transfer_out anchor
        when the carrier names one.</li>
      </ol>
      <t>A failure at any stage MUST result in refusal. A refused
      carrier SHOULD be retained for forensic inspection, separate from
      accepted material. Retention of a refused carrier is a storage
      outcome; it MUST NOT be presented or interpreted as a pending
      review or as a hold on the sender.</t>
      <t>An integrity check that holds establishes who produced the
      carrier and that its blocks belong to it. It does not establish
      that the producer key was current at the causal point of
      production. Implementations MUST NOT report a carrier as trusted
      on the strength of producer binding alone. A carrier that
      declares a producer binding which then fails MUST be treated as
      worse than a carrier that declares none, because the binding was
      meant to hold.</t>
    </section>

    <section anchor="handoff">
      <name>Carrier Change and Handoff Edges</name>
      <t>A transfer, or the task it belongs to, may need to continue
      under a different carrier: a different device, actor, or
      runtime. The fact that a new carrier holds the same input bytes
      MUST NOT by itself be taken as evidence that it may continue.
      TAT separates three questions and evaluates them in order:</t>
      <ol>
        <li><strong>Carrier change</strong>: did the carrier change,
        and does an edge declare that change? Outcomes are
        <tt>same</tt>, <tt>declared</tt>, and <tt>undeclared</tt>. An
        unnamed carrier on either side is <tt>undeclared</tt>, never
        <tt>same</tt>. An edge that names a different pair of actors
        than the observed change does not declare it.</li>
        <li><strong>Edge validity</strong>: does the declaring edge
        hold? Outcomes are <tt>valid</tt>, <tt>invalid</tt>, and
        <tt>unprovable</tt>.</li>
        <li><strong>Branch liveness</strong>: is the branch the edge
        departs from still live? Outcomes are <tt>same_epoch</tt>,
        <tt>declared_forward</tt>, <tt>stale_branch</tt>,
        <tt>dead_parent</tt>, and <tt>unknown</tt>.</li>
      </ol>
      <t>A <tt>declared</tt> carrier change is not a valid one; it is a
      change that can now be judged. An undeclared carrier change
      MUST be treated as unknown continuity and MUST NOT be silently
      retried under the new carrier.</t>

      <section anchor="edge-fields">
        <name>Handoff Edge Fields</name>
        <t>A Handoff Edge MUST carry: <tt>from</tt>, <tt>to</tt>,
        <tt>task_root</tt>, <tt>carry_parent</tt>,
        <tt>predecessor_receipt_id</tt>, <tt>remaining_scope</tt>,
        <tt>nonce</tt>, <tt>freshness</tt>, and <tt>signature</tt>. An
        edge that omits any of these is <tt>unprovable</tt>. An empty
        <tt>remaining_scope</tt> is a valid declaration that nothing is
        handed on; only an absent field is undeclared.</t>
        <t>An edge is <tt>invalid</tt> when any of the following
        holds:</t>
        <ul>
          <li>its <tt>from</tt> and <tt>to</tt> do not match the
          observed carrier change;</li>
          <li>its <tt>task_root</tt> differs from the task being
          carried (a handoff moves a carrier within a task; it does not
          move the task);</li>
          <li>its <tt>carry_parent</tt> differs from the current
          carry;</li>
          <li>its <tt>predecessor_receipt_id</tt> differs from the
          receipt the new carrier claims to continue;</li>
          <li><tt>remaining_scope</tt> contains anything the current
          carry did not hold, or the new carrier asks for anything
          <tt>remaining_scope</tt> does not contain;</li>
          <li>its nonce has been spent before;</li>
          <li>its signature does not verify.</li>
        </ul>
        <t>An edge is <tt>unprovable</tt> when a required check cannot
        be performed, for example because no replay ledger or no
        verification key is available. Unprovable is never a pass.</t>
        <t>The signature covers at least task_root, carry_parent,
        from, to, and nonce. Ed25519 <xref target="RFC8032"/> is
        RECOMMENDED.</t>
      </section>

      <section anchor="edge-rules">
        <name>Handoff Rules</name>
        <ul>
          <li>Only a <tt>valid</tt> edge on a branch whose liveness is
          <tt>same_epoch</tt> or <tt>declared_forward</tt> MAY open a
          continuation under the new carrier. Neither
          <tt>invalid</tt> nor <tt>unprovable</tt> MAY degrade into
          continuation.</li>
          <li>Opening a continuation is not admission. The new carrier
          MUST obtain a fresh admission before it acts; authority is
          not inherited across a carrier change.</li>
          <li>A handoff MAY pass on or narrow the scope of the carry. It
          MUST NOT widen it.</li>
          <li>Nonces MUST be claimed atomically: checking that a nonce
          is unused and recording it as spent MUST happen as one
          exclusive operation, and the record MUST survive process
          restarts. A replay ledger that cannot be read in full MUST be
          treated as unable to show that a nonce is unused.</li>
          <li>A later stage MUST NOT rescue an earlier refusal. A valid
          edge does not revive a revoked or tombstoned parent.</li>
          <li>Branch liveness is causal, not wall-clock. Silence does
          not age a branch; an intervening reseed, revocation, or fork
          does. A timeout MAY trigger a liveness check but MUST NOT be
          the liveness verdict. A parent that closed ungracefully is
          <tt>unknown</tt> until recovery evidence exists.</li>
        </ul>
        <t>A carrier change is distinct from a change of transport
        lane. Moving the same carrier's bytes from one lane to another
        does not require a Handoff Edge; moving the transfer to a
        different carrier does.</t>
      </section>
    </section>

    <section anchor="receipts">
      <name>Receipts</name>
      <t>Every TAT decision step (consent, arrival, admission, and
      handoff) SHOULD produce a receipt, and a refusal MUST produce one
      whenever an acceptance at the same step would. A system that
      records only what it allowed cannot answer what it turned
      away.</t>
      <t>A receipt MUST distinguish its own absence. Implementations
      MUST NOT encode the following three situations with the same
      value:</t>
      <ul>
        <li>no receipt was required;</li>
        <li>a receipt was required and was not attempted;</li>
        <li>a receipt was attempted and its production was refused.</li>
      </ul>
      <t>A refused receipt is not an absent receipt. When receipt
      production is refused, the implementation SHOULD record the
      refusing layer and its stated reason next to the empty receipt,
      and SHOULD attribute the refusal only as far as the reason
      supports, rather than to the nearest plausible layer. The
      underlying decision stands; consumers that require a verifiable
      receipt remain fail-closed.</t>
      <t>A receipt SHOULD name the decider separately from the signer.
      The signer attests that it evaluated a specific input at a
      specific point; the decider is the evaluation that reached the
      outcome. A single field carrying both invites a signing key to
      be read as a source of authority. Inputs that the decider
      received but did not read SHOULD be listed as such.</t>
      <t>Fields copied into a receipt from an unverified carrier MUST be
      marked as claimed, and a receipt for a refusal MUST NOT grant,
      restore, or promote anything.</t>
    </section>

    <section anchor="validation">
      <name>Validation Rules</name>
      <ol>
        <li>
          <t><strong>Bilateral Consent</strong>: a sender MUST NOT begin
          protected content transfer before an explicit receiver-side
          consent has been verified. In store-and-forward mode, the
          receiver MUST NOT open or act on content before its own
          consent decision (<xref target="store-and-forward"/>).</t>
        </li>
        <li>
          <t><strong>Seed Authenticity</strong>: the receiver MUST verify the
          seed signature, fingerprint, and transfer identifier before
          producing consent, and MUST check the sender verification key
          against the key registered for the claimed sender.</t>
        </li>
        <li>
          <t><strong>Transfer-Pair Consistency</strong>: the same transfer_pair_id
          MUST appear in the initiating seed, the receiver consent, the
          sender transfer_out anchor, and the receiver transfer_in
          anchor.</t>
        </li>
        <li>
          <t><strong>Stream Integrity</strong>: the receiver MUST verify the
          stream integrity, chunk topology, and final content summary
          before writing transfer_in (<xref target="chunking"/>).</t>
        </li>
        <li>
          <t><strong>Mutual Anchoring</strong>: the sender MUST write
          transfer_out before content flow, and the receiver MUST write
          transfer_in only after successful verification.</t>
        </li>
        <li>
          <t><strong>Post-Transfer Finality</strong>: if a sender claims
          deactivation or succession, this MUST be represented by an
          explicit tombstone or equivalent finality object rather than
          by silent deletion alone.</t>
        </li>
        <li>
          <t><strong>Arrival Is Not Admission</strong>: arrival and
          relay custody MUST NOT be treated as admission (<xref
          target="arrival"/>).</t>
        </li>
        <li>
          <t><strong>Carrier Change</strong>: a change of carrier MUST be
          declared by a valid Handoff Edge on a live branch, and the new
          carrier MUST be admitted fresh (<xref target="handoff"/>).</t>
        </li>
        <li>
          <t><strong>Fail-Closed Unknowns</strong>: a check that could
          not be performed MUST NOT be reported as a passed check.</t>
        </li>
      </ol>
    </section>

    <section anchor="relationship">
      <name>Relationship to CEP, TIBET, SSM, ICC, and IDDrop</name>
      <t>TAT is lower than IDDrop, complementary to SSM, orthogonal to
      ICC or TZA/TBZ sealed object semantics, and anchored by but not
      identical to TIBET causal truth.</t>
      <t>CEP <xref target="CEP"/> is the umbrella continuity model, TAT
      is the generic handoff and transfer profile, and IDDrop <xref
      target="IDDROP"/> is an identity-transfer application profile
      over TAT.</t>
      <ul>
        <li>TIBET decides causal truth</li>
        <li>TAT carries the handoff</li>
        <li>ICC or TZA seals the object</li>
        <li>SSM makes the outer surface routable</li>
        <li>IDDrop decides identity-transfer semantics above TAT</li>
      </ul>
      <t>A sealed carrier format answers whether its binding holds. The
      receiver answers whether the carrier may be admitted. TAT keeps
      these apart: a carrier format that refused on policy would impose
      one consumer's judgement on every other consumer.</t>
    </section>

    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>[RFC Editor: please remove this section, and the reference to
      RFC 7942, before publication.]</t>
      <t>This section records the status of known implementations of
      the protocol defined by this specification at the time of
      posting of this Internet-Draft, and is based on a proposal
      described in <xref target="RFC7942"/>. The description of
      implementations in this section is intended to assist the IETF
      in its decision processes in progressing drafts to RFCs. Please
      note that the listing of any individual implementation here does
      not imply endorsement by the IETF. Furthermore, no effort has
      been spent to verify the information presented here that was
      supplied by IETF contributors. This is not intended as, and must
      not be construed to be, a catalog of available implementations
      or their features. Readers are advised to note that other
      implementations may exist.</t>
      <t>According to RFC 7942, "this will allow reviewers and working
      groups to assign due consideration to documents that have the
      benefit of running code, which may serve as evidence of valuable
      experimentation and feedback that have made the implemented
      protocols more mature. It is up to the individual working groups
      to use this information as they see fit".</t>

      <section anchor="impl-humotica">
        <name>Humotica Reference Components</name>
        <dl>
          <dt>Organization</dt>
          <dd>Humotica.</dd>
          <dt>Description</dt>
          <dd>Components of TAT exist across several Humotica code
          bases: the AInternet-in-a-Box appliance, a TBZ sealed-archive
          toolchain, and an arrival gate for a rendezvous inbox. They
          are not yet presented as one guarded TAT transfer flow; there
          is no single component that drives seed, consent,
          transfer_out, streaming, and transfer_in end to end as
          specified in <xref target="flow"/>. This is an open
          item.</dd>
          <dt>Implemented</dt>
          <dd>
            <ul>
              <li>Tunnel key schedule of <xref target="key-schedule"/>
              (X25519, HKDF-SHA256 with transfer_pair_id as salt, an
              8-octet nonce prefix followed by a 32-bit big-endian chunk
              index, AES-256-GCM).</li>
              <li>A store-and-forward sealed offer: ephemeral-to-static
              X25519, a plaintext header signed with Ed25519 and bound
              to the sealed body by digest, and decryption failure for
              any key other than the intended receiver's. In this path
              the transfer_pair_id is derived from a lane identifier,
              which is the case <xref target="key-schedule"/> now
              discourages.</li>
              <li>Chunk topology preflight and incremental whole-object
              verification with no partial output on failure (<xref
              target="chunking"/>).</li>
              <li>An arrival gate running format, integrity, policy,
              and trace stages, with registered-key binding of the
              sender, receiver match, revocation check, retention of
              refused carriers, and an arrival record that references
              the sender's transfer_out token as causal parent (<xref
              target="arrival"/>).</li>
              <li>Carrier change, Handoff Edge validity, and branch
              liveness as separate predicates, composed at a single
              call site that verifies signatures against a node key,
              claims nonces atomically in a durable ledger, writes a
              receipt for every outcome, and marks every opened
              continuation as still requiring fresh admission (<xref
              target="handoff"/>).</li>
              <li>Receipts that record a refused receipt production
              distinctly from an absent one, receipts that name signer
              and decider in separate fields, and append-only refusal
              receipts whose copied fields are marked as claimed (<xref
              target="receipts"/>).</li>
            </ul>
          </dd>
          <dt>Not implemented</dt>
          <dd>The interactive Consent Object exchange and interactive
          mode as one flow (an ephemeral-to-ephemeral derivation exists
          as a primitive, but no component drives the exchange around
          it); a tombstone written
          as part of a transfer; and a key-currentness check at the
          causal point of production.</dd>
          <dt>Maturity</dt>
          <dd>Development. Each component listed has its own tests; no
          interoperability testing with independent implementations has
          taken place.</dd>
          <dt>Licensing</dt>
          <dd>The TBZ toolchain is available under MIT or Apache-2.0.
          The AInternet-in-a-Box node is available under
          AGPL-3.0-or-later.</dd>
          <dt>Contact</dt>
          <dd>Jasper van de Meent, info@humotica.com.</dd>
          <dt>Last updated</dt>
          <dd>29 October 2026.</dd>
        </dl>
      </section>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>TAT is designed to reduce ambiguity in sealed handoff, but
      several security properties depend on correct composition.
      Physical proximity alone is insufficient without explicit
      consent. Transport confidentiality is insufficient without mutual
      anchoring. Transfer success is insufficient without final
      integrity checks. Silent deletion is insufficient as proof of
      retirement.</t>
      <t>Implementations SHOULD surface fingerprint, sender identity,
      or equivalent trust hints before consent. Implementations MUST
      treat transfer_pair_id reuse as suspicious. Replayed or stale
      consent responses MUST be rejected.</t>
      <t><strong>Key and nonce reuse.</strong> The key schedule in
      <xref target="key-schedule"/> is safe only if the pair of
      ephemeral key and transfer_pair_id never repeats and no chunk
      index repeats under one key. AES-GCM nonce reuse breaks both
      confidentiality and integrity.</t>
      <t><strong>Store-and-forward.</strong> Compromise of a receiver
      static key exposes every carrier sealed to it that an attacker
      has stored. Receivers SHOULD rotate static keys and SHOULD NOT
      reuse the static key as an identity signing key. Relays see
      header fields in clear; senders SHOULD keep those fields to what
      routing and recognition require.</t>
      <t><strong>Self-asserted keys.</strong> A verification key
      carried inside the object it verifies proves only internal
      consistency. Binding to a registered key for the claimed
      identity is what prevents sender spoofing.</t>
      <t><strong>Carrier change.</strong> Treating identical input
      bytes, or an unchecked edge, as permission for a new carrier is a
      privilege-inheritance path. The rules in <xref
      target="edge-rules"/> exist to close it. A durable, atomically
      claimed replay ledger is required because a replay that crosses a
      restart is still a replay.</t>
      <t><strong>Liveness.</strong> A signed and unreplayed edge can
      still point at a revoked or superseded parent. Liveness MUST be
      checked separately, and an unreadable revocation or epoch state
      MUST be treated as unknown, not as live.</t>
      <t><strong>Receipts as attack surface.</strong> Refusal receipts
      record content an attacker controls. Fields copied from an
      unverified carrier MUST NOT be executed, dereferenced, or used as
      lookup keys outside the receiver's own store.</t>
      <t><strong>Ambiguous absence.</strong> Collapsing "not required",
      "not attempted", and "refused" into one empty value causes
      operators to misread a correct refusal as a missing step, and to
      repair the wrong layer.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="Scott Bradner"/>
          <date month="March" year="1997"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
      </reference>
      <reference anchor="RFC5116" target="https://www.rfc-editor.org/info/rfc5116">
        <front>
          <title>An Interface and Algorithms for Authenticated Encryption</title>
          <author initials="D." surname="McGrew" fullname="David McGrew"/>
          <date month="January" year="2008"/>
        </front>
        <seriesInfo name="RFC" value="5116"/>
      </reference>
      <reference anchor="RFC5869" target="https://www.rfc-editor.org/info/rfc5869">
        <front>
          <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
          <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk"/>
          <author initials="P." surname="Eronen" fullname="Pasi Eronen"/>
          <date month="May" year="2010"/>
        </front>
        <seriesInfo name="RFC" value="5869"/>
      </reference>
      <reference anchor="RFC7748" target="https://www.rfc-editor.org/info/rfc7748">
        <front>
          <title>Elliptic Curves for Security</title>
          <author initials="A." surname="Langley" fullname="Adam Langley"/>
          <author initials="M." surname="Hamburg" fullname="Mike Hamburg"/>
          <author initials="S." surname="Turner" fullname="Sean Turner"/>
          <date month="January" year="2016"/>
        </front>
        <seriesInfo name="RFC" value="7748"/>
      </reference>
      <reference anchor="RFC8032" target="https://www.rfc-editor.org/info/rfc8032">
        <front>
          <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
          <author initials="S." surname="Josefsson" fullname="Simon Josefsson"/>
          <author initials="I." surname="Liusvaara" fullname="Ilari Liusvaara"/>
          <date month="January" year="2017"/>
        </front>
        <seriesInfo name="RFC" value="8032"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba" fullname="Barry Leiba"/>
          <date month="May" year="2017"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
      </reference>
      <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
        <front>
          <title>Concise Binary Object Representation (CBOR)</title>
          <author initials="C." surname="Bormann" fullname="Carsten Bormann"/>
          <author initials="P." surname="Hoffman" fullname="Paul Hoffman"/>
          <date month="December" year="2020"/>
        </front>
        <seriesInfo name="STD" value="94"/>
        <seriesInfo name="RFC" value="8949"/>
      </reference>
    </references>

    <references>
      <name>Informative References</name>
      <reference anchor="RFC7942" target="https://www.rfc-editor.org/info/rfc7942">
        <front>
          <title>Improving Awareness of Running Code: The Implementation Status Section</title>
          <author initials="Y." surname="Sheffer" fullname="Yaron Sheffer"/>
          <author initials="A." surname="Farrel" fullname="Adrian Farrel"/>
          <date month="July" year="2016"/>
        </front>
        <seriesInfo name="BCP" value="205"/>
        <seriesInfo name="RFC" value="7942"/>
      </reference>
      <reference anchor="CAUSAL">
        <front>
          <title>TIBET Causal Time</title>
          <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
          <date month="May" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-tibet-causal-time-02"/>
      </reference>
      <reference anchor="SSM">
        <front>
          <title>TIBET Semantic Surface Manifest</title>
          <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
          <date month="May" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-tibet-semantic-surface-manifest-02"/>
      </reference>
      <reference anchor="CEP">
        <front>
          <title>Continuity Envelope</title>
          <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
          <date month="May" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-continuity-envelope-00"/>
      </reference>
      <reference anchor="IDDROP">
        <front>
          <title>IDDrop</title>
          <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
          <date month="May" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-iddrop-00"/>
      </reference>
    </references>

    <section anchor="changes" numbered="false">
      <name>Changes from -00</name>
      <ul>
        <li>Abstract: added carrier change to the scope summary.</li>
        <li>Introduction: added a paragraph explaining the scope of this
        revision.</li>
        <li>Terminology: added Carrier, Handoff Edge, Arrival, Admission,
        Receipt, and Decider.</li>
        <li>Protocol Overview: added cross-references to CAUSAL and SSM;
        defined interactive and store-and-forward modes; stated that
        relay custody is not delivery and delivery is not consent.</li>
        <li>TAT Objects: transfer_in SHOULD reference transfer_out as
        causal parent; added Handoff Edge and Receipt objects; new
        subsection Minimum Seed Contents, including registered-key
        binding and digest binding of sealed content.</li>
        <li>Touch-and-Transfer Flow: stated that steps 3 to 5 are
        independent of carrier and transport.</li>
        <li>New section Store-and-Forward Mode.</li>
        <li>Tunnel Establishment: added the CBOR reference; new
        subsection Key Schedule (HKDF salt, info labels, nonce
        construction, associated data, freshness and uniqueness
        requirements, chunk limit); new subsection Chunk Topology and
        Final Summary.</li>
        <li>New section Arrival and Admission.</li>
        <li>New section Carrier Change and Handoff Edges, with Handoff
        Edge Fields and Handoff Rules.</li>
        <li>New section Receipts.</li>
        <li>Validation Rules: extended Bilateral Consent for
        store-and-forward, Seed Authenticity with registered-key
        binding, and Stream Integrity with chunk topology; added rules
        7 (Arrival Is Not Admission), 8 (Carrier Change), and 9
        (Fail-Closed Unknowns).</li>
        <li>Relationship section: added CEP and IDDrop references and a
        paragraph on carrier format versus receiver admission.</li>
        <li>New section Implementation Status per RFC 7942.</li>
        <li>Security Considerations: added key and nonce reuse,
        store-and-forward, self-asserted keys, carrier change, liveness,
        receipts as attack surface, and ambiguous absence.</li>
        <li>References: added RFC 8032 (normative) and RFC 7942
        (informative); RFC 8949, CAUSAL, SSM, CEP, and IDDROP are now
        cited from the text.</li>
        <li>Added Acknowledgments.</li>
        <li>Updated docName and date.</li>
      </ul>
    </section>

    <section anchor="acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>The author thanks Root AI (Claude, Anthropic) and Codex for
      co-design of the handoff, arrival, and receipt rules in this
      revision, and for review of the reference components.</t>
    </section>
  </back>
</rfc>
