Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

RFDs — Requests for Discussion

Design rationale for the orca-mvp monorepo. RFDs cover any system in this tree: argon (language + Oxide toolchain), kernel, tide, platform, tools, userspace.

What an RFD is

An RFD captures a single design position and the rationale behind it. One question per RFD. Once committed, the rationale is the durable answer; if a future RFD changes the answer, the old RFD is marked superseded and the new one cites it.

RFDs are not work-tracking artifacts. Implementation work that flows from a committed RFD lives in GitHub Issues that cite the RFD. Closing all the issues does not close the RFD; the RFD stays committed as the rationale of record.

What an RFD is not

  • Not a spec. Specs live in rustdoc (code surfaces) and the Argon book (language surface). RFDs reference those for the “what got built” but don’t redefine them.
  • Not a task list. Use GitHub Issues + Project boards for active work.
  • Not a status board. Cluster status, release readiness, in-flight work — all live in GitHub Projects.

Layout

rfd/
├── README.md                       this file
├── 0001-rfd-process.md             how RFDs work
├── NNNN-<slug>.md                  one position per file
└── archive/                        superseded or abandoned RFDs (optional; usually we just leave them in place with state field set)

Numbering

  • Four-digit zero-padded, monotonic.
  • Numbers are assigned at draft time in the PR that introduces the RFD.
  • Once a number is assigned and the PR opens, the number is burned even if the RFD is abandoned (the file lands with state: abandoned).
  • Gaps are normal; never renumber.

Lifecycle

Each RFD carries a state field with one of:

  • discussion — drafted, open for comment. The PR is the discussion forum.
  • committed — ratified; the rationale is in force. Body frozen except clarifications.
  • abandoned — opened but the position was dropped. Body frozen.
  • superseded — replaced by a later RFD. superseded_by: field carries the replacement’s number. Body frozen.

State transitions:

  • discussion → committed on PR merge after ratification.
  • discussion → abandoned on PR close-without-merge or explicit abandonment.
  • committed → superseded happens only when a new RFD lands that explicitly supersedes this one.

Metadata block

Each RFD opens with a small HTML metadata block right after the H1. argon-theme.css styles it as a colored status pill plus a muted meta strip; in the canonical /rfd/ markdown view it renders as plain text. The shape:

<div class="rfd-meta">
  <span class="rfd-status rfd-status-committed">Committed</span>
  <span class="rfd-meta-line">Opened 2026-05-03 · Committed 2026-05-03</span>
</div>

Status-pill classes correspond to lifecycle states:

  • rfd-status-discussion — open, drafting (yellow)
  • rfd-status-committed — settled, in force (green)
  • rfd-status-superseded — replaced by a later RFD (slate, line-through)
  • rfd-status-abandoned — dropped without resolution (orange)

The meta line carries dates inline (Opened YYYY-MM-DD · Committed YYYY-MM-DD). For a superseded RFD, append · Superseded by <a href="NNNN-slug.html">RFD-NNNN</a>.

Body shape

Lightweight; not bureaucratic. Use the sections that fit the question; skip ones that don’t apply.

  1. Question — one paragraph stating what’s being decided.
  2. Context — what’s hard about this, what changed, what depends on it.
  3. Options — alternatives considered (skip if there’s only one obvious answer).
  4. Decision — the answer (only when state is committed).
  5. Rationale — why; the load-bearing reasoning future readers need to make consistent calls.
  6. Consequences — what changes downstream (which crates, docs, tests, conventions).

How to land an RFD

  1. Pick the next free number. Create rfd/NNNN-<slug>.md with state: discussion.
  2. Open a PR titled RFD-NNNN: <title>.
  3. Discuss on the PR. Body iterates as the discussion converges.
  4. Once ratified: flip state to committed, set committed: date, merge.
  5. Cite the RFD from any code, doc, or issue that depends on the rationale.

How to supersede an RFD

  1. Open a new RFD (next free number) with the new position.
  2. New RFD cites the prior in its body and explains what changed.
  3. On merge: flip prior RFD’s state to superseded, set superseded_by field. Do not modify prior body content beyond that.

Index

RFDTitleState
0001RFD processdiscussion
0002Argon is foundational-ontology-neutralcommitted
0003Foreign-format support lives in ox-* crates, not in the languagecommitted
0004Decidability ladder is Argon’s own, never framed in OWL termscommitted
0005One grammar, multiple evaluation contextscommitted
0006Three compute forms — expression, inline body, opaque FFIcommitted
0007Queries and mutations are first-class items; every result carries why-provenancecommitted
0008Tests are first-class items; proof-status attributes for theorem claimscommitted
0009Generics are functor modules and generic computations, not parametric conceptscommitted
0010Module system and standpointscommitted
0011Two-tier visibility and direct-dependency rulecommitted
0012Package manifest is unified; editions are parse-time onlycommitted
0013Bivalent lockfile (content-hash + constructs-hash); workspace-local resolutioncommitted
0014std ships with the toolchain; explicit imports — no auto-preludecommitted
0015Surface naming prefers PL idiom over proof-assistant idiomcommitted
0016Refinement under OWA is three-valued (Kleene-Belnap)superseded
0017Universal top type is / Top; no explicit Thing wrappercommitted
0018where clauses, unsafe blocks, modal operators — one mechanism per concerncommitted
0019Patterns are first-class parameterized templatescommitted
0020Per-tenant kernel runtime — shared base + per-tenant overlaycommitted
0021Unified axiom event log; bitemporal; CBOR axiom-ADT bodiescommitted
0022CQRS projections + DRedc IVM behind a ProjectionMaintainer traitcommitted
0023Kernel API v2 — resource-oriented redesigncommitted
0024Diagnostic codes — OE / OW / OI severity prefix; X* for external bridgescommitted
0025Toolchain architecture — oxup argv[0] dispatch; single-root state; rustup-stylecommitted
0026Living diagrams — diagram blocks as graduated language extensioncommitted
0027Agent-facing tooling — universal CLI + JSON contract, MCP as transport, registration as datacommitted
0028Diagnostics schema 1.0 — agent wire-format ratificationcommitted
0029Doc comments and ox doc//////! semantics, intra-doc links, doc tests, JSON IRcommitted
0030ox doc --document-deps and external-package documentation — Cargo --no-deps parity; deps rendered from local cachediscussion
0031Concept-reference endpoints on pub metarel — subtype-aware validation alongside metatype-keyword and axis-value matchesaccepted
0032Shared-base package classification for workspace-vendored deps — SharedBasePolicy consulted for workspace members, not just locked depsaccepted
0033Sequenced test statements: mutate and cleanup in test blocks — per-statement saturation, canonical emit semantics, ordered teardowndiscussion
0034Composition pipeline and the oxc / ox boundary — two-phase pipeline, per-package .oxc, workspace .oxbin, Engine/Module/Storecommitted
0035Binary artifact .oxbin and the execute layer — section model, three-axis versioning, Merkle content-addressing, runtime trait surface, hot replacement contractcommitted
0036Generic declarations for derive, mutation, and compute<T: Bound> lifted from pub constraint, monomorphization at compose time, Datalog-alternatives composition, substrate-neutral boundsdiscussion
0037AFT-grounded truth-value semantics — bilattice substrate, K3/FDE/Boolean lattice contexts, fail-closed projection, per-standpoint consistency policycommitted
0038Runtime capability advertisement — what OxbinRuntime::capabilities() reports about supported AFT operators and lattice contextsdiscussion
0039Collections and collection operators — Set / List / Map / Optional / Range as closed type constructors, UFCS method-call sugar, comprehensions, indexing, slicing, membership; graduated-context tier dispatchcommitted
0040Substrate atoms and the explicit-writes principle — six atoms (metatype, concept, rule, trait, decorator, macro); four surface keywords (fn, derive, query, mutation) as one rule primitive; call-purity ladder; explicit-writes via insert / update / delete / emit with declared sink; : vs <: cleanup; braces-required; MLT via InstanceOfdiscussion
0041Traits and behavioral polymorphism — pub trait declarations with required fn / derive / query / mutation items; default impls; trait inheritance via <:; impl Trait for Concept blocks; generic bounds <T: Trait> with multiple-bound composition via +; mixed concept/trait bounds via where-clauses; static dispatch via monomorphization at compose time; orphan rule for coherence; concept/trait orthogonalitydiscussion
0042Macros and compile-time code generation — declarative macros (macro!-style, syntactic pattern matching) and procedural macros (@[…]-style, compiled Rust with resolved-AST and metatype-calculus access); expansion at oxc elaboration time within per-package boundary; hygiene; spans through expansion; sandbox + capability grants; state machines and @[derive(...)] as canonical examplesdiscussion
0043Query and mutation surface — select / insert / update / delete / with / emit / scenario grammar replacing require / do / retract / emit / return clauses; EdgeQL-style shape grammar shared between reads, writes, and computed fields; .field scope-relative resolution; aggregations + group by / order by / limit; match form for multi-hop traversal; emit-sink declarations; tier ceilings per body; lease-story worked migrationdiscussion
0044Cross-level instantiation (MLT) — Instantiates IR atom generalized to InstanceOf { instance: EntityRef, type_concept: u64 } with EntityRef = Individual / Concept / Statement; surface pub kind A : B admission for concept-of-concept; order derived from instantiation closure via new phase_mlt; vocabulary constraints via @[order(=N)] / @[bounded_order(N)]; Lean extension TypeGraphMLT with instantiates relation, acyclicity, order monotonicity; Tonto compatibilitydiscussion