• §18A.12 directive #1 — the ONE async seam. Resolve the bridge (via detectBridge unless pinned) and the per-graph backend params, and return an opaque, frozen CauslWasmModule the synchronous createCauslWasmSync consumes with zero further await.

    Call ONCE per process+bridge at app init (in the browser: BEFORE the first render that builds a wasm graph). Idempotent — concurrent calls share one resolution via compiledModuleByBridge; a transient failure drops the cache entry so the next call retries.

    LOUD-FAIL: an unresolvable bridge/artefact throws a WasmEngineUnavailableError (this is an explicit wasm request — it never silently degrades). The #32 loader port LANDED: this resolves the artefact base, runs the one true async WebAssembly.compile, and imports the sidecar + compute-imports snippet. The resolution await happens OUTSIDE any commit envelope (the §18A.6 single-tick invariant is untouched — it is hoisted to bootstrap).

    Parameters

    Returns Promise<CauslWasmModule>

    import { preloadCauslWasm, createCauslWasmSync } from '@causl/causl-wasm-ts/wasm'
    const handle = await preloadCauslWasm() // once, at app init
    const graph = createCauslWasmSync(handle) // sync, at every render