<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.34 (Ruby 3.3.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-bellis-unheaded-wotan-memory-00" category="exp" submissionType="independent">
  <front>
    <title abbrev="Wotan Memory Protocol">Wotan Memory Protocol for the Unheaded Protocol</title>

    <author initials="S." surname="Bellis" fullname="Stevie Bellis">
      <organization>Unheaded</organization>
      <address>
        <postal>
          <country>US</country>
        </postal>
        <email>stevie@bellis.tech</email>
      </address>
    </author>

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

    <area>Internet</area>
    <workgroup>Independent Submission</workgroup>
    

    <abstract>


<?line 52?>

<t>Wotan is the memory and I/O bus for the Unheaded Protocol, providing
addressable per-flow storage for BPF programs executing within the
Limited Domain.</t>

<t>The Wotan protocol specifies the BPF helper interface for memory access,
the address space layout for per-flow data structures, a five-level
cache hierarchy (L0 through L4), and the topic-based I/O model for
interaction with userspace services.</t>

<t>This memo defines the memory model, helper functions, address space,
cache miss protocol, gRPC streaming contracts, triple-role architecture,
reliability guarantees, and I/O topic naming conventions for systems
implementing the Unheaded Protocol's computational layer.</t>

<t>Draft-03 introduces a structured error code taxonomy with severity
levels, helper return codes for common operations, and error recovery
procedures. Draft-02 security patches W1-W8 are retained.</t>



    </abstract>



  </front>

  <middle>


<?line 73?>

<section anchor="introduction"><name>Introduction</name>

<t>The Unheaded Protocol <xref target="UNHEADED-FOUNDATION"></xref> specifies a 20-byte register
file (the Monad) that travels with every packet through a Limited Domain.
BPF programs at each hop read and write the Monad, performing stateless
per-packet computation.</t>

<t>Many use cases require state beyond the 20-byte Monad: buffering input,
accumulating results, maintaining per-flow state machines, or storing
scratch memory for complex algorithms.</t>

<t>Wotan provides this state via a hierarchical memory model:</t>

<t><list style="symbols">
  <t>L0: Monad (20 bytes, in packet, per-hop latency ~320 ns)</t>
  <t>L1: Per-hop BPF map cache (64-byte cache lines, ~100-200 ns latency)</t>
  <t>L2: Per-flow ring buffer RAM (configurable size, ~1-10 us latency)</t>
  <t>L3: Write-Ahead Log (persistent storage, ~100 us-1 ms latency)</t>
  <t>L4: Sophia dictionaries <xref target="UNHEADED-SOPHIA"></xref> (instruction decode,
~100-200 ns latency)</t>
</list></t>

<t>This memo defines the Wotan memory protocol: the BPF helper interface,
address space layout, cache coherency model, and userspace I/O
interaction.</t>

<section anchor="cross-references"><name>Cross-References</name>

<t>This document is part of the Unheaded Protocol specification family:</t>

<t><list style="symbols">
  <t><strong>Protocol Foundation</strong> <xref target="UNHEADED-FOUNDATION"></xref>: Defines the Monad wire
format (20 bytes, FROZEN at v0x01), per-hop processing, IANA
registries, IANA registration procedures, and the wire format
immutability threat model.</t>
  <t><strong>Sophia Dictionary Format</strong> <xref target="UNHEADED-SOPHIA"></xref>: Defines the semantic
layer including sub-dictionary type systems for hierarchical knowledge
and QPACK compression headers for dictionary entries.</t>
</list></t>

</section>
</section>
<section anchor="terminology-and-language"><name>Terminology and Language</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD 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 following terms are used:</t>

<dl>
  <dt>Flow Label:</dt>
  <dd>
    <t>The IPv6 Flow Label field (20 bits) or derived hash used to key
per-flow state in Wotan. Maps packets to unique per-flow ring buffers.</t>
  </dd>
  <dt>Ring Buffer:</dt>
  <dd>
    <t>A BPF ring buffer (BPF_MAP_TYPE_RINGBUF) allocated per flow, used as
L2 memory (general-purpose RAM) with configurable size via --ring-size.</t>
  </dd>
  <dt>Cache Line:</dt>
  <dd>
    <t>A 64-byte unit of L1 cache (per-hop BPF map), with tag, valid, dirty,
and LRU tracking.</t>
  </dd>
  <dt>Write-Back:</dt>
  <dd>
    <t>Transfer of dirty cache lines from L1 (per-hop map) to L2 (ring buffer)
for persistence or hand-off.</t>
  </dd>
  <dt>Memory-Mapped I/O:</dt>
  <dd>
    <t>Designated address ranges that publish to or read from Wotan topics
(e.g., write to address 0x0000C000 publishes to compute.screen).</t>
  </dd>
</dl>

</section>
<section anchor="error-code-taxonomy-new-in-draft-03"><name>Error Code Taxonomy (NEW in draft-03)</name>

<section anchor="overview"><name>Overview</name>

<t>Draft-02 defined error handling for BPF helpers using standard errno
codes (-ENOENT, -EFAULT, -ENOMEM, -EACCES, -EINVAL, -EAGAIN). Draft-03
introduces a structured error code taxonomy that classifies errors by
severity, origin, and recommended recovery action.</t>

<t>This taxonomy applies to all Wotan operations: BPF helper functions,
gRPC streaming, WAL operations, and control frame exchanges.</t>

</section>
<section anchor="error-severity-levels"><name>Error Severity Levels</name>

<t>Each error code is assigned a severity level:</t>

<figure><artwork><![CDATA[
Severity    Code    Description                 Action
--------    ----    --------------------------  ---------------------------
INFO        0       Informational event          Log, continue processing
WARNING     1       Degraded but functional      Log, emit metric, continue
ERROR       2       Operation failed             Log, retry or degrade
CRITICAL    3       Subsystem failure            Log, alert, isolate
FATAL       4       Unrecoverable failure        Log, halt, require restart
]]></artwork></figure>

</section>
<section anchor="structured-error-code-format"><name>Structured Error Code Format</name>

<t>Error codes in draft-03 use a 32-bit structured format:</t>

<figure><artwork><![CDATA[
 31       24 23       16 15        8 7         0
+-----------+-----------+-----------+-----------+
| Severity  |  Origin   | Category  |  Detail   |
| (3 bits)  |  (5 bits) | (8 bits)  |  (8 bits) |
+-----------+-----------+-----------+-----------+
]]></artwork></figure>

<dl>
  <dt>Severity:</dt>
  <dd>
    <t>3-bit severity level (0-4, see above). Bits 31-29.</t>
  </dd>
  <dt>Origin:</dt>
  <dd>
    <t>5-bit origin identifier. Bits 28-24.</t>
  </dd>
</dl>

<figure><artwork><![CDATA[
Origin Code   Name              Description
-----------   ----------------  ----------------------------
0x00          WOTAN_CORE        Core Wotan daemon
0x01          WOTAN_L1          L1 cache subsystem
0x02          WOTAN_L2          L2 ring buffer subsystem
0x03          WOTAN_L3          L3 WAL subsystem
0x04          WOTAN_GRPC        gRPC streaming subsystem
0x05          WOTAN_TOPIC       Topic routing subsystem
0x06          WOTAN_SETTINGS    SETTINGS exchange
0x07          WOTAN_GOAWAY      GOAWAY frame processing
0x08          SOPHIA_LOOKUP     Sophia dictionary lookup
0x09          SOPHIA_UPDATE     Sophia dictionary update
0x0A          SHIELD_INGRESS    Shield ingress processing
0x0B          SHIELD_EGRESS     Shield egress processing
0x0C          SHIM_EXEC         Shim program execution
0x0D-0x1E    Reserved
0x1F          VENDOR_SPECIFIC   Vendor-specific origin
]]></artwork></figure>

<dl>
  <dt>Category:</dt>
  <dd>
    <t>8-bit error category. Bits 23-16.</t>
  </dd>
</dl>

<figure><artwork><![CDATA[
Category    Name                Description
--------    -----------------   ---------------------------------
0x00        NONE                No error
0x01        ACCESS_CONTROL      Authorization / permission error
0x02        BOUNDS_CHECK        Address / offset out of range
0x03        RESOURCE            Memory / buffer / disk exhausted
0x04        INTEGRITY           Checksum / HMAC / CRC failure
0x05        PROTOCOL            Wire format / version mismatch
0x06        TIMEOUT             Operation timed out
0x07        CONCURRENCY         Lock contention / CAS failure
0x08        CONFIGURATION       Settings mismatch / invalid param
0x09        DEPENDENCY          External dependency unavailable
0x0A        DATA_CORRUPTION     Data integrity violation
0x0B        RATE_LIMIT          Rate limit exceeded
0x0C-0xFE   Reserved
0xFF        VENDOR_SPECIFIC     Vendor-specific category
]]></artwork></figure>

<dl>
  <dt>Detail:</dt>
  <dd>
    <t>8-bit error detail code. Bits 7-0. Interpretation depends on the
category.</t>
  </dd>
</dl>

</section>
<section anchor="helper-return-code-mapping"><name>Helper Return Code Mapping</name>

<t>BPF helper functions continue to return standard errno codes for
backward compatibility. The structured error code is available via
an auxiliary error detail mechanism.</t>

<section anchor="bpf-helper-return-codes"><name>BPF Helper Return Codes</name>

<figure><artwork><![CDATA[
errno           Structured Code              Severity
---------       ---------------------------  --------
-ENOENT (-2)    [ERROR, L2, RESOURCE, 0x01]  ERROR
-EFAULT (-14)   [ERROR, L1, BOUNDS, 0x01]    ERROR
-ENOMEM (-12)   [WARN, L1, RESOURCE, 0x01]   WARNING
-EACCES (-13)   [ERROR, CORE, ACCESS, 0x01]  ERROR
-EINVAL (-22)   [ERROR, CORE, PROTOCOL, 0x01] ERROR
-EAGAIN (-11)   [INFO, L1, CONCURRENCY, 0x01] INFO
-EBUSY (-16)    [WARN, L3, CONCURRENCY, 0x01] WARNING
]]></artwork></figure>

</section>
<section anchor="auxiliary-error-detail"><name>Auxiliary Error Detail</name>

<t>When a BPF helper returns a negative errno, implementations SHOULD
write the full 32-bit structured error code to a per-CPU BPF array
map:</t>

<figure><artwork><![CDATA[
struct {
    __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
    __uint(max_entries, 1);
    __type(key, u32);
    __type(value, u32);  // 32-bit structured error code
} wotan_last_error SEC(".maps");
]]></artwork></figure>

<t>Shim programs MAY read this map after a helper returns an error to
obtain detailed error information:</t>

<figure><artwork><![CDATA[
ret = bpf_wotan_read(flow_label, addr, buf, len);
if (ret < 0) {
    u32 key = 0;
    u32 *err = bpf_map_lookup_elem(&wotan_last_error, &key);
    if (err) {
        u8 severity = (*err >> 29) & 0x7;
        u8 origin = (*err >> 24) & 0x1F;
        u8 category = (*err >> 16) & 0xFF;
        u8 detail = *err & 0xFF;
        // Handle based on severity/category
    }
}
]]></artwork></figure>

</section>
</section>
<section anchor="common-error-codes"><name>Common Error Codes</name>

<section anchor="l1-cache-errors"><name>L1 Cache Errors</name>

<figure><artwork><![CDATA[
Code                                Errno     Description
----------------------------------  --------  -------------------------
[WARN, L1, RESOURCE, 0x01]         -ENOMEM   Cache miss (line not in L1)
[ERROR, L1, BOUNDS, 0x01]          -EFAULT   Offset > 63 (read)
[ERROR, L1, BOUNDS, 0x02]          -EFAULT   Offset > 56 (write, 8-byte)
[INFO, L1, CONCURRENCY, 0x01]      -EAGAIN   CAS comparison failed
[ERROR, L1, BOUNDS, 0x03]          -EFAULT   CAS alignment error (not 8-byte)
[WARN, L1, RATE_LIMIT, 0x01]       -EBUSY    Cache-miss rate exceeded (W6)
]]></artwork></figure>

</section>
<section anchor="l2-ring-buffer-errors"><name>L2 Ring Buffer Errors</name>

<figure><artwork><![CDATA[
Code                                Errno     Description
----------------------------------  --------  -------------------------
[ERROR, L2, RESOURCE, 0x01]         -ENOENT   Flow not found (no ring buf)
[ERROR, L2, RESOURCE, 0x02]         -ENOMEM   Ring buffer full (overflow)
[ERROR, L2, INTEGRITY, 0x01]        N/A       CRC-32 mismatch on entry
[ERROR, L2, INTEGRITY, 0x02]        N/A       Seqno discontinuity (W1)
[ERROR, L2, DATA_CORRUPTION, 0x01]  N/A       Valid flag inconsistency
]]></artwork></figure>

</section>
<section anchor="l3-wal-errors"><name>L3 WAL Errors</name>

<figure><artwork><![CDATA[
Code                                Errno     Description
----------------------------------  --------  -------------------------
[ERROR, L3, RESOURCE, 0x01]         -ENOSPC   WAL disk full
[ERROR, L3, INTEGRITY, 0x01]        N/A       HMAC-SHA256 mismatch (W4)
[ERROR, L3, INTEGRITY, 0x02]        N/A       CRC-32 mismatch on WAL entry
[ERROR, L3, INTEGRITY, 0x03]        N/A       Seqno gap in WAL (W1)
[WARN, L3, CONCURRENCY, 0x01]       N/A       Compaction lock contention (W5)
[CRITICAL, L3, DATA_CORRUPTION, 0x01] N/A     WAL file corrupted (unrecoverable)
]]></artwork></figure>

</section>
<section anchor="grpc-streaming-errors"><name>gRPC Streaming Errors</name>

<figure><artwork><![CDATA[
Code                                Errno     Description
----------------------------------  --------  -------------------------
[ERROR, GRPC, ACCESS, 0x01]         N/A       Unauthorized topic publish
[WARN, GRPC, RESOURCE, 0x01]        N/A       Subscriber buffer overflow
[ERROR, GRPC, TIMEOUT, 0x01]        N/A       Subscription idle timeout (5m)
[ERROR, GRPC, PROTOCOL, 0x01]       N/A       Invalid SETTINGS frame (W7)
[ERROR, GRPC, PROTOCOL, 0x02]       N/A       Invalid GOAWAY frame (W8)
[WARN, GRPC, RATE_LIMIT, 0x01]      N/A       GOAWAY rate limit exceeded
]]></artwork></figure>

</section>
<section anchor="sophia-lookup-errors"><name>Sophia Lookup Errors</name>

<figure><artwork><![CDATA[
Code                                Errno     Description
----------------------------------  --------  -------------------------
[ERROR, SOPHIA, RESOURCE, 0x01]     N/A       Dictionary not initialized
[ERROR, SOPHIA, BOUNDS, 0x01]       N/A       Nesting depth exceeded (8 levels)
[ERROR, SOPHIA, DATA_CORRUPTION, 0x01] N/A    Circular reference detected
[ERROR, SOPHIA, INTEGRITY, 0x01]    N/A       ML-DSA-65 signature invalid
[ERROR, SOPHIA, RESOURCE, 0x02]     N/A       Dictionary full (128 entries)
[WARN, SOPHIA, INTEGRITY, 0x02]     N/A       QPACK decompression failure
]]></artwork></figure>

</section>
</section>
<section anchor="error-recovery-procedures-new-in-draft-03"><name>Error Recovery Procedures (NEW in draft-03)</name>

<section anchor="recovery-by-severity-level"><name>Recovery by Severity Level</name>

<figure><artwork><![CDATA[
Severity    Recovery Procedure
--------    ---------------------------------------------------
INFO        Log event. No recovery action needed. Continue
            processing immediately.

WARNING     Log event. Emit metric (increment warning counter).
            Continue processing with degraded behavior:
            - Cache miss: retry via BPF_TAIL_CALL (3 attempts max)
            - Rate limit: back off (100ms delay)
            - Buffer overflow: drain to L3 before retry

ERROR       Log event. Emit metric. Skip current operation.
            Apply fallback:
            - Access denied: drop packet or use default value
            - Bounds check: skip memory access, use zero-fill
            - Resource exhaustion: degrade to stateless mode
            - Integrity failure: reject data, emit EVENT_ANOMALY

CRITICAL    Log event. Emit alert (Wotan alerts.* topic). Isolate
            affected subsystem:
            - L3 corruption: disable WAL writes, switch to L2-only
            - gRPC failure: disconnect and reconnect (exponential backoff)
            - Sophia failure: use cached dictionary version

FATAL       Log event. Emit emergency alert. Halt affected flow:
            - WAL unrecoverable: drop flow state, reallocate
            - Total memory exhaustion: enter Emergency Mode
              (per [UNHEADED-FOUNDATION] Section 10.3)
            - Require operator intervention for restart
]]></artwork></figure>

</section>
<section anchor="automatic-recovery-state-machine"><name>Automatic Recovery State Machine</name>

<t>Each Wotan subsystem (L1, L2, L3, gRPC, Sophia) maintains an
independent recovery state machine:</t>

<figure><artwork><![CDATA[
States:
  HEALTHY     -> All operations succeeding
  DEGRADED    -> Some operations failing, recovery in progress
  RECOVERING  -> Active recovery procedure executing
  FAILED      -> Recovery exhausted, subsystem disabled

Transitions:
  HEALTHY -> DEGRADED:
    Trigger: error_count > threshold (configurable, default 10)
    Action: Enable recovery procedures

  DEGRADED -> RECOVERING:
    Trigger: Recovery procedure initiated
    Action: Execute recovery steps per severity level

  RECOVERING -> HEALTHY:
    Trigger: 3 consecutive successful operations
    Action: Reset error counters, resume normal operation

  RECOVERING -> FAILED:
    Trigger: Recovery attempts exhausted (max 5)
    Action: Disable subsystem, alert operator

  FAILED -> RECOVERING:
    Trigger: Operator intervention (manual restart command)
    Action: Re-execute recovery from clean state

  DEGRADED -> HEALTHY:
    Trigger: error_count drops below threshold / 2
    Action: Resume normal operation
]]></artwork></figure>

</section>
<section anchor="recovery-metrics"><name>Recovery Metrics</name>

<t>Implementations MUST export the following recovery metrics:</t>

<figure><artwork><![CDATA[
wotan_error_total{severity, origin, category}     (counter)
wotan_recovery_attempts_total{subsystem}           (counter)
wotan_recovery_success_total{subsystem}            (counter)
wotan_recovery_failure_total{subsystem}            (counter)
wotan_subsystem_state{subsystem}                   (gauge: 0-3)
wotan_time_in_degraded_seconds{subsystem}          (histogram)
]]></artwork></figure>

</section>
<section anchor="cross-subsystem-recovery"><name>Cross-Subsystem Recovery</name>

<t>When one subsystem enters FAILED state, dependent subsystems MUST
be notified:</t>

<figure><artwork><![CDATA[
Dependency Graph:
  L1 cache -> L2 ring buffer -> L3 WAL
  gRPC streaming -> L2 ring buffer
  Sophia lookup -> L1 cache

Example: L3 WAL enters FAILED state:
  1. L2 ring buffer: Switch to overflow-drop mode (no L3 drain)
  2. L1 cache: Continue operating (L1 hits unaffected)
  3. gRPC: Continue streaming (events may lack persistence guarantee)
  4. Alert: Emit CRITICAL alert on Wotan alerts.* topic
  5. Dashboard: Display L3 subsystem as red (FAILED)
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="architecture-overview"><name>Architecture Overview</name>

<section anchor="role-in-the-unheaded-protocol"><name>Role in the Unheaded Protocol</name>

<t>Wotan bridges Monad computation <xref target="UNHEADED-FOUNDATION"></xref> to memory and
I/O:</t>

<t><list style="symbols">
  <t>Shim programs (BPF) running at each hop read/write Wotan memory via
BPF helpers (bpf_wotan_read, bpf_wotan_write, bpf_wotan_cas).</t>
  <t>Wotan maintains per-flow state keyed by IPv6 Flow Label.</t>
  <t>Wotan interfaces with userspace via ring buffer events and pub/sub
topics.</t>
  <t>Wotan implements cache miss handling, prefetching, and Write-Ahead
Log management.</t>
</list></t>

</section>
<section anchor="memory-hierarchy"><name>Memory Hierarchy</name>

<figure><artwork><![CDATA[
Level   Name                Size           Latency      Backing
------  --------------------  ---------      ----------   ----------
L0      Monad (packet)      20 bytes       ~ns          wire
L1      Cache (BPF map)     variable       ~100-200ns   per-hop
L2      Ring Buffer (RAM)   configurable   ~1-10us      per-flow
L3      Write-Ahead Log     disk           ~100us-1ms   persistent
L4      Sophia dictionaries BPF maps       ~100-200ns   instruction decode
]]></artwork></figure>

<t>Wotan implements transparent L1-&gt;L2 promotion on cache miss, L2-&gt;L3
flush on overflow, and L3-&gt;L2 recovery on process restart.</t>

</section>
<section anchor="separation-of-compute-and-memory"><name>Separation of Compute and Memory</name>

<t>The Monad is transient compute state (stateless by design). Wotan is
persistent state machine storage. This separation allows:</t>

<t><list style="symbols">
  <t>Shim programs to remain stateless with respect to the packet format.</t>
  <t>External state to be accessed in a controlled, measurable manner.</t>
  <t>Cache miss latency to be handled without blocking per-hop logic.</t>
  <t>Memory updates to be tracked in Anamnesis for observability.</t>
</list></t>

</section>
</section>
<section anchor="bpf-helper-interface"><name>BPF Helper Interface</name>

<t>BPF Shim programs access Wotan memory via three helper functions. All
helpers operate on a 32-bit address space keyed by IPv6 Flow Label.
Error codes follow the taxonomy defined in Section 3.</t>

<section anchor="bpfwotanread"><name>bpf_wotan_read</name>

<t>Read from Wotan memory.</t>

<figure><artwork><![CDATA[
long bpf_wotan_read(u32 flow_label, u32 addr, void *buf, u32 len);
]]></artwork></figure>

<t><strong>Arguments:</strong>
- flow_label: 20-bit IPv6 Flow Label (zero-extended to u32)
- addr: 32-bit address within the flow's address space
- buf: pointer to destination buffer
- len: number of bytes to read (MUST be 1, 2, or 4)</t>

<t><strong>Returns:</strong>
- On success: number of bytes read (len)
- -ENOENT (-2): flow_label not found [ERROR, L2, RESOURCE, 0x01]
- -EFAULT (-14): addr out of bounds [ERROR, L1, BOUNDS, 0x01]
- -ENOMEM (-12): L1 cache miss [WARN, L1, RESOURCE, 0x01]
- -EACCES (-13): not authorized [ERROR, CORE, ACCESS, 0x01]
- -EINVAL (-22): len not in {1, 2, 4} [ERROR, CORE, PROTOCOL, 0x01]</t>

</section>
<section anchor="bpfwotanwrite"><name>bpf_wotan_write</name>

<t>Write to Wotan memory.</t>

<figure><artwork><![CDATA[
long bpf_wotan_write(u32 flow_label, u32 addr, const void *buf, u32 len);
]]></artwork></figure>

<t><strong>Arguments:</strong>
- flow_label: 20-bit IPv6 Flow Label
- addr: 32-bit address within the flow's address space
- buf: pointer to source buffer
- len: number of bytes to write (MUST be 1, 2, or 4)</t>

<t><strong>Returns:</strong>
- On success: number of bytes written (len)
- -ENOENT (-2): flow_label not found [ERROR, L2, RESOURCE, 0x01]
- -EFAULT (-14): addr out of bounds [ERROR, L1, BOUNDS, 0x02]
- -ENOMEM (-12): L1 cache miss [WARN, L1, RESOURCE, 0x01]
- -EACCES (-13): not authorized [ERROR, CORE, ACCESS, 0x01]
- -EINVAL (-22): len not in {1, 2, 4} [ERROR, CORE, PROTOCOL, 0x01]</t>

</section>
<section anchor="bpfwotancas"><name>bpf_wotan_cas</name>

<t>Atomic compare-and-swap on Wotan memory.</t>

<figure><artwork><![CDATA[
long bpf_wotan_cas(u32 flow_label, u32 addr, u32 expected, u32 desired);
]]></artwork></figure>

<t><strong>Arguments:</strong>
- flow_label: 20-bit IPv6 Flow Label
- addr: 32-bit address (MUST be 8-byte aligned per PATCH W3)
- expected: expected current value (u32)
- desired: value to write if current == expected</t>

<t><strong>Returns:</strong>
- 0: swap successful [INFO, L1, NONE, 0x00]
- -EAGAIN (-11): current != expected [INFO, L1, CONCURRENCY, 0x01]
- -ENOENT (-2): flow_label not found [ERROR, L2, RESOURCE, 0x01]
- -EFAULT (-14): addr out of bounds or not 8-byte aligned
  [ERROR, L1, BOUNDS, 0x03]
- -EACCES (-13): not authorized [ERROR, CORE, ACCESS, 0x01]</t>

</section>
<section anchor="error-handling-enhanced-in-draft-03"><name>Error Handling (Enhanced in draft-03)</name>

<t>Implementations MUST handle all specified error codes. The structured
error taxonomy (Section 3) provides additional detail beyond errno:</t>

<figure><artwork><![CDATA[
For each helper return:
  1. Check errno (standard error handling, backward compatible)
  2. Optionally read wotan_last_error map for structured code
  3. Apply recovery procedure per severity level (Section 3.5.1)
  4. Emit metric: wotan_helper_error_total{errno, helper_name}
]]></artwork></figure>

<t>RECOMMENDED error handling by severity:</t>

<t><list style="symbols">
  <t>INFO (-EAGAIN): Retry immediately (CAS retry loop, max 10 iterations)</t>
  <t>WARNING (-ENOMEM): Retry via BPF_TAIL_CALL (max 3 attempts)</t>
  <t>ERROR (-ENOENT, -EFAULT, -EACCES, -EINVAL): Skip operation, use
default value, emit EVENT_ANOMALY</t>
</list></t>

<t>Programs MUST NOT crash on negative returns; they MUST check return
values and branch accordingly.</t>

</section>
</section>
<section anchor="upc-memory-model-extensions-new-in-draft-03-update"><name>UPC Memory Model Extensions (NEW in draft-03 update)</name>

<section anchor="overview-1"><name>Overview</name>

<t>The Unheaded Protocol Computer (UPC) extends the Wotan memory model
with dedicated BPF map regions for program code, screen I/O, keyboard
input, and block device emulation.  These extensions enable general-
purpose computation within the BPF datapath.</t>

</section>
<section anchor="rommap-program-code-storage"><name>ROM_MAP (Program Code Storage)</name>

<t>The ROM_MAP is a BPF hash map that stores MBC program instructions.
The program counter (PC) indexes into this map.</t>

<figure><artwork><![CDATA[
struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 262144);   // 256K instruction slots
    __type(key, u32);              // Word-aligned instruction address
    __type(value, u32);            // 32-bit MBC instruction word
} rom_map SEC(".maps");
]]></artwork></figure>

<t>ROM_MAP is loaded from a UPCFlat binary (see <xref target="UNHEADED-FOUNDATION"></xref>
UPCFlat Binary Format) before the first packet is processed.
ROM_MAP MUST NOT be modified during program execution.</t>

</section>
<section anchor="rammap-read-write-memory"><name>RAM_MAP (Read-Write Memory)</name>

<t>The RAM_MAP is a BPF hash map that provides the UPC's general-purpose
read-write memory.  All LD/ST family instructions access this map.</t>

<figure><artwork><![CDATA[
struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 1048576);  // 1M word slots (4 MiB)
    __type(key, u32);              // Word-aligned byte address
    __type(value, u32);            // 32-bit word value
} ram_map SEC(".maps");
]]></artwork></figure>

<section anchor="address-space-layout"><name>Address Space Layout</name>

<t>The RAM_MAP address space follows the layout defined in
<xref target="UNHEADED-FOUNDATION"></xref> UPC Memory Region Types:</t>

<figure><artwork><![CDATA[
Address Range        Size        Region        Description
-----------          --------    ----------    -------------------------
0x0000_0000-0x0006_FFFF  448 KiB  RAM         .rodata + .data + .bss
0x0006_8000          4 bytes     KBD_IO        Keyboard I/O (scancode<<1|pressed)
0x0007_0000-0x0007_FA00  64 000 B SCREEN      Screen pixels (320x200 8bpp)
0x000F_0000-0x0010_FFFF  128 KiB  DEBUG       Debug output region
0x0011_0000-0x0050_FFFF  ~4 MiB   WAD         WAD data (doom1.wad)
0x0052_0000-0x0152_0000  16 MiB   HEAP        Bump allocator heap
0x03F0_0000              (grows down) STACK    Stack (r15 = SP)
]]></artwork></figure>

</section>
</section>
<section anchor="screenmap-video-output"><name>SCREEN_MAP (Video Output)</name>

<t>The SCREEN_MAP stores the pixel framebuffer and is separate from
RAM_MAP for performance isolation.</t>

<figure><artwork><![CDATA[
struct {
    __uint(type, BPF_MAP_TYPE_ARRAY);
    __uint(max_entries, 16000);    // 320x200/4 = 16000 words
    __type(key, u32);              // Word index
    __type(value, u32);            // 4 packed pixels (8-bit palette)
} screen_map SEC(".maps");
]]></artwork></figure>

<t>Writes to RAM_MAP addresses in the SCREEN range (0x0007_0000 to
0x0007_FA00) are intercepted and redirected to SCREEN_MAP.  A
SYS_DRAW_FRAME syscall (0x01) copies the current pixel buffer
from RAM_MAP to SCREEN_MAP and emits an EVENT_SCREEN_WRITE (0x14)
to the Anamnesis ring buffer.</t>

</section>
<section anchor="kbdmap-keyboard-input"><name>KBD_MAP (Keyboard Input)</name>

<figure><artwork><![CDATA[
struct {
    __uint(type, BPF_MAP_TYPE_ARRAY);
    __uint(max_entries, 1);
    __type(key, u32);              // Always 0
    __type(value, struct kbd_state);
} kbd_map SEC(".maps");

struct kbd_state {
    u32 key;       // Keycode
    u32 pressed;   // 1 = pressed, 0 = released
    u64 sequence;  // Monotonically increasing event counter
};
]]></artwork></figure>

<t>The SYS_GET_KEY syscall (0x02) reads from KBD_MAP.  The BPF program
checks the sequence counter to determine if a new key event has
occurred since the last read.  Wotan userspace writes key events
to KBD_MAP via bpf_map_update_elem.</t>

</section>
<section anchor="cpumap-processor-state"><name>CPU_MAP (Processor State)</name>

<figure><artwork><![CDATA[
struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 256);      // Max 256 concurrent flows
    __type(key, u32);              // IPv6 Flow Label
    __type(value, struct cpu_state);
} cpu_map SEC(".maps");

struct cpu_state {
    u32 regs[16];           // General-purpose registers r0-r15
    u32 pc;                 // Program counter (ROM_MAP index)
    u8  flags;              // CPU flags: Z(0), N(1), C(2)
    u8  stalled;            // 1 if waiting for cache miss
    u8  halted;             // 1 if HALT executed
    u8  _pad;
    u64 sleep_until;        // bpf_ktime_get_ns() wakeup time
    u64 insn_count;         // Total instructions executed
    u64 cache_hits;         // L1 cache hits
    u64 cache_misses;       // L1 cache misses
    u8  interrupt_pending;  // Non-zero if interrupt waiting
    u8  interrupt_vector;   // Pending interrupt vector
    u8  interrupts_enabled; // Non-zero if accepting interrupts
    u8  _pad2;
    u32 tick_counter;       // Timer interrupt tick counter
};
]]></artwork></figure>

<t>CPU state persists across packet hops.  Each IPv6 flow label maps
to an independent CPU instance.  The MBC CPU processes one instruction
per hop (per-packet computation model).</t>

</section>
</section>
<section anchor="wal-specification-new-in-draft-03-update"><name>WAL Specification (NEW in draft-03 update)</name>

<section anchor="overview-2"><name>Overview</name>

<t>The Write-Ahead Log (WAL) provides L3 persistence for Wotan memory.
It is an append-only log of dirty cache line writes, enabling crash
recovery by replaying WAL records to reconstruct L2 state.</t>

</section>
<section anchor="wal-record-format"><name>WAL Record Format</name>

<t>Each WAL record is exactly 76 bytes:</t>

<figure><artwork><![CDATA[
 0                                                              7
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                   Timestamp (8 bytes, LE u64)                 |
|                  Unix nanoseconds since epoch                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                Line Address (4 bytes, LE u32)                 |
|             Cache-line-aligned byte address                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                                                               |
|                  Cache Line Data (64 bytes)                   |
|              Complete 64-byte cache line content              |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>Total: 8 + 4 + 64 = 76 bytes per record.</t>

</section>
<section anchor="wal-operation"><name>WAL Operation</name>

<section anchor="append"><name>Append</name>

<t>When a dirty cache line is evicted from L1 or during periodic
writeback (default: every 1 ms), the WAL appends a record:</t>

<figure><artwork><![CDATA[
1. Open WAL file in append mode (O_APPEND | O_WRONLY)
2. Write 76-byte record (timestamp + address + data)
3. Call fsync() to ensure durability
4. Update WAL sequence counter
]]></artwork></figure>

<t>Implementations MUST call fsync() after each write to guarantee
that the record is durable before acknowledging the writeback.</t>

</section>
<section anchor="recovery"><name>Recovery</name>

<t>On process restart, WAL records are replayed in order:</t>

<figure><artwork><![CDATA[
1. Open WAL file in read mode
2. Read 76-byte records sequentially
3. For each record:
   a. Validate record integrity (HMAC-SHA256 per PATCH W4)
   b. Write cache line data to L2 ring buffer at line_addr
   c. Mark page as clean
4. Resume normal operation
]]></artwork></figure>

</section>
<section anchor="compaction"><name>Compaction</name>

<t>WAL compaction reduces the file size by removing superseded records
(records where a later record writes to the same address):</t>

<figure><artwork><![CDATA[
1. Acquire exclusive compaction lock (PATCH W5)
2. Read all records, building address -> latest_record map
3. Write retained records to new WAL file
4. Atomically rename new file over old
5. Release compaction lock
]]></artwork></figure>

<t>Compaction MUST NOT run concurrently with append operations.</t>

</section>
</section>
<section anchor="wal-configuration"><name>WAL Configuration</name>

<figure><artwork><![CDATA[
Parameter           Default         Description
---------           --------        ----------------------------------
wal_enabled         false           Enable L3 persistence
wal_path            (none)          WAL file path on disk
writeback_period    1 ms            Dirty cache flush interval
wal_max_size        256 MiB         Maximum WAL file size before compaction
wal_fsync           true            fsync after each write
]]></artwork></figure>

</section>
</section>
<section anchor="tty-subsystem-new-in-draft-03-update"><name>TTY Subsystem (NEW in draft-03 update)</name>

<section anchor="overview-3"><name>Overview</name>

<t>The TTY subsystem provides console I/O for UPC programs that use
standard Unix-style write(2) and read(2) syscalls on file descriptors
0 (stdin), 1 (stdout), and 2 (stderr).  TTY output is captured by
the BPF compute engine and forwarded to Wotan as EVENT_TTY_WRITE
(0x18) events.</t>

</section>
<section anchor="circular-buffer"><name>Circular Buffer</name>

<t>Each UPC flow maintains a TTY circular buffer in L2 memory for
console output accumulation:</t>

<figure><artwork><![CDATA[
struct tty_buffer {
    u8   data[4096];     // 4 KiB circular buffer
    u16  head;           // Write position (next byte to write)
    u16  tail;           // Read position (next byte to read)
    u32  total_written;  // Total bytes written (monotonic counter)
    u32  overflow_count; // Number of bytes dropped due to full buffer
};
]]></artwork></figure>

<section anchor="write-operation-syswrite-to-fd-1-or-2"><name>Write Operation (SYS_WRITE to fd 1 or 2)</name>

<t>When a UPC program issues SYS_WRITE with fd=1 or fd=2:</t>

<figure><artwork><![CDATA[
1. Copy bytes from RAM_MAP[buf..buf+count] to tty_buffer.data
   at the current head position
2. Advance head = (head + count) % 4096
3. If head would overtake tail (buffer full):
   a. Drop oldest bytes by advancing tail
   b. Increment overflow_count
4. Increment total_written by count
5. Emit EVENT_TTY_WRITE (0x18) to Anamnesis ring buffer
6. Publish tty output to Wotan topic compute.tty.{flow_label}
]]></artwork></figure>

</section>
<section anchor="read-operation-sysread-from-fd-0"><name>Read Operation (SYS_READ from fd 0)</name>

<t>When a UPC program issues SYS_READ with fd=0:</t>

<figure><artwork><![CDATA[
1. Check if tail != head (data available)
2. If data available: copy min(count, available) bytes to
   RAM_MAP[buf..buf+n]
3. Advance tail = (tail + n) % 4096
4. Return number of bytes read in r0
5. If no data: set r0 = 0 (non-blocking) or stall CPU
]]></artwork></figure>

</section>
</section>
<section anchor="event-emission"><name>Event Emission</name>

<t>TTY events are published on the Wotan topic:</t>

<figure><artwork><![CDATA[
Topic: compute.tty.{flow_label}
Payload:
  - timestamp (u64, Unix nanoseconds)
  - flow_label (u32)
  - fd (u8, 0=stdin, 1=stdout, 2=stderr)
  - length (u16, bytes written)
  - data (variable, TTY output bytes)
]]></artwork></figure>

<t>Dashboard subscribers MAY render TTY output in a terminal emulator
widget for real-time program output monitoring.</t>

</section>
<section anchor="tty-configuration"><name>TTY Configuration</name>

<figure><artwork><![CDATA[
Parameter           Default    Description
---------           -------    ----------------------------------
tty_buffer_size     4096       Circular buffer size (bytes)
tty_emit_events     true       Emit EVENT_TTY_WRITE to Anamnesis
tty_publish_topic   true       Publish to Wotan compute.tty.*
tty_max_line_len    256        Max bytes per single write event
]]></artwork></figure>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="topic-injection-attacks"><name>Topic Injection Attacks</name>

<t>A malicious application could publish events to unauthorized topics.</t>

<t><strong>Mitigation (MANDATORY)</strong>:
- Topic access control via Sophia <xref target="UNHEADED-SOPHIA"></xref> (per-program
  topic whitelist)
- Verify publisher identity (program ID from BPF context)
- Enforce least-privilege (default: deny all topics)
- Log unauthorized publish attempts
- Emit ANOMALY event to Anamnesis</t>

</section>
<section anchor="ring-buffer-memory-exhaustion-patch-w6"><name>Ring Buffer Memory Exhaustion (PATCH W6)</name>

<t>Per-program cache-miss rate limiting (10K misses/sec budget).
See draft-02 Section 8.2 for complete specification.</t>

</section>
<section anchor="cross-flow-memory-access-patch-w2"><name>Cross-Flow Memory Access (PATCH W2)</name>

<t>64-bit composite L1 cache keys prevent birthday attack collisions.
See draft-02 Section 4.1 for complete specification.</t>

</section>
<section anchor="cas-alignment-violations-patch-w3"><name>CAS Alignment Violations (PATCH W3)</name>

<t>8-byte alignment enforced by BPF verifier at load time.
See draft-02 Section 3.2.1 for complete specification.</t>

</section>
<section anchor="wal-tampering-detection-patch-w4"><name>WAL Tampering Detection (PATCH W4)</name>

<t>HMAC-SHA256 authentication on WAL entries.
See draft-02 Section 3.1 for specification.</t>

</section>
<section anchor="wal-compaction-race-conditions-patch-w5"><name>WAL Compaction Race Conditions (PATCH W5)</name>

<t>Exclusive mutex during compaction. See draft-02 Section 3.3.</t>

</section>
<section anchor="goaway-frame-dos-patch-w8"><name>GOAWAY Frame DoS (PATCH W8)</name>

<t>Frame validation and rate limiting. See draft-02 Section 10.2.</t>

</section>
<section anchor="normative-error-code-cross-reference-13-codes"><name>Normative Error Code Cross-Reference (13 codes)</name>

<t>The following 13 normative error codes are defined across the
Unheaded Protocol specification family.  This cross-reference table
provides a single point of lookup:</t>

<figure><artwork><![CDATA[
Code     Name                       Spec        Section   Level
------   -------------------------  ----------  --------  --------
0x0000   UNHD_NO_ERROR              Foundation  18.11     Flow
0x0001   UNHD_PROTOCOL_ERROR        Foundation  18.11     System
0x0002   UNHD_INVALID_FRAME         Foundation  18.11     Domain
0x0003   UNHD_FLOW_CONTROL_ERROR    Foundation  18.11     Domain
0x0004   UNHD_SETTINGS_TIMEOUT      Foundation  18.11     System
0x0005   UNHD_STREAM_CLOSED         Foundation  18.11     Flow
0x0006   UNHD_FRAME_SIZE_ERROR      Foundation  18.11     Domain
0x0007   UNHD_REFUSED_STREAM        Foundation  18.11     Flow
0x0008   UNHD_CANCEL                Foundation  18.11     Flow
0x0009   UNHD_COMPRESSION_ERROR     Foundation  18.11     Domain
0x000A   UNHD_CONNECT_ERROR         Foundation  18.11     System
0x000B   UNHD_ENHANCE_YOUR_CALM     Foundation  18.11     System
0x000C   UNHD_INTERNAL_ERROR        Foundation  18.11     System
]]></artwork></figure>

<t>Error codes 0x0000-0x003F are in the Standards Range and can only
be registered during initialization (Specification Required policy
per RFC 8126).  Extension codes 0x0040-0x00FF are available for
protocol extensions.  Codes 0x1F00+ are reserved for testing
(greasing per the 0x1F*N+0x21 pattern).</t>

<section anchor="error-level-definitions"><name>Error Level Definitions</name>

<figure><artwork><![CDATA[
Level     Description                     Scope
-------   ----------------------------    ----------------------
Flow      Error specific to a single flow Affects one stream only
Domain    Error affecting a domain        Affects one connection
System    Error affecting the system      Affects all connections
]]></artwork></figure>

</section>
</section>
<section anchor="error-code-information-leakage"><name>Error Code Information Leakage</name>

<t>Structured error codes (Section 3) may reveal internal architecture
details to an attacker observing BPF program behavior or Wotan metrics.</t>

<t><strong>Mitigation</strong>:
- Error detail codes MUST NOT contain sensitive data (keys, addresses)
- Metrics SHOULD aggregate error counts, not individual error details
- The wotan_last_error map is per-CPU and ephemeral (not persisted)
- External-facing error messages SHOULD use generic descriptions</t>

</section>
<section anchor="cross-reference-with-foundation-and-sophia"><name>Cross-Reference with Foundation and Sophia</name>

<t>Security considerations in this memo are aligned with:</t>

<t><list style="numbers" type="1">
  <t><strong><xref target="UNHEADED-FOUNDATION"></xref> Section 10 - Security Considerations</strong>:
Wire format immutability threat model, parser divergence attacks,
BPF containment, and integrity protection mechanisms.</t>
  <t><strong><xref target="UNHEADED-SOPHIA"></xref> Section 9 - Security Considerations</strong>:
Dictionary poisoning, nested dictionary security, QPACK
decompression security, and BPF map access control.</t>
</list></t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This memo does not request IANA registration of option types or protocol
numbers; those are handled by <xref target="UNHEADED-FOUNDATION"></xref>.</t>

<t>Wotan topic naming uses informal convention (compute.<em>, sophia.</em>,
anamnesis.*). If standardization is needed, IANA may create a registry:</t>

<figure><artwork><![CDATA[
Registry Name: Wotan Topic Namespace
Policy: Expert Review
Template: Topic Name, Component, Description, Reference
]]></artwork></figure>

<section anchor="wotan-error-origin-registry-new-in-draft-03"><name>Wotan Error Origin Registry (NEW in draft-03)</name>

<figure><artwork><![CDATA[
Registry Name:  Unheaded Wotan Error Origin Codes
Template:       Origin Code (0x00-0x1F), Origin Name, Description,
                Specification Reference
Policy:         Specification Required

Initial entries: See Section 3.2 (16 entries, codes 0x00-0x0C)
]]></artwork></figure>

</section>
<section anchor="wotan-error-category-registry-new-in-draft-03"><name>Wotan Error Category Registry (NEW in draft-03)</name>

<figure><artwork><![CDATA[
Registry Name:  Unheaded Wotan Error Category Codes
Template:       Category Code (0x00-0xFF), Category Name, Description,
                Specification Reference
Policy:         Specification Required

Initial entries: See Section 3.2 (12 entries, codes 0x00-0x0B)
]]></artwork></figure>

<?line 1113?>

</section>
</section>
<section anchor="authors-address"><name>Author's Address</name>

<t>Stevie Bellis
Unheaded
Email: stevie@bellis.tech</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="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"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="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"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>
<reference anchor="UNHEADED-FOUNDATION" >
  <front>
    <title>Unheaded: Protocol Foundation</title>
    <author initials="S." surname="Bellis">
      <organization></organization>
    </author>
    <date year="2026" month="March"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-bellis-unheaded-protocol-foundation-00"/>
</reference>
<reference anchor="UNHEADED-SOPHIA" >
  <front>
    <title>Sophia Dictionary Format for the Unheaded Protocol</title>
    <author initials="S." surname="Bellis">
      <organization></organization>
    </author>
    <date year="2026" month="March"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-bellis-unheaded-sophia-dictionary-00"/>
</reference>


    </references>

    <references title='Informative References' anchor="sec-informative-references">



    </references>

</references>


<?line 1039?>

<section anchor="changes-from-draft-bellis-unheaded-wotan-memory-02"><name>Changes from draft-bellis-unheaded-wotan-memory-02</name>

<t>The following changes are made in draft-03:</t>

<t><list style="numbers" type="1">
  <t><strong>Error Code Taxonomy (NEW)</strong>: Added Section 3 defining a structured
32-bit error code format with severity levels (INFO, WARNING, ERROR,
CRITICAL, FATAL), origin codes (16 subsystems), and category codes
(12 categories). Provides fine-grained error classification beyond
standard errno codes.</t>
  <t><strong>Helper Return Codes (ENHANCED)</strong>: Added structured error code
annotations to all BPF helper return values (Section 5). Each errno
return now maps to a full 32-bit structured code. Added auxiliary
error detail mechanism via per-CPU BPF array map
(wotan_last_error).</t>
  <t><strong>Error Recovery Procedures (NEW)</strong>: Added Section 3.5 defining
recovery procedures by severity level, automatic recovery state
machine (HEALTHY -&gt; DEGRADED -&gt; RECOVERING -&gt; FAILED), recovery
metrics, and cross-subsystem recovery dependency graph.</t>
  <t><strong>Cross-References to Foundation draft-06 and Sophia draft-03
(UPDATED)</strong>: Updated UNHEADED-FOUNDATION reference from draft-04 to
draft-06. Updated UNHEADED-SOPHIA reference from draft-01 to
draft-03. Added Section 1.1 documenting the specification family
structure.</t>
  <t><strong>Wotan Error Origin Registry (NEW IANA)</strong>: Added IANA registry for
error origin codes (0x00-0x1F).</t>
  <t><strong>Wotan Error Category Registry (NEW IANA)</strong>: Added IANA registry
for error category codes (0x00-0xFF).</t>
  <t><strong>Error Code Information Leakage (NEW Security)</strong>: Added security
consideration for structured error codes potentially revealing
internal architecture details.</t>
  <t><strong>UPC Memory Model Extensions (NEW)</strong>: Added ROM_MAP, RAM_MAP,
SCREEN_MAP, KBD_MAP, and CPU_MAP BPF map definitions with
complete structure specifications.  Defines the UPC address space
layout, screen I/O redirection, keyboard input protocol, and
per-flow CPU state persistence model.</t>
  <t><strong>WAL Specification (NEW)</strong>: Added complete Write-Ahead Log
specification with 76-byte record format (8-byte timestamp +
4-byte address + 64-byte cache line data), append/fsync semantics,
crash recovery replay procedure, and compaction protocol with
exclusive locking.</t>
  <t><strong>TTY Subsystem (NEW)</strong>: Added console I/O subsystem with 4 KiB
circular buffer, write/read operations on fd 0/1/2, overflow
handling, EVENT_TTY_WRITE emission, and Wotan topic publication
on compute.tty.{flow_label}.</t>
  <t><strong>Updated Date</strong>: Changed date from 2026-03-05 to 2026-03-15.</t>
</list></t>

<t>All draft-02 content is retained, including security patches W1-W8.
No existing wire format, processing rule, or normative requirement
from draft-02 is modified or removed.</t>

</section>
<section anchor="acknowledgments"><name>Acknowledgments</name>

<t>The Linux kernel BPF community (Alexei Starovoitov, Daniel Borkmann,
Song Liu) for the infrastructure enabling per-packet computation in the
kernel datapath.</t>

<t>The authors of RFC 9669 (BPF ISA), RFC 8799 (Limited Domains), and
RFC 9673 (Hop-by-Hop Processing Rehabilitation) for the foundational
protocols that make this design possible.</t>

<t>This document was co-authored with assistance from Claude (Anthropic).</t>

</section>


  </back>

<!-- ##markdown-source:
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
xQ5izyGbAAA=

-->

</rfc>

