Skip to content

Direction: give kiln a no_std interpreter mode for on-board embedded execution (hybrid with synth-AOT) — amends RFC #46 #415

Description

@avrabe

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)

  1. 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.
  2. Sync + collections port — kiln-sync abstractions; alloc collections behind the std feature boundary.
  3. Platform-callback I/O — WASI/host imports via the kiln-builtins callback surface on embedded.
  4. Live migration — execution-state serialize/restore (DLR-FT parity; gale/gust checkpoint). Can be its own track.
  5. 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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions