Skip to content

ADR 0002 — Milestone 0 decision set ​

  • Status: Accepted (project owner, 2026-10-22: "approve all the open decisions")
  • Scope: every proposal listed in docs/open-decisions.md at the end of M0/C0.

Each decision below adopts the proposed answer from open-decisions.md, with the rationale given in the referenced document. Later changes need a new ADR that supersedes the relevant item.

Language and compiler ​

IDDecisionReference
OD-1Compiler in C# / .NET 10; NativeAOT for distributionADR 0001
OD-2Hybrid memory architecture: ownership + borrowing as the sole safety mechanism; regions/arenas as loans; escape analysis optimisation-onlymemory-model.md §1–2
OD-3No references in user aggregates in v0 (E3); lifetime-parameterised structs designed for M6ownership.md §4
OD-4class reserved; future sugar for always-boxed non-Copy typeslanguage-spec.md Ex4
OD-5Panic = abort; no unwinding; destructors do not run on panicownership.md §0
OD-6Integer overflow panics in all builds; explicit wrapping*/checked*/saturating*ownership.md §0
OD-7Structs are implicitly Copy iff all fields are Copy and no drop; @noncopy opts outownership.md §1
OD-8v0 arena contents must have no drop (R2); drop lists latermemory-model.md §3.3
OD-9No closures in v0 (non-capturing fn pointers only); scoped closures M6+language-spec.md §6
OD-10Static generics only in v0; dyn Interface futurelanguage-spec.md Ex12
OD-11Package manifest nova.toml (name, version, profile, path-only dependencies in v0); exact schema specified in M1milestone-1.md
OD-12No growable scratch arrays in v0memory-model.md §3.4
OD-13Rc<T>/Weak<T> post-M6, explicit, single-threadedmemory-model.md §6
OD-14@flat layouts: post-M9 research onlymemory-model.md §7
OD-17Call sites: implicit shared borrow; mut x for exclusive; borrow x/borrow mut x elsewherelanguage-spec.md §3
OD-18Reference types spelled borrow T / borrow mut Tlanguage-spec.md §2

CosmoOS integration ​

IDDecisionReference
OD-15Nova userland runtime uses public libc functions only (no raw cosmo_* syscall wrappers)cosmoos/profiles.md §2.2
OD-16Native personality is the default; musl/Linux personality profile later, opt-incosmoos/profiles.md §2.3
OD-19In-tree route S1 uses checked-in, deterministic generated C with a provenance header (no .NET in CosmoOS CI)cosmoos/build-integration.md §3
OD-20Prove C1 out of tree (S0) first, then propose a Nova unit for CosmoOScosmoos/feasibility.md
OD-21Missing libc pieces are proposed as CosmoOS libc units; Nova works around them meanwhilecosmoos/profiles.md §2.2

Kernel questions (KQ) ​

Accepted where the answer is a Nova-side policy:

IDDecision
KQ-1IRQ-context Nova code is @noalloc (follow the interrupt.h policy)
KQ-4@nosleep scopes may allocate via kmalloc; the permission lives in the kmalloc binding and is revisited if kmalloc gains might_sleep
KQ-8Address typing stays Nova-side; no CosmoOS header changes requested

Not decidable from Nova alone. Each needs a CosmoOS code change or a CosmoOS policy ruling made as an owner-chosen unit. Until then, Nova adopts the conservative default shown:

IDQuestionNova default until resolved
KQ-2Export preempt_enable / out-of-line quiesce read lock for modulesModules may not use Quiesce.read()
KQ-3call_quiesce barrier at module unloadModules may not deferDrop into module text
KQ-5Built-in Nova code calling non-exported internalsOnly exported symbols, even for built-in code, until ruled
KQ-6kobject_put from IRQ context for non-blocking releasesForbidden
KQ-7FP-register check for .ko filesNova's C4 acceptance runs the disassembly check itself

Pre-1.0: the language and its tools are still changing.