<?xml version="1.0" encoding="utf-8"?>
<?xml-model href="rfc7991bis.rnc"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     ipr="trust200902"
     docName="draft-veridom-omp-00"
     category="info"
     submissionType="independent"
     xml:lang="en"
     version="3">

  <front>
    <title abbrev="OMP Core Protocol">Operating Model Protocol (OMP): A Deterministic Routing and Evidence Architecture for AI Decision Accountability in Regulated Industries</title>

    <seriesInfo name="Internet-Draft" value="draft-veridom-omp-00"/>

    <author fullname="Tolulope Adebayo" initials="T." surname="Adebayo">
      <organization>Veridom Ltd</organization>
      <address>
        <postal>
          <street>London</street>
          <country>United Kingdom</country>
        </postal>
        <email>tolulope@veridom.io</email>
        <uri>https://veridom.io</uri>
      </address>
    </author>

    <author fullname="Festus Makanjuola" initials="F." surname="Makanjuola">
      <organization>Veridom Ltd</organization>
      <address>
        <email>festus@veridom.io</email>
      </address>
    </author>

    <author fullname="Oluropo Apalowo" initials="O." surname="Apalowo">
      <organization>Veridom Ltd</organization>
      <address>
        <email>ropo@veridom.io</email>
      </address>
    </author>

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

    <area>Security</area>

    <keyword>AI accountability</keyword>
    <keyword>deterministic routing</keyword>
    <keyword>operating model protocol</keyword>
    <keyword>SHA-256 Merkle chain</keyword>
    <keyword>tamper-evident audit trail</keyword>
    <keyword>per-decision explainability</keyword>
    <keyword>regulated industries</keyword>
    <keyword>RFC 3161</keyword>
    <keyword>principal-agent enforcement</keyword>

    <abstract>
      <t>
        Regulated institutions deploying AI face a structural evidence problem: the gap between
        what their systems claim to do and what they can prove happened at the level of an
        individual decision. Existing compliance infrastructure addresses this problem
        observationally -- monitoring, dashboards, retrospective reporting -- but does not
        close it structurally.
      </t>
      <t>
        This specification defines the Operating Model Protocol (OMP), a deterministic routing
        invariant that classifies every interaction in a regulated operation to exactly one of
        three outcome states -- AUTONOMOUS, ASSISTED, or ESCALATED -- and generates a
        tamper-evident audit trace at the point of every decision. The routing decision is a
        deterministic function of a composite Confidence Score, Watchtower enforcement
        evaluations, and domain-specific thresholds. Given identical inputs, the protocol
        produces identical outputs. This invariance is the architectural basis of the
        regulatory claim.
      </t>
      <t>
        Each audit trace is sealed using a three-layer cryptographic integrity architecture:
        SHA-256 content hash, a trusted timestamp from an accredited third-party
        Timestamp Authority (per RFC 3161), and institution signature. The chain forms a Merkle structure in
        which modification of any historical trace invalidates all subsequent chain hashes.
        Per-decision accountability is therefore verifiable by any third party without access
        to the institution's or Veridom's infrastructure.
      </t>
      <t>
        The protocol has been independently instantiated across four regulated domains --
        digital credit under the Kenya CBK NDTCP framework, FCA Consumer Duty, FCA agent
        distribution oversight, and US legal AI supervision under ABA Rule 5.3 -- with the
        same two invariants holding in each: deterministic classification and immutable audit
        trail. Domain-specific profiles for digital credit and cooperative lending are
        published separately as draft-veridom-omp-ndtcp and draft-veridom-omp-sacco.
      </t>
    </abstract>
  </front>

  <middle>

    <section anchor="intro" numbered="true" toc="default">
      <name>Introduction</name>
      <t>
        Regulated institutions globally share a structural failure: the gap between what they
        claim their operations do and what they can prove happened. This gap manifests in three
        distinct layers:
      </t>
      <ul spacing="normal">
        <li>
          <strong>Policy-to-Practice Gap:</strong> The institution has the required policies.
          Its agents, systems, and processes do not consistently follow them. The gap is
          invisible until an examiner asks to see evidence.
        </li>
        <li>
          <strong>Practice-to-Evidence Gap:</strong> Practices are compliant, but the
          contemporaneous evidence trail is absent or incomplete. Decisions are made but not
          recorded at the required granularity.
        </li>
        <li>
          <strong>Evidence-to-Examination Gap:</strong> Evidence exists but is not producible
          in the form a regulator requires -- scattered across systems, formatted for
          operations rather than audit, and not independently verifiable.
        </li>
      </ul>
      <t>
        Every existing compliance tool accepts at least one of these layers as permanent.
        Monitoring tools accept that violations will occur and report them after the fact.
        GRC platforms accept that evidence will be incomplete and provide storage for what
        exists. Compliance dashboards accept the examination gap and help institutions
        produce narratives instead of proofs.
      </t>
      <t>
        OMP refuses these concessions. The protocol closes all three layers structurally: it
        makes Layer 1 deviations impossible without generating a record, closes Layer 2 by
        producing evidence at the moment of the decision, and closes Layer 3 by producing a
        cryptographically sealed artifact that requires no manual assembly and carries no
        institutional fingerprints on the integrity claim.
      </t>
      <t>
        This document specifies the OMP core protocol. A parallel publication of this specification is available at <xref target="ZENODO-OMP"/>. Domain-specific profiles that define
        vertical configuration parameters are specified in companion documents. Notably, the
        protocol was independently instantiated in a legal services context (citation
        verification under ABA Rule 5.3) without reference to the financial services
        instantiation, and the same two invariants -- deterministic classification and
        immutable audit trail -- held. This convergence is cited as evidence that the
        architecture describes a discovered structural pattern, not a designed framework.
      </t>

      <section anchor="related" numbered="true" toc="default">
        <name>Relationship to Related Work</name>
        <t>
          Several specifications address overlapping problem spaces. This document notes the
          following related work and its relationship to OMP:
        </t>
        <ul spacing="normal">
          <li>
            <xref target="I-D.cowles-volt"/>, <xref target="I-D.cowles-aocl"/>, and
            <xref target="I-D.cowles-aee"/> define VOLT (hash-chained operations ledger),
            AOCL (11-layer governance pipeline), and AEE (agent envelope exchange)
            respectively. These drafts address generic agentic AI workflows. OMP addresses
            the specific domain requirements of regulated financial services: per-decision
            credit decision explainability, principal-agent accountability under named
            regulatory frameworks, and regulator-ready evidence artifact generation.
            The architectural approaches are complementary; OMP adds <xref target="RFC3161"/> trusted
            timestamping to close the host-compromise threat that VOLT explicitly
            acknowledges in its own threat model (T7).
          </li>
        </ul>
      </section>
    </section>

    <section anchor="conventions" numbered="true" toc="default">
      <name>Conventions and Definitions</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>
      <t>
        The terms AUTONOMOUS, ASSISTED, and ESCALATED, when written in ALL CAPS, refer
        specifically to the three routing outcome states defined in <xref target="routing"/>
        of this document.
      </t>
    </section>

    <section anchor="terminology" numbered="true" toc="default">
      <name>Terminology</name>
      <dl newline="false" spacing="normal">
        <dt>OMP:</dt>
        <dd>Operating Model Protocol. The deterministic routing invariant defined in this document.</dd>

        <dt>Interaction:</dt>
        <dd>Any input event -- a message, query, transaction request, or signal -- that enters the OMP pipeline for routing.</dd>

        <dt>Intent Class:</dt>
        <dd>A domain-specific category of interaction defined during vertical configuration. Each Intent Class has its own routing threshold theta.</dd>

        <dt>Confidence Score (C):</dt>
        <dd>A normalised float in [0.0, 1.0] representing the system's computed certainty that a given routing decision is correct. Composite of C_m (model confidence), C_p (policy compliance score), and C_d (data completeness score).</dd>

        <dt>Routing Threshold (theta):</dt>
        <dd>The minimum Confidence Score required for a given Intent Class to qualify for the AUTONOMOUS path.</dd>

        <dt>Watchtower:</dt>
        <dd>A domain-specific enforcement rule that evaluates an interaction against a defined trigger condition and returns a severity-tagged routing override signal.</dd>

        <dt>Audit Trace:</dt>
        <dd>The complete, structured metadata record of a single OMP routing event, including routing decision, confidence scores, Watchtower evaluations, and cryptographic seals.</dd>

        <dt>Proof-Point Artifact:</dt>
        <dd>An aggregated, cryptographically sealed PDF generated from a defined time window of Audit Traces. Regulator-ready in under 30 seconds from any point in deployment history.</dd>

        <dt>Named Accountable Officer:</dt>
        <dd>A human actor whose identity is explicitly logged in the Audit Trace as the approving authority for an ASSISTED or ESCALATED resolution.</dd>

        <dt>H_s (Source State Hash):</dt>
        <dd>SHA-256 hash of an external data source response at the exact millisecond of query. Proves what the source said at decision time independently of current state.</dd>

        <dt>H_content (Trace Content Hash):</dt>
        <dd>SHA-256 hash of the complete Audit Trace record, excluding the sealing fields themselves.</dd>

        <dt>H_c (Trace Chain Hash):</dt>
        <dd>SHA-256 Merkle chain entry. Each trace's H_c incorporates the preceding trace's H_c. Modification of any trace breaks all subsequent chain hashes.</dd>

        <dt>TST (TimeStampToken):</dt>
        <dd>A cryptographically signed timestamp token issued by an accredited Timestamp Authority per <xref target="RFC3161"/>. Provides externally verifiable proof of existence at a specific point in time.</dd>

        <dt>TSA (Timestamp Authority):</dt>
        <dd>An accredited third-party Timestamp Authority operating per <xref target="RFC3161"/>. Independent of the institution and of Veridom.</dd>

        <dt>VerticalConfig:</dt>
        <dd>The domain-specific configuration layer that sits on top of the OMP invariant core. Defines Intent Classes, routing thresholds, Watchtower definitions, and SLA parameters for a specific regulated domain.</dd>

        <dt>Threshold Change Record (TCR):</dt>
        <dd>A sealed, immutable record of any modification to a production VerticalConfig. Required before any configuration change takes effect.</dd>
      </dl>
    </section>

    <section anchor="architecture" numbered="true" toc="default">
      <name>Protocol Architecture</name>
      <t>
        The OMP pipeline processes every incoming interaction through five sequential stages.
        These stages are invariant across all vertical deployments. Only the configuration
        parameters -- Intent Classes, Routing Thresholds, and Watchtower definitions --
        change per domain.
      </t>

      <table align="center">
        <thead>
          <tr><th>Stage</th><th>Name</th><th>Function</th></tr>
        </thead>
        <tbody>
          <tr><td>S1</td><td>Ingestion and Normalisation</td><td>Receive payload. Assign UUID v4 Interaction ID. Normalise to canonical JSON per <xref target="RFC8785"/>. Compute interaction_hash = SHA-256(normalised_payload).</td></tr>
          <tr><td>S2</td><td>Intent Classification</td><td>Classify interaction to a registered Intent Class. Record intent_class, intent_confidence, and top-3 candidates with confidence scores.</td></tr>
          <tr><td>S3</td><td>Watchtower Evaluation</td><td>Evaluate all active Watchtowers in priority order. Record triggered status, severity, and evidence for each.</td></tr>
          <tr><td>S4</td><td>Routing Decision</td><td>Apply routing function R(C, W, theta, phi) to assign exactly one path. Record routing_rationale with explicit rule reference.</td></tr>
          <tr><td>S5</td><td>Trace Sealing</td><td>Compute H_content, request <xref target="RFC3161"/> TST, compute H_c, append to ledger.</td></tr>
        </tbody>
      </table>

      <t>
        Stages S1 through S5 and the routing logic in <xref target="routing"/> are invariant.
        They MUST NOT change between verticals, deployments, or software versions without a
        formal specification amendment following the Change Control process in
        <xref target="changecontrol"/>. This invariance is the basis of the regulatory claim:
        the same inputs always produce the same routing decision.
      </t>
    </section>

    <section anchor="routing" numbered="true" toc="default">
      <name>Routing Decision Logic</name>
      <t>
        The routing decision is a deterministic function R(C, W, theta, phi) where C is the
        Confidence Score, W is the set of Watchtower evaluation results, theta is the Intent
        Class routing threshold, and phi is the set of override conditions. The function
        MUST return exactly one value from {AUTONOMOUS, ASSISTED, ESCALATED}.
      </t>

      <section anchor="decision-tree" numbered="true" toc="default">
        <name>Routing Decision Tree</name>
        <t>Routing is evaluated strictly top-to-bottom. The first matching condition determines the outcome.</t>
        <sourcecode name="routing-function" type="pseudocode"><![CDATA[
FUNCTION Route(interaction) -> Path:
  // STEP 1: Watchtower Hard Blocks (highest priority)
  FOR each Watchtower W_i in ActiveWatchtowers(interaction.vertical):
    IF W_i.evaluate(interaction) == TRUE:
      IF W_i.severity == HARD_BLOCK:
        RETURN ESCALATED  // immediate, no further evaluation
      IF W_i.severity == FORCE_ASSISTED:
        SET assisted_flag = TRUE

  // STEP 2: Classification confidence gate
  IF interaction.intent_confidence < 0.60:
    RETURN ESCALATED  // system cannot reliably classify

  // STEP 3: Assisted override from Watchtower
  IF assisted_flag == TRUE:
    RETURN ASSISTED

  // STEP 4: Confidence Score vs. Routing Threshold
  theta = GetThreshold(
    interaction.intent_class, interaction.vertical)
  IF interaction.confidence_score >= theta:
    RETURN AUTONOMOUS

  // STEP 5: Confidence below threshold but above minimum floor
  IF interaction.confidence_score >= 0.50:
    RETURN ASSISTED

  // STEP 6: Default
  RETURN ESCALATED
        ]]></sourcecode>
      </section>

      <section anchor="confidence" numbered="true" toc="default">
        <name>Confidence Score Computation</name>
        <t>
          The Confidence Score C is a composite metric computed as a weighted combination
          of three independent signals. The composite design prevents single-signal gaming.
        </t>
        <sourcecode name="confidence-score" type="pseudocode"><![CDATA[
C = (0.50 * C_m) + (0.30 * C_p) + (0.20 * C_d)

// C_m: raw softmax probability of top-ranked response candidate
// C_p: policy compliance score (0.0-1.0)
// C_d: data completeness score
//   (fraction of required fields)

// Hard constraint:
IF C_p == 0.0:
  C = 0.0  // forces ESCALATED regardless of other signals
        ]]></sourcecode>
        <t>
          Signal weights are configurable per vertical deployment within the ranges:
          C_m in [0.30, 0.70], C_p in [0.10, 0.40], C_d in [0.10, 0.30].
          Weights MUST sum to 1.0. Any modification REQUIRES a Threshold Change Record
          per <xref target="changecontrol"/>.
        </t>
      </section>

      <section anchor="paths" numbered="true" toc="default">
        <name>Path Specifications</name>

        <section anchor="autonomous" numbered="true" toc="default">
          <name>AUTONOMOUS Path</name>
          <t>An interaction routes to AUTONOMOUS if and only if all of the following are true:</t>
          <ul spacing="normal">
            <li>No active Watchtower has returned W = TRUE with severity HARD_BLOCK or FORCE_ASSISTED.</li>
            <li>interaction.intent_confidence is greater than or equal to 0.60.</li>
            <li>C is greater than or equal to theta for the assigned Intent Class.</li>
            <li>C_p is greater than 0.0 (no active policy violation).</li>
          </ul>
          <t>
            The system dispatches response without human review. A full Audit Trace MUST
            be generated and sealed per <xref target="sealing"/>. Error monitoring continues
            for the duration of the Error Attribution Window (default: 30 minutes post-dispatch).
          </t>
        </section>

        <section anchor="assisted" numbered="true" toc="default">
          <name>ASSISTED Path</name>
          <t>An interaction routes to ASSISTED if any of the following are true:</t>
          <ul spacing="normal">
            <li>A Watchtower has returned W = TRUE with severity FORCE_ASSISTED.</li>
            <li>intent_confidence is greater than or equal to 0.60 AND 0.50 is less than or equal to C which is less than theta.</li>
          </ul>
          <t>
            The system generates a proposed response and places it in the Named Accountable
            Officer's review queue. A review SLA timer MUST be started (default: 120 seconds
            standard priority, 300 seconds high priority). The Named Accountable Officer MUST
            apply one of four Resolution Actions:
          </t>
          <dl newline="false" spacing="normal">
            <dt>RA-1 APPROVE:</dt><dd>Proposed response dispatched as generated. Officer ID and approval timestamp logged.</dd>
            <dt>RA-2 EDIT + APPROVE:</dt><dd>Officer modifies response. C_p re-evaluated on modified text. Modified response hash recorded.</dd>
            <dt>RA-3 REJECT -&gt; ESCALATE:</dt><dd>Interaction re-routed to ESCALATED. Rejection reason logged.</dd>
            <dt>RA-4 ATTEST + OVERRIDE:</dt><dd>Officer overrides system assessment with independent verification. Mandatory attestation text logged.</dd>
          </dl>
          <t>
            If the review SLA expires without a resolution action, the interaction MUST be
            automatically re-routed to ESCALATED. The SLA breach event, breach timestamp,
            and original assigned officer ID MUST be recorded in the Audit Trace.
          </t>
        </section>

        <section anchor="escalated" numbered="true" toc="default">
          <name>ESCALATED Path</name>
          <t>An interaction routes to ESCALATED if any of the following are true:</t>
          <ul spacing="normal">
            <li>A Watchtower has returned W = TRUE with severity HARD_BLOCK.</li>
            <li>interaction.intent_confidence is less than 0.60.</li>
            <li>C_p equals 0.0 (active policy violation).</li>
            <li>C is less than 0.50.</li>
            <li>SLA breach on an ASSISTED ticket (automatic re-route).</li>
          </ul>
          <t>
            Every ESCALATED interaction MUST carry exactly one primary reason code from
            the following set: ESC-01 (LOW_CONFIDENCE), ESC-02 (MISSING_DATA), ESC-03
            (POLICY_VIOLATION), ESC-04 (WATCHTOWER_BLOCK), ESC-05 (INTENT_AMBIGUOUS),
            ESC-06 (SENTIMENT_SIGNAL), ESC-07 (SLA_BREACH), ESC-08 (OUT_OF_SCOPE).
          </t>
        </section>
      </section>
    </section>

    <section anchor="watchtowers" numbered="true" toc="default">
      <name>Watchtower Framework</name>
      <t>
        Watchtowers are evaluated in Stage S3, before routing in Stage S4. They operate as
        pre-routing enforcement gates. A Watchtower MUST NOT force an AUTONOMOUS outcome.
        Watchtowers MUST only override routing in the direction of greater human involvement.
      </t>
      <t>
        Watchtowers are additive. Multiple Watchtowers MAY activate on a single interaction.
        The highest-severity result governs routing: HARD_BLOCK takes precedence over
        FORCE_ASSISTED, which takes precedence over AUDIT_ONLY. All activated Watchtowers
        MUST be recorded in the Audit Trace regardless of which governs the routing decision.
      </t>

      <section anchor="watchtower-schema" numbered="true" toc="default">
        <name>Watchtower Definition Schema</name>
        <sourcecode name="watchtower-schema" type="pseudocode"><![CDATA[
Watchtower = {
  id:           string,     // e.g., "WT-03-APP-FRAUD"
  name:         string,     // human-readable
  vertical:     string[],   // applicable verticals, or [*] for all
  priority:     integer,    // evaluation order (lower = earlier)
  severity:     HARD_BLOCK | FORCE_ASSISTED | AUDIT_ONLY,
  trigger:      function(interaction) -> boolean,
  evidence:     function(interaction) -> object,
  buyer_signal: string      // regulatory/commercial pain addressed
}
        ]]></sourcecode>
      </section>

      <section anchor="watchtower-registry" numbered="true" toc="default">
        <name>Core Watchtower Registry v1.0</name>
        <table align="center">
          <thead>
            <tr><th>ID</th><th>Name</th><th>Severity</th><th>Primary Trigger</th></tr>
          </thead>
          <tbody>
            <tr><td>WT-01</td><td>PII Exposure Shield</td><td>HARD_BLOCK</td><td>PII pattern detected in payload before ingestion to inference layer.</td></tr>
            <tr><td>WT-02</td><td>POS Single-Principal Detector</td><td>HARD_BLOCK</td><td>Agent ID linked to multiple principal records OR geo-location mismatch.</td></tr>
            <tr><td>WT-03</td><td>APP Fraud Early Warning</td><td>FORCE_ASSISTED</td><td>High-velocity reversal pattern OR coercion language detected.</td></tr>
            <tr><td>WT-04</td><td>Regulatory Silence Detector</td><td>HARD_BLOCK</td><td>No response logged within SLA window OR multiple follow-ups without resolution.</td></tr>
            <tr><td>WT-05</td><td>High-Value Transaction Guardrail</td><td>FORCE_ASSISTED</td><td>Transaction value exceeds vertical-configured threshold OR legal language detected.</td></tr>
            <tr><td>WT-06</td><td>Operational Discipline Proof-Point</td><td>AUDIT_ONLY</td><td>Scheduled quarterly trigger OR on-demand invocation. Generates Proof-Point PDF.</td></tr>
          </tbody>
        </table>
      </section>
    </section>

    <section anchor="audit-trace" numbered="true" toc="default">
      <name>Audit Trace Schema</name>
      <t>
        The Audit Trace is the primary output of every OMP routing event. It is not a log.
        It is a structured evidence record designed to satisfy regulatory examination
        requirements. Every field is mandatory unless explicitly marked OPTIONAL.
        Fields marked PRIVILEGED are protected from third-party disclosure under applicable
        work product doctrine.
      </t>
      <t>
        All Audit Trace records produced under this specification MUST carry
        schema_version field value "VERIDOM-SCHEMA-001-v1.0". Implementations that extend
        the schema MUST use a distinct schema_version string.
      </t>
      <sourcecode name="audit-trace-schema" type="json"><![CDATA[
{
  // IDENTITY
  "trace_id":              "UUID v4",
  "trace_version":         "1.0",
  "created_at":            "ISO 8601 UTC (millisecond precision)",
  "vertical":              "string",
  "deployment_id":         "string",
  "schema_version":        "VERIDOM-SCHEMA-001-v1.0",

  // INTERACTION
  "interaction_id":        "UUID v4",
  "interaction_received":  "ISO 8601 UTC",
  "interaction_hash":      "sha256(normalised_payload)",
  "channel":               "string",
  "requester_id":          "string (anonymised)",

  // INTENT CLASSIFICATION
  "intent_class":          "string",
  "intent_confidence":     "float [0.0, 1.0]",
  "intent_top3":           "[{class, confidence}]",
  "classifier_version":    "string",

  // CONFIDENCE SCORING
  "confidence_score":      "float [0.0, 1.0]",
  "confidence_components": {
    "C_m": "float", "C_p": "float", "C_d": "float",
    "weights": { "C_m": "float", "C_p": "float", "C_d": "float" }
  },
  "routing_threshold":     "float",

  // WATCHTOWER EVALUATIONS
  "watchtowers_evaluated": [
    { "watchtower_id": "string", "triggered": "boolean",
      "severity": "string", "evidence": "object",
      "evaluated_at": "ISO 8601 UTC" }
  ],
  "watchtower_override":    "boolean",
  "override_watchtower_id": "string | null",

  // ROUTING DECISION
  "routing_path":          "AUTONOMOUS | ASSISTED | ESCALATED",
  "routing_rationale":     "string",
  "routing_decided_at":    "ISO 8601 UTC",

  // PATH-SPECIFIC FIELDS
  "autonomous_dispatch":   "object | null",
  "assisted_resolution":   "object | null",
  "escalation_record":     "object | null",

  // RFC 3161 TIMESTAMP
  "tst_time":              "ISO 8601 UTC (millisecond precision)",
  "tst_tsa_identity":      "string",  // TSA DN. Mandatory.
  "tst_raw":               "Base64 (raw TimeStampToken)",
  "tst_serial":            "string",
  "tst_hash_alg":          "SHA-256",
  "tst_message_imprint":   "sha256 (must equal trace_content_hash)",
  "tst_certificate":       "Base64 | URI",

  // CRYPTOGRAPHIC SEALING
  "source_state_hash":     "sha256 | null",
  "trace_content_hash":    "sha256",
  "trace_chain_hash":      "sha256",
  "sealed_at":             "ISO 8601 UTC",
  "seal_version":          "SHA256-RFC3161-CHAIN-v1"
}
      ]]></sourcecode>
    </section>

    <section anchor="sealing" numbered="true" toc="default">
      <name>Cryptographic Sealing</name>
      <t>
        The sealing process transforms the Audit Trace into a legally defensible evidence
        record. The chain is: SHA-256 hash of the decision record, followed by <xref target="RFC3161"/>
        timestamp from an accredited TSA, followed by institution-signed container.
        Veridom does NOT sign. The institution signs. This preserves evidentiary independence.
      </t>

      <section anchor="source-hash" numbered="true" toc="default">
        <name>Source State Hash (H_s)</name>
        <t>
          When the OMP pipeline queries an external data source, it MUST capture a
          cryptographic snapshot of the response at the exact millisecond of query.
          This anchors the verification decision to a specific, immutable data state.
        Canonical JSON serialisation uses <xref target="RFC8785"/>.
        </t>
        <sourcecode name="source-hash" type="pseudocode"><![CDATA[
FUNCTION ComputeSourceStateHash(api_response) -> H_s:
  canonical_json = CanonicalJSON(api_response)  // see RFC 8785
  input = canonical_json + '|' + QueryTimestamp_ms
  H_s = SHA256(input)
  RETURN H_s
        ]]></sourcecode>
      </section>

      <section anchor="content-hash" numbered="true" toc="default">
        <name>Trace Content Hash</name>
        <sourcecode name="content-hash" type="pseudocode"><![CDATA[
FUNCTION ComputeTraceContentHash(trace) -> H_content:
  fields_to_hash = trace.excluding([
    'trace_content_hash', 'trace_chain_hash',
    'sealed_at', 'seal_version',
    'tst_time', 'tst_tsa_identity', 'tst_raw',
    'tst_serial', 'tst_certificate'
  ])
  canonical_json = CanonicalJSON(fields_to_hash)  // see RFC 8785
  H_content = SHA256(canonical_json)
  RETURN H_content
        ]]></sourcecode>
      </section>

      <section anchor="rfc3161" numbered="true" toc="default">
        <name>RFC 3161 Trusted Timestamp</name>
        <t>
          Following computation of H_content, the OMP pipeline MUST request a
          TimeStampToken (TST) from an accredited Timestamp Authority conforming to
          <xref target="RFC3161"/>. The TST provides externally verifiable, third-party-attested proof
          that the Audit Trace existed in its exact sealed form at a specific moment in
          time, independently of the institution's own infrastructure.
        </t>
        <sourcecode name="rfc3161-request" type="pseudocode"><![CDATA[
FUNCTION RequestTimestamp(H_content) -> TST:
  request = TimestampRequest(
    hashAlgorithm:  SHA-256,
    messageImprint: H_content,
    nonce:          SecureRandom(64-bit),
    certReq:        TRUE
  )
  TST = TSA.sign(request)
  VERIFY TST.messageImprint == H_content
  RETURN TST
  // The TSA signs only the hash, never the trace content.
  // No sensitive payload is transmitted to the TSA.
        ]]></sourcecode>
        <t>
          Implementations MUST use a TSA satisfying at least one of:
          eIDAS Qualified TSA (EU Regulation 910/2014 Annex III),
          WebTrust for Certification Authorities Timestamping, or
          ETSI EN 319 421 / 319 422.
          Implementations MUST NOT use non-accredited or self-operated TSAs
          in regulated deployments.
        </t>
        <t>
          The three-layer integrity architecture established by this sealing process is:
        </t>
        <sourcecode name="three-layer" type="pseudocode"><![CDATA[
Layer 1 - Content:   H_content = SHA-256(canonical trace record)
Layer 2 - Time:      TST = TSA.sign(H_content)
                      [external, independent]
Layer 3 - Identity:  Proof-Point = Institution.sign(trace + TST)
        ]]></sourcecode>
      </section>

      <section anchor="chain-hash" numbered="true" toc="default">
        <name>Trace Chain Hash (Merkle Chain)</name>
        <sourcecode name="chain-hash" type="pseudocode"><![CDATA[
FUNCTION ComputeChainHash(trace, previous_H_c) -> H_c:
  input = trace.trace_content_hash + '|' + previous_H_c
  H_c = SHA256(input)
  RETURN H_c

// Genesis block:
// previous_H_c = SHA256('VERIDOM-GENESIS-' + deployment_id)

FUNCTION VerifyChain(traces[]) -> boolean:
  expected_H_c = GenesisHash(traces[0].deployment_id)
  FOR each trace in traces (ordered by sealed_at):
    computed = SHA256(CanonicalJSON(trace.excluding(sealing_fields)))
    IF computed != trace.trace_content_hash: RETURN FALSE
    expected_H_c = SHA256(computed + '|' + expected_H_c)
    IF expected_H_c != trace.trace_chain_hash: RETURN FALSE
  RETURN TRUE
        ]]></sourcecode>
      </section>

      <section anchor="proof-point" numbered="true" toc="default">
        <name>Proof-Point Artifact Sealing</name>
        <t>
          The Proof-Point artifact MUST be generated by aggregating Audit Traces over a
          defined time window. The artifact MUST be sealed with a document-level SHA-256
          hash and signed by the institution. Veridom MUST NOT sign. The institution signs.
          This preserves evidentiary independence. The artifact MUST be producible in under
          30 seconds for any deployment with up to 10,000 traces in the time window.
        </t>
      </section>
    </section>

    <section anchor="changecontrol" numbered="true" toc="default">
      <name>Change Control</name>
      <t>
        Any modification to a production VerticalConfig, routing threshold, Watchtower
        definition, or confidence weight REQUIRES a Threshold Change Record (TCR)
        documenting: the change, the rationale, the validation data supporting the change,
        and the Named Accountable Officer authorising deployment.
      </t>
      <t>
        A 30-day written notice period to the client's designated compliance officer is
        REQUIRED before any change takes effect in production. The TCR MUST itself be sealed
        with SHA-256 and appended to the deployment evidence ledger. No retroactive
        modification of configuration is permitted.
      </t>
    </section>

    <section anchor="metrics" numbered="true" toc="default">
      <name>Metrics and Observability</name>
      <t>
        OMP produces three operationally independent metric streams. These streams MUST NOT
        be aggregated into a single resolution rate for internal system health analysis.
        Aggregation conceals the difference between system performance and human compensation.
      </t>
      <t>
        The diagnostic order when investigating a system health issue is MANDATORY:
        (1) Autonomous Dashboard -- is the system still deciding correctly?
        (2) Assisted Dashboard -- is the human gate catching problems?
        (3) Escalated Dashboard -- are failures being categorised correctly for improvement?
        Inverting this order produces misleading diagnoses.
      </t>
    </section>

    <section anchor="implementation" numbered="true" toc="default">
      <name>Implementation Requirements</name>
      <t>SHA-256 implementation MUST conform to <xref target="FIPS180-4"/>.</t>
      <t>Canonical JSON serialisation MUST conform to <xref target="RFC8785"/>. All floating-point values MUST be serialised with minimum 15 significant digits.</t>
      <t>All timestamps MUST be UTC, ISO 8601 format, with millisecond precision. Maximum acceptable clock drift: 50ms.</t>
      <t>The append-only evidence ledger MUST be implemented as a write-once data store. Deletion MUST be architecturally impossible, not merely policy-restricted.</t>
      <t>Confidence Score computation MUST be stateless. No hidden state or session memory MAY influence C.</t>
    </section>

    <section anchor="security" numbered="true" toc="default">
      <name>Security Considerations</name>

      <section anchor="threat-model" numbered="true" toc="default">
        <name>Threat Model</name>
        <t>The following attack scenarios are addressed by the sealing architecture:</t>
        <dl newline="false" spacing="normal">
          <dt>Single trace content altered:</dt>
          <dd>trace_content_hash mismatch detected on verification. Chain broken from that trace forward.</dd>
          <dt>Trace deleted from ledger:</dt>
          <dd>Chain gap: H_c of following trace does not match expected value. Exact deletion position identifiable.</dd>
          <dt>Trace inserted retroactively:</dt>
          <dd>All subsequent H_c values would require recomputation. Cannot be done without full ledger write access and TSA collusion.</dd>
          <dt>External source API response changes post-decision:</dt>
          <dd>H_s proves what the source said at decision time independently of current state. No impact on trace integrity.</dd>
          <dt>Infrastructure breach:</dt>
          <dd>Chain can be independently verified from exported trace data. Institution-held export provides independent verification path.</dd>
        </dl>
      </section>

      <section anchor="host-compromise" numbered="true" toc="default">
        <name>Fully Compromised Host</name>
        <t>
          A fully compromised host can produce a self-consistent SHA-256 chain of fabricated
          records. This threat is explicitly acknowledged in related work
          <xref target="I-D.cowles-volt"/> as threat T7: "If the execution host is fully
          compromised, an attacker controlling the recorder can emit a consistent but
          fabricated trace."
        </t>
        <t>
          <xref target="RFC3161"/> trusted timestamping closes this gap. A compromised host cannot
          retroactively obtain a valid TST from an accredited TSA for fabricated records.
          The TSA's signature would be absent, or its timestamp would postdate the claimed
          event. Implementations MUST use <xref target="RFC3161"/> timestamping to provide externally
          verifiable temporal anchoring.
        </t>
      </section>

      <section anchor="confidence-gaming" numbered="true" toc="default">
        <name>Confidence Score Gaming</name>
        <t>
          The composite Confidence Score uses three independent signals to prevent gaming.
          Implementations MUST treat C_p = 0.0 as an automatic ESCALATED outcome regardless
          of C_m or C_d values. The policy compliance signal cannot be compensated by high
          model confidence.
        </t>
      </section>

      <section anchor="watchtower-override" numbered="true" toc="default">
        <name>Watchtower Override Restriction</name>
        <t>
          No Watchtower MAY force an AUTONOMOUS outcome. Watchtowers MUST only override
          routing in the direction of greater human involvement. This restriction is
          architectural and MUST be enforced at the implementation level.
        </t>
      </section>
    </section>

    <section anchor="iana" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>
        This document makes no requests of IANA. If a future version of this protocol
        defines a registry of Watchtower identifiers or schema version strings, an
        appropriate IANA registry request will be made at that time.
      </t>
    </section>

  </middle>

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

      <references>
        <name>Normative References</name>

        <reference anchor="RFC2119" target="https://www.rfc-editor.org/rfc/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner"/>
            <date year="1997" month="March"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
        </reference>

        <reference anchor="RFC8174" target="https://www.rfc-editor.org/rfc/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author initials="B." surname="Leiba" fullname="B. Leiba"/>
            <date year="2017" month="May"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
        </reference>

        <reference anchor="RFC3161" target="https://www.rfc-editor.org/rfc/rfc3161">
          <front>
            <title>Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)</title>
            <author initials="C." surname="Adams" fullname="C. Adams"/>
            <author initials="P." surname="Cain" fullname="P. Cain"/>
            <author initials="D." surname="Pinkas" fullname="D. Pinkas"/>
            <author initials="R." surname="Zuccherato" fullname="R. Zuccherato"/>
            <date year="2001" month="August"/>
          </front>
          <seriesInfo name="RFC" value="3161"/>
        </reference>

        <reference anchor="RFC8785" target="https://www.rfc-editor.org/rfc/rfc8785">
          <front>
            <title>JSON Canonicalization Scheme (JCS)</title>
            <author initials="A." surname="Rundgren" fullname="A. Rundgren"/>
            <author initials="B." surname="Jordan" fullname="B. Jordan"/>
            <author initials="S." surname="Lindstrom" fullname="S. Lindstrom"/>
            <date year="2020" month="June"/>
          </front>
          <seriesInfo name="RFC" value="8785"/>
        </reference>

        <reference anchor="FIPS180-4">
          <front>
            <title>Secure Hash Standard (SHS)</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
          <seriesInfo name="NIST FIPS" value="180-4"/>
        </reference>

      </references>

      <references>
        <name>Informative References</name>

        <reference anchor="I-D.cowles-volt">
          <front>
            <title>Verifiable Operations Ledger and Trace (VOLT)</title>
            <author initials="A." surname="Cowles" fullname="A. Cowles"/>
            <date year="2026" month="February"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-cowles-volt-00"/>
        </reference>

        <reference anchor="I-D.cowles-aocl">
          <front>
            <title>Agent Orchestration Control Layers (AOCL)</title>
            <author initials="A." surname="Cowles" fullname="A. Cowles"/>
            <date year="2026" month="February"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-cowles-aocl-00"/>
        </reference>

        <reference anchor="I-D.cowles-aee">
          <front>
            <title>Agent Envelope Exchange (AEE)</title>
            <author initials="A." surname="Cowles" fullname="A. Cowles"/>
            <date year="2026" month="February"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-cowles-aee-00"/>
        </reference>

        <reference anchor="ZENODO-OMP">
          <front>
            <title>OMP - Operating Model Protocol: A Deterministic Routing Invariant for Tamper-Evident AI Decision Accountability in Regulated Industries</title>
            <author initials="T." surname="Adebayo" fullname="T. Adebayo"/>
            <author initials="F." surname="Makanjuola" fullname="F. Makanjuola"/>
            <author initials="O." surname="Apalowo" fullname="O. Apalowo"/>
            <date year="2026" month="March" day="21"/>
          </front>
          <seriesInfo name="Zenodo" value="10.5281/zenodo.19140948"/>
        </reference>

      </references>
    </references>
  </back>

</rfc>
