Decision
Pursue a hybrid embedded story: keep meld + synth AOT→native ELF for the certified hot path, and make kiln's interpreter no_std-capable so it can run on-board (gale/gust), competing head-to-head with the safety-critical interpreter field (#413: NASA spacewasm, DLR-FT/wasm-interpreter) instead of ceding that niche.
This amends RFC #46, which currently states "there is no no_std interpreter" and routes all embedded execution through synth-AOT. RFC #46's build-time component lowering (meld) and AOT-for-perf (synth) stay — this adds an interpreter deployment target, it does not remove synth.
Why (from the #413 peer comparison)
- spacewasm (NASA) and DLR-FT interpret on-board — no AOT. DLR states explicitly they chose an interpreter because a compiler defies DO-178C/DO-332 design principles. A compiler (synth) in the embedded cert TCB is a materially harder cert story than an interpreter; the incumbents avoided it deliberately.
- kiln already has the ingredients. Capability-bounded memory + per-instruction fuel are exactly what a cert-friendly on-board interpreter needs. kiln-runtime is already categorized
no-std with a std feature and a (currently no-op) no_std stub — the no_std gate is a choice, not a limitation.
- Live migration gap. DLR-FT can serialize + move a running instance → maps onto gale/gust checkpoint-restart/failover. Native AOT code can't migrate easily; an interpreter can.
Feasibility (measured)
kiln-runtime std-dependence is moderate and localized:
- Sync primitives (~90
Mutex/RwLock/thread hits) → port to kiln-sync no_std equivalents. Main blocker.
- Collections (~55
std:: hits, few std::collections) → alloc (BTreeMap etc.).
- I/O (only ~5
std::fs/std::io hits) → platform callbacks (the existing kiln-builtins pattern).
Not a rewrite; a focused port centered on sync + collections. Target shape: DLR-FT's "in-place, almost no external deps."
Phasing (proposed)
- Feasibility spike — run a minimal core module through the interpreter under
no_std + alloc on thumbv7em; measure binary size + that fuel/bounded-memory still hold. Go/no-go gate.
- Sync + collections port — kiln-sync abstractions; alloc collections behind the
std feature boundary.
- Platform-callback I/O — WASI/host imports via the kiln-builtins callback surface on embedded.
- Live migration — execution-state serialize/restore (DLR-FT parity; gale/gust checkpoint). Can be its own track.
- Cert-evidence parity — the no_std interpreter carries the same Verus/Lean/witness-MC-DC/sigil evidence (kiln's differentiator vs the peers).
Cross-repo
Amends RFC #46 (doc update + BA sign-off), and touches positioning for meld/synth (interpreter is no longer only std/reference) and gale/gust (new on-board deployment target + migration). Loop those in before committing beyond the Phase-1 spike.
Tracked in kiln rivet as a design-decision + REQ_NOSTD_INTERP. Relates to #283 (positioning vs Wasmtime TCB), #413 (peer comparison), #401/SR-35 (verified oracle).
Decision
Pursue a hybrid embedded story: keep meld + synth AOT→native ELF for the certified hot path, and make kiln's interpreter
no_std-capable so it can run on-board (gale/gust), competing head-to-head with the safety-critical interpreter field (#413: NASA spacewasm, DLR-FT/wasm-interpreter) instead of ceding that niche.This amends RFC #46, which currently states "there is no no_std interpreter" and routes all embedded execution through synth-AOT. RFC #46's build-time component lowering (meld) and AOT-for-perf (synth) stay — this adds an interpreter deployment target, it does not remove synth.
Why (from the #413 peer comparison)
no-stdwith astdfeature and a (currently no-op)no_stdstub — theno_stdgate is a choice, not a limitation.Feasibility (measured)
kiln-runtime std-dependence is moderate and localized:
Mutex/RwLock/threadhits) → port tokiln-syncno_std equivalents. Main blocker.std::hits, fewstd::collections) →alloc(BTreeMap etc.).std::fs/std::iohits) → platform callbacks (the existing kiln-builtins pattern).Not a rewrite; a focused port centered on sync + collections. Target shape: DLR-FT's "in-place, almost no external deps."
Phasing (proposed)
no_std + alloconthumbv7em; measure binary size + that fuel/bounded-memory still hold. Go/no-go gate.stdfeature boundary.Cross-repo
Amends RFC #46 (doc update + BA sign-off), and touches positioning for meld/synth (interpreter is no longer only std/reference) and gale/gust (new on-board deployment target + migration). Loop those in before committing beyond the Phase-1 spike.
Tracked in kiln rivet as a design-decision + REQ_NOSTD_INTERP. Relates to #283 (positioning vs Wasmtime TCB), #413 (peer comparison), #401/SR-35 (verified oracle).