<?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-tibet-semantic-surface-manifest-03"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     version="3">

  <front>
    <title abbrev="SSM">TIBET Semantic Surface Manifest</title>

    <seriesInfo name="Internet-Draft"
                value="draft-vandemeent-tibet-semantic-surface-manifest-03"/>

    <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>semantic surface</keyword>
    <keyword>routing</keyword>
    <keyword>admission</keyword>
    <keyword>TIBET</keyword>
    <keyword>TBZ</keyword>
    <keyword>sealed containers</keyword>

    <abstract>
      <t>This document defines the Semantic Surface Manifest, a
      human-readable and policy-matchable routing layer for
      identity-bound continuity containers and TBZ-based sealed
      bundles.</t>
      <t>The Semantic Surface Manifest exposes limited dispatch metadata
      such as time fragment, context, profile, and priority without
      exposing sealed content. It is intended for use in systems where
      routing decisions may need to occur before deep inspection, while
      trust remains anchored in intrinsic bundle properties such as magic
      bytes, manifests, hashes, signatures, and causal references.</t>
      <t>This revision separates two decisions that earlier revisions
      left implicit: a routing hint, which may be taken from the visible
      surface before any inspection, and an admission verdict, which must
      never rest on the visible surface.</t>
      <t>In short: address visible, content sealed.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <t>The Semantic Surface Manifest (SSM) gives a sealed object a
      short, readable name that can be used to dispatch it without
      opening it. The name is a hint. What the object is, who produced
      it, and whether it may be acted upon are established from the
      object's intrinsic, verifiable properties.</t>
      <t>This is the -03 revision. Revision -02 added the Sealed
      Authentication Module extension (<xref target="sam-extension"/>)
      as a complement to the Claim-Verified extension
      (<xref target="claim-verified"/>). Revision -03 incorporates what
      was learned from implementing the surface model since May 2026.
      The main additions are: an explicit distinction between routing
      hints and admission verdicts (<xref target="routing-vs-admission"/>);
      a description of the places a surface can be carried and which of
      them count as intrinsic (<xref target="surface-carriage"/>);
      clarifications to the processing model on type recognition, origin
      anchoring, and the order of checks
      (<xref target="processing-model"/>); a Disguised Surface mismatch
      class (<xref target="disguised-surface"/>); guidance for
      self-describing artefacts (<xref target="self-describing"/>); and
      an Implementation Status section (<xref target="impl-status"/>).
      All changes are listed in <xref target="changes-from-02"/>.</t>
    </section>

    <section anchor="requirements-language">
      <name>Requirements Language</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>
    </section>

    <section anchor="problem">
      <name>Problem Statement</name>
      <t>Sealed containers often provide strong integrity but weak
      dispatch semantics.</t>
      <t>Systems therefore face a recurring tradeoff: either encrypt and
      seal everything, delaying routing and policy choice until deep
      inspection, or expose too much metadata, weakening privacy and
      creating new security ambiguities.</t>
      <t>The Semantic Surface Manifest addresses this by providing a
      constrained, readable routing layer that supports dispatch without
      decrypting content, minimizes metadata exposure, does not replace
      cryptographic verification, and composes with existing
      sealed-container workflows.</t>
      <t>A second, quieter problem appears once such a layer exists: a
      readable surface invites being read as a decision. A queue that was
      chosen from a name, or an object that arrived where it was
      expected, can come to be treated as accepted. This document
      therefore states explicitly which decisions a surface may inform
      and which it may not.</t>
    </section>

    <section anchor="terminology">
      <name>Terminology</name>
      <dl>
        <dt>Identity-Bound Continuity Container:</dt>
        <dd>A cryptographically sealed bundle that combines identity
        binding, continuity semantics, and containerized payload
        transfer.</dd>
        <dt>Semantic Surface Manifest:</dt>
        <dd>A human-readable routing surface associated with a bundle,
        typically expressed through filename or object-name structure and
        optionally mirrored into sealed manifest fields.</dd>
        <dt>Intrinsic Truth:</dt>
        <dd>Properties established by the sealed object itself and
        covered by its integrity verification, such as magic bytes,
        manifest, signatures, hashes, and chain anchors. A field is
        intrinsic because verification covers it, not because it is
        located inside the object's bytes; see
        <xref target="surface-carriage"/>.</dd>
        <dt>Extrinsic Surface:</dt>
        <dd>Properties expressed outside the integrity coverage of the
        sealed object for dispatch and routing, such as time fragment,
        context, profile, and priority.</dd>
        <dt>Surface-Integrity Event:</dt>
        <dd>A meaningful mismatch or anomaly involving visible routing
        surface and mirrored sealed routing fields, or between the
        visible surface and the object's recognized type.</dd>
        <dt>Carrier:</dt>
        <dd>The sealed object as it travels, including any visible
        header or name attached to it.</dd>
        <dt>Sidecar Descriptor:</dt>
        <dd>A separate, unsealed record stored or transmitted beside a
        carrier that names its destination, kind, or surface label
        without being part of the carrier's integrity coverage.</dd>
        <dt>Routing Hint:</dt>
        <dd>Any decision input taken from the extrinsic surface, a
        sidecar descriptor, or the transport context, used to select a
        queue, handler, lane, or processing path.</dd>
        <dt>Admission Verdict:</dt>
        <dd>The result of evaluating whether an object may be treated as
        more than opaque bytes at a given consumer: for example, whether
        it may be opened, materialized, registered, or treated as
        identity-bound. An admission verdict is computed from intrinsic
        truth and local policy.</dd>
        <dt>Arrival:</dt>
        <dd>The event of an object being received or stored. Arrival is
        not admission.</dd>
      </dl>
    </section>

    <section anchor="design-goals">
      <name>Design Goals</name>
      <t>The Semantic Surface Manifest is intended to remain
      human-readable, machine-parseable, bounded in disclosure, and
      composable with existing ICC or TBZ verification workflows.</t>
      <t>It should support wildcard or policy matching, align with logs
      and audit ecosystems, and support mirrored sealed fields for
      consistency checks. It must not be treated as proof of identity or
      content, override manifest truth, or carry rich payload
      details.</t>
      <t>It must also not be usable as an admission input: a surface may
      choose where an object goes, never whether it is accepted there.</t>
    </section>

    <section anchor="syntax">
      <name>Syntax</name>
      <t>The normative external form is:</t>
      <sourcecode type="text"><![CDATA[
<time-fragment>.<context>.<profile>.<priority>[.<icc-ext>]
]]></sourcecode>
      <t>The Semantic Surface Manifest is intentionally flat and
      dot-delimited in version 1. The formal grammar uses ABNF as defined
      in <xref target="RFC5234"/>.</t>
      <t>Each segment is restricted to lowercase letters, digits, and
      hyphens. Segments must not contain spaces, slashes, underscores,
      nested dots, or uppercase letters.</t>
      <sourcecode type="abnf"><![CDATA[
surface-name    = time-fragment "." context "." profile "." priority
                  [ "." icc-ext ]

time-fragment   = date-frag [ "t" time-frag "z" ]
date-frag       = 4DIGIT "-" 2DIGIT "-" 2DIGIT
time-frag       = 2DIGIT "-" 2DIGIT
context         = 1*32(segment-char)
profile         = 1*16(segment-char)
priority        = 1*16(segment-char)
icc-ext         = 1*16(segment-char)
segment-char    = LCALPHA / DIGIT / "-"
LCALPHA         = %x61-7A
DIGIT           = %x30-39
]]></sourcecode>
      <t>A name that does not match this grammar is not a version 1
      semantic surface. A parser MUST NOT repair or reinterpret such a
      name into a version 1 surface. Implementations that use a
      different surface grammar are discussed in
      <xref target="other-grammars"/>.</t>
    </section>

    <section anchor="time-fragments">
      <name>Time Fragment Format</name>
      <t>This document prefers an ISO8601-style fragment over compact
      local date forms because it is lexicographically sortable, readable
      across jurisdictions, aligned with logs, and supports both coarse
      and fine routing granularity.</t>
      <t>Two forms are recommended in version 1:</t>
      <sourcecode type="text"><![CDATA[
2026-05-08
2026-05-08t18-38z
]]></sourcecode>
    </section>

    <section anchor="vocabulary">
      <name>Vocabulary Registries</name>
      <section anchor="profile-registry">
        <name>Profile Registry</name>
        <t>Initial profile values include claude, gemini, gpt, kit,
        iddrop, parentattest, capsule, and tza. These values describe
        semantic class, not vendor authenticity.</t>
        <t>An implementation MAY use a profile value as an expectation
        that the object is a sealed container (for example, treating a
        name whose final segment is a registered profile as one that
        should carry container magic bytes). Such an expectation is a
        routing hint; when it is not met, the result is a
        surface-integrity event (<xref target="disguised-surface"/>),
        not a type determination.</t>
      </section>
      <section anchor="priority-registry">
        <name>Priority Registry</name>
        <t>Initial priority values include urgent, normal, background,
        and sealed.</t>
      </section>
      <section anchor="context-field">
        <name>Context</name>
        <t>The context field remains open-text in version 1 but is
        expected to be short, low-leakage, and ABNF-conforming.</t>
      </section>
      <section anchor="unknown-values">
        <name>Unknown Values</name>
        <t>A profile, priority, or other surface value that a processor
        does not recognize MUST NOT be mapped by default onto a class or
        handling level that carries more capability than the processor
        would give an object with no surface at all. A fallback may
        degrade handling; it may not elevate it.</t>
      </section>
    </section>

    <section anchor="surface-carriage">
      <name>Surface Carriage</name>
      <t>A semantic surface can travel with an object in several places.
      The place determines how much it can be relied upon.</t>
      <dl>
        <dt>Object name:</dt>
        <dd>The filename or object-store key. Any party that can rename
        the object can change it. A receiver may also rename an object
        on arrival (for example, naming a landed carrier by its content
        hash), so the original name need not survive transport.</dd>
        <dt>Sidecar descriptor:</dt>
        <dd>A separate record next to the carrier (for example, a small
        JSON document naming destination, kind, and surface label) that
        a forwarder can read without unsealing the carrier. It is as
        mutable as the object name.</dd>
        <dt>In-band header outside integrity coverage:</dt>
        <dd>Bytes inside the carrier, such as a format header field or
        a declared payload class, that are not covered by the
        signature, hash, or AEAD authentication that protects the
        payload. Although physically inside the object, these are
        extrinsic surface.</dd>
        <dt>In-band header inside integrity coverage:</dt>
        <dd>A visible header that is itself signed, or whose signature
        and body hash bind it to the sealed payload. This is readable
        before decryption and, once the binding has been verified, is
        intrinsic truth.</dd>
        <dt>Mirrored sealed fields:</dt>
        <dd>Surface fields repeated inside the sealed manifest
        (<xref target="mirrored-fields"/>). These are intrinsic once the
        container has been verified and are the durable copy of the
        surface.</dd>
      </dl>
      <t>An implementation MUST classify each surface location it reads
      according to whether its integrity verification covers that
      location, and MUST treat locations outside that coverage as
      extrinsic surface, wherever they are physically stored. A format
      that places surface or classification bytes in a header SHOULD
      either bring them under the integrity mechanism or document them
      as extrinsic.</t>
    </section>

    <section anchor="processing-model">
      <name>Processing Model</name>
      <section anchor="surface-parse">
        <name>Surface Parse</name>
        <t>A compliant implementation MAY parse the semantic surface
        before opening the bundle in order to choose a queue, handler,
        retention policy, or operator lane. The result of a surface
        parse is a routing hint (<xref target="routing-vs-admission"/>).</t>
      </section>
      <section anchor="type-sniff">
        <name>Type Sniff</name>
        <t>An implementation SHOULD verify container type using
        intrinsic signals such as TBZ magic bytes before deep
        handling.</t>
        <t>Type recognition SHOULD identify the container family from
        its magic bytes independently of the format version that
        follows them, so that a newer version of a known family is
        reported as a version the reader does not handle rather than as
        a non-container.</t>
        <t>If the visible surface implies a sealed container and the
        magic bytes do not match, the object MUST NOT be routed or
        handled as a sealed container; this is a Disguised Surface
        (<xref target="disguised-surface"/>). Conversely, an object
        whose magic bytes identify a sealed container SHOULD be handled
        as one regardless of its name or extension; a renamed carrier is
        still a carrier.</t>
        <t>Magic bytes establish type, not origin or integrity. A matching
        prefix is necessary for treating an object as a sealed container
        and is never sufficient for admitting it.</t>
        <t>Implementations that observe a directory or queue SHOULD NOT
        sniff an object while it is still being written. Writers SHOULD
        write to a temporary name and rename the object into place when
        complete.</t>
      </section>
      <section anchor="deep-verification">
        <name>Deep Verification</name>
        <t>Before trust-sensitive operations, an implementation MUST
        verify the sealed container according to its intrinsic integrity
        rules.</t>
        <t>A signature that verifies under a public key carried inside
        the same object establishes internal consistency only. Origin is
        established by comparing that key with a key anchored outside the
        object, such as a trust store, a name-service record, or a key
        the consumer already holds. An implementation MUST NOT treat a
        key carried inside an object as an authority by virtue of being
        carried there.</t>
        <t>Whether the producer's key was current (not rotated, not
        revoked) at the relevant point is a separate question from
        whether the signature verifies. An implementation that does not
        evaluate key currentness SHOULD NOT describe a verified object as
        "trusted", and SHOULD use a term that states only what was
        measured (for example, "producer bound").</t>
        <t>If the reader cannot perform verification at all (for example,
        because the available tooling predates the container version, or
        the verification component cannot be loaded), the result MUST be
        treated as unprovable and MUST NOT default to acceptance.</t>
      </section>
      <section anchor="admission">
        <name>Admission</name>
        <t>After deep verification, a consumer decides whether the object
        may be admitted at that consumer: opened, materialized,
        registered, or treated as identity-bound. The admission verdict
        is computed from intrinsic truth and local policy only. The
        semantic surface, sidecar descriptors, and any in-band header
        outside integrity coverage MUST NOT contribute to it.</t>
        <t>This document does not define a verdict vocabulary. An
        implementation SHOULD, however, keep at least the following
        outcomes distinct, because each leads to a different next
        action:</t>
        <ul>
          <li>bound: the declared bindings verify; the object may be
          admitted subject to local policy;</li>
          <li>carried: the object declares no binding and none is broken;
          it may be stored and forwarded but not treated as
          identity-bound;</li>
          <li>refused: a declared binding fails, or bound and unbound
          parts are mixed;</li>
          <li>unprovable: a binding could not be evaluated either
          way.</li>
        </ul>
        <t>An object whose declared binding fails verification MUST NOT
        be treated more favourably than an object that declares no
        binding. The absence of a claim and an unverifiable claim MUST
        NOT be collapsed into the same outcome.</t>
      </section>
      <section anchor="surface-consistency">
        <name>Surface-to-Manifest Consistency</name>
        <t>If the sealed manifest contains mirrored surface fields, the
        implementation SHOULD compare them against the external semantic
        surface. Meaningful mismatch SHOULD be treated as a
        surface-integrity event leading to triage, quarantine, or policy
        review rather than silent acceptance.</t>
        <t>The comparison SHOULD be made after deep verification, against
        verified mirrored fields. A comparison made against unverified
        fields is itself only a hint. Where a sidecar descriptor carries
        a surface label in addition to the object name, the descriptor
        label SHOULD also be compared with the mirrored fields.</t>
        <t>A mismatch on an object that otherwise verifies does not by
        itself invalidate the object; it means the visible surface is
        not a reliable description of it. Whether such an object is
        delivered with a flag, held for triage, or refused is a policy
        decision (<xref target="mismatch"/>). It MUST NOT be accepted
        silently.</t>
      </section>
      <section anchor="recorded-disposition">
        <name>Recorded Disposition</name>
        <t>When a type sniff, verification, or admission step declines to
        proceed with an object, the implementation SHOULD record a
        disposition with a reason (for example, refused, quarantined,
        held for triage, or ignored as an incomplete write). Recording
        an arrival and then returning without any disposition makes an
        undecided object indistinguishable from a handled one.</t>
      </section>
    </section>

    <section anchor="routing-vs-admission">
      <name>Routing Hints and Admission Verdicts</name>
      <t>Routing and admission are different decisions with different
      inputs.</t>
      <ul>
        <li>Routing MAY happen before any inspection and MAY use the
        semantic surface, sidecar descriptors, and transport context.</li>
        <li>Admission MUST be based on intrinsic truth and local policy,
        and MUST NOT rest on the visible surface.</li>
      </ul>
      <t>A forwarder or relay can therefore be content-blind: it can
      check that an object carries the expected container magic bytes,
      read a destination from a descriptor, and pass the bytes on
      without opening them. Doing so is arrival and transport, not
      admission. Storing and forwarding a sealed object MAY occur without
      an admission verdict; treating it as identity-bound MUST NOT.</t>
      <t>A routing hint can also take the form of an expectation, for
      example a signed statement by a predecessor that a particular
      successor is expected, or a surface pattern that a consumer has
      been told to watch for. A matched expectation MAY select a faster
      processing path. It MUST NOT substitute for, or upgrade, an
      admission verdict. An expectation narrows what is acceptable; it
      does not grant acceptance. When admission fails and an
      expectation matched, the reason reported SHOULD name the failed
      admission, so that operators do not repair the expectation in
      place of the object.</t>
      <t>If a declared expectation is itself checked and fails, the
      result SHOULD be treated as refused even if admission succeeded,
      because the expectation was stated by a party entitled to restrict
      what follows it.</t>
    </section>

    <section anchor="mirrored-fields">
      <name>Mirrored Manifest Fields</name>
      <t>This document defines optional mirrored manifest fields such as
      surface_time_fragment, surface_context, surface_profile, and
      surface_priority.</t>
      <t>If both an external semantic surface and internal mirrored
      fields are present, the mirrored fields are authoritative for
      triage classification and deep semantic handling.</t>
      <t>Because names can change in transit and on arrival, an
      implementation MAY reconstruct the canonical surface name from the
      verified mirrored fields and compare it with the name under which
      the object was found. A difference SHOULD be recorded with both
      names, so that an operator rename is explicit rather than silent.
      A recorded rename of an otherwise consistent object is a Cosmetic
      Mismatch (<xref target="cosmetic-mismatch"/>).</t>
    </section>

    <section anchor="example">
      <name>Example</name>
      <t>Example external surface:</t>
      <sourcecode type="text"><![CDATA[
2026-05-08.redspecter-review.claude.urgent
]]></sourcecode>
      <t>Processing may route to an urgent queue, classify as a candidate
      profile, verify TBZ magic bytes, inspect the manifest, verify
      signatures and hashes, compare visible and sealed surface, and only
      then hand to a profile-aware handler if consistent or
      policy-approved.</t>
      <t>The steps divide as follows. Choosing the urgent queue and the
      candidate profile are routing hints. Verifying magic bytes is type
      recognition. Verifying signatures and hashes, and comparing the
      signer's key with an externally anchored key, produce the inputs
      to admission. Handing the object to a profile-aware handler is the
      admitted action. If the object is renamed in transit, for example
      to a name chosen for the recipient, the routing hint changes but
      none of the later steps do.</t>
    </section>

    <section anchor="mismatch">
      <name>Mismatch Classes</name>
      <section anchor="cosmetic-mismatch">
        <name>Cosmetic Mismatch</name>
        <t>A visible label changes while sealed truth remains intact.
        Recommended disposition is triage with manifest semantics
        prevailing.</t>
      </section>
      <section anchor="routing-risk">
        <name>Routing-Risk Mismatch</name>
        <t>A visible profile and a sealed profile differ in a way that
        creates significant misrouting risk. Recommended disposition is
        triage or quarantine, not auto-materialization.</t>
        <t>Examples include a visible surface that names a different
        sender or recipient than the sealed fields, a visible priority
        or flag that disagrees with the sealed value, a sealed routing
        field (such as a lane) that the visible surface omits, and a
        declared payload class that disagrees with the content (for
        example, executable entries inside an object declared as a
        document).</t>
      </section>
      <section anchor="disguised-surface">
        <name>Disguised Surface</name>
        <t>The visible surface implies a sealed container (for example,
        through a registered profile or a container extension), but the
        object does not carry the container's magic bytes. The object
        MUST NOT be routed, stored, or handled as a sealed container.
        Recommended disposition is refusal at a forwarder and triage or
        quarantine at a consumer.</t>
      </section>
      <section anchor="no-mirrored-fields">
        <name>No Mirrored Fields</name>
        <t>Legacy bundles may provide visible routing only, yielding a
        reduced-assurance mode because no sealed-surface comparison is
        possible.</t>
      </section>
    </section>

    <section anchor="self-describing">
      <name>Self-Describing Artefacts</name>
      <t>The surface model applies beyond bundles in transit. Any
      artefact that declares what it is (a tool descriptor, a capability
      manifest, a sealed result) presents a surface, and the same rule
      holds: the declaration is a hint until it is admitted.</t>
      <t>This allows an operation to be expressed against an object
      without opening it. The verb expresses intent; the magic bytes
      establish type; admission establishes whether the verb may act on
      the object; and the semantic surface is where verb and object meet.
      An implementation may, for example, refuse a verb against an
      object whose recognized class it does not permit, before any
      content is unpacked.</t>
      <t>For self-describing artefacts the following guidance
      applies.</t>
      <ul>
        <li>The existence of a file is not the existence of the thing it
        describes. A descriptor found in a location that is read for
        such descriptors SHOULD remain inert (not registered, not
        loaded, not offered as usable) until it is admitted.</li>
        <li>A surface the artefact declares about itself SHOULD be
        checked against the internal fields it summarizes (for example,
        a declared surface that must embed the artefact's own name). A
        disagreement is a reason to reject the artefact.</li>
        <li>Admission SHOULD rest on an anchor outside the artefact,
        such as a release-signed hash manifest that pins the artefact's
        digest, or a receipt issued locally by an authorized party and
        bound to that digest. Write access to the location is not such
        an anchor.</li>
        <li>The artefact SHOULD be read once, within a size bound, and
        the bytes that were judged SHOULD be the bytes that are used. A
        consumer that re-opens the artefact by path after admission
        reintroduces a time-of-check to time-of-use gap.</li>
        <li>An artefact that is not admitted SHOULD remain available for
        inspection, separate from usable artefacts, rather than being
        silently discarded.</li>
      </ul>
    </section>

    <section anchor="claim-verified">
      <name>Claim-Verified Extension (Privacy-Preserving Policy Answers)</name>
      <t>This section defines an OPTIONAL extension to the SSM that allows
      a sealed envelope to carry a privacy-preserving policy answer such
      as an age-gate verification, without disclosing the underlying
      personal data used to derive that answer.</t>
      <t>The Claim-Verified Extension is intended for challenge-response
      flows where: a verifier (e.g. a merchant) MUST be assured that a
      rule is satisfied (e.g. "user is age 18 or older"); a responder
      (e.g. a wallet on a Secure Enclave smartphone) holds the personal
      data needed to evaluate the rule locally; and neither side wishes
      to transmit the personal data itself.</t>

      <section anchor="claim-verified-goal">
        <name>Design goal</name>
        <t>A response envelope using this extension answers: did this
        challenge satisfy the requested rule. It explicitly does NOT
        answer: who the person is, what their exact birth date is, what
        document number they carry, or any other personal payload.</t>
      </section>

      <section anchor="claim-verified-challenge">
        <name>Challenge envelope fields</name>
        <t>The verifier issues a challenge as a sealed envelope carrying
        the following fields. Required: intent (policy intent, e.g.
        "verify_age"); threshold (rule parameter, e.g. 18); reply_to
        (verifier address as AINS or JIS-DID); challenge_nonce (opaque
        per-challenge random value); challenge_hash (sha256 of canonical
        challenge material). Optional: valid_until (expiry timestamp,
        RFC3339); policy_domain (e.g. "age-gate"); jurisdiction (country
        or policy-scope identifier); evidence_class (e.g.
        "minimal-disclosure").</t>
      </section>

      <section anchor="claim-verified-response">
        <name>Response envelope fields</name>
        <t>The responder issues a response as a sealed envelope carrying
        the following fields. Required: intent (the response form, e.g.
        "verify_age_response"); challenge_hash (sha256 copied from the
        challenge); claim_verified (symbolic claim, e.g.
        "age_over_threshold"); threshold (MUST match challenge); result
        (boolean true or false). Optional: issuer_anchor (trust anchor
        reference); valid_at (time of local verification); result_scope
        (e.g. "session-only"); receipt_requested (boolean).</t>
      </section>

      <section anchor="claim-verified-privacy">
        <name>Normative privacy posture</name>
        <t>A response envelope using this extension MUST NOT include
        full legal name, birth date, passport number, citizen number,
        face template, or raw credential payload. It MAY include trust
        anchor reference for the issuing credential, policy domain
        reference, and challenge-bound correlation material such as
        challenge_hash, only where needed for downstream verification
        or audit.</t>
      </section>

      <section anchor="claim-verified-semantics">
        <name>Semantics</name>
        <t>A claim_verified response asserts: "a trusted wallet answered
        this exact challenge with a valid claim_verified result against
        the parameter threshold". It explicitly does NOT assert "this is
        natural person X". This keeps the statement policy-bound, not
        identity-maximal. The cryptographic binding between challenge
        and response via challenge_hash prevents replay across distinct
        verifier sessions.</t>
      </section>

      <section anchor="claim-verified-audit">
        <name>Audit and CBOM implications</name>
        <t>Implementations MAY record the challenge-response pair in a
        Causal Bill of Materials (CBOM) to enable subsequent regulatory
        review. A compliant CBOM trace SHOULD show: challenge received
        with challenge_hash; local policy evaluation performed; response
        emitted with matching challenge_hash; response accepted or
        denied by verifier; receipt logged if receipt_requested is true.
        The CBOM trace MUST NOT cause the merchant or auditor to retain
        personal identity payloads. The cryptographic chain alone is
        sufficient evidence that the policy answer was produced by an
        identity-bound wallet for a specific challenge.</t>
      </section>

      <section anchor="claim-verified-generalization">
        <name>Relationship to broader claim-verification</name>
        <t>This extension is intentionally minimal. The same shape
        generalizes to other policy domains: verify_age with threshold
        (age-gate); verify_residency with jurisdiction (region-gate);
        verify_kyc_class with level (tiered consent); verify_role with
        role (attestation-bound capability). In all cases the responder
        discloses only the symbolic claim and boolean result, never the
        underlying personal evidence.</t>
      </section>
    </section>

    <section anchor="sam-extension">
      <name>Sealed Authentication Module (SAM) Extension</name>
      <t>This section defines an OPTIONAL extension to the SSM that
      permits a sealed envelope to carry an intent-bound, one-shot
      authentication artifact, such that an agent may request execution
      of a specific action without ever holding the underlying secret
      material in cleartext.</t>
      <t>The SAM extension is intended for credential-bearing flows
      where: an upstream caller (e.g. an automated agent) needs to
      cause a specific action to occur (e.g. publish a package, sign a
      transaction, deploy a container); the calling actor MUST NOT
      possess the raw credential needed to perform that action; and a
      bounded execution boundary (e.g. tibet-gateway) holds custody of
      the credential and performs the action on behalf of the caller
      under cryptographically enforced scope.</t>

      <section anchor="sam-design-goal">
        <name>Design goal</name>
        <t>A SAM envelope answers: which single bounded act is this
        artifact permitted to authorise, by which actor, for which
        target, until when. It does NOT carry the secret material in a
        form the holder can read; the encrypted credential block can
        only be unsealed inside the trusted execution boundary that
        materialised the SAM.</t>
        <t>This is the natural complement to the Claim-Verified
        Extension (<xref target="claim-verified"/>): claim-verified
        responses say "this rule is satisfied"; SAM envelopes say "this
        single bounded act is now authorised".</t>
      </section>

      <section anchor="sam-fields">
        <name>SAM envelope fields</name>
        <t>A SAM envelope carries the following fields in its sealed
        manifest. Required: intent (semantic label for the bounded act,
        e.g. "upload_package"); secret_id (opaque identifier of the
        underlying credential in the issuing keychain); target_action
        (the action endpoint or contract address); actor_id
        (JIS-DID of the actor permitted to present this envelope);
        valid_until (RFC3339 expiry timestamp); ephemeral_id (single-
        use identifier tied to this materialisation).</t>
        <t>Optional: constraints (array of key-value pairs that further
        bound the act, e.g. package="tibet-zip", registry="pypi");
        policy_lane (which policy regime authorised this SAM);
        receipt_required (boolean, whether a sealed receipt is
        expected after execution); supersedes_sam_id (link to a prior
        SAM this one replaces, in rotation chains).</t>
      </section>

      <section anchor="sam-normative-posture">
        <name>Normative posture</name>
        <t>A SAM envelope MUST NOT include the underlying secret
        material in cleartext form. The encrypted credential block, if
        present in the sealed payload, MUST be decryptable only by the
        execution boundary identified in the manifest (typically
        identified by its public key or AINS reference).</t>
        <t>An execution boundary that materialises a SAM envelope
        MUST: validate the manifest signature against the issuing
        keychain; check that the actor_id matches the entity presenting
        the envelope (via TIBET-SIG-V1 or equivalent identity proof);
        confirm that valid_until has not elapsed; enforce that the
        intended action matches target_action and all constraints; and
        destroy the ephemeral session after execution completes,
        whether successful or not.</t>
        <t>An execution boundary MUST NOT permit a SAM envelope to be
        replayed: the ephemeral_id is single-use and MUST be recorded
        in a non-replay log for at least the duration of valid_until
        plus the conservative network-clock-skew margin.</t>
      </section>

      <section anchor="sam-causality">
        <name>Causal chain implications</name>
        <t>SAM materialisation is itself a causally-anchored event.
        The issuing keychain SHOULD record a secret-proxied event in
        its custody timeline (see related tibet-keychain
        specification), with action_id and parent_action_id linking the
        SAM materialisation to the originating intent request.</t>
        <t>Upon execution, the execution boundary SHOULD emit a
        provenance-sealed response that references the SAM envelope's
        sam_id and ephemeral_id, so that downstream audit walkers (e.g.
        tibet-cbom) can construct the full chain: intent request -
        SAM materialisation - execution - response. Each step is
        Ed25519-signed by the actor responsible for that step.</t>
      </section>

      <section anchor="sam-example">
        <name>Example</name>
        <t>Agent intent: "upload tibet-zip v1.0.3 to PyPI".
        Keychain materialises a SAM envelope with the following
        manifest fields:</t>
        <t>intent = "upload_package", secret_id = "sec_pypi_001",
        target_action = "/upload/pypi", actor_id =
        "jis:humotica:codex", valid_until =
        "2026-05-12T10:34:18Z", ephemeral_id = "eph_d7fad2165e13",
        constraints = [package="tibet-zip", registry="pypi"].</t>
        <t>The agent receives the SAM as a sealed .tza envelope; the
        agent cannot extract the underlying PyPI token. The agent
        forwards the envelope to a tibet-gateway endpoint, which
        validates the manifest, breaks the seal in its own runtime,
        executes the upload against PyPI, emits a provenance-sealed
        response back to the agent, and destroys the ephemeral
        session. The agent never possessed the PyPI token at any
        point.</t>
      </section>

      <section anchor="sam-generalisation">
        <name>Generalisation across credential domains</name>
        <t>The same envelope shape generalises to any credential-
        bearing action where bounded delegation is required:
        publication to package registries (PyPI, crates.io, npm,
        Maven), source-code platforms (GitHub PATs, GitLab tokens),
        cloud APIs (AWS service accounts, GCP service credentials),
        signing operations (smart-contract transactions, code-signing
        keys, TLS-certificate issuance), and database access where the
        agent should not see the connection string. In all cases the
        envelope captures intent + scope, and the gateway performs the
        act under cryptographic enforcement.</t>
      </section>

      <section anchor="sam-four-w-family">
        <name>Position in the four-W family</name>
        <t>The SAM extension defines the WHY primitive in a four-part
        family of credential-life-cycle artifacts: a temporal-trigger
        layer (WHEN, see related tibet-vault specification) decides
        when a sealed result may be disclosed; a custody-and-timeline
        layer (WHERE/HOW, see related tibet-keychain specification)
        records where the secret lives and who touched it; the SAM
        layer (WHY, this section) authorises a single bounded act
        without releasing the secret; and an execution-boundary layer
        (WHERE-EXEC, see related tibet-gateway specification) safely
        performs the act. The four layers compose into one causally
        verifiable credential workflow.</t>
      </section>
    </section>

    <section anchor="impl-status">
      <name>Implementation Status</name>
      <t>[Note to the 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>
      <t>All three implementations below are by the author's
      organization. They are research implementations. None of them
      implements the version 1 surface grammar of
      <xref target="syntax"/> as a validating parser; they implement the
      processing model around it.</t>

      <section anchor="impl-tbz">
        <name>TIBET-ZIP (tbz) codec</name>
        <dl>
          <dt>Organization:</dt><dd>Humotica.</dd>
          <dt>Description:</dt>
          <dd>Rust codec and command-line tool for the TBZ container
          format, version 2.4.1. Relevant behaviour: container recognition
          by the three-octet magic prefix 0x54 0x42 0x5A ("TBZ") before
          the file extension is considered; refusal to treat a file
          named with a container extension as a container when the magic
          bytes are absent; a notice when a container is found under a
          name without a container extension; an optional one-octet
          in-band surface slot in the version 2 header, signalled by a
          header flag; a declared payload class in the version 2 header,
          checked after opening against the outer file extension and
          against the inner manifest entries (executable entries inside
          an envelope not declared as code), as a warning or, in strict
          mode, as a refusal; and a binding report command that reports
          producer and block binding state without issuing a
          verdict.</dd>
          <dt>Findings that informed this revision:</dt>
          <dd>In the version 2 sealed container, the sender signature
          covers the ciphertext and the AEAD additional data is the
          transfer identifier; the header flags and the declared payload
          class are not covered. They are therefore extrinsic surface in
          the sense of <xref target="surface-carriage"/>, even though they
          are inside the file. The sealed-container writer examined does
          not emit the one-octet surface slot. The automatic mode of the
          command-line tool recognizes a version-specific four-octet
          prefix; by code reading, a version 2 container with a container
          extension would be reported as lacking magic bytes rather than
          as a newer version, which motivated the version-independence
          guidance in <xref target="type-sniff"/>.</dd>
          <dt>Maturity:</dt><dd>Research implementation.</dd>
          <dt>Licensing:</dt><dd>MIT OR Apache-2.0.</dd>
          <dt>Contact:</dt><dd>Jasper van de Meent, info@humotica.com.</dd>
        </dl>
      </section>

      <section anchor="impl-continuityd">
        <name>tibet-continuityd</name>
        <dl>
          <dt>Organization:</dt><dd>Humotica.</dd>
          <dt>Description:</dt>
          <dd>Python daemon, version 0.6.17, that watches intake
          directories and runs a sniff, verify, and fork pipeline on
          arriving objects. Its sniff stage states the rule "name is
          hint, content is truth, arrival is event"; classifies arrivals
          by magic bytes into, among others, sealed, sealed without a
          recognized extension, disguised (the name implies a sealed
          container but the magic bytes are absent), and executable;
          uses the initial Profile Registry values of this document as
          the set of names that imply a sealed container; ignores files
          with in-flight staging suffixes until they are renamed into
          place; and, in its verification stage, reconstructs the
          canonical surface name from the manifest and records both names
          when they differ.</dd>
          <dt>Findings that informed this revision:</dt>
          <dd>In one operating mode, an arrival that is not a sealed
          container is logged and then not given any further
          disposition, while a stricter mode quarantines it. This
          motivated <xref target="recorded-disposition"/>.</dd>
          <dt>Maturity:</dt><dd>Research implementation.</dd>
          <dt>Licensing:</dt><dd>MIT.</dd>
          <dt>Contact:</dt><dd>Jasper van de Meent, info@humotica.com.</dd>
        </dl>
      </section>

      <section anchor="impl-iab">
        <name>AInternet-in-a-box</name>
        <dl>
          <dt>Organization:</dt><dd>Humotica.</dd>
          <dt>Description:</dt>
          <dd><t>A self-hosted node runtime (Python and shell) that exchanges
          sealed carriers between identities. Relevant components:</t>
          <ul>
            <li>A content-blind lane holder and a minimal relay that
            accept only objects carrying the TBZ magic bytes, route by a
            destination taken from a sidecar descriptor or request field,
            record the presented name as ignored, and never open the
            payload. A landed carrier is stored under a name chosen by the
            receiver (a transport identifier or a prefix of its content
            hash), not under the name the sender gave it.</li>
            <li>A sealed offer carrier with a plaintext discovery header
            that is signed by the sender's identity key and carries a hash
            of the sealed body, so that the readable header is bound to the
            payload (the "in-band header inside integrity coverage" case
            of <xref target="surface-carriage"/>). Sender origin is
            established by comparing the header's key with the key the
            recipient holds for the claimed sender; where the recipient
            holds no such key, the message is presented as unproven.</li>
            <li>A message flow in which the sender's software composes a
            surface label, mirrors it inside the sealed body, and stages it
            as a plaintext label in a sidecar descriptor. On reading,
            decryption and the header binding checks run first; the label is then compared
            with the sealed sender, recipient, priority flag, and lane,
            and with the descriptor label. A mismatch flags the message
            for triage and does not refuse an otherwise valid message.
            This flow uses an addressing grammar of its own
            (<xref target="other-grammars"/>), not the version 1
            grammar.</li>
            <li>An admission predicate for archives with the outcomes
            producer_bound, carried, refused, and unprovable, which rejects
            a caller's claim to have checked key currentness rather than
            honouring it; and an open path that derives the predicate's
            inputs from the archive bytes via the codec's binding report,
            in which a verified forward expectation cannot lift a failing
            admission and the refusal names the admission.</li>
            <li>Admission on read for tool descriptors ("a raw file is not
            a tool"): one bounded read; schema validation; a declared
            surface that must embed the descriptor's own name; admission
            only by a release-signed hash-manifest pin or a local receipt
            bound to the descriptor digest; otherwise the descriptor is
            inert and is listed separately from usable tools.</li>
            <li>A cold storage path that treats decryption as proof of
            nothing about origin, requires the package signer to equal an
            externally held root key, and refuses containers that set the
            in-band surface flag.</li>
            <li>A registry of named local surfaces with classes and default
            projections, whose stated rule is that a readable filename is
            not authority and whose fallback may only degrade.</li>
          </ul>
          <t>The self-tests of the admission predicate, the open predicate,
          the tool-descriptor admission, and the lane holder passed in the
          author's workspace on 29 October 2026.</t></dd>
          <dt>Maturity:</dt><dd>Research implementation under active
          development.</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>The Semantic Surface Manifest is not a source of trust.
      Implementations must assume that external names can be changed and
      visible routing labels can be misleading. The sealed container
      remains the only strong source of truth.</t>
      <t>Routing may depend on SSM, but trust must not depend on SSM
      alone. Admission must not depend on it at all
      (<xref target="routing-vs-admission"/>).</t>
      <t>The following threats were made concrete during implementation:</t>
      <ul>
        <li>Rename and disguise. An attacker renames an arbitrary file so
        that its surface implies a sealed container, or renames a
        container so that its surface implies a different profile or
        recipient. Type recognition by magic bytes
        (<xref target="type-sniff"/>) and surface-to-manifest comparison
        (<xref target="surface-consistency"/>) address these.
        Conversely, because the name carries no authority, a sender can
        give a carrier any name, including one chosen for the recipient;
        this is a property, not a weakness, provided no consumer relies
        on the name.</li>
        <li>Unauthenticated in-band fields. A header field inside the
        object but outside its integrity coverage can be altered without
        breaking any signature. Treating such a field as intrinsic would
        let an attacker change classification while verification still
        passes (<xref target="surface-carriage"/>).</li>
        <li>Embedded keys. A signature that verifies under a key carried
        in the same object proves only that whoever made the object held
        that key (<xref target="deep-verification"/>).</li>
        <li>Expectation as grant. If a matched routing pattern or a
        pre-arranged expectation is allowed to stand in for admission,
        anyone able to produce an object that matches the expectation
        obtains admission.</li>
        <li>Downgrade by tooling. If an older or absent verifier yields a
        benign default, running old tooling becomes a way past the check.
        Unverifiable must mean unprovable.</li>
        <li>Check and use. If a consumer verifies one read of an object and
        then uses a second read, the object can be replaced in between
        (<xref target="self-describing"/>).</li>
        <li>Silent drop. A pipeline that logs an arrival and then takes no
        decision gives the appearance of handling without its effect
        (<xref target="recorded-disposition"/>).</li>
      </ul>
      <t>Magic bytes are public and trivially reproduced. They identify a
      format; they do not authenticate anything.</t>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>The Semantic Surface Manifest intentionally exposes limited
      metadata. Implementers should keep context low-sensitivity, avoid
      direct secrets or detailed personal data, and prefer naming for
      dispatch rather than disclosure.</t>
      <t>A surface that names a sender and a recipient, as addressing
      grammars do (<xref target="other-grammars"/>), discloses the
      communication relationship to every party that can see the name or
      a sidecar descriptor, including relays that cannot read the
      content. Implementers should weigh this against the routing
      benefit, and should prefer that relays route on a destination
      field alone rather than on a name that also identifies the
      sender.</t>
      <t>A recorded rename (<xref target="mirrored-fields"/>) retains the
      name an operator chose; if names may carry personal information,
      audit records of renames carry it too.</t>
    </section>

    <section anchor="interop">
      <name>Interoperability Considerations</name>
      <t>The SSM is designed to compose with TBZ, ICC-based continuity
      containers, TIBET Drop or TAT flows, session-state bundles,
      attestation bundles, sealed capsules, local storage, transport
      objects, attachments, queues, and router decisions.</t>
      <section anchor="other-grammars">
        <name>Surface Grammars Other Than Version 1</name>
        <t>Implementation experience shows that deployments may use a
        surface grammar other than the version 1 dispatch grammar of
        <xref target="syntax"/>. One implementation uses an addressing
        grammar of the form sender@locus.subject.recipient, optionally
        followed by a recipient host, a lane, and an uppercase flag. That
        grammar uses characters the version 1 grammar excludes and
        carries fields (sender, recipient) that version 1 does not.</t>
        <t>This document does not define such grammars. The processing
        model of <xref target="processing-model"/>, the separation of
        <xref target="routing-vs-admission"/>, and the mismatch classes of
        <xref target="mismatch"/> apply to them unchanged. A processor
        MUST know which grammar it is parsing and MUST NOT attempt to
        interpret a surface under a grammar it was not written for. A
        surface that fails its grammar yields no routing hint, and its
        object is handled as if it had no surface.</t>
      </section>
    </section>

    <section anchor="stack-relation">
      <name>Relationship to JIS, TIBET, TAT, and ICC</name>
      <t>This document does not replace JIS identity semantics, TIBET
      causal ordering, TAT transfer flow, or ICC sealed object
      semantics. It adds a visible routing surface above them.</t>
      <t>A clean split is that JIS decides who is acting, TIBET decides
      causal truth, TAT decides transfer flow, ICC decides sealed object
      class, and SSM decides visible dispatch semantics.</t>
      <t>In a single hand-off, three distinct questions are answered by
      three distinct artefacts: the semantic surface answers what the
      object appears to be (address); the verified sealed manifest
      answers what it is (truth); and an accompanying instruction or
      message, where one exists, answers what the sender expects the
      receiver to do with it (intent). None of the three substitutes for
      another.</t>
    </section>

    <section anchor="future-work">
      <name>Future Work</name>
      <ul>
        <li>richer but still bounded registries for profile</li>
        <li>explicit mirrored-surface validation modes</li>
        <li>MUX or SNAFT routing integration</li>
        <li>UI conventions for displaying safe routing metadata</li>
        <li>signed or policy-bound surface-to-manifest binding hints</li>
        <li>bringing in-band surface and payload-class bytes of container
        formats under the container's integrity mechanism</li>
        <li>a registry or identifier scheme for surface grammars other
        than version 1</li>
        <li>test vectors for disguised surfaces, renamed carriers, and
        mismatch classes</li>
      </ul>
    </section>

    <section anchor="future-questions">
      <name>Questions for Future Revisions</name>
      <t>The following topics are non-blocking for the present -03
      revision and are recorded here to guide later discussion and
      interoperability work.</t>
      <ul>
        <li>whether profile should remain open-text or move to a tighter
        registry</li>
        <li>whether the optional suffix should be preserved, normalized,
        or ignored by parsers</li>
        <li>whether seconds-level time fragments should be allowed in
        version 1</li>
        <li>whether some domains should escalate all mismatch to
        quarantine while others allow low-risk auto-continue</li>
        <li>whether an addressing grammar that names sender and recipient
        should be specified as a second surface grammar, given its
        privacy cost</li>
        <li>whether this document should define a minimal admission
        verdict vocabulary, or leave it to each consumer</li>
      </ul>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests two registries: a Surface Profile
      Registry and a Surface Priority Registry.</t>
      <t>Registration policy for both is Expert Review as described in
      <xref target="RFC8126"/>. Initial profile
      values are claude, gemini, gpt, kit, iddrop, parentattest,
      capsule, and tza. Initial priority values are urgent, normal,
      background, and sealed.</t>
      <t>No registries are requested for time-fragment, context, or
      icc-ext in version 1. This revision requests no additional
      registries.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <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 fullname="S. Bradner" surname="Bradner" initials="S."/>
            <date month="March" year="1997"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC5234" target="https://www.rfc-editor.org/info/rfc5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" surname="Crocker" initials="D."/>
            <author fullname="P. Overell" surname="Overell" initials="P."/>
            <date month="January" year="2008"/>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
        </reference>
        <reference anchor="RFC8126" target="https://www.rfc-editor.org/info/rfc8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" surname="Cotton" initials="M."/>
            <author fullname="B. Leiba" surname="Leiba" initials="B."/>
            <author fullname="T. Narten" surname="Narten" initials="T."/>
            <date month="June" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
        </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 fullname="B. Leiba" surname="Leiba" initials="B."/>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </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 fullname="Y. Sheffer" surname="Sheffer" initials="Y."/>
            <author fullname="A. Farrel" surname="Farrel" initials="A."/>
            <date month="July" year="2016"/>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
      </references>
    </references>

    <section anchor="changes-from-02">
      <name>Changes from -02</name>
      <ul>
        <li>Abstract: added a paragraph on the distinction between routing
        hints and admission verdicts; added keyword "admission".</li>
        <li>Section 1: the former "Status of This Memo (-02 revision)"
        section is renamed "Introduction", describes the purpose of the
        document, and summarizes this revision. The stale statement that
        the present version is -00 is removed.</li>
        <li>Section 2 (new): Requirements Language (BCP 14). The
        Claim-Verified and SAM sections already used uppercase key words;
        RFC 2119 and RFC 8174 are added as normative references.</li>
        <li>Section 3: added a paragraph on the risk of a readable surface
        being read as a decision.</li>
        <li>Section 4: "Intrinsic Truth" now requires integrity coverage,
        not mere location inside the object; "Extrinsic Surface" and
        "Surface-Integrity Event" adjusted accordingly; new terms Carrier,
        Sidecar Descriptor, Routing Hint, Admission Verdict, and
        Arrival.</li>
        <li>Section 5: added the design goal that a surface is not an
        admission input.</li>
        <li>Section 6: a name that does not match the grammar is not a
        version 1 surface and must not be repaired into one; pointer to
        other grammars. The ABNF is unchanged.</li>
        <li>Section 8: profile values may be used as an expectation that
        an object is sealed, as a routing hint only; new subsection
        Unknown Values (fallback may degrade, never elevate).</li>
        <li>Section 9 (new): Surface Carriage (object name, sidecar
        descriptor, in-band header outside or inside integrity coverage,
        mirrored sealed fields).</li>
        <li>Section 10: Processing Model keywords made normative (MAY,
        SHOULD, MUST) where -02 used lowercase. Type Sniff: version-
        independent family recognition, disguised surfaces, renamed
        carriers, magic bytes as necessary but not sufficient, in-flight
        writes. Deep Verification: origin requires an externally anchored
        key; key currentness is a separate axis; unverifiable is
        unprovable. New subsections Admission and Recorded Disposition.
        Surface-to-Manifest Consistency: compare after verification,
        include sidecar labels, mismatch must not be accepted
        silently.</li>
        <li>Section 11 (new): Routing Hints and Admission Verdicts,
        including expectations that narrow but do not grant.</li>
        <li>Section 12: mirrored fields as the durable copy; rename
        detection by reconstructing the canonical name.</li>
        <li>Section 13: the example now identifies which steps are
        routing, type recognition, admission inputs, and the admitted
        action.</li>
        <li>Section 14: Routing-Risk Mismatch examples added; new
        mismatch class Disguised Surface.</li>
        <li>Section 15 (new): Self-Describing Artefacts (admission on
        read, inert until admitted, external anchor, single bounded read).</li>
        <li>Section 17: the reference to the Claim-Verified Extension
        previously read "Section 13" and pointed at the wrong section; it
        is now a cross-reference.</li>
        <li>Section 18 (new): Implementation Status per RFC 7942.</li>
        <li>Section 19: Security Considerations extended with threats made
        concrete during implementation.</li>
        <li>Section 20: Privacy Considerations extended for addressing
        surfaces and recorded renames.</li>
        <li>Section 21: new subsection on surface grammars other than
        version 1.</li>
        <li>Section 22: added the address, truth, and intent split.</li>
        <li>Sections 23 and 24: new future-work items and questions; stale
        "-00" reference corrected.</li>
        <li>Section 25: states that this revision requests no additional
        registries.</li>
        <li>References split into normative and informative; RFC 2119, RFC
        8174, and RFC 7942 added.</li>
        <li>The Claim-Verified and SAM extensions are otherwise
        unchanged.</li>
      </ul>
    </section>

    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The author thanks the Humotica team for editorial assistance,
      RFC outline preparation, mismatch class formalization, and the
      operational tooling that made the surface consistency model
      concrete.</t>
      <t>The author also thanks Richard Barron of Red Specter Security
      Research for adversarial framing that helped sharpen the address
      visible, content sealed principle and the rename-attack
      perspective.</t>
    </section>
  </back>
</rfc>
