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 → committedon PR merge after ratification.discussion → abandonedon PR close-without-merge or explicit abandonment.committed → supersededhappens 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.
- Question — one paragraph stating what’s being decided.
- Context — what’s hard about this, what changed, what depends on it.
- Options — alternatives considered (skip if there’s only one obvious answer).
- Decision — the answer (only when state is
committed). - Rationale — why; the load-bearing reasoning future readers need to make consistent calls.
- Consequences — what changes downstream (which crates, docs, tests, conventions).
How to land an RFD
- Pick the next free number. Create
rfd/NNNN-<slug>.mdwithstate: discussion. - Open a PR titled
RFD-NNNN: <title>. - Discuss on the PR. Body iterates as the discussion converges.
- Once ratified: flip
statetocommitted, setcommitted:date, merge. - Cite the RFD from any code, doc, or issue that depends on the rationale.
How to supersede an RFD
- Open a new RFD (next free number) with the new position.
- New RFD cites the prior in its body and explains what changed.
- On merge: flip prior RFD’s
statetosuperseded, setsuperseded_byfield. Do not modify prior body content beyond that.
Index
| RFD | Title | State |
|---|---|---|
| 0001 | RFD process | discussion |
| 0002 | Argon is foundational-ontology-neutral | committed |
| 0003 | Foreign-format support lives in ox-* crates, not in the language | committed |
| 0004 | Decidability ladder is Argon’s own, never framed in OWL terms | committed |
| 0005 | One grammar, multiple evaluation contexts | committed |
| 0006 | Three compute forms — expression, inline body, opaque FFI | committed |
| 0007 | Queries and mutations are first-class items; every result carries why-provenance | committed |
| 0008 | Tests are first-class items; proof-status attributes for theorem claims | committed |
| 0009 | Generics are functor modules and generic computations, not parametric concepts | committed |
| 0010 | Module system and standpoints | committed |
| 0011 | Two-tier visibility and direct-dependency rule | committed |
| 0012 | Package manifest is unified; editions are parse-time only | committed |
| 0013 | Bivalent lockfile (content-hash + constructs-hash); workspace-local resolution | committed |
| 0014 | std ships with the toolchain; explicit imports — no auto-prelude | committed |
| 0015 | Surface naming prefers PL idiom over proof-assistant idiom | committed |
| 0016 | Refinement under OWA is three-valued (Kleene-Belnap) | superseded |
| 0017 | Universal top type is ⊤ / Top; no explicit Thing wrapper | committed |
| 0018 | where clauses, unsafe blocks, modal operators — one mechanism per concern | committed |
| 0019 | Patterns are first-class parameterized templates | committed |
| 0020 | Per-tenant kernel runtime — shared base + per-tenant overlay | committed |
| 0021 | Unified axiom event log; bitemporal; CBOR axiom-ADT bodies | committed |
| 0022 | CQRS projections + DRedc IVM behind a ProjectionMaintainer trait | committed |
| 0023 | Kernel API v2 — resource-oriented redesign | committed |
| 0024 | Diagnostic codes — OE / OW / OI severity prefix; X* for external bridges | committed |
| 0025 | Toolchain architecture — oxup argv[0] dispatch; single-root state; rustup-style | committed |
| 0026 | Living diagrams — diagram blocks as graduated language extension | committed |
| 0027 | Agent-facing tooling — universal CLI + JSON contract, MCP as transport, registration as data | committed |
| 0028 | Diagnostics schema 1.0 — agent wire-format ratification | committed |
| 0029 | Doc comments and ox doc — //////! semantics, intra-doc links, doc tests, JSON IR | committed |
| 0030 | ox doc --document-deps and external-package documentation — Cargo --no-deps parity; deps rendered from local cache | discussion |
| 0031 | Concept-reference endpoints on pub metarel — subtype-aware validation alongside metatype-keyword and axis-value matches | accepted |
| 0032 | Shared-base package classification for workspace-vendored deps — SharedBasePolicy consulted for workspace members, not just locked deps | accepted |
| 0033 | Sequenced test statements: mutate and cleanup in test blocks — per-statement saturation, canonical emit semantics, ordered teardown | discussion |
| 0034 | Composition pipeline and the oxc / ox boundary — two-phase pipeline, per-package .oxc, workspace .oxbin, Engine/Module/Store | committed |
| 0035 | Binary artifact .oxbin and the execute layer — section model, three-axis versioning, Merkle content-addressing, runtime trait surface, hot replacement contract | committed |
| 0036 | Generic declarations for derive, mutation, and compute — <T: Bound> lifted from pub constraint, monomorphization at compose time, Datalog-alternatives composition, substrate-neutral bounds | discussion |
| 0037 | AFT-grounded truth-value semantics — bilattice substrate, K3/FDE/Boolean lattice contexts, fail-closed projection, per-standpoint consistency policy | committed |
| 0038 | Runtime capability advertisement — what OxbinRuntime::capabilities() reports about supported AFT operators and lattice contexts | discussion |
| 0039 | Collections and collection operators — Set / List / Map / Optional / Range as closed type constructors, UFCS method-call sugar, comprehensions, indexing, slicing, membership; graduated-context tier dispatch | committed |
| 0040 | Substrate 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 InstanceOf | discussion |
| 0041 | Traits 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 orthogonality | discussion |
| 0042 | Macros 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 examples | discussion |
| 0043 | Query 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 migration | discussion |
| 0044 | Cross-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 compatibility | discussion |