Enterprise Enterprise: the wasm engine and causl-wasm-ts
Causl ships a pure-TypeScript engine (causl-ts) as the
open-source floor and reference implementation. As an Enterprise feature
I also ship a Rust→WebAssembly engine, causl-core-rs,
consumed through a thin TypeScript client, causl-wasm-ts.
Both engines expose the same public Graph surface: the
canonical primitives of SPEC §12.1 plus the §12.2 second-tier structural
surface, the full contract the Rust core satisfies over FFI (§18A.4).
Inside causl-wasm-ts the Rust engine is the
whole engine. There is no TypeScript fallback in that package,
and createCausl() either constructs the wasm graph or throws.
The promotion gate documented in
SPEC §18A.7
has been met. The engine and client repositories are private, so I cite
them here by name and issue number without linking; reaching the source
needs a Gitea account on git.opsite.ca.
Integrating causl-wasm-ts
Adopt the Rust engine from a TypeScript or Node application: the
Gitea-registry install, await preloadCauslWasm() once at
boot, synchronous createCausl() afterwards, the placed
artefact and its loader, and the two structured failure codes.
Two-engine architecture
Two conformant engines, now in two different repositories:
causl-core-rs ships the Rust engine that
causl-wasm-ts binds, and causl-core-ts
stays dual-engine as the differential oracle. The §18A contract and
the shared public Graph surface.
Wasm performance, measured
What the wasm path actually costs. The marshal tax is not the ceiling: a raw boundary crossing is 1.6 ns. The real costs are a per-commit clone that scales with graph size, a per-recompute constant, and a per-commit constant.
Read the numbersGenerated API reference
The TypeDoc-generated reference for the package surface. It is built
from an older package layout and still names @causl/core,
so it lags the 2026-07-27 rename. Where it disagrees with these prose
pages, the prose pages are current.
Distribution
The Enterprise @causl/* packages are distributed through a
self-hosted, private npm registry: the Gitea package
registry at https://git.opsite.ca/api/packages/causl/npm/.
It is fully private. Every package requires
authentication to read, nothing is listed publicly, and anonymous
requests are rejected. The old Verdaccio host
iasbuilt-npm.opsite.ca is gone; any .npmrc or
lockfile still naming it is stale.
Read this before you edit an
.npmrc.@causl/coreis not the client, and it has zero versions on this registry. It does resolve on the public npm registry, at 0.3.0 through 0.3.3, to a different package (the retired TypeScript engine). So an.npmrcmissing the@causl:registry=line, or a lockfile still pinning@causl/core, installs successfully and gets the wrong package rather than failing. The failure mode is a silent wrong install, not an error. Install@causl/causl-wasm-ts, and check the scope line is present before you do.
The packages, the repositories that publish them, and where each one lives:
| Layer | Repository | Package | Registry |
|---|---|---|---|
| Rust engine | causl-core-rs |
@causl/core-rs |
Gitea (private) |
| TypeScript engine | causl-core-ts |
@causl/core-ts (never published) |
Gitea (private) |
| TypeScript client | causl-wasm-ts |
@causl/causl-wasm-ts |
Gitea (private) |
| OSS TypeScript engine | causl-ts |
@causlts/core |
public npmjs |
@causl/causl-wasm-ts is the package you install. Its
satellite packages (@causl/persistence,
@causl/devtools, @causl/devtools-bridge,
@causl/migration-check, @causl/formula,
@causl/hypothesis, @causl/sync,
@causl/react) publish from the same repository to the same
registry. Two names that used to appear here do not exist on it:
@causl/wasm was never published, and @causl/core
is the hazard above. The naming scheme is deliberate, engines by
substrate and clients by consumer language, and it is recorded in
causl-wasm-ts docs/repo-naming-decision.md.
Point the @causl scope at the registry and attach the token
issued during Enterprise onboarding. Both lines go in
.npmrc before the first install:
@causl:registry=https://git.opsite.ca/api/packages/causl/npm/
//git.opsite.ca/api/packages/causl/npm/:_authToken=${CAUSL_NPM_TOKEN}
Then install with your usual package manager:
pnpm add @causl/causl-wasm-ts
# npm install @causl/causl-wasm-ts
# yarn add @causl/causl-wasm-ts
These Enterprise features require a production Rust build and a Node
target (SPEC §18A.2).
The §18A.7 GO/NO-GO gate was met on 2026-06-21, all five criteria GO, so
in causl-wasm-ts the Rust engine is the unconditional
production engine. The host floor is Safari 18.2, Chromium 119,
Firefox 120 and Node 22, governed by typed function references
rather than by WasmGC heap types; the
host-tier matrix
has the detail. The pure-TypeScript engine is still the §12 conformance
reference and the §18A.7 Criterion-5 floor, but it lives in
causl-core-ts, not in causl-wasm-ts. That is
the repository that stays dual-engine and runs the differential oracle.