Pick the bridge the loader instantiates. This is the wasm-artefact SELECTOR
(distinct from the main-bundle host-capability probe detectBridge() /
detectFeatures() in src/bridge.ts).
wasmgc-classic is the ONLY bridge this package builds, vendors or ships.
This selector resolves to it on every host that passes the causl/causl-wasm-ts#426 floor
probe below, and refuses (typed, loud) on hosts that fail it. Its
classic-strings build needs no wasm:js-string host support, so it
instantiates on every host at or above the declared floor.
wasmgc-builtins is RETIRED, not merely unpacked. #147 dropped it from
package.json#files while leaving it vendored and pinnable, on the reading
that it was a working bridge nobody had a probe for. It was not:
causl/causl-core-rs#210 measured its wasm:js-string imports as i32-typed
where the W3C builtins are externref-typed, so the artefact is rejected by
WebAssembly.compile(bytes, { builtins: ['js-string'] }) on every host and
always was. causl/causl-core-rs#355 removed the vendored tree, the build row
and the artefact-path mapping here; assertBridgeIsShipped refuses the
id at selection time and says why. See RETIRED_BUILTINS_BRIDGE_IDS.
The retirement is not a verdict that the tier is a bad idea, and it is not
permanent by construction. causl/causl-core-rs#358 is the work that would
make the bridge loadable: retyping the eleven wasm:js-string imports to
genuine externref on the engine side, either by moving them onto
wasm-bindgen's descriptor-driven ABI or by a post-link retype pass. If that
lands, this selector gets a second artefact back and the host probe above
gets something to choose between.
The chosen bridge string is what wasmUrlFor() keys on; the gc-classic
artifact directory mirrors the BridgeId value exactly. The legacy
serde-json bridge was retired with the split-crate engine_rs lineage
(issue #10).
causl/causl-wasm-ts#426 resolved the iasbuilt/causl#691 placeholder by making this selector PROBE rather
than by deleting it. With one artefact there is nothing to pick BETWEEN,
but under the 0.5.0 throw-instead-of-degrade policy there is still a real
decision here: whether this host is one the shipped artefact can validate
on at all. The old constant answered 'wasmgc-classic' on every host,
including hosts whose WebAssembly validates nothing, so the selection
that decides support was not a decision. Now it is: the probe below
validates a 56-byte module that uses exactly the artefact's measured
minimal feature set, and a host that refuses it gets the typed
WasmEngineUnavailableError naming the declared floor
(WASM_HOST_FLOOR_REFUSAL) BEFORE any 720 KB artefact fetch.
The probe is NOT a WasmGC sniff, deliberately. src/bridge.ts carries a
12-byte ref.null any probe, but test/host-failure-contract-275.test.ts
cell (A) measured the shipped artefact as declaring ZERO WasmGC
struct/array/rec-group types, so GC heap types are not what the artefact
needs. What it needs, per the wasm-tools feature bisect recorded on
WASM_HOST_FLOOR in src/wasm-registry.ts, is typed function references
((ref $t) params, call_ref) plus reference types, bulk memory,
sign-extension and non-trapping float-to-int. The probe module uses all
five and nothing else, so its verdict tracks the artefact rather than a
proposal the artefact does not use.
An explicitly pinned options.bridge skips this probe at every call site
(options.bridge ?? (await detectBridge())), which is the documented
escape hatch for a host the probe misjudges: the loader's own
WebAssembly.compile of the real artefact remains the final arbiter
there, classified by isWasmCapabilityError on the #108 preload
path.
#280 — the compile-reject classification USED to feed the §18A.13.1
capability fallback (loud one-time warn/telemetry, then a pure-TS graph).
It no longer does: 0.5.0 withdrew the fallback, so both this probe's
refusal and the loader's compile reject surface as
WasmEngineUnavailableError (CAUSL_WASM_ENGINE_UNAVAILABLE). The probe
feeds no degrade decision; it moves the SAME refusal earlier and names the
floor while doing so.
Pick the bridge the loader instantiates. This is the wasm-artefact SELECTOR (distinct from the main-bundle host-capability probe
detectBridge()/detectFeatures()insrc/bridge.ts).wasmgc-classicis the ONLY bridge this package builds, vendors or ships. This selector resolves to it on every host that passes the causl/causl-wasm-ts#426 floor probe below, and refuses (typed, loud) on hosts that fail it. Itsclassic-stringsbuild needs nowasm:js-stringhost support, so it instantiates on every host at or above the declared floor.wasmgc-builtinsis RETIRED, not merely unpacked. #147 dropped it frompackage.json#fileswhile leaving it vendored and pinnable, on the reading that it was a working bridge nobody had a probe for. It was not: causl/causl-core-rs#210 measured itswasm:js-stringimports as i32-typed where the W3C builtins are externref-typed, so the artefact is rejected byWebAssembly.compile(bytes, { builtins: ['js-string'] })on every host and always was. causl/causl-core-rs#355 removed the vendored tree, the build row and the artefact-path mapping here; assertBridgeIsShipped refuses the id at selection time and says why. See RETIRED_BUILTINS_BRIDGE_IDS.The retirement is not a verdict that the tier is a bad idea, and it is not permanent by construction. causl/causl-core-rs#358 is the work that would make the bridge loadable: retyping the eleven
wasm:js-stringimports to genuineexternrefon the engine side, either by moving them onto wasm-bindgen's descriptor-driven ABI or by a post-link retype pass. If that lands, this selector gets a second artefact back and the host probe above gets something to choose between.The chosen bridge string is what
wasmUrlFor()keys on; thegc-classicartifact directory mirrors the BridgeId value exactly. The legacyserde-jsonbridge was retired with the split-crateengine_rslineage (issue #10).causl/causl-wasm-ts#426 resolved the iasbuilt/causl#691 placeholder by making this selector PROBE rather than by deleting it. With one artefact there is nothing to pick BETWEEN, but under the 0.5.0 throw-instead-of-degrade policy there is still a real decision here: whether this host is one the shipped artefact can validate on at all. The old constant answered
'wasmgc-classic'on every host, including hosts whoseWebAssemblyvalidates nothing, so the selection that decides support was not a decision. Now it is: the probe below validates a 56-byte module that uses exactly the artefact's measured minimal feature set, and a host that refuses it gets the typed WasmEngineUnavailableError naming the declared floor (WASM_HOST_FLOOR_REFUSAL) BEFORE any 720 KB artefact fetch.The probe is NOT a WasmGC sniff, deliberately.
src/bridge.tscarries a 12-byteref.null anyprobe, buttest/host-failure-contract-275.test.tscell (A) measured the shipped artefact as declaring ZERO WasmGC struct/array/rec-group types, so GC heap types are not what the artefact needs. What it needs, per the wasm-tools feature bisect recorded onWASM_HOST_FLOORinsrc/wasm-registry.ts, is typed function references ((ref $t)params,call_ref) plus reference types, bulk memory, sign-extension and non-trapping float-to-int. The probe module uses all five and nothing else, so its verdict tracks the artefact rather than a proposal the artefact does not use.An explicitly pinned
options.bridgeskips this probe at every call site (options.bridge ?? (await detectBridge())), which is the documented escape hatch for a host the probe misjudges: the loader's ownWebAssembly.compileof the real artefact remains the final arbiter there, classified by isWasmCapabilityError on the #108 preload path.#280 — the compile-reject classification USED to feed the §18A.13.1 capability fallback (loud one-time warn/telemetry, then a pure-TS graph). It no longer does: 0.5.0 withdrew the fallback, so both this probe's refusal and the loader's compile reject surface as
WasmEngineUnavailableError(CAUSL_WASM_ENGINE_UNAVAILABLE). The probe feeds no degrade decision; it moves the SAME refusal earlier and names the floor while doing so.