You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
After the CM pin advance to 2f13265 (CM#705 merge; polyengine#173), a bounded set of new conformance rows cannot pass on wasmtime-environ 47.0.3 and are xfailed under pin-drift classes. This issue is the register; the wasmtime bump (49.x, cf. the parked findings entries from #246/#247 and the case-folding gap #238) retires every class below. Failure direction is benign throughout: 47-era tooling over-rejects now-valid programs or under-rejects now-invalid ones at validation time — no soundness exposure at runtime.
Class: fact-reentrance-47 — FACT compiles now-valid reentrance to static traps
wasmtime-environ 47's FACT emits an unconditional CannotEnterComponent trap at translation time for same-instance/ancestor lower→lift pairs (upstream trampoline.rs; documented at runtime/src/intrinsics/fact_calls.ts header). CM#705 makes these calls valid. Affected: 10 of 13 directives in test/async/reentrance.wast (all route at least one executed adapter edge through an ancestor lift — including the sibling-reentrance cases 4/10/11, whose wiring passes through a root-level lift). The three passable directives (parent-to-child control, the never-executes-adapter branch, and the dtor-reentrance case) are NOT in this class — the dtor case is gated on polyengine's own gate removal (#173) instead.
wasmparser at the 47 pin predates hyphen-insensitivity and transitive strongly-unique rules: 5 new assert_invalid directives in test/validation/kebab.wast are accepted (missing rejection). Extends the case-folding gap already tracked in #238 and the findings entries (#246).
test/validation/max-value-size.wast (new): 7 assert_invalid directives pinning elem_size(t) < 2^28, including product-overflow and u32-wrap cases. The 47-era validator accepts all 7. Note: this file is in upstream's own test/nyi.txt at the pin — even current wasmtime does not implement it; verify at bump time whether the bumped wasmparser enforces it or the class needs to survive the bump with a narrower name.
Exit criteria
wasmtime-environ bump lands (translator-shim Cargo pin + just test-rust + full regen/triage).
All three classes' xfail entries removed; the stale-xfail detector enforces completeness.
Correction to the fact-reentrance-47 class description, from ground-truth triage during the pin advance (probe of async/reentrance.json + wasmtime-environ 47.0.3 source):
The static trap is broader than described.fact/trampoline.rs:116-127 traps unconditionally when lift.instance == lower.instanceor either instance is an ancestor of the other — i.e. every vertical fused adapter is a compile-time trap stub at 47, including plain non-reentrant parent→child calls (a canon lower at the outer level of a child instance's lifted export). Only sibling adapters compile to real fused code, which is why the existing corpus (sibling/host-shaped composition) never surfaced this: under the old pin, the only corpus rows exercising vertical adapters were trap-on-reenter.wast-family assert_trap "cannot enter component instance" rows, and the static stub's message is byte-compatible with the dynamic check's — it passed for a subtly different reason than we thought.
Consequences:
All 10 executed-adapter directives in reentrance.wast are in this class — including the two rows pre-analysis called "controls" (parent-to-child, wast line 60) and the dtor-reentrance row (line 198, predicted to be provable by polyengine's own gate removal). None of them reach polyengine runtime code: they die inside the generated adapter with wasm trap: cannot enter component instance (the wasm trap: prefix is the discriminator vs polyengine's own gate message, which carries the instance index and (reentrance forbidden)).
The cm705-gate-removal xfail class (pin-advance migration map: CM#705 removes the may_enter flag/trap #173) has zero corpus rows: the gate-removal PR's proof burden shifts entirely to the runtime unit suites (inverted reentrance pins + poisoning pins), and post-removal these corpus rows keep failing identically until the wasmtime bump.
Exit criterion sharpened: upstream wasmtime removed the static vertical-adapter trap while adopting CM#705, so the bump makes these adapters real fused code; expect the whole class (11 rows incl. the cascade) to flip at once. Lines 522/657 (+ their 645/760 cascades) are NOT this class — wasmparser 0.252 encoding drift, tracked with Pin-blocked conformance residues (#13 exit): name-option + thread-encoding xfails need wasmparser >= 0.255 #152.
Triage 2026-09-05: the bump this issue waited for has landed (#281: wasmtime-environ main@4675ee1, wasm-tools 0.258, CM submodule 7c67611), and the register no longer matches its title. Retitling to what remains; labels (p2, upstream-tracking) stay.
Class by class, against the exit criteria:
class in the body
outcome
fact-reentrance-47
retired. The bump removed FACT's static vertical-adapter stub; 7 of the 10 masked reentrance.wast rows passed outright, the remaining 3 were runtime residue tracked as #279 and fixed by #282. Zero rows left.
name-rules-47
survives under a new name, name-rules-nyi (5 kebab.json rows). It was never pin drift: kebab.wast is in upstream's own test/nyi.txt at the current pin — wasmtime itself has not implemented CM#703/#704's kebab-folding conflict check, so wasmparser 0.258 accepts all five.
max-value-size-47
survives under a new name, max-value-size-nyi (7 rows), same reason: max-value-size.wast is in upstream's nyi.txt; the body's "verify at bump time whether the class needs to survive with a narrower name" resolved as yes.
not done.#238 (translator accepts [method]/[static] case-folded collisions) is still open and #281 does not mention it. It is the same wasmtime gap as name-rules-nyi one layer over, so it stays open on the same upstream event.
This issue is now the upstream-nyi register: rows the pinned suite asserts and upstream's own nyi.txt admits wasmtime does not enforce. Exit is wasmtime implementing the checks (then a routine environ bump flips them; the stale-xfail detector enforces the cleanup). Incoming: #250's pin advance to CM 8892da0 (#716) adds binary.wastassert_malformed rows for a nonzero reserved byte on the former cancellable slot — also in upstream nyi.txt, so they belong here too.
Watch: bytecodealliance/wasmtime for CM#703/#704 name-folding and CM#688 element-size-bound enforcement; wasmtime#14244 for the #716 encoding.
Activity
lannbot commentedon Aug 30, 2026
Correction to the
fact-reentrance-47class description, from ground-truth triage during the pin advance (probe ofasync/reentrance.json+ wasmtime-environ 47.0.3 source):The static trap is broader than described.
fact/trampoline.rs:116-127traps unconditionally whenlift.instance == lower.instanceor either instance is an ancestor of the other — i.e. every vertical fused adapter is a compile-time trap stub at 47, including plain non-reentrant parent→child calls (acanon lowerat the outer level of a child instance's lifted export). Only sibling adapters compile to real fused code, which is why the existing corpus (sibling/host-shaped composition) never surfaced this: under the old pin, the only corpus rows exercising vertical adapters weretrap-on-reenter.wast-familyassert_trap "cannot enter component instance"rows, and the static stub's message is byte-compatible with the dynamic check's — it passed for a subtly different reason than we thought.Consequences:
reentrance.wastare in this class — including the two rows pre-analysis called "controls" (parent-to-child, wast line 60) and the dtor-reentrance row (line 198, predicted to be provable by polyengine's own gate removal). None of them reach polyengine runtime code: they die inside the generated adapter withwasm trap: cannot enter component instance(thewasm trap:prefix is the discriminator vs polyengine's own gate message, which carries the instance index and(reentrance forbidden)).f 0) is a poison cascade: line 99's adapter trap breaks the host-entry bracket, polyengine's per-instance poisoning marks the corpse, and line 100 is then refused by the poisoning gate with the Go components trap (and poison their instance) when the Go runtime reads the clock inside cabi_realloc #145 cause suffix naming the adapter trap. It clears when line 99 clears, so it rides this class too.cm705-gate-removalxfail class (pin-advance migration map: CM#705 removes the may_enter flag/trap #173) has zero corpus rows: the gate-removal PR's proof burden shifts entirely to the runtime unit suites (inverted reentrance pins + poisoning pins), and post-removal these corpus rows keep failing identically until the wasmtime bump.wasmtime bump: pin environ to main@4675ee1, wasm-tools 0.258, CM subm…
lannbot commentedon Sep 5, 2026
Triage 2026-09-05: the bump this issue waited for has landed (#281: wasmtime-environ
main@4675ee1, wasm-tools 0.258, CM submodule 7c67611), and the register no longer matches its title. Retitling to what remains; labels (p2, upstream-tracking) stay.Class by class, against the exit criteria:
fact-reentrance-47reentrance.wastrows passed outright, the remaining 3 were runtime residue tracked as #279 and fixed by #282. Zero rows left.name-rules-47name-rules-nyi(5kebab.jsonrows). It was never pin drift:kebab.wastis in upstream's owntest/nyi.txtat the current pin — wasmtime itself has not implemented CM#703/#704's kebab-folding conflict check, so wasmparser 0.258 accepts all five.max-value-size-47max-value-size-nyi(7 rows), same reason:max-value-size.wastis in upstream'snyi.txt; the body's "verify at bump time whether the class needs to survive with a narrower name" resolved as yes.[method]/[static]case-folded collisions) is still open and #281 does not mention it. It is the same wasmtime gap asname-rules-nyione layer over, so it stays open on the same upstream event.This issue is now the upstream-nyi register: rows the pinned suite asserts and upstream's own
nyi.txtadmits wasmtime does not enforce. Exit is wasmtime implementing the checks (then a routine environ bump flips them; the stale-xfail detector enforces the cleanup). Incoming: #250's pin advance to CM8892da0(#716) addsbinary.wastassert_malformedrows for a nonzero reserved byte on the formercancellableslot — also in upstreamnyi.txt, so they belong here too.Watch: bytecodealliance/wasmtime for CM#703/#704 name-folding and CM#688 element-size-bound enforcement; wasmtime#14244 for the #716 encoding.
[-]wasmtime 49 bump: pin-drift xfail register after the CM#705 pin advance (FACT reentrance, name rules, max-value-size)[/-][+]upstream-nyi register: name-rules-nyi (CM#703/#704) + max-value-size-nyi (CM#688) await wasmtime enforcement[/+]