<?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-provenance-01"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     version="3">

  <front>
    <title abbrev="TIBET">TIBET: Transaction/Interaction-Based Evidence Trail</title>

    <seriesInfo name="Internet-Draft"
                value="draft-vandemeent-tibet-provenance-01"/>

    <author fullname="Jasper van de Meent" initials="J."
            surname="van de Meent">
      <organization>Humotica</organization>
      <address>
        <postal>
          <country>Netherlands</country>
        </postal>
        <email>jasper@humotica.nl</email>
        <uri>https://humotica.nl</uri>
      </address>
    </author>

    <author fullname="Root AI" surname="Root AI">
      <organization>Humotica</organization>
      <address>
        <email>root_idd@humotica.nl</email>
        <uri>https://humotica.nl</uri>
      </address>
    </author>

    <date year="2026" month="March" day="29"/>

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

    <keyword>provenance</keyword>
    <keyword>audit trail</keyword>
    <keyword>AI transparency</keyword>
    <keyword>accountability</keyword>
    <keyword>evidence</keyword>

    <abstract>
      <t>This document defines TIBET (Transaction/Interaction-Based
      Evidence Trail), a data model and protocol for constructing
      cryptographically linked provenance chains over interactions
      between autonomous agents, human actors, and automated
      processes. A TIBET token captures four dimensions of
      provenance: content (ERIN), references (ERAAN), context
      (EROMHEEN), and intent (ERACHTER). Tokens are
      cryptographically signed, hash-chained, and designed for
      append-only storage. TIBET is transport-agnostic and
      encoding-flexible, with JSON over HTTPS as the baseline
      serialization. This document specifies the token data model,
      chain semantics, canonicalization rules, verification
      procedures, and integration points with companion protocols
      JIS <xref target="JIS"/>, UPIP <xref target="UPIP"/>,
      RVP <xref target="RVP"/>, and AINS <xref target="AINS"/>.</t>
    </abstract>
  </front>

  <middle>
    <!-- Section 1: Introduction -->
    <section anchor="introduction">
      <name>Introduction</name>

      <t>Autonomous agents, AI systems, human operators, and automated
      processes increasingly interact across trust boundaries. When
      decisions are made -- who initiated them, what data informed
      them, in what context, and for what reason -- this information
      is critical for audit, regulatory compliance (including the
      EU AI Act <xref target="EU-AI-ACT"/>), and dispute
      resolution. Current logging approaches are fragmented: they
      capture events but not intent, actions but not context,
      outcomes but not reasoning.</t>

      <t>TIBET addresses this gap by defining a structured evidence
      token that captures four dimensions of provenance for every
      interaction:</t>

      <ul>
        <li>ERIN: What is IN the action (content, payload, decision)</li>
        <li>ERAAN: What is attached TO the action (references, dependencies)</li>
        <li>EROMHEEN: What is AROUND the action (context, environment)</li>
        <li>ERACHTER: What is BEHIND the action (intent, reasoning)</li>
      </ul>

      <t>These four components -- named using Dutch prepositions that
      describe spatial relationships -- together provide the evidence
      needed to answer not only "what happened?" but also "why did
      it happen?", "what informed it?", and "what was the context?"</t>

      <!-- Section 1.1: Problem Statement -->
      <section anchor="problem-statement">
        <name>Problem Statement</name>

        <t>Existing audit and logging approaches suffer from three
        structural limitations:</t>

        <ol>
          <li>PARTIAL CAPTURE: Traditional logs record events (what) but
          not intent (why) or context (in what situation). After the
          fact, auditors must reconstruct intent from circumstantial
          evidence -- a process sometimes called "compliance
          archaeology."</li>

          <li>FRAGMENTED CHAINS: When an action triggers subsequent
          actions across systems, actors, or trust boundaries, the
          causal chain is typically lost. Each system maintains its
          own logs with no standardized linking mechanism.</li>

          <li>NO VERIFICATION: Log entries are typically unsigned plain
          text. There is no standardized mechanism to verify that a
          log entry has not been modified, that it was created by the
          claimed actor, or that the chain is complete.</li>
        </ol>

        <t>TIBET provides a standardized, cryptographically verifiable
        evidence format that addresses all three limitations.</t>
      </section>

      <!-- Section 1.2: Design Principles -->
      <section anchor="design-principles">
        <name>Design Principles</name>

        <dl>
          <dt>EVIDENCE OVER ENFORCEMENT:</dt>
          <dd>TIBET records what happened. It does not prevent or allow
          actions. Enforcement is a policy decision made by consuming
          applications based on TIBET evidence. Evidence cannot be
          un-recorded; enforcement can be bypassed.</dd>

          <dt>TRANSPORT AGNOSTICISM:</dt>
          <dd>TIBET tokens are data objects, not protocol messages. They
          can be transported over HTTP, WebSocket, message queues,
          gRPC, or any other mechanism. This document defines JSON
          over HTTPS as the baseline serialization for
          interoperability.</dd>

          <dt>ENCODING FLEXIBILITY:</dt>
          <dd>While JSON <xref target="RFC8259"/> is the baseline encoding,
          TIBET tokens MAY be serialized in CBOR <xref target="RFC8949"/>,
          Protocol Buffers, or other formats, provided the
          canonicalization rules (<xref target="canonicalization"/>) are
          maintained.</dd>

          <dt>CHAIN CAPABILITY:</dt>
          <dd>Tokens link to form chains via parent references, enabling
          reconstruction of complete interaction histories across
          actor and system boundaries.</dd>

          <dt>COMPANION INTEGRATION:</dt>
          <dd>TIBET is designed as part of a protocol suite. It relies on
          JIS <xref target="JIS"/> for actor identity, and is consumed by
          UPIP <xref target="UPIP"/> for process integrity,
          RVP <xref target="RVP"/> for continuous verification, and
          AINS <xref target="AINS"/> for agent discovery. This
          document defines TIBET's own scope and specifies integration
          points without duplicating functionality defined elsewhere.</dd>
        </dl>
      </section>
    </section>

    <!-- Section 2: Terminology -->
    <section anchor="terminology">
      <name>Terminology</name>

      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
      "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
      RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
      interpreted as described in BCP 14 <xref target="RFC2119"/>
      <xref target="RFC8174"/> when, and only when, they appear in
      all capitals, as shown here.</t>

      <dl>
        <dt>Actor:</dt>
        <dd>An entity that creates, modifies, or participates in a
        TIBET token. Actors include AI agents, human users,
        automated processes, and services. Actor identity is
        established through the companion JIS protocol
        <xref target="JIS"/> or through locally-assigned
        identifiers.</dd>

        <dt>Chain:</dt>
        <dd>An ordered sequence of TIBET tokens linked through
        parent_id references. A chain represents a complete
        interaction or transaction history from initiation to
        resolution.</dd>

        <dt>Companion Protocol:</dt>
        <dd>One of the protocols in the TIBET suite: JIS
        <xref target="JIS"/> (identity), UPIP <xref target="UPIP"/>
        (process integrity), RVP <xref target="RVP"/> (continuous
        verification), AINS <xref target="AINS"/> (discovery). Each
        companion addresses a distinct concern while relying on
        TIBET for provenance.</dd>

        <dt>ERACHTER:</dt>
        <dd>Dutch: "behind it." The intent component of a TIBET token.
        Captures WHY an action was taken.</dd>

        <dt>ERAAN:</dt>
        <dd>Dutch: "attached to it." The reference component of a TIBET
        token. Captures dependencies, related tokens, and external
        resources.</dd>

        <dt>ERIN:</dt>
        <dd>Dutch: "in it." The content component of a TIBET token.
        Captures the actual content or action.</dd>

        <dt>EROMHEEN:</dt>
        <dd>Dutch: "around it." The context component of a TIBET token.
        Captures environmental and situational context.</dd>

        <dt>FIR/A (First Initiation Revoke/Accept):</dt>
        <dd>A trust establishment protocol defined in JIS
        <xref target="JIS"/>. FIR/A produces a trust score between
        0.0 and 1.0 that TIBET tokens MAY reference.</dd>

        <dt>Provenance:</dt>
        <dd>The complete origin and history of a piece of data or
        decision, including all transformations and the reasoning
        behind them.</dd>

        <dt>Token:</dt>
        <dd>A single TIBET record capturing one interaction, decision,
        or event with full four-dimensional provenance.</dd>

        <dt>Token Hash:</dt>
        <dd>The SHA-256 <xref target="FIPS180-4"/> hash of a token's
        canonical serialization, excluding the "signature" and "hash"
        fields. The token hash is used for chain linking and
        integrity verification.</dd>
      </dl>
    </section>

    <!-- Section 3: Token Data Model -->
    <section anchor="token-data-model">
      <name>Token Data Model</name>

      <!-- Section 3.1: Token Structure -->
      <section anchor="token-structure">
        <name>Token Structure</name>

        <t>A TIBET token is a JSON <xref target="RFC8259"/> object.
        The following example shows all required and commonly used
        optional fields:</t>

        <sourcecode type="json"><![CDATA[
{
  "token_id": "tbt-550e8400-e29b-41d4-a716-446655440000",
  "version": "1.1",
  "type": "decision",
  "timestamp": "2026-03-29T10:30:00.000Z",
  "actor": "jis:idd:root_idd_2025",
  "erin": {
    "decision": "APPROVED",
    "confidence": 0.92
  },
  "eraan": [
    "tbt:550e8400-e29b-41d4-a716-446655440001",
    "model:credit-scoring-v2.3.1"
  ],
  "eromheen": {
    "environment": "production",
    "region": "eu-west-1",
    "regulatory_context": ["GDPR", "EU-AI-Act"]
  },
  "erachter": "Credit application evaluated per policy v2.3.1
    section 4.2. Score 0.92 exceeds threshold 0.75.",
  "parent_id": "tbt-550e8400-e29b-41d4-a716-446655440001",
  "state": "RESOLVED",
  "hash": "sha256:4f2e8a1b...",
  "signature": {
    "algorithm": "Ed25519",
    "public_key": "ed25519:base64...",
    "value": "base64..."
  }
}
        ]]></sourcecode>
      </section>

      <!-- Section 3.2: Required Fields -->
      <section anchor="required-fields">
        <name>Required Fields</name>

        <t>Every TIBET token MUST contain the following fields:</t>

        <dl>
          <dt>"token_id" (string):</dt>
          <dd>A globally unique identifier. MUST be prefixed with "tbt-"
          followed by a UUID v4 <xref target="RFC9562"/>. Example:
          "tbt-550e8400-e29b-41d4-a716-446655440000".</dd>

          <dt>"version" (string):</dt>
          <dd>The TIBET protocol version. For tokens conforming to this
          document, the value MUST be "1.1".</dd>

          <dt>"type" (string):</dt>
          <dd>The token type. See <xref target="token-types"/> for
          defined types.</dd>

          <dt>"timestamp" (string):</dt>
          <dd>The creation time in ISO 8601 format with millisecond
          precision and UTC timezone designator (Z). Example:
          "2026-03-29T10:30:00.000Z".</dd>

          <dt>"actor" (string):</dt>
          <dd>The identifier of the entity that created this token.
          See <xref target="actor-identity"/> for format
          requirements.</dd>

          <dt>"erin" (object):</dt>
          <dd>The content component. MUST be a non-empty JSON object.
          See <xref target="erin"/>.</dd>

          <dt>"eraan" (array):</dt>
          <dd>The reference component. MUST be a JSON array (MAY be
          empty). See <xref target="eraan"/>.</dd>

          <dt>"eromheen" (object):</dt>
          <dd>The context component. MUST be a JSON object (MAY be
          empty). See <xref target="eromheen"/>.</dd>

          <dt>"erachter" (string):</dt>
          <dd>The intent component. MUST be a non-empty human-readable
          string. See <xref target="erachter"/>.</dd>

          <dt>"state" (string):</dt>
          <dd>The current lifecycle state. See
          <xref target="state-model"/>.</dd>

          <dt>"hash" (string):</dt>
          <dd>The token hash computed per
          <xref target="token-hash-computation"/>. Format:
          "sha256:&lt;hex64&gt;".</dd>

          <dt>"signature" (object):</dt>
          <dd>Cryptographic signature over the canonical token.
          See <xref target="signature-generation"/>.</dd>
        </dl>
      </section>

      <!-- Section 3.3: Optional Fields -->
      <section anchor="optional-fields">
        <name>Optional Fields</name>

        <dl>
          <dt>"parent_id" (string):</dt>
          <dd>The token_id of the parent token. Present when this token
          is part of a chain. See
          <xref target="parent-child-linking"/>.</dd>

          <dt>"parent_hash" (string):</dt>
          <dd>The hash of the parent token at the time of child creation.
          SHOULD be present when parent_id is present. Enables chain
          integrity verification without fetching the parent.</dd>

          <dt>"supersedes" (string):</dt>
          <dd>The token_id of a token that this token supersedes.
          See <xref target="token-supersession"/>.</dd>

          <dt>"metadata" (object):</dt>
          <dd>Implementation-specific key-value pairs. Implementations
          MUST NOT place data required for interoperability in
          metadata.</dd>
        </dl>
      </section>

      <!-- Section 3.4: Token Types -->
      <section anchor="token-types">
        <name>Token Types</name>

        <t>The following token types are defined:</t>

        <dl>
          <dt>"action":</dt>
          <dd>A concrete action performed by an actor (API call, file
          write, command execution).</dd>

          <dt>"decision":</dt>
          <dd>A decision made by an actor, including the factors and
          confidence level.</dd>

          <dt>"message":</dt>
          <dd>A communication between actors (query, response,
          notification).</dd>

          <dt>"query":</dt>
          <dd>A request for information or capability.</dd>

          <dt>"response":</dt>
          <dd>A reply to a query or message.</dd>

          <dt>"observation":</dt>
          <dd>A passive recording of state or event, not initiated by
          the token's actor.</dd>

          <dt>"transition":</dt>
          <dd>A state change in a workflow or process.</dd>
        </dl>

        <t>Implementations SHOULD use the defined types. Implementations
        MAY define additional types using the "x-" prefix (e.g.,
        "x-audit", "x-heartbeat"). Implementations MUST NOT reject
        tokens with unrecognized types.</t>
      </section>
    </section>

    <!-- Section 4: Provenance Components -->
    <section anchor="provenance-components">
      <name>Provenance Components</name>

      <!-- Section 4.1: ERIN -->
      <section anchor="erin">
        <name>ERIN - Content Component</name>

        <t>ERIN ("What's IN it") captures the core content or action.
        The ERIN object MUST be present and MUST NOT be empty.</t>

        <t>The internal structure of ERIN is application-defined. TIBET
        does not prescribe specific fields within ERIN, but the
        following patterns are RECOMMENDED:</t>

        <t>For actions and decisions:</t>

        <sourcecode type="json"><![CDATA[
"erin": {
  "action": "approve_transaction",
  "confidence": 0.92,
  "parameters": { }
}
        ]]></sourcecode>

        <t>For messages and queries:</t>

        <sourcecode type="json"><![CDATA[
"erin": {
  "content": "What are my account permissions?",
  "format": "natural_language",
  "language": "en"
}
        ]]></sourcecode>

        <t>ERIN answers the question: "What is the core payload of this
        interaction?"</t>
      </section>

      <!-- Section 4.2: ERAAN -->
      <section anchor="eraan">
        <name>ERAAN - Reference Component</name>

        <t>ERAAN ("What's attached TO it") captures dependencies,
        references to other tokens, external resources, and related
        artifacts. ERAAN MUST be a JSON array.</t>

        <t>Each element SHOULD use a typed reference format:</t>

        <t>"&lt;type&gt;:&lt;identifier&gt;"</t>

        <t>Defined reference types:</t>

        <dl>
          <dt>"tbt:"</dt>
          <dd>Reference to another TIBET token (by token_id)</dd>

          <dt>"model:"</dt>
          <dd>Reference to an AI model version</dd>

          <dt>"policy:"</dt>
          <dd>Reference to a policy document version</dd>

          <dt>"dataset:"</dt>
          <dd>Reference to a dataset</dd>

          <dt>"api:"</dt>
          <dd>Reference to an external API call</dd>

          <dt>"document:"</dt>
          <dd>Reference to a document or file</dd>

          <dt>"actor:"</dt>
          <dd>Reference to another actor's identity</dd>
        </dl>

        <t>Implementations MAY define additional reference types.
        Implementations MUST preserve unrecognized reference types
        during processing.</t>

        <t>Example:</t>

        <sourcecode type="json"><![CDATA[
"eraan": [
  "tbt:tbt-550e8400-...",
  "model:credit-scoring-v2.3.1",
  "policy:lending-policy-2026q1"
]
        ]]></sourcecode>

        <t>ERAAN answers the question: "What other artifacts informed
        or are connected to this interaction?"</t>
      </section>

      <!-- Section 4.3: EROMHEEN -->
      <section anchor="eromheen">
        <name>EROMHEEN - Context Component</name>

        <t>EROMHEEN ("What's AROUND it") captures the environmental and
        situational context at the time of the interaction. EROMHEEN
        MUST be a JSON object (MAY be empty if context is not
        available).</t>

        <t>RECOMMENDED fields:</t>

        <dl>
          <dt>"environment" (string):</dt>
          <dd>Deployment environment (e.g., "production", "staging",
          "development").</dd>

          <dt>"region" (string):</dt>
          <dd>Deployment region or location.</dd>

          <dt>"session_id" (string):</dt>
          <dd>Session identifier, if applicable.</dd>

          <dt>"regulatory_context" (array of strings):</dt>
          <dd>Applicable regulatory frameworks (e.g., "GDPR",
          "EU-AI-Act", "NIS2").</dd>
        </dl>

        <t>Additional context fields are application-defined.</t>

        <t>Example:</t>

        <sourcecode type="json"><![CDATA[
"eromheen": {
  "environment": "production",
  "region": "eu-west-1",
  "session_id": "sess_abc123",
  "regulatory_context": ["GDPR", "EU-AI-Act"]
}
        ]]></sourcecode>

        <t>EROMHEEN answers the question: "In what context did this
        interaction occur?"</t>
      </section>

      <!-- Section 4.4: ERACHTER -->
      <section anchor="erachter">
        <name>ERACHTER - Intent Component</name>

        <t>ERACHTER ("What's BEHIND it") captures the intent, reasoning,
        and purpose of the action. ERACHTER MUST be a non-empty
        human-readable string.</t>

        <t>ERACHTER serves two purposes:</t>

        <ol>
          <li>AUDITABILITY: Regulators and auditors can understand WHY
          an action was taken without reverse-engineering the decision
          from logs.</li>

          <li>ACCOUNTABILITY: The stated intent is part of the signed
          token, making it a verifiable commitment by the actor.</li>
        </ol>

        <t>For automated decisions, ERACHTER SHOULD include:</t>
        <ul>
          <li>The decision logic or rule that was applied</li>
          <li>The threshold or criteria that was met or not met</li>
          <li>Whether human oversight was available or triggered</li>
        </ul>

        <t>Example:</t>

        <sourcecode><![CDATA[
"erachter": "Credit application evaluated per policy
lending-policy-2026q1 section 4.2. Score 0.92 exceeds
threshold 0.75. Human review not triggered (confidence
above 0.90 per oversight policy)."
        ]]></sourcecode>

        <t>ERACHTER answers the question: "Why was this action taken?"</t>
      </section>

      <!-- Section 4.5: Component Boundaries -->
      <section anchor="component-boundaries">
        <name>Component Boundaries</name>

        <t>To guide implementers in placing data in the correct
        component:</t>

        <artwork type="ascii-art"><![CDATA[
+------------------+----------------------------------------+
| If the data is   | Place it in                            |
+------------------+----------------------------------------+
| The core action, | ERIN (content)                         |
| decision, or     |                                        |
| payload          |                                        |
|                  |                                        |
| A reference to   | ERAAN (references)                     |
| another token,   |                                        |
| model, policy,   |                                        |
| or external      |                                        |
| resource         |                                        |
|                  |                                        |
| Environmental,   | EROMHEEN (context)                     |
| situational, or  |                                        |
| deployment       |                                        |
| context          |                                        |
|                  |                                        |
| The reasoning,   | ERACHTER (intent)                      |
| purpose, or      |                                        |
| justification    |                                        |
+------------------+----------------------------------------+
        ]]></artwork>

        <t>When in doubt, the test is: "Would an auditor need this to
        understand WHAT happened (ERIN), what INFORMED it (ERAAN),
        WHERE/WHEN it happened (EROMHEEN), or WHY (ERACHTER)?"</t>
      </section>
    </section>

    <!-- Section 5: Canonicalization and Hashing -->
    <section anchor="canonicalization">
      <name>Canonicalization and Hashing</name>

      <!-- Section 5.1: Canonical JSON Serialization -->
      <section anchor="canonical-json">
        <name>Canonical JSON Serialization</name>

        <t>Before computing hashes or signatures, a TIBET token MUST be
        serialized to Canonical JSON. The canonical form is defined
        as:</t>

        <ol>
          <li>All object keys are sorted lexicographically by Unicode
          code point.</li>
          <li>No whitespace between tokens (no spaces after colons or
          commas, no newlines).</li>
          <li>Strings use only the escape sequences defined in
          RFC 8259 Section 7.</li>
          <li>Numbers use the shortest representation without leading
          zeros. No trailing zeros after decimal point.</li>
          <li>The "signature" and "hash" fields are EXCLUDED from the
          canonical form used for hash and signature computation.</li>
        </ol>

        <t>This canonicalization ensures that the same logical token
        produces the same byte sequence regardless of the serializer
        used, which is necessary for hash and signature verification
        across implementations.</t>
      </section>

      <!-- Section 5.2: Token Hash Computation -->
      <section anchor="token-hash-computation">
        <name>Token Hash Computation</name>

        <t>The token hash MUST be computed as follows:</t>

        <ol>
          <li>Construct a JSON object containing all required and present
          optional fields EXCEPT "hash" and "signature".</li>
          <li>Serialize this object using Canonical JSON
          (<xref target="canonical-json"/>).</li>
          <li>Compute SHA-256 <xref target="FIPS180-4"/> over the UTF-8
          encoding of the canonical string.</li>
          <li>Encode the result as lowercase hexadecimal.</li>
          <li>Prefix with "sha256:".</li>
        </ol>

        <t>Result format: "sha256:&lt;64 hex characters&gt;"</t>
      </section>

      <!-- Section 5.3: Signature Generation -->
      <section anchor="signature-generation">
        <name>Signature Generation</name>

        <t>After computing the token hash, the creating actor MUST sign
        the token:</t>

        <ol>
          <li>Take the token hash string (e.g.,
          "sha256:4f2e8a1b...").</li>
          <li>Sign this string using the actor's private key.</li>
          <li>Construct the signature object:</li>
        </ol>

        <sourcecode type="json"><![CDATA[
"signature": {
  "algorithm": "Ed25519",
  "public_key": "ed25519:<base64 public key>",
  "value": "<base64 signature>"
}
        ]]></sourcecode>

        <t>The algorithm field MUST be one of:</t>
        <ul>
          <li>"Ed25519" (RECOMMENDED)</li>
          <li>"ECDSA-P256"</li>
        </ul>

        <t>Implementations SHOULD use Ed25519 unless constrained by
        existing infrastructure.</t>
      </section>

      <!-- Section 5.4: Signature Verification -->
      <section anchor="signature-verification">
        <name>Signature Verification</name>

        <t>To verify a TIBET token's signature:</t>

        <ol>
          <li>Extract and remove the "signature" and "hash" fields.</li>
          <li>Serialize the remaining object using Canonical JSON.</li>
          <li>Compute SHA-256 over the canonical string.</li>
          <li>Compare the computed hash with the stored "hash" field.
          If they differ, the token has been modified.</li>
          <li>Verify the signature in "signature.value" against the
          computed hash using the public key in
          "signature.public_key".</li>
          <li>If JIS identity binding is available
          (<xref target="jis-identity-binding"/>), verify that the
          public key belongs to the claimed actor.</li>
        </ol>
      </section>
    </section>

    <!-- Section 6: Chain Semantics -->
    <section anchor="chain-semantics">
      <name>Chain Semantics</name>

      <!-- Section 6.1: Parent-Child Linking -->
      <section anchor="parent-child-linking">
        <name>Parent-Child Linking</name>

        <t>Tokens form chains through the "parent_id" field. When an
        action triggers a subsequent action, the subsequent token
        SHOULD reference the triggering token as its parent.</t>

        <t>Chain rules:</t>

        <ul>
          <li>A token with no parent_id is a ROOT token (chain
          origin).</li>
          <li>A token with a parent_id is a CHILD token.</li>
          <li>A parent MAY have multiple children (branching).</li>
          <li>A child MUST have exactly zero or one parent.</li>
          <li>When parent_id is present, parent_hash SHOULD also be
          present, containing the parent's hash at child creation
          time.</li>
        </ul>

        <t>Example chain:</t>

        <artwork type="ascii-art"><![CDATA[
[User Query]  -->  [AI Processing]  -->  [API Call]
    |                    |                   |
 tbt-001              tbt-002             tbt-003
 (root)            parent:tbt-001      parent:tbt-002
        ]]></artwork>
      </section>

      <!-- Section 6.2: Append-Only Expectation -->
      <section anchor="append-only">
        <name>Append-Only Expectation</name>

        <t>TIBET tokens, once created and signed, MUST NOT be modified.
        The token_id, hash, and signature together form an immutable
        record.</t>

        <t>Tokens MAY be stored in any storage system that preserves
        their integrity. Append-only logs, content-addressable stores,
        databases with write-once semantics, or ledger systems are
        all suitable, provided the storage system does not modify
        token contents.</t>

        <t>This document does not mandate a specific storage system.
        The integrity of a TIBET token is self-contained: any
        verifier can recompute the hash and verify the signature
        without trusting the storage system.</t>
      </section>

      <!-- Section 6.3: Token Supersession -->
      <section anchor="token-supersession">
        <name>Token Supersession</name>

        <t>When a token's content must be corrected or updated (e.g.,
        an incorrect decision is revised), implementations MUST NOT
        modify the original token. Instead, a new token MUST be
        created with:</t>

        <ul>
          <li>A new token_id</li>
          <li>The "supersedes" field set to the original token's
          token_id</li>
          <li>An ERACHTER explaining why the original is being
          superseded</li>
        </ul>

        <t>The original token remains in the chain, preserving the
        complete history including corrections.</t>
      </section>

      <!-- Section 6.4: Chain Verification -->
      <section anchor="chain-verification">
        <name>Chain Verification</name>

        <t>To verify a TIBET chain:</t>

        <ol>
          <li>For each token in the chain, verify the token hash and
          signature (<xref target="signature-verification"/>).</li>
          <li>For each child token, verify that parent_hash (if present)
          matches the actual hash of the referenced parent.</li>
          <li>Verify that timestamps are monotonically non-decreasing
          from parent to child.</li>
          <li>Verify that the chain has no gaps (every referenced
          parent_id exists in the chain or is declared as
          external).</li>
        </ol>

        <t>Chain verification failures MUST be reported as evidence.
        Whether a verification failure blocks processing is a local
        policy decision (evidence over enforcement).</t>
      </section>
    </section>

    <!-- Section 7: Token Lifecycle -->
    <section anchor="token-lifecycle">
      <name>Token Lifecycle</name>

      <!-- Section 7.1: State Model -->
      <section anchor="state-model">
        <name>State Model</name>

        <t>TIBET tokens have the following states:</t>

        <artwork type="ascii-art"><![CDATA[
CREATED --> ACTIVE --> RESOLVED
              |
              +--> SUPERSEDED
        ]]></artwork>

        <t>State descriptions:</t>

        <dl>
          <dt>"CREATED":</dt>
          <dd>Token initialized, action pending or in progress.</dd>

          <dt>"ACTIVE":</dt>
          <dd>Action is being processed or monitored.</dd>

          <dt>"RESOLVED":</dt>
          <dd>Final state. Action complete, outcome recorded.</dd>

          <dt>"SUPERSEDED":</dt>
          <dd>Token has been superseded by a newer token
          (<xref target="token-supersession"/>). The superseding
          token's token_id SHOULD be recorded in the transition
          record.</dd>
        </dl>

        <t>Note: The -00 version defined states DETECTED, CLASSIFIED,
        and MITIGATED. These are removed in -01 because they
        conflate provenance recording with incident response
        workflow, which is a policy concern. Implementations that
        need incident response states SHOULD define them as
        application-specific extensions in the "metadata" field.</t>
      </section>

      <!-- Section 7.2: State Transitions -->
      <section anchor="state-transitions">
        <name>State Transitions</name>

        <t>State transitions follow these rules:</t>

        <ul>
          <li>CREATED -> ACTIVE: When the action begins
          processing.</li>
          <li>CREATED -> RESOLVED: For instantaneous actions.</li>
          <li>ACTIVE -> RESOLVED: When the action completes.</li>
          <li>ACTIVE -> SUPERSEDED: When a correction is issued.</li>
          <li>RESOLVED -> SUPERSEDED: When a resolved action is later
          corrected.</li>
          <li>CREATED -> SUPERSEDED: When an action is cancelled
          before processing.</li>
        </ul>

        <t>All other transitions are invalid.</t>
      </section>

      <!-- Section 7.3: State Transition Record -->
      <section anchor="state-transition-record">
        <name>State Transition Record</name>

        <t>Each state transition MUST be recorded as a separate TIBET
        token of type "transition" with:</t>

        <ul>
          <li>parent_id pointing to the token being transitioned</li>
          <li>ERIN containing: {"transition": {"from": "ACTIVE",
          "to": "RESOLVED"}}</li>
          <li>ERACHTER explaining why the transition occurred</li>
          <li>The actor who authorized the transition</li>
        </ul>

        <t>This ensures that even state changes produce auditable
        evidence.</t>
      </section>
    </section>

    <!-- Section 8: Actor Identity -->
    <section anchor="actor-identity">
      <name>Actor Identity</name>

      <!-- Section 8.1: Actor Identifier Format -->
      <section anchor="actor-identifier-format">
        <name>Actor Identifier Format</name>

        <t>The "actor" field MUST be a string identifying the entity
        that created the token. The following formats are defined:</t>

        <dl>
          <dt>JIS identity:</dt>
          <dd>"jis:&lt;entity_type&gt;:&lt;identifier&gt;"
          Examples: "jis:idd:root_idd_2025", "jis:human:jasper",
          "jis:service:payment_gateway"</dd>

          <dt>Local identity:</dt>
          <dd>"local:&lt;identifier&gt;"
          Used when JIS identity is not available. The identifier
          is locally assigned and has no global uniqueness
          guarantee.</dd>
        </dl>

        <t>Implementations SHOULD use JIS identities when available.
        Implementations MUST accept both formats.</t>
      </section>

      <!-- Section 8.2: JIS Identity Binding -->
      <section anchor="jis-identity-binding">
        <name>JIS Identity Binding</name>

        <t>When the actor uses a JIS identity
        (<xref target="actor-identifier-format"/>), the signature's
        public key SHOULD be verifiable against the actor's JIS
        identity record. This binding enables a verifier to confirm
        that:</t>

        <ol>
          <li>The actor identifier refers to a real, established
          entity.</li>
          <li>The signing key belongs to that entity.</li>
          <li>The entity's trust score (FIR/A) can inform processing
          decisions.</li>
        </ol>

        <t>The mechanism for resolving a JIS identity to its public key
        is defined in <xref target="JIS"/>. AINS <xref target="AINS"/>
        provides discovery of the resolution endpoint.</t>
      </section>

      <!-- Section 8.3: Anonymous and Pseudonymous Actors -->
      <section anchor="anonymous-actors">
        <name>Anonymous and Pseudonymous Actors</name>

        <t>TIBET supports anonymous and pseudonymous tokens. An actor
        MAY use a pseudonymous identifier (e.g.,
        "local:anon-session-4f2e") when privacy requirements prevent
        identity disclosure. In this case:</t>

        <ul>
          <li>The token MUST still be signed (the key proves consistency
          within a session, even if the actor is unknown).</li>
          <li>The ERACHTER SHOULD note that the actor is pseudonymous
          and why.</li>
          <li>Verifiers SHOULD treat pseudonymous tokens with lower
          trust than identified tokens.</li>
        </ul>
      </section>
    </section>

    <!-- Section 9: Trust Scoring (FIR/A) -->
    <section anchor="trust-scoring">
      <name>Trust Scoring (FIR/A)</name>

      <!-- Section 9.1: Trust Score as Evidence -->
      <section anchor="trust-score-evidence">
        <name>Trust Score as Evidence</name>

        <t>TIBET tokens MAY include trust-related evidence in EROMHEEN.
        Trust scores are computed by the companion JIS protocol
        <xref target="JIS"/> using FIR/A and represent the actor's
        trust level at the time of token creation.</t>

        <t>Trust scores are EVIDENCE, not ASSERTIONS. A trust score in
        a TIBET token means "at the time of this action, this
        registry computed this score for this actor." Different
        registries MAY compute different scores for the same actor.</t>
      </section>

      <!-- Section 9.2: Score Inputs -->
      <section anchor="score-inputs">
        <name>Score Inputs</name>

        <t>Trust scores are behavior-based, not claim-based. Scores
        adjust based on:</t>

        <ul>
          <li>Consistency of behavior patterns</li>
          <li>Accuracy of stated intent (ERACHTER) vs. actual
          outcomes</li>
          <li>Chain integrity maintenance</li>
          <li>Response to verification requests</li>
        </ul>

        <t>The scoring algorithm is defined in JIS
        <xref target="JIS"/>. TIBET provides the evidence chain that
        scoring algorithms consume.</t>
      </section>

      <!-- Section 9.3: Local Evaluation -->
      <section anchor="local-evaluation">
        <name>Local Evaluation</name>

        <t>Trust scores MUST be computed locally by each evaluating
        party. A trust score from one registry is an opinion, not a
        fact. Only the underlying TIBET evidence chain is factual.</t>

        <t>This prevents "trust laundering" -- the inflation of trust
        scores through permissive intermediaries.</t>
      </section>
    </section>

    <!-- Section 10: Transport Considerations -->
    <section anchor="transport">
      <name>Transport Considerations</name>

      <!-- Section 10.1: Baseline -->
      <section anchor="transport-baseline">
        <name>Baseline: JSON over HTTPS</name>

        <t>For interoperability, JSON encoding over HTTPS is the
        baseline transport. All conforming implementations MUST
        support this baseline.</t>
      </section>

      <!-- Section 10.2: Alternative Transports -->
      <section anchor="alternative-transports">
        <name>Alternative Transports</name>

        <t>TIBET tokens MAY be transported over:</t>
        <ul>
          <li>WebSocket connections</li>
          <li>Message queues (AMQP, Kafka, NATS)</li>
          <li>gRPC streams</li>
          <li>File transfer (for UPIP bundles)</li>
          <li>I-Poll messages (for agent-to-agent communication)</li>
        </ul>

        <t>Regardless of transport, the token format and verification
        procedures defined in this document apply.</t>
      </section>

      <!-- Section 10.3: Content-Type -->
      <section anchor="content-type">
        <name>Content-Type</name>

        <t>When TIBET tokens are transmitted over HTTP, the Content-Type
        header SHOULD be:</t>

        <t>application/tibet+json</t>

        <t>Implementations MUST also accept "application/json".</t>
      </section>
    </section>

    <!-- Section 11: Storage Considerations -->
    <section anchor="storage">
      <name>Storage Considerations</name>

      <!-- Section 11.1: Append-Only Logs -->
      <section anchor="append-only-logs">
        <name>Append-Only Logs</name>

        <t>TIBET tokens MAY be stored in append-only logs or ledgers.
        This is RECOMMENDED for regulated environments but is not
        a protocol requirement. The integrity of a TIBET token is
        self-verifiable through its hash and signature, independent
        of the storage system.</t>
      </section>

      <!-- Section 11.2: Retention Policy -->
      <section anchor="retention-policy">
        <name>Retention Policy</name>

        <t>Retention of TIBET tokens is a local policy decision. This
        document makes no normative statements about retention
        periods. Implementers should consider applicable regulatory
        requirements (e.g., GDPR <xref target="GDPR"/> right to
        erasure, financial record retention rules).</t>

        <t>When tokens containing personal data are deleted per
        retention policy, implementations SHOULD retain a tombstone
        record containing: token_id, token hash, deletion timestamp,
        and the reason for deletion.</t>
      </section>
    </section>

    <!-- Section 12: Privacy Considerations -->
    <section anchor="privacy">
      <name>Privacy Considerations</name>

      <!-- Section 12.1 -->
      <section anchor="sensitive-data">
        <name>Sensitive Data in Components</name>

        <t>ERIN and EROMHEEN components MAY contain personal data,
        business-sensitive information, or security-relevant context.
        Implementations MUST support encryption at rest for stored
        tokens and SHOULD support field-level encryption for
        individual components.</t>
      </section>

      <!-- Section 12.2 -->
      <section anchor="selective-disclosure">
        <name>Selective Disclosure</name>

        <t>An actor presenting a TIBET chain to a verifier MAY redact
        components that are not relevant to the verification purpose.
        When components are redacted:</t>

        <ul>
          <li>The token hash is still verifiable (proving the redacted
          version was derived from a valid token).</li>
          <li>Redacted fields are replaced with their individual hashes,
          prefixed with "redacted:sha256:&lt;hex&gt;".</li>
          <li>The signature remains valid over the original token.</li>
        </ul>

        <t>The verifier can confirm that a valid token exists with the
        claimed hash without seeing the redacted content.</t>
      </section>

      <!-- Section 12.3 -->
      <section anchor="redacted-views">
        <name>Redacted Views</name>

        <t>Implementations SHOULD support generating redacted views of
        tokens where sensitive fields (ERIN, EROMHEEN) are replaced
        with their hashes. This enables sharing provenance chains
        for audit purposes without exposing sensitive content.</t>
      </section>

      <!-- Section 12.4 -->
      <section anchor="data-minimization">
        <name>Data Minimization</name>

        <t>Implementations SHOULD apply data minimization
        principles:</t>

        <ul>
          <li>ERIN: Include only the minimum content needed for
          provenance.</li>
          <li>EROMHEEN: Include only context relevant to audit and
          verification.</li>
          <li>ERACHTER: Include only reasoning relevant to
          accountability.</li>
          <li>ERAAN: Reference external resources by identifier rather
          than embedding their content.</li>
        </ul>
      </section>
    </section>

    <!-- Section 13: Security Considerations -->
    <section anchor="security">
      <name>Security Considerations</name>

      <!-- Section 13.1 -->
      <section anchor="sec-token-integrity">
        <name>Token Integrity</name>

        <t>Attack: An adversary modifies a token's content after
        creation.</t>

        <t>Impact: The audit trail contains false evidence. Decisions
        based on the modified token may be incorrect.</t>

        <t>Mitigation: Every token includes a hash computed over its
        canonical serialization and a cryptographic signature from
        the creating actor. Modification of any field invalidates
        the hash, which invalidates the signature.</t>

        <t>Deployment: Implementations MUST verify hash and signature
        before processing any token. Implementations MUST reject
        tokens with invalid hashes or signatures and MUST record the
        rejection as evidence.</t>
      </section>

      <!-- Section 13.2 -->
      <section anchor="sec-chain-integrity">
        <name>Chain Integrity</name>

        <t>Attack: An adversary inserts, removes, or reorders tokens in
        a chain.</t>

        <t>Impact: The audit trail is incomplete or misleading. Causal
        relationships may be falsified.</t>

        <t>Mitigation: Child tokens include parent_hash, creating a
        hash chain. Insertion of a fake token breaks the chain
        because the fake token's hash will not match the parent_hash
        in subsequent tokens.</t>

        <t>Deployment: Implementations MUST verify parent_hash
        references during chain verification. Implementations SHOULD
        alert on chain gaps (referenced parents that do not
        exist).</t>
      </section>

      <!-- Section 13.3 -->
      <section anchor="non-repudiation">
        <name>Non-Repudiation</name>

        <t>Attack: An actor denies creating a token.</t>

        <t>Impact: Accountability is undermined.</t>

        <t>Mitigation: Tokens are signed with the actor's private key.
        The signature can be verified by any party with access to
        the actor's public key (published via JIS identity or AINS
        record).</t>

        <t>Deployment: For high-assurance scenarios, implementations
        SHOULD use hardware-protected signing keys (secure elements,
        TPM). For standard scenarios, software key management with
        proper access controls is sufficient.</t>
      </section>

      <!-- Section 13.4 -->
      <section anchor="replay-attacks">
        <name>Replay Attacks</name>

        <t>Attack: An adversary replays a valid token from a different
        context.</t>

        <t>Impact: The audit trail records an action that did not occur
        in the claimed context.</t>

        <t>Mitigation: Tokens include millisecond-precision timestamps.
        Chain linking (parent_id + parent_hash) binds tokens to
        specific positions in a chain. Replaying a token in a
        different chain or at a different time creates a detectable
        inconsistency.</t>

        <t>Deployment: Implementations SHOULD reject tokens with
        timestamps outside a configurable window (default: 5
        minutes). For real-time scenarios, tighter windows are
        RECOMMENDED.</t>
      </section>

      <!-- Section 13.5 -->
      <section anchor="unauthorized-transitions">
        <name>Unauthorized State Transitions</name>

        <t>Attack: An adversary issues a state transition for a token
        they did not create.</t>

        <t>Impact: The token's lifecycle is corrupted.</t>

        <t>Mitigation: State transitions are recorded as separate tokens
        (<xref target="state-transition-record"/>) that must be
        signed by an authorized actor. Who may transition a token is
        a local policy decision.</t>

        <t>Deployment: Implementations SHOULD maintain an access control
        list per token specifying which actors may issue transitions.
        At minimum, the creating actor MUST be authorized.</t>
      </section>

      <!-- Section 13.6 -->
      <section anchor="denial-of-service">
        <name>Denial of Service</name>

        <t>Attack: An adversary floods the system with tokens, exhausting
        storage or processing capacity.</t>

        <t>Impact: Legitimate tokens cannot be created or stored.</t>

        <t>Mitigation: Token creation is tied to actor identity
        (<xref target="actor-identity"/>). Rate limiting per actor,
        based on FIR/A trust score, is the primary defense. Low-trust
        actors SHOULD have lower rate limits.</t>

        <t>Deployment: Implementations MUST implement per-actor rate
        limiting. Implementations SHOULD use FIR/A trust scores to
        set rate limits dynamically.</t>
      </section>

      <!-- Section 13.7 -->
      <section anchor="key-compromise">
        <name>Key Compromise</name>

        <t>Attack: An actor's signing key is compromised.</t>

        <t>Impact: The adversary can create tokens impersonating the
        compromised actor.</t>

        <t>Mitigation: JIS <xref target="JIS"/> provides key rotation
        and revocation mechanisms. When a key is revoked, verifiers
        can determine that tokens signed with the revoked key after
        the revocation timestamp are suspect.</t>

        <t>Deployment: Implementations SHOULD check key revocation status
        during signature verification. Implementations SHOULD use
        short-lived signing keys where feasible.</t>
      </section>

      <!-- Section 13.8 -->
      <section anchor="implementation-guidance">
        <name>Implementation Guidance</name>

        <t>Implementations MUST use SHA-256 <xref target="FIPS180-4"/>
        for all hash computations. Implementations SHOULD support
        algorithm agility through the hash prefix ("sha256:") to
        enable future migration.</t>

        <t>Implementations MUST use Ed25519 or ECDSA-P256 for
        signatures. Ed25519 is RECOMMENDED for new
        implementations.</t>
      </section>
    </section>

    <!-- Section 14: Integration with Companion Protocols -->
    <section anchor="companion-integration">
      <name>Integration with Companion Protocols</name>

      <!-- Section 14.1 -->
      <section anchor="integration-jis">
        <name>JIS - Identity and Trust Establishment</name>

        <t>JIS <xref target="JIS"/> provides actor identity and trust
        establishment. TIBET relies on JIS for:</t>

        <ul>
          <li>Actor identifier format
          (<xref target="actor-identifier-format"/>)</li>
          <li>Public key resolution for signature verification</li>
          <li>FIR/A trust scores as evidence input</li>
        </ul>

        <t>Each JIS FIR/A handshake SHOULD produce a TIBET token
        recording the trust establishment event.</t>

        <t>Mapping of JIS Humotica context to TIBET components:</t>

        <ul>
          <li>Humotica.sense -> ERIN (what triggered the action)</li>
          <li>Humotica.context -> EROMHEEN (situational context)</li>
          <li>Humotica.intent -> ERIN.intent (the declared
          purpose)</li>
          <li>Humotica.explanation -> ERACHTER (the reasoning)</li>
        </ul>
      </section>

      <!-- Section 14.2 -->
      <section anchor="integration-upip">
        <name>UPIP - Process Integrity</name>

        <t>UPIP <xref target="UPIP"/> uses TIBET tokens to record
        process execution provenance. Each UPIP layer transition
        (STATE, DEPS, PROCESS, RESULT, VERIFY) MAY produce a TIBET
        token. Fork tokens reference TIBET chains to establish
        handoff provenance.</t>
      </section>

      <!-- Section 14.3 -->
      <section anchor="integration-rvp">
        <name>RVP - Continuous Verification</name>

        <t>RVP <xref target="RVP"/> produces verification tokens that
        include TIBET provenance fields. Each RVP verification moment
        corresponds to a TIBET token recording: who was verified,
        how, with what confidence, and why verification was
        triggered.</t>
      </section>

      <!-- Section 14.4 -->
      <section anchor="integration-ains">
        <name>AINS - Agent Discovery</name>

        <t>AINS <xref target="AINS"/> records MAY reference TIBET chain
        anchors as trust evidence. A long TIBET chain with verified
        integrity is evidence of sustained, auditable operation. AINS
        registries MAY weight TIBET chain evidence in trust score
        computation.</t>
      </section>
    </section>

    <!-- Section 15: IANA Considerations -->
    <section anchor="iana">
      <name>IANA Considerations</name>

      <section anchor="media-type-registration">
        <name>Media Type Registration</name>

        <t>This document requests registration of the following media
        type <xref target="RFC6838"/>:</t>

        <dl>
          <dt>Type name:</dt>
          <dd>application</dd>

          <dt>Subtype name:</dt>
          <dd>tibet+json</dd>

          <dt>Required parameters:</dt>
          <dd>none</dd>

          <dt>Optional parameters:</dt>
          <dd>none</dd>

          <dt>Encoding considerations:</dt>
          <dd>binary (UTF-8 JSON)</dd>

          <dt>Security considerations:</dt>
          <dd>See <xref target="security"/></dd>

          <dt>Interoperability considerations:</dt>
          <dd>See <xref target="token-data-model"/></dd>

          <dt>Published specification:</dt>
          <dd>this document</dd>

          <dt>Applications that use this media type:</dt>
          <dd>TIBET token creators and verifiers, autonomous agent
          platforms, audit systems</dd>

          <dt>Fragment identifier considerations:</dt>
          <dd>none</dd>

          <dt>Person and email address to contact for further
          information:</dt>
          <dd>Jasper van de Meent &lt;jasper@humotica.nl&gt;</dd>

          <dt>Intended usage:</dt>
          <dd>COMMON</dd>

          <dt>Restrictions on usage:</dt>
          <dd>none</dd>

          <dt>Author:</dt>
          <dd>Jasper van de Meent</dd>

          <dt>Change controller:</dt>
          <dd>IETF</dd>
        </dl>

        <t>Note: The -00 version requested registration of X-TIBET-*
        HTTP headers. This is withdrawn. Provisional HTTP header
        fields do not require registration, and the use case does
        not justify standardized header fields at this time.</t>
      </section>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>

      <!-- Normative References -->
      <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" initials="S."
                    surname="Bradner"/>
            <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="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" initials="B."
                    surname="Leiba"/>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>

        <reference anchor="RFC8259"
                   target="https://www.rfc-editor.org/info/rfc8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data
                   Interchange Format</title>
            <author fullname="T. Bray" initials="T." surname="Bray"
                    role="editor"/>
            <date month="December" year="2017"/>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>

        <reference anchor="RFC9562"
                   target="https://www.rfc-editor.org/info/rfc9562">
          <front>
            <title>Universally Unique IDentifiers (UUIDs)</title>
            <author fullname="K. Davis" initials="K."
                    surname="Davis"/>
            <author fullname="B. Peabody" initials="B."
                    surname="Peabody"/>
            <author fullname="P. Leach" initials="P."
                    surname="Leach"/>
            <date month="May" year="2024"/>
          </front>
          <seriesInfo name="RFC" value="9562"/>
          <seriesInfo name="DOI" value="10.17487/RFC9562"/>
        </reference>

        <reference anchor="FIPS180-4"
                   target="https://csrc.nist.gov/publications/detail/fips/180/4/final">
          <front>
            <title>Secure Hash Standard (SHS)</title>
            <author>
              <organization>National Institute of Standards and
              Technology (NIST)</organization>
            </author>
            <date month="August" year="2015"/>
          </front>
          <seriesInfo name="FIPS PUB" value="180-4"/>
        </reference>
      </references>

      <!-- Informative References -->
      <references>
        <name>Informative References</name>

        <reference anchor="JIS">
          <front>
            <title>JIS: JTel Identity Standard</title>
            <author fullname="Jasper van de Meent" initials="J."
                    surname="van de Meent"/>
            <author fullname="Root AI" surname="Root AI"/>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-vandemeent-jis-identity-01"/>
        </reference>

        <reference anchor="UPIP">
          <front>
            <title>UPIP: Universal Process Integrity Protocol</title>
            <author fullname="Jasper van de Meent" initials="J."
                    surname="van de Meent"/>
            <author fullname="Root AI" surname="Root AI"/>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-vandemeent-upip-process-integrity-01"/>
        </reference>

        <reference anchor="RVP">
          <front>
            <title>RVP: Real-time Verification Protocol</title>
            <author fullname="Jasper van de Meent" initials="J."
                    surname="van de Meent"/>
            <author fullname="Root AI" surname="Root AI"/>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-vandemeent-rvp-continuous-verification-01"/>
        </reference>

        <reference anchor="AINS">
          <front>
            <title>AINS: AInternet Name Service</title>
            <author fullname="Jasper van de Meent" initials="J."
                    surname="van de Meent"/>
            <author fullname="Root AI" surname="Root AI"/>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-vandemeent-ains-discovery-01"/>
        </reference>

        <reference anchor="RFC6838"
                   target="https://www.rfc-editor.org/info/rfc6838">
          <front>
            <title>Media Type Specifications and Registration
                   Procedures</title>
            <author fullname="N. Freed" initials="N."
                    surname="Freed"/>
            <author fullname="J. Klensin" initials="J."
                    surname="Klensin"/>
            <author fullname="T. Hansen" initials="T."
                    surname="Hansen"/>
            <date month="January" year="2013"/>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>

        <reference anchor="RFC8949"
                   target="https://www.rfc-editor.org/info/rfc8949">
          <front>
            <title>Concise Binary Object Representation
                   (CBOR)</title>
            <author fullname="C. Bormann" initials="C."
                    surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P."
                    surname="Hoffman"/>
            <date month="December" year="2020"/>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>

        <reference anchor="EU-AI-ACT">
          <front>
            <title>Regulation (EU) 2024/1689 laying down harmonised
            rules on artificial intelligence (Artificial
            Intelligence Act)</title>
            <author>
              <organization>European Parliament</organization>
            </author>
            <date month="June" year="2024"/>
          </front>
        </reference>

        <reference anchor="GDPR">
          <front>
            <title>Regulation (EU) 2016/679 on the protection of
            natural persons with regard to the processing of
            personal data (General Data Protection
            Regulation)</title>
            <author>
              <organization>European Parliament</organization>
            </author>
            <date month="April" year="2016"/>
          </front>
          <seriesInfo name="Regulation (EU)" value="2016/679"/>
        </reference>
      </references>
    </references>

    <!-- Appendix A: Token Examples -->
    <section anchor="token-examples">
      <name>Token Examples</name>

      <!-- A.1: Simple Query Token -->
      <section anchor="simple-query-token">
        <name>Simple Query Token</name>

        <sourcecode type="json"><![CDATA[
{
  "token_id": "tbt-550e8400-e29b-41d4-a716-446655440000",
  "version": "1.1",
  "type": "query",
  "timestamp": "2026-03-29T10:30:00.000Z",
  "actor": "jis:human:user_12345",
  "erin": {
    "content": "What are my account permissions?",
    "format": "natural_language",
    "language": "en"
  },
  "eraan": [
    "actor:jis:service:account_service"
  ],
  "eromheen": {
    "environment": "production",
    "client": "mobile-app-v3.2",
    "regulatory_context": ["GDPR"]
  },
  "erachter": "User requesting account information via
    self-service portal. Routine access check, no elevated
    permissions requested.",
  "state": "CREATED",
  "hash": "sha256:4f2e8a1b3c9d7e6f...",
  "signature": {
    "algorithm": "Ed25519",
    "public_key": "ed25519:MCowBQYD...",
    "value": "7f3a9b2c..."
  }
}
        ]]></sourcecode>
      </section>

      <!-- A.2: AI Decision Token (Child) -->
      <section anchor="ai-decision-token">
        <name>AI Decision Token (Child)</name>

        <sourcecode type="json"><![CDATA[
{
  "token_id": "tbt-550e8400-e29b-41d4-a716-446655440001",
  "version": "1.1",
  "type": "decision",
  "timestamp": "2026-03-29T10:30:05.127Z",
  "actor": "jis:idd:credit_model_v2",
  "erin": {
    "decision": "APPROVED",
    "amount": 50000,
    "confidence": 0.92,
    "factors": {
      "credit_score": 0.85,
      "income_ratio": 0.78,
      "history_length": 0.95
    }
  },
  "eraan": [
    "tbt:tbt-550e8400-e29b-41d4-a716-446655440000",
    "model:credit-scoring-v2.3.1",
    "policy:lending-policy-2026q1"
  ],
  "eromheen": {
    "environment": "production",
    "region": "eu-west-1",
    "regulatory_context": ["GDPR", "EU-AI-Act"],
    "human_oversight": "available"
  },
  "erachter": "Credit application evaluated per policy
    lending-policy-2026q1 section 4.2. Score 0.92 exceeds
    threshold 0.75. Approved. Human review not triggered
    (confidence above 0.90 per oversight policy OP-7.1).",
  "parent_id": "tbt-550e8400-e29b-41d4-a716-446655440000",
  "parent_hash": "sha256:4f2e8a1b3c9d7e6f...",
  "state": "RESOLVED",
  "hash": "sha256:7c9d1b2e3f4a5d6c...",
  "signature": {
    "algorithm": "Ed25519",
    "public_key": "ed25519:KDwoBQYE...",
    "value": "9d2f3a1b..."
  }
}
        ]]></sourcecode>
      </section>
    </section>

    <!-- Appendix B: Canonicalization Example -->
    <section anchor="canonicalization-example">
      <name>Canonicalization Example</name>

      <t>Given the token in <xref target="simple-query-token"/>
      (excluding "hash" and "signature"):</t>

      <t>Canonical JSON (abbreviated):</t>

      <sourcecode><![CDATA[
{"actor":"jis:human:user_12345","erachter":"User requesting...",
"eraan":["actor:jis:service:account_service"],"erin":{"content":
"What are my account permissions?","format":"natural_language",
"language":"en"},"eromheen":{"client":"mobile-app-v3.2",
"environment":"production","regulatory_context":["GDPR"]},
"state":"CREATED","timestamp":"2026-03-29T10:30:00.000Z",
"token_id":"tbt-550e8400-e29b-41d4-a716-446655440000",
"type":"query","version":"1.1"}
      ]]></sourcecode>

      <t>Note: keys are sorted lexicographically ("actor" &lt;
      "erachter" &lt; "eraan" &lt; "erin" &lt; "eromheen" &lt;
      "state" &lt; ...).</t>
    </section>

    <!-- Appendix C: Changes from -00 -->
    <section anchor="changes-from-00">
      <name>Changes from -00</name>

      <t>This section lists substantive changes from
      draft-vandemeent-tibet-provenance-00:</t>

      <ol>
        <li>Added RFC 8174 alongside RFC 2119 in Terminology.</li>

        <li>Changed intended status from Standards Track to
        Informational. The protocol needs broader review and
        implementation experience before Standards Track is
        appropriate.</li>

        <li>Added "version" field (value "1.1") to token
        structure.</li>

        <li>Added "tbt-" prefix to token_id for namespacing.</li>

        <li>Replaced "immutable ledger" language with
        transport/storage-agnostic formulation. Tokens are self-
        verifiable; storage is a deployment decision.</li>

        <li>Added canonicalization rules
        (<xref target="canonicalization"/>) for deterministic
        hashing across implementations.</li>

        <li>Structured the signature as an object with algorithm,
        public_key, and value fields (was: bare string).</li>

        <li>Simplified state model from five states (CREATED,
        DETECTED, CLASSIFIED, MITIGATED, RESOLVED) to four
        (CREATED, ACTIVE, RESOLVED, SUPERSEDED). Incident
        response states are application-specific, not
        protocol.</li>

        <li>Added token supersession mechanism
        (<xref target="token-supersession"/>).</li>

        <li>Added component boundary guidance
        (<xref target="component-boundaries"/>).</li>

        <li>Added Privacy Considerations section
        (<xref target="privacy"/>) with selective disclosure and
        redacted views.</li>

        <li>Expanded Security Considerations from 4 paragraphs to 8
        structured subsections with attack/impact/mitigation/
        deployment format.</li>

        <li>Removed X-TIBET-* HTTP header registration from IANA
        Considerations. Not justified at this stage.</li>

        <li>Added Actor Identity section
        (<xref target="actor-identity"/>) with JIS binding and
        pseudonymous actor support.</li>

        <li>Normalized companion protocol references to
        <xref target="JIS"/>, <xref target="UPIP"/>,
        <xref target="RVP"/>, <xref target="AINS"/>.</li>

        <li>Updated references: added RFC 9562 (UUID), RFC 8949
        (CBOR), RFC 6838 (media types), FIPS 180-4
        (SHA-256).</li>
      </ol>
    </section>

    <!-- Acknowledgments -->
    <section anchor="acknowledgements" numbered="false">
      <name>Acknowledgements</name>

      <t>The author thanks Codex (codex.aint) for the suite-wide
      cleanup analysis that informed this revision, and the
      HumoticaOS family for building the first operational TIBET
      implementation.</t>
    </section>
  </back>
</rfc>
