Assessment · Ouroboros

Where Ouroboros stands: microkernel, protection, fault tolerance

A self-assessment against the three ideas this project draws on, measured as they actually stand in the code today — not aspiration. It sits alongside the two outward-looking research notes, research-minix-boot.md and research-helix-os.md, and reads best after architecture.md, which is the authoritative reference for the mechanisms named below.

This note supersedes the "current shape" sections of both research notes. Both were written before the driver-isolation, per-task-page- table, and fault-containment milestones (all 2026-08-18), and both state flatly that Ouroboros has "no fault isolation of any kind." That is no longer true, which is exactly what makes this re-assessment worth writing. Where those notes say "none yet," read this instead.

The short version: on the three services it has moved out (the filesystem, the console, and now the network stack), Ouroboros is a genuine microkernel — enforced isolation, capability-based bulk IPC, and real crash recovery. The mechanisms are the real thing. What separates it from MINIX and Helix is breadth and generality, not honesty of the individual pieces.

---

Axis 1 — Microkernel (MINIX)

The defining MINIX move is that the kernel does not contain the services: drivers, the filesystem, and the network stack are separate user-space processes, and the kernel is just mechanism (IPC, scheduling, privilege) underneath them. Measured against that one test:

Where Ouroboros genuinely qualifies now

Where it falls short of MINIX

Verdict: structurally a microkernel on the services it actually moved, using the right IPC primitives and an enforced IPC capability topology that is now a static baseline plus runtime delegation. Short of MINIX mainly on breadth (three servers, not a full fleet) and on general capability delegation (today's is one-step, to a task's own direct children, and irrevocable, where MINIX's grants are general and transitive).

---

Axis 2 — Protective states / enforced isolation

"Protected" was aspirational in this project until very recently, so it's worth being precise about the line that got crossed.

Before (the state the research notes describe)

Isolation was a convention. Every EL0 region was accessible to every task — the shell could read or write the filesystem server's memory and vice versa, with no fault. "Supervised EL0 process" meant "we gate a syscall by task index." Real, but soft: nothing stopped one task from reaching into another's memory, it was just impolite.

Now — hardware-enforced, and proven by fault injection

The honest caveats

Verdict: this is the axis where Ouroboros is strongest relative to both influences. MINIX gets EL0-equivalent isolation from separate address spaces; Helix explicitly does not have hardware-enforced isolation between modules (its safety leans on Rust's memory safety and hot-reload bookkeeping — see the research note). Ouroboros now has real, MMU-enforced, injection-verified per-task isolation, with a stack guard page turning silent overflow into a clean, contained fault. The one thing left on this axis is the reverted per-task-ASID TLB optimization.

---

Axis 3 — Fault tolerance (Helix OS, and MINIX's RS)

Helix's pitch is self-healing: a module crashes or hangs, the kernel detects it and restarts it (with attempted state migration) without a reboot. MINIX's is the reincarnation server: a crashed process is restarted from a clean slate because it was never in the kernel to begin with. Ouroboros has a real, minimal version of both — and it landed the same day as the isolation work, which is not a coincidence.

What exists

Where it's short of Helix (and of MINIX's RS)

Verdict: a genuine, working reincarnation story for one service, with the crucial "state is disk-derivable" property that makes it real recovery. Short of both influences on generality (one supervised task, not all), on the non-crashing failure mode (no watchdog), and on liveness of the swap (reload, not hot-reload).

---

Consolidated scorecard

Read this as "how close is the mechanism," not "is it as mature." All three projects are pre-alpha; MINIX is the only one with decades of real-world hardening behind the design.

DimensionMINIXHelixOuroboros (today)
Services outside the kernelFull fleet (disk, net, FS, all drivers) as separate address-space processesModules outside the TCB, but within one address spaceThree — the FAT32 filesystem (fsd), the console (cond), and the network protocol stack (netd), real separate EL0 processes
Isolation mechanismSeparate address spaces (hardware)Rust memory safety + hot-reload bookkeeping (no hardware boundary between modules)Per-task MMU page-table views (hardware), injection-verified + validated syscall pointers
IPCSynchronous SEND/RECEIVE/SENDREC, fixed 64-byte messagesTrait-boundary calls + IPC queuing in the schedulerSynchronous MSG_CALL (sendrec-shaped, sender-filtered) + copy-by-mailbox; grant/safecopy capability for bulk data
Bulk data across the boundarysys_safecopy (capability-gated copy)Within one address space (no cross-space copy needed)GRANT + SAFECOPY — the same capability model as MINIX
Crash recoveryRS restarts the crashed process from a clean slateSelf-heal: watchdog + health monitor + recovery, with attempted state migrationA supervisor registry reloads any crashed server from a kept image (fsd remounts from disk — state is disk-derived); shared 3-restart cap
Non-crashing hang recoveryTimeouts / RS healthHealth checks for hangs (first-class)Yes — a passive heartbeat catches a runnable wedge; an active ping catches a blocked wedge
Live code replacementNo (restart, not hot-swap)Yes — pause/snapshot/swap/restore/rollbackNo (reload same image)
Supervision scopeUniform (RS parents every boot-image process)Uniform (self-heal framework)Uniform — a registry supervises every boot-image server (fsd, cond, netd)
Trust topologyCapability-gated endpoints between serversTrait boundariesCapability send-mask — a per-slot mask enforced at the IPC boundary restricts who each task may reach, now a static baseline plus runtime DELEGATE (coarse: one target, non-transitive, in practice shell-only)
Kernel/policy splitKernel is mechanism; PM/VFS/RS are policyExplicit: core/ (mechanism) vs. subsystems/ + modules_impl/ (policy)Partial — the FS, console, and network stack are out; scheduler, MMU, and the remaining drivers are still kernel-resident

---

What would close the gap, in order of payoff

Not commitments — the natural next moves toward the fuller ideal, and the shape each would take given what already exists:

Several moves on this list have since shipped, in order:

What's left, in rough order of payoff:

  1. General capability delegation. Today's DELEGATE is one-step and irrevocable: a task may pass what it holds to its own direct children and nowhere else. MINIX's grant mechanism is general and transitive (any task hands any held capability onward, revocably) — needed for direct task-to-task streaming without a relay, or a spawned program that runs its own server.
  2. More breadth — a third component out of the kernel (limited by the no-IOMMU DMA constraint on the block transport).
  3. The smaller, already-recorded items that harden the isolation itself: revisiting per-task ASIDs with a proven break-before-make sequence (the reverted optimization — see the isolation postmortem for the real-hardware fault evidence).

None of these is a small task, and none is needed to call the current state honest. They're the difference between "the mechanisms are real" (true today) and "the mechanisms are general" (the next era of the project).

---

Sources and cross-references