<?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="info"
     docName="draft-vandemeent-continuity-envelope-01"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     version="3">

  <front>
    <title abbrev="CEP">Continuity Envelope Protocol</title>
    <seriesInfo name="Internet-Draft"
                value="draft-vandemeent-continuity-envelope-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>continuity messaging</keyword>
    <keyword>continuity envelope</keyword>
    <keyword>sealed handoff</keyword>
    <keyword>causal continuity</keyword>
    <keyword>AInternet</keyword>

    <abstract>
      <t>This document defines the Continuity Envelope Protocol (CEP), a
      transport-agnostic protocol model for identity-bound messaging
      systems where delivery alone is not sufficient.</t>
      <t>CEP separates a visible envelope surface from sealed internal
      object truth and defines how receivers determine whether a
      delivered object may safely and legitimately continue. The protocol
      distinguishes between control-plane notification, data-plane object
      carriage, and decision-plane continuation handling. It further
      distinguishes a refused result from an absent one and from an
      unknown one, and requires that continuation decisions and refusals
      leave receipts.</t>
      <t>CEP is the umbrella model for companion drafts such as TIBET
      TAT, which specifies generic sealed handoff and transfer flow,
      and IDDrop, which profiles that handoff model for identity
      transfer.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Classical messaging protocols are primarily optimized for
      delivery. For cross-host agents, sealed artifact exchange, and
      resumable automation, delivery is necessary but insufficient.
      Delivery establishes that bytes arrived; it does not establish
      that the object they carry may continue.</t>
      <t>CEP defines how visible surfaces, sealed truth, and continuation
      decisions relate across transport fabrics. It is designed to be
      used alongside agent naming <xref target="AINS"/>, identity <xref
      target="JIS"/>, provenance tokens <xref target="TIBET"/>, and
      semantic surface manifests <xref target="SSM"/>, but does not
      depend on any of them normatively.</t>
      <section anchor="scope">
        <name>Scope</name>
        <t>This document defines the separation between control-plane
        notification, data-plane carriage, and decision-plane
        continuation handling; the role of the Continuity Envelope as a
        visible routing surface; the distinction between envelope
        reference, presence, verification, and continuation approval;
        the distinction between refused, absent, and unknown results;
        receipts for continuation decisions and for refusals; how
        continuity history is read; layered time semantics and drift
        handling; continuity across restart of a participating runtime;
        and a common vocabulary for causality and continuation
        outcomes.</t>
        <t>This document does not define a single mandatory wire format,
        a single mandatory transport binding, a specific cryptographic
        primitive suite, or a universal trust-scoring algorithm.</t>
        <t>Instead, this document provides the architectural frame into
        which companion drafts fit: TIBET TAT <xref target="TAT"/>
        defines the generic touch-and-transfer and relay handoff
        protocol, while IDDrop <xref target="IDDROP"/> defines an
        identity-transfer profile over that handoff model.</t>
      </section>
    </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>Continuity Messaging</dt>
        <dd>A messaging model in which the exchanged unit is a continuity
        step rather than delivery alone.</dd>
        <dt>Continuity Envelope</dt>
        <dd>The visible routing and operator-facing surface associated
        with an object handoff.</dd>
        <dt>Envelope Reference</dt>
        <dd>A control-plane pointer to an object, without implying byte
        possession or verification.</dd>
        <dt>Sealed Truth</dt>
        <dd>The normative internal object state carried through
        manifests, signatures, mirrored fields, and causal claims.</dd>
        <dt>Continuation Decision</dt>
        <dd>The decision-plane result that determines whether, and how,
        a delivered object may progress. Its values are listed in <xref
        target="continuation-decision-table"/>.</dd>
        <dt>Receipt</dt>
        <dd>A record that a decision or effect took place, produced by
        the party that made the decision or observed the effect, and
        verifiable under local policy.</dd>
        <dt>Receipt Attempt</dt>
        <dd>A record that a receipt was required and its production was
        attempted but did not yield a verifiable receipt.</dd>
        <dt>Refusal Record</dt>
        <dd>A record kept by a receiver that it refused an inbound
        object, stating what was refused and why. A refusal record grants
        nothing.</dd>
        <dt>Continuity History</dt>
        <dd>An append-only, hash-linked sequence of records (decisions,
        outcomes, lifecycle events) from which a reader derives the
        current state of a continuity relationship.</dd>
        <dt>Strict Reader</dt>
        <dd>A reader of continuity history that returns a result only
        when the whole history it read verifies, and otherwise returns
        "unknown".</dd>
        <dt>Lenient Reader</dt>
        <dd>A reader of continuity history that tolerates defects such as
        unreadable or unlinked records, for example by skipping them.</dd>
        <dt>Consumer</dt>
        <dd>The component that reads a produced record and acts on it,
        renders it, or decides on it.</dd>
      </dl>
    </section>

    <section anchor="architecture">
      <name>Architectural Model</name>
      <section anchor="control-plane">
        <name>Control Plane</name>
        <t>The control plane carries notification and lightweight
        exchange metadata. Control-plane data MUST NOT be interpreted as
        proof that the receiver possesses or has verified the underlying
        object bytes unless such proof is explicitly encoded.</t>
      </section>
      <section anchor="data-plane">
        <name>Data Plane</name>
        <t>The data plane carries the continuity-bearing object itself.
        Examples include local file drop, relay-carried sealed object,
        peer-to-peer artifact transfer, and object fetched by
        reference.</t>
        <t>An object in transit MAY be mutable, but it SHOULD become
        visible to a consumer only once complete: a sender SHOULD publish
        an object under its final name or reference atomically (for
        example, by writing to a temporary name and renaming), and a
        consumer SHOULD NOT inspect or act on an object before that
        publication. A partially written object is neither present nor
        absent; it is not yet published.</t>
        <t>A drop location is a delivery point, not an archive. Where
        history of handled objects is needed, it SHOULD be kept as
        receipts separate from the delivery point, so that a delivery
        point does not silently become a queue of stale objects.</t>
      </section>
      <section anchor="decision-plane">
        <name>Decision Plane</name>
        <t>The decision plane evaluates whether continuation is
        legitimate and safe. The decision plane MUST treat sealed truth
        as authoritative where conflict exists.</t>
        <t>A component that only carries or places an object MUST NOT
        add to, or weaken, a decision made elsewhere. If it carries a
        decision, it SHOULD carry the decision record unchanged.</t>
      </section>
    </section>

    <section anchor="problem">
      <name>Problem Statement</name>
      <t>In mailbox-centered systems, a successful delivery event is
      frequently treated as the end of the transport problem. In
      continuity-bearing systems, delivery is only one stage.</t>
      <t>Several failure classes appear after arrival, including
      divergence between transport metadata and sealed truth, visible
      names that overclaim object identity, control-plane references
      without local bytes, disagreement between time fragments across
      layers, stale or replayed continuity, and missing or invalid
      causal parentage.</t>
      <t>Implementation experience (<xref target="impl-status"/>) added
      further classes: a correct refusal that leaves no trace, so that a
      null receipt cannot be told apart from a receipt that was never
      needed; a permission that is still acted on after it has aged in
      transit; a damaged history that a tolerant reader presents as
      shorter rather than as damaged; and records that are produced but
      that no component reads, so that their existence implies an effect
      that does not happen.</t>
    </section>

    <section anchor="envelope-semantics">
      <name>Continuity Envelope Semantics</name>
      <t>The Continuity Envelope provides a visible routing surface for
      operator readability, sorting, grouping, routing hints, freshness
      hints, priority hints, and continuity diagnostics.</t>
      <t>The envelope surface is not the final source of truth. CEP
      therefore adopts the principle: name is hint, content is
      truth.</t>
      <section anchor="surface-shape">
        <name>Surface Shape</name>
        <sourcecode type="text"><![CDATA[
<time-fragment>.<context>.<profile>.<priority>[.<extension>]
]]></sourcecode>
      </section>
      <section anchor="surface-abnf">
        <name>ABNF</name>
        <t>The following ABNF, using the notation of <xref target="RFC5234"/>,
        defines a conservative baseline grammar for version 1 envelope
        surfaces:</t>
        <sourcecode type="abnf"><![CDATA[
surface-name    = time-fragment "." context "." profile "." priority
                  [ "." extension ]

time-fragment   = compact-time / dashed-time / date-only
compact-time    = 8DIGIT "t" 6DIGIT "z"
dashed-time     = 4DIGIT "-" 2DIGIT "-" 2DIGIT "t"
                  2DIGIT "-" 2DIGIT "-" 2DIGIT "z"
date-only       = 4DIGIT "-" 2DIGIT "-" 2DIGIT

context         = 1*48(segment-char)
profile         = 1*48(segment-char)
priority        = 1*32(segment-char)
extension       = 1*48(segment-char)

segment-char    = LCALPHA / DIGIT / "-"
LCALPHA         = %x61-7A
DIGIT           = %x30-39
]]></sourcecode>
      </section>
      <section anchor="surface-policy">
        <name>Character and Length Policy</name>
        <t>For portability and operator safety, implementations SHOULD
        prefer lowercase ASCII, dot-delimited segments, and per-segment
        characters from <tt>[a-z0-9-]</tt>. Implementations SHOULD
        reject or normalize spaces, shell metacharacters, empty
        segments, and path separators.</t>
        <t>Implementations SHOULD also apply conservative operational
        limits. Representative values are a total surface length of 180
        characters or less, hard rejection above 200 characters, a
        preferred segment length of 32 characters or less, and a segment
        upper bound of 48 characters.</t>
      </section>
    </section>

    <section anchor="sealed-truth">
      <name>Sealed Object Truth</name>
      <t>The sealed object carries the normative internal state. This MAY
      include manifest data, mirrored surface fields, integrity digests,
      signature data, sealed time fields, causal parentage fields, and
      schema or version identifiers.</t>
      <t>If the envelope surface and sealed truth disagree, the sealed
      truth MUST be treated as authoritative for object identity, while
      the mismatch SHOULD be surfaced as a continuity signal.</t>
      <section anchor="schema-identity">
        <name>Schema Identity</name>
        <t>Control-plane metadata and sealed manifest schema identifiers
        SHOULD be consistent for the same object handoff. An
        implementation receiving a mismatch MAY triage the object,
        downgrade trust, request resynchronization, or continue under
        local policy if the mismatch is understood and bounded.</t>
      </section>
      <section anchor="consistency-authenticity">
        <name>Consistency Is Not Authenticity</name>
        <t>Where signatures in a sealed object are verified against
        public keys carried in that same object, a successful check
        establishes that the object is internally consistent. It does not
        establish that the keys belong to the parties they name; a
        self-consistent forgery passes the same check. An implementation
        SHOULD report such a result as internal consistency and MUST NOT
        report it as authentication unless the keys were bound to the
        parties by a separate, independently verified means (for example
        an identity layer such as <xref target="JIS"/>).</t>
      </section>
    </section>

    <section anchor="verification-states">
      <name>Verification States</name>
      <t>CEP requires verification to be layered. These states MUST NOT
      be collapsed into a single generic "verified" signal when their
      meanings differ.</t>
      <section anchor="progress-states">
        <name>Progress States</name>
        <t>Progress states record how far verification of an object has
        advanced. They are ordered; each implies the ones above it in
        <xref target="verification-state-table"/>.</t>
        <table anchor="verification-state-table">
          <name>Progress States</name>
          <thead>
            <tr><th>State</th><th>Meaning</th></tr>
          </thead>
          <tbody>
            <tr><td>referenced</td><td>Control plane carries a pointer only</td></tr>
            <tr><td>present</td><td>Receiver possesses bytes locally</td></tr>
            <tr><td>digest-matched</td><td>Observed digest matches expected digest</td></tr>
            <tr><td>container-verified</td><td>Container structure and integrity verified</td></tr>
            <tr><td>manifest-verified</td><td>Manifest semantics and mirrored fields validated</td></tr>
            <tr><td>continuation-approved</td><td>Object may safely continue under policy</td></tr>
          </tbody>
        </table>
      </section>
      <section anchor="non-progress-states">
        <name>Non-Progress States</name>
        <t>Version -00 listed only progress states, which left a reader
        with one way to express that verification did not advance: the
        absence of a higher state. That absence covers three different
        facts. CEP therefore defines three non-progress states, which
        MUST be kept distinct from each other and from the progress
        states.</t>
        <table anchor="non-progress-state-table">
          <name>Non-Progress States</name>
          <thead>
            <tr><th>State</th><th>Meaning</th></tr>
          </thead>
          <tbody>
            <tr><td>absent</td><td>The reader looked where the object or
            record must be and found none. This is a measurement.</td></tr>
            <tr><td>refused</td><td>A check was performed and the object
            did not pass it, or the checking component refused to produce
            a result. The reason is recorded.</td></tr>
            <tr><td>unknown</td><td>The reader could not determine the
            state: the bytes or history were unreadable or did not
            verify, or the component needed to check them was
            unavailable.</td></tr>
          </tbody>
        </table>
        <t>A non-progress state SHOULD name the progress state at which
        verification stopped (for example, "refused at
        manifest-verified") and SHOULD carry a reason.</t>
      </section>
      <section anchor="verification-rules">
        <name>Rules</name>
        <ul>
          <li>An implementation MUST NOT report "unknown" as "absent".
          "Absent" states that something was looked for and is not
          there; "unknown" states that the looking did not succeed.</li>
          <li>An implementation MUST NOT treat "unknown" as permitting
          continuation. Unknown opens nothing.</li>
          <li>Signatures or digests that were carried but not checked
          (for example, because the verifier could not be loaded) MUST
          be reported as "unknown", not as "absent" and not as a progress
          state. Carried is not checked.</li>
          <li>Where no check was performed at all, an implementation
          SHOULD say so explicitly rather than leave the field empty; an
          unmeasured result is fail-closed, but it is not a
          refusal.</li>
        </ul>
      </section>
    </section>

    <section anchor="causality">
      <name>Causality and Continuation</name>
      <t>CEP treats causal legitimacy as distinct from delivery. An
      object MAY be successfully delivered but still fail continuation
      checks if causal parentage is missing, points to an unknown or
      invalid predecessor, policy forbids progression from the observed
      lineage, or drift exceeds acceptable thresholds.</t>
      <table anchor="continuation-decision-table">
        <name>Recommended Continuation Outcomes</name>
        <thead>
          <tr><th>Outcome</th><th>Meaning</th></tr>
        </thead>
        <tbody>
          <tr><td>continue</td><td>Progression is allowed</td></tr>
          <tr><td>triage</td><td>Further inspection is required</td></tr>
          <tr><td>fork</td><td>Progression continues along a branch</td></tr>
          <tr><td>quarantine</td><td>Object is isolated pending policy review</td></tr>
          <tr><td>resync</td><td>Fresh alignment is required before continuation</td></tr>
          <tr><td>refuse</td><td>Progression is denied and the refusal is recorded</td></tr>
        </tbody>
      </table>
      <section anchor="forward-only">
        <name>Forward-Only History and Forks</name>
        <t>Continuity history is forward-only. Records SHOULD NOT be
        deleted or rewritten. A change of state, including a correction
        or a revocation, SHOULD be expressed as a new record that refers
        to the record it supersedes.</t>
        <t>A revocation closes a branch. Continuing after a revocation is
        a fork: a new branch that refers to the closed one. Records on
        the closed branch remain valid as history; what ends is the
        ability to act further on that branch.</t>
        <t>A party whose signing key has been lost cannot sign the
        revocation of its own relationship. Where one party therefore
        closes a branch alone, the record MUST describe itself as
        unilateral and MUST NOT be presented as a bilateral
        supersession. A unilateral fork records the local party's own
        state; it imposes nothing on the peer and grants nothing to a
        successor, which requires its own fresh establishment.</t>
      </section>
      <section anchor="ordering">
        <name>Ordering Is Not Descent</name>
        <t>When a reader must determine which of several decisions is the
        newer one (for example, a grant and a later revocation), the
        order SHOULD be taken from a causal sequence assigned under a
        shared write boundary (for example, a sequence number assigned
        under a lock held by all writers, or position in a hash-linked
        history). Wall-clock timestamps, file order, and content
        pointers that other writers also move MUST NOT be the sole basis
        for that order.</t>
        <t>A hash link to the previous record proves the order in which
        records were written. It does not prove that a step consumed, or
        was caused by, the record before it. A continuation claim that
        depends on a specific predecessor SHOULD name that predecessor
        and the subject it concerns explicitly, rather than rely on
        adjacency in the history.</t>
      </section>
      <section anchor="decision-and-outcome">
        <name>Decision and Outcome</name>
        <t>A continuation decision and the effect that follows it are
        separate facts and SHOULD be recorded separately. The outcome
        record SHOULD state whether the effect was executed, failed, or
        never took place, and SHOULD refer to the decision it acts on by
        that decision's own record reference rather than by a value
        recomputed later.</t>
        <t>If a writer cannot determine whether an effect took place, the
        outcome is uncertain. A reader MUST treat an uncertain outcome as
        unresolved, not as success and not as failure.</t>
      </section>
    </section>

    <section anchor="receipts">
      <name>Receipts and Refusals</name>
      <section anchor="receipt-absence">
        <name>Qualified Absence of a Receipt</name>
        <t>A decision record without a receipt can mean three different
        things: no receipt was needed; a receipt was needed and its
        production was never attempted; or a receipt was needed, its
        production was attempted, and the producing layer refused. A
        single null field cannot carry these three facts.</t>
        <t>When a receipt is required and its production is attempted
        but refused, the implementation SHOULD record a Receipt Attempt
        beside the absent receipt. The receipt field itself SHOULD
        remain empty, because nothing verifiable was produced. The
        Receipt Attempt SHOULD contain:</t>
        <ul>
          <li>a state identifying it as a refused production;</li>
          <li>the reason as stated by the refusing layer, preserved
          verbatim (subject to a length limit);</li>
          <li>the component responsible for the refusal, derived from
          the refusal itself, or the value "unattributed" when it cannot
          be derived. An implementation MUST NOT attribute a refusal to a
          guessed component;</li>
          <li>the statements the record does not make: that no receipt
          was needed, that the decision itself was refused, or that a
          precondition of the decision (such as a presence check)
          failed.</li>
        </ul>
        <t>The decision recorded alongside a Receipt Attempt stands.
        Anything downstream that requires a verifiable receipt remains
        fail-closed; the Receipt Attempt makes that state visible but
        does not substitute for the receipt.</t>
      </section>
      <section anchor="refusal-records">
        <name>Refusal Records</name>
        <t>A receiver that refuses an inbound object SHOULD keep a
        Refusal Record. A correct refusal that leaves no trace removes
        the evidence needed later to answer when, and with what, a peer
        stopped verifying.</t>
        <ul>
          <li>A Refusal Record SHOULD be append-only.</li>
          <li>Every field copied from the refused object is a claim by an
          unverified source and SHOULD be labelled as claimed. The record
          proves that something arrived and was refused, not who sent
          it.</li>
          <li>A Refusal Record MUST NOT grant, restore, or promote
          anything, and content copied from the refused object MUST NOT
          be executed, resolved, or used for lookup outside the
          receiver's own store.</li>
          <li>Failure to write a Refusal Record MUST NOT block or reverse
          the refusal.</li>
          <li>Where the refused object carries independently verifiable
          parts (for example, a signature by an account key and a
          separate signature by a runtime key), the record SHOULD report
          the result of each part separately rather than merge them into
          one reason, because the combination can narrow the cause
          (key change, modification in transit, or canonicalization
          drift) without proving it.</li>
        </ul>
      </section>
      <section anchor="consumers">
        <name>Records and Their Consumers</name>
        <t>A record that is produced but read by no consumer can imply an
        effect that does not happen, for example a revocation marker
        that no verifier consults. An implementation that produces a
        continuity record SHOULD identify the consumer that reads it. If
        no consumer exists yet, the producing component SHOULD declare
        that state explicitly (in this document: "awaiting consumer"),
        so that the absence of an effect reads as a declared gap rather
        than as a working mechanism.</t>
        <t>Likewise, an implementation SHOULD declare which states it
        distinguishes and must not merge, and which capabilities are
        deliberately not available, so that a deliberate absence does
        not read as breakage.</t>
      </section>
    </section>

    <section anchor="reading-history">
      <name>Reading Continuity History</name>
      <t>A reader of continuity history SHOULD return one of three
      results:</t>
      <dl>
        <dt>clean</dt>
        <dd>The history exists and every record verifies: each record
        parses, each carries the link to its predecessor, and each
        matches its own integrity value. The reader returns the
        records.</dd>
        <dt>absent</dt>
        <dd>No history exists at the expected location.</dd>
        <dt>unknown</dt>
        <dd>The history exists but could not be read or does not verify.
        The reader returns the reason, not records.</dd>
      </dl>
      <t>A broken history is unknown, not empty and not shorter. A reader
      used for a continuation decision, or for any decision that grants
      or withdraws authority, MUST be a strict reader. A lenient reader
      MAY be used for display or diagnostics, but its result MUST NOT be
      used to grant or continue: a lenient reader that skips an
      unreadable record can drop a withdrawal and thereby make an
      earlier approval appear to stand again.</t>
      <t>A strict reader SHOULD verify the same bytes it returns, rather
      than verify once and read again. A final record that is not yet
      completely written MAY be excluded from a read-only view, provided
      the remaining prefix itself verifies; a strict reader that holds
      the writer's lock SHOULD instead report an incomplete final record
      as unknown.</t>
      <t>Where several readers interpret the same history, they SHOULD
      reach the same verdict on the same defect. In particular, a
      history whose writer never produces an empty predecessor link
      after the first record MUST NOT be read as having been
      legitimately restarted at such a link.</t>
    </section>

    <section anchor="time-drift">
      <name>Time and Drift</name>
      <t>CEP treats time as layered rather than singular. Envelope time
      SHOULD be treated as a grouping hint, freshness hint, operator
      readability signal, and early drift indicator. It MUST NOT be
      treated as the sole authority for continuity legitimacy.</t>
      <t>Sealed internal time fields carry the object's normative time
      claims. Causal order is authoritative for continuation
      legitimacy.</t>
      <section anchor="window-kinds">
        <name>Kinds of Windows</name>
        <t>Implementations use time windows for several purposes, and a
        single "time to live" field tends to hide which one is meant. CEP
        distinguishes the following:</t>
        <dl>
          <dt>Physical-world windows</dt>
          <dd>A window that measures a fact about the physical world,
          such as whether a human was present within the last few
          minutes. A wall-clock window is appropriate here.</dd>
          <dt>Continuity-state windows</dt>
          <dd>A window applied to the state of a history or ledger. The
          state of continuity history is ordered causally; a wall-clock
          expiry applied to it SHOULD NOT be used to decide continuation.
          Ordering follows <xref target="ordering"/>.</dd>
          <dt>Handoff windows</dt>
          <dd>A window whose expiry opens a different path, for example
          offering the same step on another carrier. A handoff window
          SHOULD name its handoff target and SHOULD declare what is
          preserved across the handoff. A window that names no target is
          an expiry, not a handoff. A handoff SHOULD be taken only after
          the original channel was measured as not answering, and the
          new carrier's admission is fresh, not inherited from the
          original channel.</dd>
          <dt>Open questions</dt>
          <dd>A pending decision awaiting a party is not a window. It
          does not age and does not expire. Escalation of an open
          question SHOULD be triggered by a measured lack of response on
          its channel, not by its age.</dd>
        </dl>
        <t>A window that is too short can silently select a different
        carrier or path than the one the owner chose. Window lengths
        SHOULD be chosen with the slowest legitimate path in mind, and a
        fallback taken because a window lapsed SHOULD be recorded as
        such.</t>
      </section>
      <section anchor="permission-aging">
        <name>Permissions in Transit</name>
        <t>A decision that permits an effect is evidence that the
        decision was made at a given point, not a permission that is
        valid whenever it is read. When a permission is carried to a
        consumer through a delivery point, its freshness SHOULD be
        checked when it is placed and MUST be checked again when the
        consumer picks it up. Otherwise a consumer that resumes after a
        pause can act on permissions that expired while waiting.
        Implementations SHOULD persist the request, not the
        permission.</t>
      </section>
    </section>

    <section anchor="restart">
      <name>Restart and Runtime Continuity</name>
      <section anchor="boot-branch">
        <name>Resume or Reseed</name>
        <t>When a participating node restarts, it SHOULD decide
        explicitly whether to resume its previous continuity state or to
        reseed (start a new runtime state while retaining history). The
        decision SHOULD be based on recorded evidence of how the previous
        run ended:</t>
        <ul>
          <li>If the previous run recorded a graceful close, the node MAY
          resume.</li>
          <li>If no closing record exists, the node SHOULD reseed. The
          absence of a closing record is itself evidence that the end was
          not chosen; it MUST NOT be filled in retroactively.</li>
          <li>If the node has no identity, there is nothing to resume or
          reseed, and the decision SHOULD say so.</li>
        </ul>
        <t>The decision SHOULD produce a receipt that names the branch
        taken, the reason, and the head of the continuity history at the
        time of the decision. The component that decides SHOULD NOT also
        consume the evidence it decided on, when another component
        performs the actual resumption.</t>
      </section>
      <section anchor="runtime-reattest">
        <name>Runtime Re-attestation</name>
        <t>Continuity relationships between parties SHOULD be bound to
        long-lived parties (accounts) rather than to the runtime instances
        that currently represent them, with a separate, short-lived
        attestation binding the current runtime to the relationship. A
        break retires the runtime, not the account.</t>
        <ul>
          <li>A runtime attestation SHOULD be signed both by the account
          key and by the runtime key, and SHOULD carry a freshness
          bound.</li>
          <li>A verifier that knows the current runtime MUST refuse an
          attestation for any other runtime as a replay.</li>
          <li>After a reseed, a node MAY issue a fresh runtime
          attestation for each surviving relationship without modifying
          the signed relationship and without a new handshake with the
          peer. It MUST NOT do so for an account that has been revoked.
          It SHOULD record a receipt listing which relationships were
          refreshed, skipped, or refused, so that a reader can explain a
          relationship that remains unusable.</li>
          <li>A relationship SHOULD name the surfaces it covers. A
          request on a surface outside that set SHOULD be refused with a
          reason that says so, rather than reported as an absent
          relationship.</li>
        </ul>
      </section>
    </section>

    <section anchor="transport-bindings">
      <name>Transport Bindings</name>
      <t>CEP is transport-agnostic. Possible bindings include local file
      drop, peer-to-peer delivery, relay-based object transfer,
      control-plane notification over message protocols, object fetch by
      reference, and future bridge transports.</t>
      <section anchor="companion-drafts">
        <name>Companion Transfer and Application Drafts</name>
        <t>CEP is intended to be read together with companion drafts
        when a concrete transfer or application profile is needed.</t>
        <t>In particular, TIBET TAT defines how a consent-bound sealed
        handoff is executed across proximity, relay, or local network
        paths, and IDDrop defines how identity claims are offered,
        requested, validated, and materialized over that handoff
        substrate.</t>
        <t>CEP therefore acts as the umbrella model: CEP says how
        continuity-bearing messaging is structured, TAT says how a
        sealed transfer happens, and IDDrop says how identity transfer
        happens over TAT.</t>
      </section>
    </section>

    <section anchor="examples">
      <name>Examples</name>
      <t>Field names in these examples are illustrative.</t>
      <section anchor="example-control-plane">
        <name>Example Control-Plane Notification</name>
        <sourcecode type="json"><![CDATA[
{
  "from_agent": "jasper",
  "to_agent": "codex",
  "poll_type": "PUSH",
  "metadata": {
    "envelope_name": "20260514t064148z.message.jasper.normal.tza",
    "envelope_ref": "/var/lib/tibet/inbox/20260514t064148z.message.jasper.normal.tza",
    "schema": "aint-send-v2",
    "verification_state": "referenced"
  }
}
]]></sourcecode>
      </section>
      <section anchor="example-sealed-truth">
        <name>Example Sealed Manifest Fields</name>
        <sourcecode type="json"><![CDATA[
{
  "schema": "aint-send-v2",
  "surface_time_fragment": "20260514t064148z",
  "surface_context": "message",
  "surface_profile": "jasper",
  "surface_priority": "normal",
  "sealed_created_at": "2026-05-14T06:41:48.207135+00:00",
  "content_digest": "sha256:b5ca11489ffadc4438a3815a0d7ea3bc88836dbc2f5951b1e9d7800d784aa675",
  "causal_parent": null
}
]]></sourcecode>
      </section>
      <section anchor="example-non-progress">
        <name>Example Non-Progress State</name>
        <sourcecode type="json"><![CDATA[
{
  "verification_state": "unknown",
  "stopped_at": "manifest-verified",
  "reason": "verifier unavailable; signatures carried, not checked"
}
]]></sourcecode>
      </section>
      <section anchor="example-receipt-attempt">
        <name>Example Decision with Receipt Attempt</name>
        <sourcecode type="json"><![CDATA[
{
  "decision": "continue",
  "decision_ref": "9f2c41d07ab3e655",
  "receipt": null,
  "receipt_attempt": {
    "state": "receipt_refused_by_minter",
    "owner": "unattributed",
    "reason": "ValueError: unknown axis 'example'",
    "is_not": [
      "no receipt was needed",
      "the proposal or item was refused",
      "the human presence failed"
    ]
  }
}
]]></sourcecode>
      </section>
      <section anchor="example-refusal-record">
        <name>Example Refusal Record</name>
        <sourcecode type="json"><![CDATA[
{
  "kind": "refusal-record",
  "at": 1789000000,
  "refused_by": "sync-receive",
  "reason": "bad-runtime-account-signature",
  "grants_nothing": true,
  "claimed_relation_id": "rel-0123456789abcdef",
  "claimed_account": "peer.example",
  "claimed_runtime_pubkey": "4f1e...",
  "signature_halves": {"runtime": "valid", "account": "invalid"}
}
]]></sourcecode>
      </section>
    </section>

    <section anchor="interop">
      <name>Interoperability Considerations</name>
      <t>To remain interoperable, CEP implementations SHOULD preserve
      predictable envelope grammars, separate reference from
      verification states, expose mismatches rather than hiding them,
      converge schema identity across control and sealed planes, and
      support both operator readability and machine normalization.</t>
      <t>In addition, implementations SHOULD carry the non-progress
      states "absent", "refused", and "unknown" as distinct values on the
      wire, SHOULD carry a Receipt Attempt rather than a bare null where a
      required receipt could not be produced, and SHOULD agree on how a
      damaged continuity history is classified (<xref
      target="reading-history"/>), since two readers that disagree on
      whether a history is intact will disagree on whether an object may
      continue.</t>
    </section>

    <section anchor="impl-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 <xref target="RFC7942"/>, "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-iab">
        <name>AInternet-in-a-Box</name>
        <dl>
          <dt>Organization:</dt>
          <dd>Humotica</dd>
          <dt>Description:</dt>
          <dd>A self-hosted node runtime for identity-bound agents. It
          implements the decision-plane and history-reading aspects of
          this document; it does not implement the envelope surface
          grammar of <xref target="envelope-semantics"/> as a distinct
          component.</dd>
          <dt>Maturity:</dt>
          <dd>Pre-release development code (0.4.0-dev / 0.5.0 line),
          Python.</dd>
          <dt>Coverage:</dt>
          <dd>
            <ul>
              <li>Strict reading of hash-linked history with the results
              clean, absent, and unknown, verifying the same bytes it
              returns (<xref target="reading-history"/>).</li>
              <li>A strict reader for authority decisions, introduced
              after review found that a lenient reader skipping an
              unreadable record allowed a withdrawn approval to appear
              live again (<xref target="reading-history"/>).</li>
              <li>A test that writes real histories with exactly one
              defect each and records where strict and lenient readers in
              the same code base disagree; the disagreements are tracked
              as open, expected failures (<xref
              target="reading-history"/>).</li>
              <li>Receipt Attempt beside a null receipt, with owner
              derived from the refusal text and an explicit
              "unattributed" fallback, and the three statements the record
              does not make (<xref target="receipt-absence"/>).</li>
              <li>Append-only refusal records for refused peer
              envelopes, with copied fields labelled as claimed and
              signature halves reported separately (<xref
              target="refusal-records"/>).</li>
              <li>Separate decision and outcome records (executed, failed,
              never) for the same item; a later record that rests on a
              decision names it by that decision's own record reference,
              never by a recomputed value; and journal states whose outcome
              is not known are treated as unresolved (<xref
              target="decision-and-outcome"/>).</li>
              <li>Publication order taken from a sequence assigned under
              a shared lock, not from file order or wall-clock (<xref
              target="ordering"/>).</li>
              <li>Unilateral party forks that leave the earlier
              relationship record untouched and describe themselves as
              unilateral (<xref target="forward-only"/>).</li>
              <li>A boot-time resume-or-reseed decision based on a
              recorded graceful close, with a receipt naming the branch
              and the history head (<xref target="boot-branch"/>).</li>
              <li>Account-scoped relationships with dual-signed,
              freshness-bounded runtime attestations, replay refusal for
              a non-current runtime, surface-scoped routing, and
              re-attestation after reseed with a receipt (<xref
              target="runtime-reattest"/>).</li>
              <li>A distinction between internal consistency and
              authentication when verifying signatures against keys
              carried in the object, and "unknown" (not "absent") when
              the verifier is unavailable (<xref
              target="consistency-authenticity"/>, <xref
              target="verification-rules"/>).</li>
              <li>Atomic publication into a delivery point, re-checking
              of permission freshness, and refusal to place anything
              but an admitted decision (<xref target="data-plane"/>,
              <xref target="permission-aging"/>).</li>
              <li>A classification of time windows into physical-world,
              continuity-state, and handoff windows, and open questions
              without a timer, with a handoff record that names its
              target (<xref target="window-kinds"/>).</li>
              <li>Declared "awaiting consumer" states and declared
              must-not-merge and not-yet-available lists, checked by a
              tool (<xref target="consumers"/>).</li>
            </ul>
          </dd>
          <dt>Experience:</dt>
          <dd>The Receipt Attempt mechanism was added after a correct
          refusal by a receipt-producing layer was observed to be lost,
          leaving a null receipt next to a successful human approval; it
          was then exercised with a real approval on an internal test host
          (September 2026). Runtime re-attestation after reseed was
          exercised between two internal hosts (August 2026). These are
          internal test deployments, not production deployments.</dd>
          <dt>Licensing:</dt>
          <dd>AGPL-3.0-or-later.</dd>
          <dt>Contact:</dt>
          <dd>Jasper van de Meent, info@humotica.com</dd>
        </dl>
      </section>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>A receiver MUST NOT interpret a control-plane reference as proof
      of object integrity unless the referenced object has been acquired
      and verified under local policy.</t>
      <t>Collapsing "unknown" into "absent" or into a progress state turns
      a failure to verify into a result. Implementations MUST fail closed
      on "unknown" (<xref target="verification-rules"/>).</t>
      <t>A lenient reader of continuity history can omit a revocation or
      withdrawal and so revive an earlier grant. Authority decisions MUST
      use a strict reader (<xref target="reading-history"/>). A strict
      reader detects damage to a history but not a writer that rewrites
      the entire history consistently; protection against that requires
      an anchor outside the history, which is out of scope here.</t>
      <t>Refusal Records contain content chosen by the sender of the
      refused object. That content MUST be treated as untrusted data and
      MUST NOT be executed or used to resolve, look up, or compare
      against anything outside the receiver's own store (<xref
      target="refusal-records"/>).</t>
      <t>Verifying signatures against keys carried in the same object
      does not authenticate the signers (<xref
      target="consistency-authenticity"/>).</t>
      <t>A permission that is acted on after it has aged in a delivery
      point permits work that began after the permission had already
      lapsed. Consumers MUST re-check freshness at pickup (<xref
      target="permission-aging"/>).</t>
      <t>Runtime attestations for a runtime that is no longer current
      MUST be refused, so that a retired runtime cannot continue a
      relationship (<xref target="runtime-reattest"/>).</t>
      <t>Records with no consumer can give the appearance of a control
      that is not enforced, for example a revocation marker that no
      verifier reads (<xref target="consumers"/>).</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This version of the document makes no IANA requests.</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="RFC5234" target="https://www.rfc-editor.org/info/rfc5234">
        <front>
          <title>Augmented BNF for Syntax Specifications: ABNF</title>
          <author initials="D." surname="Crocker" fullname="Dave Crocker"/>
          <author initials="P." surname="Overell" fullname="Paul Overell"/>
          <date month="January" year="2008"/>
        </front>
        <seriesInfo name="STD" value="68"/>
        <seriesInfo name="RFC" value="5234"/>
      </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>
    </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="AINS">
        <front>
          <title>AINS: AInternet Name Service</title>
          <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
          <author surname="Root AI" fullname="Root AI"/>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="JIS">
        <front>
          <title>JTel Identity Standard</title>
          <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
          <author surname="Root AI" fullname="Root AI"/>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="TIBET">
        <front>
          <title>Traceable Intent-Based Event Tokens</title>
          <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
          <author surname="Root AI" fullname="Root AI"/>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="SSM">
        <front>
          <title>TIBET Semantic Surface Manifest</title>
          <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="TAT">
        <front>
          <title>TIBET TAT: Touch-and-Transfer Protocol</title>
          <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
          <author surname="Root AI" fullname="Root AI"/>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="IDDROP">
        <front>
          <title>IDDrop: Identity Drop and Acceptance Protocol</title>
          <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
          <author surname="Root AI" fullname="Root AI"/>
          <date year="2026"/>
        </front>
      </reference>
    </references>

    <section anchor="verification-registry">
      <name>Initial Verification-State Registry</name>
      <t>The following values are RECOMMENDED starting points for
      implementation alignment.</t>
      <table anchor="registry-table">
        <name>Verification-State Values</name>
        <thead>
          <tr><th>Value</th><th>Class</th><th>Reference</th></tr>
        </thead>
        <tbody>
          <tr><td><tt>referenced</tt></td><td>progress</td><td><xref target="progress-states"/></td></tr>
          <tr><td><tt>present</tt></td><td>progress</td><td><xref target="progress-states"/></td></tr>
          <tr><td><tt>digest-matched</tt></td><td>progress</td><td><xref target="progress-states"/></td></tr>
          <tr><td><tt>container-verified</tt></td><td>progress</td><td><xref target="progress-states"/></td></tr>
          <tr><td><tt>manifest-verified</tt></td><td>progress</td><td><xref target="progress-states"/></td></tr>
          <tr><td><tt>continuation-approved</tt></td><td>progress</td><td><xref target="progress-states"/></td></tr>
          <tr><td><tt>absent</tt></td><td>non-progress</td><td><xref target="non-progress-states"/></td></tr>
          <tr><td><tt>refused</tt></td><td>non-progress</td><td><xref target="non-progress-states"/></td></tr>
          <tr><td><tt>unknown</tt></td><td>non-progress</td><td><xref target="non-progress-states"/></td></tr>
        </tbody>
      </table>
      <t>The continuation outcomes of <xref
      target="continuation-decision-table"/> (<tt>continue</tt>,
      <tt>triage</tt>, <tt>fork</tt>, <tt>quarantine</tt>,
      <tt>resync</tt>, <tt>refuse</tt>) and the history-reading results
      of <xref target="reading-history"/> (<tt>clean</tt>,
      <tt>absent</tt>, <tt>unknown</tt>) are separate value sets and are
      not verification states.</t>
      <t>Future versions of this document MAY elevate these values into a
      formal registry.</t>
    </section>

    <section anchor="changes">
      <name>Document History</name>
      <t>[RFC Editor: please remove this section before publication.]</t>
      <section anchor="changes-from-00">
        <name>Changes from -00</name>
        <ul>
          <li>Terminology: added Continuation Decision, Receipt, Receipt
          Attempt, Refusal Record, Continuity History, Strict Reader,
          Lenient Reader, and Consumer.</li>
          <li>Data Plane: added atomic publication of delivered objects
          and the distinction between a delivery point and an
          archive.</li>
          <li>Decision Plane: a carrying component does not add to or
          weaken a decision made elsewhere.</li>
          <li>Problem Statement: added failure classes found during
          implementation.</li>
          <li>Sealed Object Truth: new subsection on internal consistency
          versus authenticity.</li>
          <li>Verification States: split into progress states (unchanged
          from -00) and new non-progress states <tt>absent</tt>,
          <tt>refused</tt>, and <tt>unknown</tt>, with rules that keep
          them distinct and fail closed on <tt>unknown</tt>.</li>
          <li>Causality and Continuation: added the <tt>refuse</tt>
          outcome and subsections on forward-only history and forks, on
          ordering versus descent, and on separating decision from
          outcome.</li>
          <li>New section: Receipts and Refusals (qualified absence of a
          receipt, Receipt Attempt, Refusal Records, records and their
          consumers).</li>
          <li>New section: Reading Continuity History (clean, absent,
          unknown; strict and lenient readers).</li>
          <li>Time and Drift: added kinds of windows and the re-check of
          permissions in transit.</li>
          <li>New section: Restart and Runtime Continuity (resume or
          reseed; runtime re-attestation).</li>
          <li>Examples: added a non-progress state, a decision with a
          Receipt Attempt, and a Refusal Record.</li>
          <li>Interoperability and Security Considerations expanded.</li>
          <li>New section: Implementation Status, per RFC 7942.</li>
          <li>Appendix A: registry now lists progress and non-progress
          values and separates them from outcome and reading-result
          values.</li>
          <li>This appendix: renamed from "Changes from -00" (as it was
          titled in -00) to "Document History", with the -00 entry kept
          below.</li>
        </ul>
      </section>
      <section anchor="changes-00">
        <name>Version -00</name>
        <t>Initial version.</t>
      </section>
    </section>

    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This draft emerged from continuityd, TBZ/TZA, AInternet, and
      JIS/TIBET design work across the HumoticaOS stack, including real
      operational feedback from early cross-host continuity handoffs.</t>
    </section>
  </back>
</rfc>
