<?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-02"
     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-02"/>

    <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="May" day="9"/>

    <area>Security</area>
    <workgroup>Internet Engineering Task Force</workgroup>

    <keyword>semantic surface</keyword>
    <keyword>routing</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>In short: address visible, content sealed.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="status">
      <name>Status of This Memo (-02 revision)</name>
      <t>This memo is an Internet-Draft revision (-02) of draft-vandemeent-tibet-semantic-surface-manifest. The -02 revision adds Section 13 (Sealed Authentication Module Extension) following work on bounded credential-delegation as a complement to the claim-verified pattern in Section 12. The change set follows the four-W family naming agreed with the implementation team on 12 May 2026: tibet-vault (WHEN), tibet-keychain (WHERE/HOW), tibet-sam (WHY), tibet-gateway (WHERE-EXEC).</t>
      <t>The present -00 version captures the core routing model, visible
      syntax, mirrored-surface concept, and mismatch consequences needed
      for first public review.</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>
    </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, such as
        magic bytes, manifest, signatures, hashes, and chain
        anchors.</dd>
        <dt>Extrinsic Surface:</dt>
        <dd>Properties expressed outside 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.</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>
    </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>
    </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>
      </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>

    <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.</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>
      </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>
      </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>
      </section>
    </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>
    </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>
    </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>
      </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="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 (Section 13): 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="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.</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>
    </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>

    <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>
    </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>
      </ul>
    </section>

    <section anchor="future-questions">
      <name>Questions for Future Revisions</name>
      <t>The following topics are non-blocking for the present -00
      version 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>
      </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.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <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>
    </references>

    <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>
