Skip to content

docs(rfc): propose RFC-0003 — the capability table - #7

Merged
MatejGomboc merged 1 commit into
mainfrom
rfc/0003-capability-table
Jul 30, 2026
Merged

docs(rfc): propose RFC-0003 — the capability table#7
MatejGomboc merged 1 commit into
mainfrom
rfc/0003-capability-table

Conversation

@MatejGomboc

Copy link
Copy Markdown
Member

Summary

The first Phase 1 design RFC, and the first to argue against the threat model by obligation number: discharges O-1 (unforgeability), O-2 (non-widenability), O-4 (no ambient authority), and the destruction half of O-3 (revocability) — with selective revocation honestly deferred to RFC-0003a.

The core proposal: a flat per-process handle table (Zircon lineage) carrying seL4's invariants — handles as kernel-table indices, subset-only derivation, generation counters against reuse — explicitly steering around the baroque capability hierarchies grave. Capability transfer is a Rust move (no Clone), making §3's compile-time-transfer claim concrete. §9 constrains the future syscall ABI to capability-indexed operations only, so O-4 is inherited by every syscall ever written.

Which pillar does this serve?

Pillar 2, directly — and it is the enforcement surface every other pillar rests on.

If this changes a document or the constitution

  • Cross-references resolve (every O-number verified against docs/threat-model.md)
  • Not a constitution amendment — a proposed RFC awaiting your verdict
  • docs/CHANGELOG.md records it

Borrow Ledger

Microkernel core — write ourselves, design only; lineage table in §10 credits seL4, Zircon, KeyKOS/EROS, and our own BlueOS blueprint (its generation-counter instinct is adopted).

unsafe register

  • New unsafe blocks: None — paper only.

For your review, specifically

  1. §4 — the representation verdict (flat table vs CNode radix) is the decision. If you disagree here, everything downstream changes.
  2. §7 — revocation: do you accept deferring selective revocation to RFC-0003a, with B3 (badges + shallow records) as the proposal on the table?
  3. §9 — the syscall constraint binds every future syscall. Cheap to reject now, expensive later.

🤖 Generated with Claude Code

The first Phase 1 design RFC, and the first consumer of the threat model:
it cites the obligations it discharges by number (O-1, O-2, O-4, and the
destruction half of O-3), which is the working style the model exists for.

The load-bearing decision is representation. Three lineages argued:

  - seL4's CNode radix: rejected as the primary structure. It is the
    "baroque capability hierarchies" grave §3 names, and its complexity
    budget assumes formal verification Setonix does not have.
  - A flat per-process handle table (Zircon lineage): recommended. O(1)
    lookup, no user-visible structure, small enough to hold in one head —
    with seL4's invariants applied to it: handles are indices into kernel
    memory (unforgeable), derivation is subset-only (rights are monotone
    decreasing, no widening operation exists), generations close the ABA
    reuse hole the old C++ blueprint already identified.
  - L4 thread-local minimalism: rejected; fits the process-holds-resources
    split worse.

Transfer is a Rust move. The kernel-side Capability deliberately has no
Clone: duplication is derive, an explicit recorded operation. This is where
§3's "Rust's ownership and move semantics model capability transfer at
compile time" stops being a slogan — the borrow checker enforces that a
capability lives in exactly one table or one in-flight message.

The RFC also constrains the syscall ABI before it exists: every
resource-touching syscall takes a handle; no syscall names a resource by
path, PID or any ambient identifier. O-4 becomes a birth constraint the
syscall RFC inherits, not a retrofit.

Honest gaps, named rather than papered over: selective transitive
revocation is proposed (badges plus shallow derivation records, keeping
revocation policy in the broker where §3 puts policy) but deferred to
RFC-0003a with the broker RFC as input; multi-core table synchronisation
couples to the IPC RFC; the memory-capability/MMU handshake and the no-root
bootstrap of the first capabilities are open questions listed for their own
RFCs.

Verified: spelling and markdown gates clean across 53 files; every O-number
cited resolves against docs/threat-model.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@MatejGomboc
MatejGomboc merged commit 23e5408 into main Jul 30, 2026
6 checks passed
@MatejGomboc
MatejGomboc deleted the rfc/0003-capability-table branch July 30, 2026 17:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant