From 6e55ccbf5c7937ec3451e7f4b8db9e40aed6f98e Mon Sep 17 00:00:00 2001 From: Lann Martin Date: Sun, 30 Aug 2026 17:34:19 -0400 Subject: [PATCH] pin advance: CM submodule 4142913 -> 2f13265 (CM#705 merge) with corpus triage (#173) Advances the spec pin across 15 upstream commits: CM#705 (may_enter removal + the new reentrance/scheduling test families), CM#707 (cancellation ASAP delivery), CM#708, CM#688 (max-value-size), CM#703/#704 (name rules), CM#698/#710 (test alignment). No runtime changes: rows the runtime cannot pass yet are xfailed under named classes with tracking issues, per the conformance discipline. New xfail classes (counts): - fact-reentrance-47 (#248, 11): wasmtime-environ 47's FACT statically compiles every VERTICAL fused adapter (same-instance or ancestor either direction, incl. plain parent->child) to a CannotEnterComponent stub (fact/trampoline.rs:116-127), masking all of reentrance.wast until the wasmtime bump; discriminator is the 'wasm trap:' prefix vs the runtime gate's '(reentrance forbidden)' message. Row 100 is a poison cascade of row 99. The cm705-gate-removal class has ZERO corpus rows: FACT-47 masks every would-be row, so #173's gate removal is pinned by runtime unit tests, not this corpus. - name-rules-47 (#248, 5) + max-value-size-47 (#248, 7): wasmparser-47 accepts components the new validation rules reject. - cm705-sync-sched (#249, 1): sync-streams STARTING/STARTED + COMPLETED/DROPPED code swap. - cm707-cancel (#250, 1): cancel-and-exclusive-lock pending-delivery. - The new during-sync-call-*/scheduling-candidates files ride the pre-existing wasmparser thread-builtin drift class (#152), not #249. Stale entries for upstream-deleted files removed (during-sync-call-no- exclusive-resume, trap-if-block-and-sync tail). e2e suite: known- acceptance-gaps allowlist for the kebab/max-value-size validator gaps (authoritative staleness lives in the harness xfails); the core-module- export artifact shifted binary.115 -> binary.116 (CM#698 renumbering). Lane expectations re-measured at exact Deno parity (1475/1428/1263/165) for sm/node/bun/sm-nightly shells + chromium/firefox; jsc lanes bumped unverified-on-aarch64 (measured by the x64 CI leg); webkit.ts deferred (#11 comment) - its per-row multi-memory deltas need a real lane run. --- harness/browser/expectations/chromium.ts | 21 +- harness/browser/expectations/firefox.ts | 21 +- harness/shell/expectations/bun-pinned.ts | 21 +- harness/shell/expectations/jsc-pinned.ts | 31 +- harness/shell/expectations/jsc-trunk.ts | 28 +- harness/shell/expectations/node-pinned.ts | 21 +- harness/shell/expectations/sm-nightly.ts | 21 +- harness/shell/expectations/sm-pinned.ts | 26 +- harness/src/xfail.ts | 888 ++++++++++++++++---- runtime/tests/integration/e2e_suite_test.ts | 53 +- third_party/component-model | 2 +- 11 files changed, 876 insertions(+), 257 deletions(-) diff --git a/harness/browser/expectations/chromium.ts b/harness/browser/expectations/chromium.ts index 77c417c..c1d1ea4 100644 --- a/harness/browser/expectations/chromium.ts +++ b/harness/browser/expectations/chromium.ts @@ -29,6 +29,12 @@ // Measured 2026-08-09 on HeadlessChrome/151.0.7922.34 (playwright 1.62.1, // linux-arm64). JSPI is present and functional (`WebAssembly.Suspending` / // `promising` + a live suspend/resume round trip). +// +// CM#705 pin advance to 2f13265 (polyengine#173): re-measured (this host is +// aarch64) — full Deno-lane parity holds exactly, zero deltas, zero stale +// deltas. Corpus grew 1416->1475 commands; see harness/src/xfail.ts and +// harness/shell/expectations/sm-pinned.ts's header for the new-class +// breakdown (engine-independent by construction). import type { LaneExpectation } from "./types.ts"; @@ -41,19 +47,12 @@ export const chromium: LaneExpectation = { "Any delta at all is a gate failure.", deltas: [], // Identical to the Deno lane's TOTAL row. - // +21 commands / +20 xfail / +1 pending-runtime vs the seed measurement: - // upstream during-sync-call-* tests (CM submodule bump to 4142913) fail - // at TRANSLATION (wasmparser pin drift, engine-independent — see - // harness/src/xfail.ts), so the shift is uniform across lanes. - // +3 passed / -3 xfail when #13 closed drop-stream:158 + - // drop-cross-task-borrow:309 (trap-wording parity, engine-independent) - // and binary:1421 (plan v4 core-module exports). totals: { - commands: 1416, - executed: 1369, - passed: 1257, + commands: 1475, + executed: 1428, + passed: 1263, failed: 0, - xfail: 112, + xfail: 165, pendingRuntime: 42, pendingCapability: 0, unsupportedDirective: 5, diff --git a/harness/browser/expectations/firefox.ts b/harness/browser/expectations/firefox.ts index 21eeb1b..77bca90 100644 --- a/harness/browser/expectations/firefox.ts +++ b/harness/browser/expectations/firefox.ts @@ -33,6 +33,12 @@ // Track M3A-1 removed that dependency from `runtime/src` (see // `harness/browser/expectations/chromium.ts` for the summary), so SpiderMonkey // now reproduces the Deno lane exactly. +// +// CM#705 pin advance to 2f13265 (polyengine#173): re-measured (this host is +// aarch64) — full Deno-lane parity holds exactly, zero deltas, zero stale +// deltas. Corpus grew 1416->1475 commands; see harness/src/xfail.ts and +// harness/shell/expectations/sm-pinned.ts's header for the new-class +// breakdown (engine-independent by construction). import type { LaneExpectation } from "./types.ts"; @@ -45,19 +51,12 @@ export const firefox: LaneExpectation = { deltas: [], // Findings lane: totals are recorded for drift detection but the driver // does not gate on them (`required: false`). - // +21 commands / +20 xfail / +1 pending-runtime vs the seed measurement: - // upstream during-sync-call-* tests (CM submodule bump to 4142913) fail - // at TRANSLATION (wasmparser pin drift, engine-independent — see - // harness/src/xfail.ts), so the shift is uniform across lanes. - // +3 passed / -3 xfail when #13 closed drop-stream:158 + - // drop-cross-task-borrow:309 (trap-wording parity, engine-independent) - // and binary:1421 (plan v4 core-module exports). totals: { - commands: 1416, - executed: 1369, - passed: 1257, + commands: 1475, + executed: 1428, + passed: 1263, failed: 0, - xfail: 112, + xfail: 165, pendingRuntime: 42, pendingCapability: 0, unsupportedDirective: 5, diff --git a/harness/shell/expectations/bun-pinned.ts b/harness/shell/expectations/bun-pinned.ts index 365eed5..861d2c8 100644 --- a/harness/shell/expectations/bun-pinned.ts +++ b/harness/shell/expectations/bun-pinned.ts @@ -33,6 +33,12 @@ // renames or drops `useWasmMultiMemory` regresses to the stock 174-failure // shape, which this expectation catches loudly (totals mismatch), findings // lane or not. +// +// CM#705 pin advance to 2f13265 (polyengine#173): re-measured (this host is +// aarch64) — full Deno-lane parity holds exactly, zero deltas, zero stale +// xfails. Corpus grew 1416->1475 commands; see harness/src/xfail.ts and +// sm-pinned.ts's header for the new-class breakdown (engine-independent by +// construction). import type { ShellLaneExpectation } from "./types.ts"; @@ -45,19 +51,12 @@ export const bunPinned: ShellLaneExpectation = { "(driver-set; stock bun lacks multi-memory -> 174 failures). JSPI on by " + "default. Findings-only until a CI track record, then promote.", deltas: [], - // +21 commands / +20 xfail / +1 pending-runtime vs the seed measurement: - // upstream during-sync-call-* tests (CM submodule bump to 4142913) fail - // at TRANSLATION (wasmparser pin drift, engine-independent — see - // harness/src/xfail.ts), so the shift is uniform across lanes. - // +3 passed / -3 xfail when #13 closed drop-stream:158 + - // drop-cross-task-borrow:309 (trap-wording parity, engine-independent) - // and binary:1421 (plan v4 core-module exports). totals: { - commands: 1416, - executed: 1369, - passed: 1257, + commands: 1475, + executed: 1428, + passed: 1263, failed: 0, - xfail: 112, + xfail: 165, pendingRuntime: 42, pendingCapability: 0, unsupportedDirective: 5, diff --git a/harness/shell/expectations/jsc-pinned.ts b/harness/shell/expectations/jsc-pinned.ts index 0d37c6d..fecceaf 100644 --- a/harness/shell/expectations/jsc-pinned.ts +++ b/harness/shell/expectations/jsc-pinned.ts @@ -30,6 +30,22 @@ // A future re-pin (pins.json version bump) that changes these totals is a // FINDING to triage before the pin bump lands, not silently absorbed here — // bump this file's totals only after re-measuring against the new pin. +// +// CM#705 pin advance to 2f13265 (polyengine#173): totals bumped to the +// engine-independent Deno-lane baseline (1475/1428/1263 passed/165 xfail/42 +// pending-runtime/5 unsupported-directive — see harness/src/xfail.ts and +// sm-pinned.ts's header for the new-class breakdown) WITHOUT a local +// re-measurement: this lane is x86_64-only and self-skips on this +// aarch64 dev host (see the recipe body in `justfile`'s `shells` target). +// Every OTHER pinned engine (sm-pinned, node-pinned, sm-nightly, +// bun-pinned — all re-measured on aarch64 this round) hit EXACT Deno-lane +// parity with zero per-row deltas, and this lane's own history is "same +// rev, same hash, same corpus => same result" (see the TOTALS note above) — +// so this bump is UNVERIFIED ON AARCH64, MEASURED-BY-CI: the x64 CI leg of +// `core` is what actually re-confirms it against the new pin (as it did for +// the prior bump per the CONFIRMED note above). Any delta the CI leg finds +// there is a finding to triage before merge, not something this dev-host +// pass could have caught. import type { ShellLaneExpectation } from "./types.ts"; @@ -43,19 +59,12 @@ export const jscPinned: ShellLaneExpectation = { "Required gate — promoted from the jsc-trunk canary at this exact, " + "hash-pinned rev.", deltas: [], - // +21 commands / +20 xfail / +1 pending-runtime vs the seed measurement: - // upstream during-sync-call-* tests (CM submodule bump to 4142913) fail - // at TRANSLATION (wasmparser pin drift, engine-independent — see - // harness/src/xfail.ts), so the shift is uniform across lanes. - // +3 passed / -3 xfail when #13 closed drop-stream:158 + - // drop-cross-task-borrow:309 (trap-wording parity, engine-independent) - // and binary:1421 (plan v4 core-module exports). totals: { - commands: 1416, - executed: 1369, - passed: 1257, + commands: 1475, + executed: 1428, + passed: 1263, failed: 0, - xfail: 112, + xfail: 165, pendingRuntime: 42, pendingCapability: 0, unsupportedDirective: 5, diff --git a/harness/shell/expectations/jsc-trunk.ts b/harness/shell/expectations/jsc-trunk.ts index 4fb9826..40c8774 100644 --- a/harness/shell/expectations/jsc-trunk.ts +++ b/harness/shell/expectations/jsc-trunk.ts @@ -48,6 +48,19 @@ // - unreachable trap wording: `"Unreachable code should not be executed"` // — already a `TRAP_MESSAGE_EQUIVALENTS` row in `harness/src/runner.ts`, // no matcher work needed here. +// +// CM#705 pin advance to 2f13265 (polyengine#173): totals bumped to the +// engine-independent Deno-lane baseline (1475/1428/1263 passed/165 xfail/42 +// pending-runtime/5 unsupported-directive — see harness/src/xfail.ts and +// sm-pinned.ts's header for the new-class breakdown) WITHOUT a local +// re-measurement: this lane is x86_64-only and self-skips on this +// aarch64 dev host. Every OTHER shell lane re-measured on aarch64 this +// round (sm-pinned, node-pinned, sm-nightly, bun-pinned) hit EXACT +// Deno-lane parity with zero per-row deltas, and this lane tracks +// jsc-pinned exactly (same rev, same hash) — so this bump is UNVERIFIED ON +// AARCH64, MEASURED-BY-CI: canary.yml's weekly x64 run is what actually +// re-confirms it (or reports trunk drift, per this file's own findings-only +// discipline). import type { ShellLaneExpectation } from "./types.ts"; @@ -60,19 +73,12 @@ export const jscTrunk: ShellLaneExpectation = { "trip, multi-memory, wasm-GC, EH, memory64, tail-calls, relaxed-simd). " + "Trunk drift is a finding to triage, never a gate.", deltas: [], - // +21 commands / +20 xfail / +1 pending-runtime vs the seed measurement: - // upstream during-sync-call-* tests (CM submodule bump to 4142913) fail - // at TRANSLATION (wasmparser pin drift, engine-independent — see - // harness/src/xfail.ts), so the shift is uniform across lanes. - // +3 passed / -3 xfail when #13 closed drop-stream:158 + - // drop-cross-task-borrow:309 (trap-wording parity, engine-independent) - // and binary:1421 (plan v4 core-module exports). totals: { - commands: 1416, - executed: 1369, - passed: 1257, + commands: 1475, + executed: 1428, + passed: 1263, failed: 0, - xfail: 112, + xfail: 165, pendingRuntime: 42, pendingCapability: 0, unsupportedDirective: 5, diff --git a/harness/shell/expectations/node-pinned.ts b/harness/shell/expectations/node-pinned.ts index 1740c77..d1ef87a 100644 --- a/harness/shell/expectations/node-pinned.ts +++ b/harness/shell/expectations/node-pinned.ts @@ -29,6 +29,12 @@ // pool-backed .buffer to wasm is a classic node-embedder defect this lane // would catch). Raw-engine coverage was already carried by the shell and // browser lanes; this pin is about the runtime consumers actually deploy. +// +// CM#705 pin advance to 2f13265 (polyengine#173): re-measured (this host is +// aarch64) — full Deno-lane parity holds exactly, zero deltas, zero stale +// xfails. Corpus grew 1416->1475 commands; see harness/src/xfail.ts and +// sm-pinned.ts's header for the new-class breakdown (engine-independent by +// construction). import type { ShellLaneExpectation } from "./types.ts"; @@ -42,19 +48,12 @@ export const nodePinned: ShellLaneExpectation = { "is deliberately not laned — flag-gated JSPI with 2 real deviations " + "(see this file's header).", deltas: [], - // +21 commands / +20 xfail / +1 pending-runtime vs the seed measurement: - // upstream during-sync-call-* tests (CM submodule bump to 4142913) fail - // at TRANSLATION (wasmparser pin drift, engine-independent — see - // harness/src/xfail.ts), so the shift is uniform across lanes. - // +3 passed / -3 xfail when #13 closed drop-stream:158 + - // drop-cross-task-borrow:309 (trap-wording parity, engine-independent) - // and binary:1421 (plan v4 core-module exports). totals: { - commands: 1416, - executed: 1369, - passed: 1257, + commands: 1475, + executed: 1428, + passed: 1263, failed: 0, - xfail: 112, + xfail: 165, pendingRuntime: 42, pendingCapability: 0, unsupportedDirective: 5, diff --git a/harness/shell/expectations/sm-nightly.ts b/harness/shell/expectations/sm-nightly.ts index 9c64298..66b728f 100644 --- a/harness/shell/expectations/sm-nightly.ts +++ b/harness/shell/expectations/sm-nightly.ts @@ -42,6 +42,12 @@ // Track this file the same way `harness/browser/expectations/firefox.ts` // tracks Firefox: any future delta gets a named, dated entry here, never a // blanket overlay. +// +// CM#705 pin advance to 2f13265 (polyengine#173): re-measured (this host is +// aarch64) — full Deno-lane parity holds exactly, zero deltas, zero stale +// xfails. Corpus grew 1416->1475 commands; see harness/src/xfail.ts and +// sm-pinned.ts's header for the new-class breakdown (engine-independent by +// construction). import type { ShellLaneExpectation } from "./types.ts"; @@ -53,19 +59,12 @@ export const smNightly: ShellLaneExpectation = { "zero deltas, all compile-probes true (multi-memory/wasm-GC/EH/memory64/" + "tail-calls/relaxed-simd), JSPI round trip verified end to end.", deltas: [], - // +21 commands / +20 xfail / +1 pending-runtime vs the seed measurement: - // upstream during-sync-call-* tests (CM submodule bump to 4142913) fail - // at TRANSLATION (wasmparser pin drift, engine-independent — see - // harness/src/xfail.ts), so the shift is uniform across lanes. - // +3 passed / -3 xfail when #13 closed drop-stream:158 + - // drop-cross-task-borrow:309 (trap-wording parity, engine-independent) - // and binary:1421 (plan v4 core-module exports). totals: { - commands: 1416, - executed: 1369, - passed: 1257, + commands: 1475, + executed: 1428, + passed: 1263, failed: 0, - xfail: 112, + xfail: 165, pendingRuntime: 42, pendingCapability: 0, unsupportedDirective: 5, diff --git a/harness/shell/expectations/sm-pinned.ts b/harness/shell/expectations/sm-pinned.ts index 857e97d..5c31342 100644 --- a/harness/shell/expectations/sm-pinned.ts +++ b/harness/shell/expectations/sm-pinned.ts @@ -34,6 +34,17 @@ // Any future re-pin (pins.json version bump) that changes these totals is a // FINDING to triage before the pin bump lands, not silently absorbed here — // bump this file's totals only after re-measuring against the new pin. +// +// CM#705 pin advance to 2f13265 (polyengine#173): re-measured (this host is +// aarch64) — full Deno-lane parity holds exactly, zero deltas, zero stale +// xfails. Corpus grew 1416->1475 commands (new reentrance.wast/ +// during-sync-scheduling-candidates.wast/during-sync-call-exclusive-resume. +// wast files, new kebab.wast/max-value-size.wast assert_invalid rows, plus +// a few line-shifted-but-unchanged rows); the new xfail classes +// (fact-reentrance-47, cm705-sync-sched, cm707-cancel, name-rules-47, +// max-value-size-47, plus growth in the pre-existing wasmparser +// thread-built-in pin-drift class) are translate-time / our-own-runtime +// drift, engine-independent by construction — see harness/src/xfail.ts. import type { ShellLaneExpectation } from "./types.ts"; @@ -48,19 +59,12 @@ export const smPinned: ShellLaneExpectation = { "browser, which prefs it — see header). Required gate — promoted from " + "the sm-nightly canary.", deltas: [], - // +21 commands / +20 xfail / +1 pending-runtime vs the seed measurement: - // upstream during-sync-call-* tests (CM submodule bump to 4142913) fail - // at TRANSLATION (wasmparser pin drift, engine-independent — see - // harness/src/xfail.ts), so the shift is uniform across lanes. - // +3 passed / -3 xfail when #13 closed drop-stream:158 + - // drop-cross-task-borrow:309 (trap-wording parity, engine-independent) - // and binary:1421 (plan v4 core-module exports). totals: { - commands: 1416, - executed: 1369, - passed: 1257, + commands: 1475, + executed: 1428, + passed: 1263, failed: 0, - xfail: 112, + xfail: 165, pendingRuntime: 42, pendingCapability: 0, unsupportedDirective: 5, diff --git a/harness/src/xfail.ts b/harness/src/xfail.ts index 8d9691e..6b81c3a 100644 --- a/harness/src/xfail.ts +++ b/harness/src/xfail.ts @@ -28,35 +28,40 @@ export const XFAIL: XfailEntry[] = [ // core-module exports (#13). --- { file: "binary/binary.json", - line: 962, + line: 974, reason: "translator error [validation]: invalid boolean value — wasmparser " + "0.252 misparses the 🧵 thread built-in encodings re-aritied in the " + "0.253-0.255 window; dual-classed with deferred threads " + "(https://github.com/polymorph-components/polyengine/issues/12), pin exit tracked by " + "https://github.com/polymorph-components/polyengine/issues/152 " + - "(pending-capability: wasmparser/wast pin alignment)", + "(pending-capability: wasmparser/wast pin alignment). CM#705 pin " + + "advance (polyengine#173) shifted this row from wast line 962 to " + + "974 (12 lines of CM#698 outer-alias-count edits landed earlier in " + + "the file); same error, same offset class, line renumbered only.", }, { file: "binary/binary.json", - line: 1194, + line: 1206, reason: "translator error [validation]: invalid leading byte (0x2) for name " + "option — the 0x2 name option is the 🔗 canonical-interface-names " + "encoding (canonversion/versionsuffix), which postdates wasmparser " + "0.252 (contracts/embedder-api.md forward note); pin exit tracked by " + "https://github.com/polymorph-components/polyengine/issues/152 " + - "(pending-capability: wasmparser/wast pin alignment)", + "(pending-capability: wasmparser/wast pin alignment). CM#705 pin " + + "advance (polyengine#173) shifted this row from wast line 1194 to " + + "1206; same error, same offset class, line renumbered only.", }, // --- validation/attributes.json: same 0x2 name-option pin drift as - // binary/binary.json:1194 above. --- + // binary/binary.json:1206 above. --- { file: "validation/attributes.json", line: 30, reason: "translator error [validation]: invalid leading byte (0x2) for name " + "option — same 🔗 canonical-names pin-drift class as " + - "binary/binary.json:1194, https://github.com/polymorph-components/polyengine/issues/152 " + + "binary/binary.json:1206, https://github.com/polymorph-components/polyengine/issues/152 " + "(pending-capability: wasmparser/wast pin alignment)", }, { @@ -64,6 +69,134 @@ export const XFAIL: XfailEntry[] = [ line: 213, reason: "same name-option pin drift as line 30, see that entry", }, + // --- validation/kebab.json: CM#703/#704 ("name rules" reworks, pulled in + // by the CM#705 pin advance polyengine#173) added import-name-conflict + // checks under kebab-case folding (a `foo-bar` import conflicts with + // `foobar`/`FOOBAR`/`foob-ar`/method-and-static-qualified variants that + // fold to the same name). wasmtime-environ 47.0.3's wasmparser accepts + // all five components as distinct imports — the folding-conflict check is + // newer than the pinned wasmparser. Classed `name-rules-47`, + // https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: wasmparser/wast pin + // alignment). Same gap class already tracked for interface names in + // upstream-component-model-repo-findings.md (#246/#247). --- + { + file: "validation/kebab.json", + line: 149, + reason: + 'expected assert_invalid ("import name `foobar` conflicts with ' + + 'previous name `foo-bar`"), but it validated — wasmparser 0.252 ' + + "(wasmtime-environ 47.0.3) does not implement CM#703/#704's " + + "kebab-case name-folding conflict check; name-rules-47, " + + "https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: wasmparser/wast pin " + + "alignment)", + }, + { + file: "validation/kebab.json", + line: 154, + reason: + 'expected assert_invalid ("import name `FOOBAR` conflicts with ' + + 'previous name `foo-bar`"), but it validated — same name-rules-47 ' + + "gap as line 149, https://github.com/polymorph-components/polyengine/issues/248", + }, + { + file: "validation/kebab.json", + line: 159, + reason: + 'expected assert_invalid ("import name `foob-ar` conflicts with ' + + 'previous name `foo-bar`"), but it validated — same name-rules-47 ' + + "gap as line 149, https://github.com/polymorph-components/polyengine/issues/248", + }, + { + file: "validation/kebab.json", + line: 164, + reason: + 'expected assert_invalid ("import name `[static]foo-bar.FO-ob-AR` ' + + 'conflicts with previous name `foo-bar`"), but it validated — same ' + + "name-rules-47 gap as line 149, https://github.com/polymorph-components/polyengine/issues/248", + }, + { + file: "validation/kebab.json", + line: 169, + reason: + 'expected assert_invalid ("import name `[method]foo-bar.foobar` ' + + 'conflicts with previous name `foo-bar`"), but it validated — same ' + + "name-rules-47 gap as line 149, https://github.com/polymorph-components/polyengine/issues/248", + }, + // --- validation/max-value-size.json: CM#688 ("max-value-size", pulled in + // by the CM#705 pin advance polyengine#173) added the elem_size(t, i64) < + // 2^28 validation rule (CanonicalABI.md#element-size). wasmtime-environ + // 47.0.3's wasmparser does not enforce it — every assert_invalid in this + // file validates instead of rejecting. Classed `max-value-size-47`, + // https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: wasmparser/wast pin + // alignment). Line 63 is the dispatch-flagged pointer-width-sensitive row + // (`list string 16777216`, the i32-vs-i64 elem-size boundary): observed + // behavior on this (presumably 64-bit host) run is identical to the + // others — wasmparser accepts it outright, not a differing failure mode + // tied to pointer width. --- + { + file: "validation/max-value-size.json", + line: 25, + reason: + 'expected assert_invalid ("exceeds maximum byte size"), but it ' + + "validated — wasmparser 0.252 (wasmtime-environ 47.0.3) does not " + + "implement CM#688's elem_size < 2^28 check (single fixed list just " + + "over the limit: `(list u8 268435456)`); max-value-size-47, " + + "https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: wasmparser/wast pin " + + "alignment)", + }, + { + file: "validation/max-value-size.json", + line: 31, + reason: + 'expected assert_invalid ("exceeds maximum byte size"), but it ' + + "validated — same max-value-size-47 gap as line 25 (fixed list " + + "whose product exceeds MAX: `(list u64 33554432)`), " + + "https://github.com/polymorph-components/polyengine/issues/248", + }, + { + file: "validation/max-value-size.json", + line: 37, + reason: + 'expected assert_invalid ("exceeds maximum byte size"), but it ' + + "validated — same max-value-size-47 gap as line 25 (u32-wrap class: " + + "real byte size is 2^32 but a naive u32 multiply wraps to 0: " + + "`(list u64 536870912)`), https://github.com/polymorph-components/polyengine/issues/248", + }, + { + file: "validation/max-value-size.json", + line: 43, + reason: + 'expected assert_invalid ("exceeds maximum byte size"), but it ' + + "validated — same max-value-size-47 gap as line 25 (compound sum " + + "exceeds MAX via a tuple), https://github.com/polymorph-components/polyengine/issues/248", + }, + { + file: "validation/max-value-size.json", + line: 48, + reason: + 'expected assert_invalid ("exceeds maximum byte size"), but it ' + + "validated — same max-value-size-47 gap as line 25 (compound sum " + + "exceeds MAX via a record), https://github.com/polymorph-components/polyengine/issues/248", + }, + { + file: "validation/max-value-size.json", + line: 57, + reason: + 'expected assert_invalid ("exceeds maximum byte size"), but it ' + + "validated — same max-value-size-47 gap as line 25 (nested fixed " + + "list), https://github.com/polymorph-components/polyengine/issues/248", + }, + { + file: "validation/max-value-size.json", + line: 63, + reason: + 'expected assert_invalid ("exceeds maximum byte size"), but it ' + + "validated — same max-value-size-47 gap as line 25; this is the " + + "dispatch-flagged pointer-width-sensitive row (`(list string " + + "16777216)`, the i32-vs-i64 elem-size boundary noted in the wast " + + "source comment) — observed identically to the other rows on this " + + "run (wasmparser accepts it outright), https://github.com/polymorph-components/polyengine/issues/248", + }, // --- values/post-return.json: post-return.wast:4 ($Tester) declares // every async built-in (task.return, thread.yield/INDEX, waitable-set.*, // subtask.*, stream.*, future.*) to assert they trap from a post-return @@ -266,12 +399,40 @@ export const XFAIL: XfailEntry[] = [ // --- async/big-interleaving-test.json: GREEN under jspi auto-detection // (M2 flip); entry pruned. --- // --- async/builtin-trap-poisons-instance.json: root cause: STREAMS --- + // --- async/cancel-and-exclusive-lock.json: CM#707 "always deliver + // cancellation as soon as possible" (third_party/component-model commit + // 1af0b35, pulled in by the CM#705 pin advance polyengine#173) changed + // when a pending cancellation must be delivered; polyengine's task + // scheduler still implements the pre-#707 delivery timing, so the + // cross-instance exclusive-lock scenario this file drives deadlocks + // instead of the callee observing cancellation. Classed `cm707-cancel`, + // https://github.com/polymorph-components/polyengine/issues/250. + // + // NOTE on hang risk (dispatch warning): this file does NOT wedge the + // harness. It completes crisply with our OWN "deadlock detected: event + // loop cannot make further progress" trap rather than looping forever — + // the pre-#707 runtime deadlock manifests as a clean trap, not a stall. + // No harness-visible skip mechanism was needed. --- + { + file: "async/cancel-and-exclusive-lock.json", + line: 196, + reason: + "expected return, got trap: wasm trap: deadlock detected: event " + + "loop cannot make further progress — polyengine has not implemented " + + "CM#707's immediate-cancellation-delivery timing yet, so the " + + "callee never observes the pending cancellation and the scheduler " + + "finds no ready thread; cm707-cancel, https://github.com/polymorph-components/polyengine/issues/250", + }, // --- async/cancel-stream.json: root cause: STREAMS --- // --- async/cancel-subtask.json: GREEN under jspi auto-detection (M2 // flip); entry pruned. --- // --- async/cancellable.json: GREEN under jspi auto-detection (M2 flip: // request_cancellation now finds cancellable SuspensionPoints, and the - // async subtask.cancel waits for callee determinacy); entry pruned. --- + // async subtask.cancel waits for callee determinacy); entry pruned. Still + // GREEN after the CM#705 pin advance (polyengine#173): the dispatch + // predicted a single failing final assert here (cm707-cancel class, + // https://github.com/polymorph-components/polyengine/issues/250) but both of this file's commands pass — + // DEVIATION FROM PREDICTION, no entry added. --- // --- async/closed-stream.json: root cause: STREAMS --- // --- async/cross-abi-calls.json: root cause: FACT-ASYNC --- // --- async/cross-task-future.json: root cause: STREAMS --- @@ -292,17 +453,24 @@ export const XFAIL: XfailEntry[] = [ // --- async/drop-subtask.json: GREEN under jspi auto-detection (M2 flip); // entry pruned. --- // --- async/drop-waitable-set.json: root cause: FACT-ASYNC --- - // --- async/during-sync-call-*.json (3 files, upstream #691): all three - // pin 🧵 sync-call-blocking semantics and are built entirely from thread + // --- async/during-sync-call-*.json + during-sync-scheduling-candidates.json: + // all pin 🧵 sync-call-blocking semantics and are built largely from thread // built-ins (thread.new-indirect / resume-later / suspend-then-resume / - // suspend) — the deferred-threads class, - // https://github.com/polymorph-components/polyengine/issues/12 — and their components fail - // TRANSLATION first, in the wasmparser-pin-drift class documented at - // trap-if-block-and-sync.json:5: wasmparser 0.252 predates the - // 0.253-0.255 re-arity of the thread built-in opcodes (0x28 - // thread.resume-later doesn't exist; 0x29/0x2a read no cancel? byte), so - // the decoder misparses the canonical section. Upstream lists all three - // in test/nyi.txt (wasmtime's own runner skips them). --- + // suspend / index / yield-then-promote) — the deferred-threads class, + // https://github.com/polymorph-components/polyengine/issues/12 — and their components fail TRANSLATION first, + // in the wasmparser-pin-drift class documented at trap-if-block-and-sync. + // json:5 (https://github.com/polymorph-components/polyengine/issues/152): wasmparser 0.252 predates the 0.253-0.255 + // re-arity of the thread built-in opcodes, so the decoder misparses the + // canonical section. `async/during-sync-call-exclusive-resume.json` and + // `async/during-sync-scheduling-candidates.json` are BRAND NEW files added by + // the CM#705 pin advance (polyengine#173) — they did not exist pre-advance, + // so these are new entries, not renumbered ones. Predicted class from the + // dispatch was `cm705-sync-sched` (polyengine#249, a semantic scheduling + // deviation); investigation found the observed failures are translator-level + // (TranslateError at the `module`/`module_definition` command, not a runtime + // semantic mismatch), root-caused by the SAME thread-built-in wasmparser pin + // drift as the older during-sync-call-*.json files below — so these are + // classed here (https://github.com/polymorph-components/polyengine/issues/152 / https://github.com/polymorph-components/polyengine/issues/12), not under #249. --- { file: "async/during-sync-call-may-block-if-other-ready-threads.json", line: 12, @@ -344,59 +512,263 @@ export const XFAIL: XfailEntry[] = [ line: 115, reason: "cascade of line 12 via line 114: no current instance", }, + // CM#705 (polyengine#173) appended a second component to this file (a new + // "setup"/"run" pair driven by thread.new-indirect/index/resume-later/ + // suspend) — same thread-built-in pin-drift mechanism as line 12 above, at + // a fresh offset. { - file: "async/during-sync-call-no-exclusive-resume.json", - line: 8, + file: "async/during-sync-call-may-block-if-other-ready-threads.json", + line: 136, reason: - "translator error [validation]: invalid leading byte (0x28) for " + - "canonical function lift (at offset 0x322) — wasmparser pin drift " + - "(class of trap-if-block-and-sync.json:5): 0x28 is 🧵 " + - "thread.resume-later in the wast-255 encoding but has no production " + - "in wasmparser 0.252; deferred-threads anyway, " + + "translator error [validation]: invalid boolean value (at offset " + + "0x28e) — same wasmparser thread-built-in pin-drift class as line 12 " + + "(https://github.com/polymorph-components/polyengine/issues/152), new second component appended by the CM#705 " + + "pin advance (polyengine#173); deferred-threads anyway, " + "https://github.com/polymorph-components/polyengine/issues/12 " + "(pending-capability: wasmparser/wast pin alignment)", }, { - file: "async/during-sync-call-no-exclusive-resume.json", - line: 115, + file: "async/during-sync-call-may-block-if-other-ready-threads.json", + line: 206, + reason: "cascade of line 136: no current instance", + }, + { + file: "async/during-sync-call-may-block-if-other-ready-threads.json", + line: 207, + reason: "cascade of line 136: no current instance", + }, + // async/during-sync-call-exclusive-resume.json: BRAND NEW file (CM#705 pin + // advance, polyengine#173; test/async/during-sync-call-exclusive-resume.wast + // is 100% new content, not a renumbering of the deleted + // during-sync-call-no-exclusive-resume.wast). All three of its components + // are built from thread.index/suspend/resume-later — same pin-drift class. + { + file: "async/during-sync-call-exclusive-resume.json", + line: 9, reason: - "cascade of this file's first failure (line 8): the component failed " + - "translation, so no current instance exists", + "translator error [validation]: unexpected end-of-file (at offset " + + "0x158) — same wasmparser thread-built-in pin-drift class as " + + "trap-if-block-and-sync.json:5 (https://github.com/polymorph-components/polyengine/issues/152): 0.252 reads no " + + "cancel? byte for 🧵 thread.suspend, walks the canonical section out " + + "of alignment and off the end; deferred-threads anyway, " + + "https://github.com/polymorph-components/polyengine/issues/12 " + + "(pending-capability: wasmparser/wast pin alignment)", }, { - file: "async/during-sync-call-no-exclusive-resume.json", - line: 116, - reason: "cascade of line 8, see line 115", + file: "async/during-sync-call-exclusive-resume.json", + line: 59, + reason: "cascade of line 9: no current instance", }, { - file: "async/during-sync-call-no-exclusive-resume.json", - line: 117, - reason: "cascade of line 8, see line 115", + file: "async/during-sync-call-exclusive-resume.json", + line: 60, + reason: "cascade of line 9: no current instance", }, + // line 65 (the file's second component) is a skipped-not-failed command; + // no xfail entry needed. Its cascades at lines 102/103 target the THIRD + // component (line 65's own module definition succeeds), which fails + // translation independently for the same reason as line 9. { - file: "async/during-sync-call-no-exclusive-resume.json", - line: 118, - reason: "cascade of line 8, see line 115", + file: "async/during-sync-call-exclusive-resume.json", + line: 102, + reason: + "cascade: the third component in this file failed translation for " + + "the same reason as line 9 (thread-built-in pin drift, " + + "https://github.com/polymorph-components/polyengine/issues/152); no current instance", }, { - file: "async/during-sync-call-no-exclusive-resume.json", - line: 119, - reason: "cascade of line 8, see line 115", + file: "async/during-sync-call-exclusive-resume.json", + line: 103, + reason: "cascade of line 102: no current instance", }, + // async/during-sync-scheduling-candidates.json: BRAND NEW file (CM#705 pin + // advance, polyengine#173). Six components, each built from thread + // built-ins (thread.new-indirect/resume-later/suspend/index/ + // yield-then-promote); every component fails translation with the same + // wasmparser thread-built-in pin-drift class as trap-if-block-and-sync. + // json:5 (https://github.com/polymorph-components/polyengine/issues/152), cascading to every assert against it. { - file: "async/during-sync-call-no-exclusive-resume.json", - line: 162, + file: "async/during-sync-scheduling-candidates.json", + line: 19, + reason: + "translator error [validation]: invalid boolean value (at offset " + + "0x241) — wasmparser thread-built-in pin drift, same class as " + + "trap-if-block-and-sync.json:5 (https://github.com/polymorph-components/polyengine/issues/152); deferred-threads " + + "anyway, https://github.com/polymorph-components/polyengine/issues/12 " + + "(pending-capability: wasmparser/wast pin alignment)", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 74, + reason: "cascade of line 19: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 75, + reason: "cascade of line 19: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 78, + reason: + "translator error [validation]: invalid leading byte (0x2d) for " + + "canonical function (at offset 0x196) — same pin-drift class as " + + "line 19, https://github.com/polymorph-components/polyengine/issues/152 (pending-capability: wasmparser/wast pin " + + "alignment)", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 132, + reason: "cascade of line 78: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 133, + reason: "cascade of line 78: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 134, + reason: "cascade of line 78: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 135, + reason: "cascade of line 78: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 144, + reason: + "translator error [validation]: invalid leading byte (0x2d) for " + + "canonical function (at offset 0x1b1) — same pin-drift class as " + + "line 19, https://github.com/polymorph-components/polyengine/issues/152 (pending-capability: wasmparser/wast pin " + + "alignment)", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 234, + reason: "cascade of line 144: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 235, + reason: "cascade of line 144: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 236, + reason: "cascade of line 144: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 237, + reason: "cascade of line 144: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 245, + reason: + "component definition failed translation: translator error " + + "[validation]: invalid boolean value (at offset 0x1d0) — same " + + "pin-drift class as line 19, https://github.com/polymorph-components/polyengine/issues/152 (pending-capability: " + + "wasmparser/wast pin alignment)", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 303, + reason: + "cascade of line 245: no definition named 'BlockedCallbackTester'" , + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 307, reason: - "cascade of the line-124 component declining at instantiation " + - "(🧵 host trampoline, deferred-threads " + - "https://github.com/polymorph-components/polyengine/issues/12, classified " + - "pending-runtime, the values/post-return.json precedent): no current " + - "instance exists for this command", + "cascade of line 245: no definition named 'BlockedCallbackTester'" , + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 304, + reason: "cascade of line 245: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 305, + reason: "cascade of line 245: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 308, + reason: "cascade of line 245: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 309, + reason: "cascade of line 245: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 315, + reason: + "component definition failed translation: translator error " + + "[validation]: invalid boolean value (at offset 0x1bb) — same " + + "pin-drift class as line 19, https://github.com/polymorph-components/polyengine/issues/152 (pending-capability: " + + "wasmparser/wast pin alignment)", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 403, + reason: + "cascade of line 315: no definition named 'SyncLiftedTester'", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 407, + reason: + "cascade of line 315: no definition named 'SyncLiftedTester'", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 404, + reason: "cascade of line 315: no current instance", }, { - file: "async/during-sync-call-no-exclusive-resume.json", - line: 163, - reason: "same line-124 instantiation-decline cascade as line 162", + file: "async/during-sync-scheduling-candidates.json", + line: 405, + reason: "cascade of line 315: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 408, + reason: "cascade of line 315: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 409, + reason: "cascade of line 315: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 414, + reason: + "translator error [validation]: invalid boolean value (at offset " + + "0x2c1) — same pin-drift class as line 19, https://github.com/polymorph-components/polyengine/issues/152 " + + "(pending-capability: wasmparser/wast pin alignment)", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 482, + reason: "cascade of line 414: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 483, + reason: "cascade of line 414: no current instance", + }, + { + file: "async/during-sync-scheduling-candidates.json", + line: 484, + reason: "cascade of line 414: no current instance", }, { file: "async/during-sync-call-no-sibling-resume.json", @@ -404,7 +776,7 @@ export const XFAIL: XfailEntry[] = [ reason: "translator error [validation]: invalid leading byte (0x28) for " + "canonical function lift (at offset 0x30c) — same wasmparser " + - "pin-drift class as during-sync-call-no-exclusive-resume.json:8; " + + "pin-drift class as during-sync-call-exclusive-resume.json:9; " + "deferred-threads anyway, https://github.com/polymorph-components/polyengine/issues/12 " + "(pending-capability: wasmparser/wast pin alignment)", }, @@ -451,105 +823,295 @@ export const XFAIL: XfailEntry[] = [ // --- async/passing-resources.json: lines 175/176 GREEN after the #18 // tls-smoke fixes (cycle-safe structural ValType equality + token // unification); entries pruned. --- - // --- async/same-component-stream-future.json: root cause: STREAMS --- - // --- async/sync-barges-in.json: GREEN under jspi auto-detection (M2 - // flip); entry pruned. --- - // --- async/sync-streams.json: GREEN. Since #43 polyengine implements - // wasmtime's model: the entry gate is HELD for the whole core invocation - // (a resolved producer blocked mid-sync-write keeps gating), and the - // async-lowered call's initial status is decided only after the callee - // instance's runnable work has been drained to quiescence — by which time - // the producer has exited and the next task reports STARTED. Adjudicated - // 2026-08-10 (issue #43): the test's hard STARTED assertion is - // schedule-dependent — an upstream test defect overfitting wasmtime's - // deferred-entry policy (pristine definitions.py answers STARTING) — - // and polyengine's drain policy satisfies it as written under any seed. The - // former release-at-BLOCK divergence is gone. (Before the M2 jspi flip - // this file was xfailed outright.) - // entry pruned. --- - // --- async/trap-if-block-and-sync.json: see entries --- + // --- async/reentrance.json: BRAND NEW file (test/async/reentrance.wast is + // 100% new content added by CM#705's "remove the may_enter flag/trap", + // polyengine#173). CORRECTED CLASSIFICATION (revision round; verified by + // probing the runner directly and reading wasmtime-environ 47.0.3 source): + // + // The `wasm trap:` PREFIX is the discriminator between the two mechanisms + // that can produce a "cannot enter component instance" message: + // - "wasm trap: cannot enter component instance" (the `wasm trap:` prefix) + // is raised by GENERATED ADAPTER CODE — wasmtime-environ 47.0.3's FACT + // compiles an unconditional `Trap::CannotEnterComponent` stub + // (src/fact/trampoline.rs:116-127) whenever a fused adapter's lift and + // lower sides are the SAME instance, or either is an ancestor of the + // other — i.e. every VERTICAL (parent/child, either direction) fused + // adapter is a static trap stub at the 47.0.3 pin, independent of + // polyengine's own reentrance implementation. Only SIBLING adapters + // compile to real fused code at this pin. Classed `fact-reentrance-47`, + // https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: wasmtime-environ bump). + // - "cannot enter component instance ${index} (reentrance forbidden)" (NO + // `wasm trap:` prefix) is polyengine's OWN `mayEnterFrom`/`enterFrom` gate + // (runtime/src/exec/boundary.ts, intrinsics/fact_calls.ts), produced in + // JS, not wasm — this is the class a prior triage round misattributed + // every row in this file to (`cm705-gate-removal`). ZERO corpus rows in + // this file actually hit that path: every failing row below carries the + // `wasm trap:` prefix, so all are FACT-47 static-stub trips, not the + // runtime's stale gate. CM#705's removal of may_enter/entering_set/ + // enter_from/leave_to from definitions.py (polyengine#173) is real and + // still-open work, but this corpus cannot prove or disprove it: FACT-47 + // masks every row that would exercise the runtime gate before the gate + // itself ever runs. #173 is tracked/pinned by runtime unit tests, not by + // this file. See also the correction note at + // https://github.com/polymorph-components/polyengine/issues/248#issuecomment-5471308919. --- + { + file: "async/reentrance.json", + line: 42, + reason: + "expected return, got trap: wasm trap: cannot enter component " + + "instance — the `wasm trap:` prefix identifies this as FACT's " + + "static vertical-adapter trap stub (wasmtime-environ 47.0.3 " + + "src/fact/trampoline.rs:116-127 compiles `Trap::CannotEnterComponent` " + + "unconditionally whenever the fused adapter's lift/lower share an " + + "instance or either is an ancestor of the other), not polyengine's " + + "own reentrance gate (whose message has no `wasm trap:` prefix); " + + "fact-reentrance-47, https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: " + + "wasmtime-environ bump)", + }, + { + file: "async/reentrance.json", + line: 60, + reason: + "expected return, got trap: wasm trap: cannot enter component " + + "instance — the `wasm trap:` prefix identifies this as FACT's " + + "static vertical-adapter trap stub (wasmtime-environ 47.0.3 " + + "src/fact/trampoline.rs:116-127 compiles `Trap::CannotEnterComponent` " + + "unconditionally whenever the fused adapter's lift/lower share an " + + "instance or either is an ancestor of the other), not polyengine's " + + "own reentrance gate (whose message has no `wasm trap:` prefix); " + + "fact-reentrance-47, https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: " + + "wasmtime-environ bump)", + }, + { + file: "async/reentrance.json", + line: 99, + reason: + "expected return, got trap: wasm trap: cannot enter component " + + "instance — the `wasm trap:` prefix identifies this as FACT's " + + "static vertical-adapter trap stub (wasmtime-environ 47.0.3 " + + "src/fact/trampoline.rs:116-127 compiles `Trap::CannotEnterComponent` " + + "unconditionally whenever the fused adapter's lift/lower share an " + + "instance or either is an ancestor of the other), not polyengine's " + + "own reentrance gate (whose message has no `wasm trap:` prefix); " + + "fact-reentrance-47, https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: " + + "wasmtime-environ bump)", + }, + { + file: "async/reentrance.json", + line: 151, + reason: + "expected return, got trap: wasm trap: cannot enter component " + + "instance — the `wasm trap:` prefix identifies this as FACT's " + + "static vertical-adapter trap stub (wasmtime-environ 47.0.3 " + + "src/fact/trampoline.rs:116-127 compiles `Trap::CannotEnterComponent` " + + "unconditionally whenever the fused adapter's lift/lower share an " + + "instance or either is an ancestor of the other), not polyengine's " + + "own reentrance gate (whose message has no `wasm trap:` prefix); " + + "fact-reentrance-47, https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: " + + "wasmtime-environ bump)", + }, + { + file: "async/reentrance.json", + line: 198, + reason: + "expected return, got trap: wasm trap: cannot enter component " + + "instance — the `wasm trap:` prefix identifies this as FACT's " + + "static vertical-adapter trap stub (wasmtime-environ 47.0.3 " + + "src/fact/trampoline.rs:116-127 compiles `Trap::CannotEnterComponent` " + + "unconditionally whenever the fused adapter's lift/lower share an " + + "instance or either is an ancestor of the other), not polyengine's " + + "own reentrance gate (whose message has no `wasm trap:` prefix); " + + "fact-reentrance-47, https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: " + + "wasmtime-environ bump)", + }, + { + file: "async/reentrance.json", + line: 237, + reason: + "expected return, got trap: wasm trap: cannot enter component " + + "instance — the `wasm trap:` prefix identifies this as FACT's " + + "static vertical-adapter trap stub (wasmtime-environ 47.0.3 " + + "src/fact/trampoline.rs:116-127 compiles `Trap::CannotEnterComponent` " + + "unconditionally whenever the fused adapter's lift/lower share an " + + "instance or either is an ancestor of the other), not polyengine's " + + "own reentrance gate (whose message has no `wasm trap:` prefix); " + + "fact-reentrance-47, https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: " + + "wasmtime-environ bump)", + }, + { + file: "async/reentrance.json", + line: 346, + reason: + "expected return, got trap: wasm trap: cannot enter component " + + "instance — the `wasm trap:` prefix identifies this as FACT's " + + "static vertical-adapter trap stub (wasmtime-environ 47.0.3 " + + "src/fact/trampoline.rs:116-127 compiles `Trap::CannotEnterComponent` " + + "unconditionally whenever the fused adapter's lift/lower share an " + + "instance or either is an ancestor of the other), not polyengine's " + + "own reentrance gate (whose message has no `wasm trap:` prefix); " + + "fact-reentrance-47, https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: " + + "wasmtime-environ bump)", + }, + { + file: "async/reentrance.json", + line: 517, + reason: + "expected return, got trap: wasm trap: cannot enter component " + + "instance — the `wasm trap:` prefix identifies this as FACT's " + + "static vertical-adapter trap stub (wasmtime-environ 47.0.3 " + + "src/fact/trampoline.rs:116-127 compiles `Trap::CannotEnterComponent` " + + "unconditionally whenever the fused adapter's lift/lower share an " + + "instance or either is an ancestor of the other), not polyengine's " + + "own reentrance gate (whose message has no `wasm trap:` prefix); " + + "fact-reentrance-47, https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: " + + "wasmtime-environ bump)", + }, { - file: "async/trap-if-block-and-sync.json", - line: 5, - reason: - "wasmparser pin drift (same class as binary.json:962/1194 and " + - "attributes.json:30/213): `testgen` assembles the suite with `wast` " + - "255.0.0 while `translator-shim` validates with `wasmparser` 0.252.0, " + - "the version wasmtime-environ 47.0.3 links against. The 0.253-0.255 " + - "window re-aritied the thread built-in opcodes: `0x2a` is " + - "`ThreadUnsuspend` (no payload) in 0.252 but " + - "`ThreadSuspendThenResume{cancellable}` (reads one byte) in 0.255. " + - "This file's canonical section ends `... 2a 00 28 ...` at 0xc16; " + - "0.252 stops after `2a`, misreads the `00` at 0xc17 as a new " + - "canonical function (`0x00` = lift family), then rejects the `0x28` " + - "at 0xc18 — the reported error, exactly. Not a plan.rs mapping bug: " + - "the failure is in wasmparser's decoder, before any mapping runs. " + - "Lifted by a wasmtime-environ whose wasmparser is >= the 0.255 line; " + - "downgrading testgen to `wast` 252 is NOT a fix (verified: it fails " + - "to parse 44 of the 59 suite files, which use the newer " + - "`(memory (core memory ...))` text syntax). Note the file's canonical " + - "functions are all deferred thread built-ins anyway (https://github.com/polymorph-components/polyengine/issues/12) " + - "(pending-capability: wasmparser/wast pin alignment)", + file: "async/reentrance.json", + line: 100, + reason: + "cannot enter component instance 0 (reentrance forbidden) — " + + "instance poisoned by: Trap: wasm trap: cannot enter component " + + "instance — a POISON CASCADE of line 99's FACT-47 static-stub trap " + + "(polyengine's withPoisonCause names the original trap, #145): line " + + "99 traps first with the wasm-trap-prefixed FACT stub, poisoning the " + + "instance, so this second invoke on it reports the poisoned-corpse " + + "wrapper around the same underlying cause; clears when line 99 " + + "clears at the wasmtime-environ bump; fact-reentrance-47, " + + "https://github.com/polymorph-components/polyengine/issues/248", }, { - file: "async/trap-if-block-and-sync.json", - line: 286, - reason: - "cascade of this file's first failure: the component was " + - "declined at instantiation, so no instance exists for this " + - "command", + file: "async/reentrance.json", + line: 429, + reason: + "expected trap \"deadlock detected: event loop cannot make further " + + "progress\", got \"wasm trap: cannot enter component instance\" — " + + "the FACT-47 static vertical-adapter stub (trampoline.rs:116-127) " + + "preempts the deadlock-detection path entirely, firing before the " + + "scheduler can observe no ready threads; fact-reentrance-47, " + + "https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: wasmtime-environ bump)", }, { - file: "async/trap-if-block-and-sync.json", - line: 287, + file: "async/reentrance.json", + line: 522, reason: - "cascade of this file's first failure: the component was " + - "declined at instantiation, so no instance exists for this " + - "command", + "translator error [validation]: section size mismatch: unexpected " + + "data at the end of the section (at offset 0xee) — wasmparser " + + "thread-built-in pin drift, same class as trap-if-block-and-sync." + + "json:5, https://github.com/polymorph-components/polyengine/issues/152 (this component uses " + + "waitable-set.new/waitable.join/subtask.cancel plus thread " + + "built-ins); deferred-threads anyway, https://github.com/polymorph-components/polyengine/issues/12 " + + "(pending-capability: wasmparser/wast pin alignment); NOT reentrance-related — " + + "a pure translate-time parse-drift failure at the module command, before " + + "any reentrance semantics could run", }, { - file: "async/trap-if-block-and-sync.json", - line: 288, + file: "async/reentrance.json", + line: 645, reason: - "cascade of this file's first failure: the component was " + - "declined at instantiation, so no instance exists for this " + - "command", + "cascade of line 522's translate-time failure: no current instance " + + "(translate-time parse drift, not reentrance)", }, { - file: "async/trap-if-block-and-sync.json", - line: 289, + file: "async/reentrance.json", + line: 657, reason: - "cascade of this file's first failure: the component was " + - "declined at instantiation, so no instance exists for this " + - "command", + "translator error [validation]: invalid leading byte (0x2b) for " + + "canonical function lift (at offset 0xe8) — same wasmparser " + + "thread-built-in pin-drift class as line 522, https://github.com/polymorph-components/polyengine/issues/152 " + + "(pending-capability: wasmparser/wast pin alignment); NOT " + + "reentrance-related — a pure translate-time parse-drift failure at " + + "the module command", }, { - file: "async/trap-if-block-and-sync.json", - line: 290, + file: "async/reentrance.json", + line: 760, reason: - "cascade of this file's first failure: the component was " + - "declined at instantiation, so no instance exists for this " + - "command", + "cascade of line 657's translate-time failure: no current instance " + + "(translate-time parse drift, not reentrance)", }, { - file: "async/trap-if-block-and-sync.json", - line: 291, + file: "async/reentrance.json", + line: 837, reason: - "cascade of this file's first failure: the component was " + - "declined at instantiation, so no instance exists for this " + - "command", + "expected trap \"waitable cannot be used synchronously while added " + + "to a waitable set\", got \"wasm trap: cannot enter component " + + "instance\" — the FACT-47 static vertical-adapter stub " + + "(trampoline.rs:116-127) preempts the intended waitable-set-membership " + + "trap by firing first on the reentrant call; fact-reentrance-47, " + + "https://github.com/polymorph-components/polyengine/issues/248 (pending-capability: wasmtime-environ bump)", }, + // --- async/sync-barges-in.json: GREEN under jspi auto-detection (M2 + // flip); entry pruned. --- + // --- async/sync-streams.json: mostly GREEN (see the #43 note below for + // the entry-gate/drain-policy history), but CM#705 (polyengine#173) FLIPPED + // three expected values in test/async/sync-streams.wast (STARTING vs + // STARTED at the sync-lowered `set` call, and a COMPLETED<->DROPPED + // completion-code swap on the paired stream.read/write) to track the new + // spec's blocking semantics now that may_enter no longer exists. polyengine + // still returns the pre-CM#705 codes, so the file's single all-in-one + // assert_return now hits a guest `unreachable`. Classed `cm705-sync-sched` + // (https://github.com/polymorph-components/polyengine/issues/249) exactly as the dispatch predicted. Since #43 + // polyengine implements wasmtime's model: the entry gate is HELD for the + // whole core invocation (a resolved producer blocked mid-sync-write keeps + // gating), and the async-lowered call's initial status is decided only + // after the callee instance's runnable work has been drained to + // quiescence — by which time the producer has exited and the next task + // reports STARTED. Adjudicated 2026-08-10 (issue #43): the test's hard + // STARTED assertion is schedule-dependent — an upstream test defect + // overfitting wasmtime's deferred-entry policy (pristine definitions.py + // answers STARTING) — and polyengine's drain policy satisfies it as + // written under any seed. The former release-at-BLOCK divergence is gone. + // (Before the M2 jspi flip this file was xfailed outright.) --- + { + file: "async/sync-streams.json", + line: 208, + reason: + "expected return, got trap: guest trapped: unreachable — CM#705 " + + "(polyengine#173) flipped this file's expected STARTING/STARTED and " + + "COMPLETED/DROPPED codes to match the post-may_enter blocking " + + "semantics; polyengine still returns the pre-CM#705 codes, so the " + + "guest's own assertion traps; cm705-sync-sched, " + + "https://github.com/polymorph-components/polyengine/issues/249", + }, + // --- async/trap-if-block-and-sync.json: cm705-gate-removal? No — the + // whole file is blocked by the pre-existing wasmparser/wast pin-drift + // class (https://github.com/polymorph-components/polyengine/issues/152, dual-classed with deferred + // threads https://github.com/polymorph-components/polyengine/issues/12): $Tester's canonical section uses + // 🧵 thread built-in encodings (CM#705 added a `trap-if-sync-cancel` export + // built from thread.suspend/thread.resume-later et al) that wasmparser 0.252 + // misparses, same mechanism as binary.json:974/1206. Every later + // "(component instance $i $Tester)" + assert command cascades off the one + // failed component-definition command at line 5; CM#705 grew the file from + // 17 to 18 exported tests (test/async/trap-if-block-and-sync.wast +82/-‑, + // adding trap-if-sync-cancel plus the four sync-stream/-future rows), + // stretching the cascade from lines 273-311 (was 286-331 pre-pin-advance; + // lines 312-331 no longer exist and their entries are deleted as stale). --- { file: "async/trap-if-block-and-sync.json", - line: 292, + line: 5, reason: - "cascade of this file's first failure: the component was " + - "declined at instantiation, so no instance exists for this " + - "command", + "wasmparser pin drift (same class as binary.json:974/1206 and " + + "attributes.json:30/213): `testgen` assembles the suite with `wast` " + + "255.0.0 while `translator-shim` validates with `wasmparser` 0.252.0, " + + "the version wasmtime-environ 47.0.3 links against. The 0.253-0.255 " + + "window re-aritied the thread built-in opcodes, so 0.252 misparses the " + + "$Tester canonical section and rejects a 🧵 thread-built-in-derived " + + "leading byte (observed post-CM#705-pin-advance, polyengine#173: " + + "\"invalid leading byte (0x28) for canonical function lift (at offset " + + "0xb66)\" — offset moved from 0xc16 pre-advance because CM#705 added " + + "the trap-if-sync-cancel/sync-stream/sync-future exports ahead of it in " + + "the same canonical section; same decoder-level failure, not a plan.rs " + + "mapping bug). Lifted by a wasmtime-environ whose wasmparser is >= the " + + "0.255 line; downgrading testgen to `wast` 252 is NOT a fix (verified: " + + "it fails to parse 44 of the 59 suite files, which use the newer " + + "`(memory (core memory ...))` text syntax). Note the file's canonical " + + "functions are all deferred thread built-ins anyway (https://github.com/polymorph-components/polyengine/issues/12) " + + "(pending-capability: wasmparser/wast pin alignment)", }, { file: "async/trap-if-block-and-sync.json", - line: 293, + line: 273, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -557,7 +1119,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 294, + line: 274, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -565,7 +1127,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 295, + line: 275, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -573,7 +1135,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 296, + line: 276, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -581,7 +1143,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 297, + line: 277, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -589,7 +1151,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 298, + line: 278, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -597,7 +1159,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 299, + line: 279, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -605,7 +1167,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 300, + line: 280, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -613,7 +1175,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 301, + line: 281, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -621,7 +1183,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 302, + line: 282, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -629,7 +1191,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 303, + line: 283, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -637,7 +1199,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 304, + line: 284, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -645,7 +1207,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 305, + line: 285, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -653,7 +1215,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 306, + line: 286, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -661,7 +1223,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 307, + line: 287, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -669,7 +1231,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 308, + line: 288, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -677,7 +1239,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 309, + line: 289, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -685,7 +1247,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 310, + line: 290, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -693,7 +1255,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 311, + line: 291, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -701,7 +1263,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 312, + line: 292, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -709,7 +1271,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 313, + line: 293, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -717,7 +1279,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 314, + line: 294, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -725,7 +1287,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 315, + line: 295, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -733,7 +1295,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 316, + line: 296, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -741,7 +1303,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 317, + line: 297, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -749,7 +1311,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 318, + line: 298, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -757,7 +1319,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 319, + line: 299, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -765,7 +1327,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 320, + line: 300, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -773,7 +1335,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 321, + line: 301, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -781,7 +1343,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 322, + line: 302, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -789,7 +1351,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 323, + line: 303, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -797,7 +1359,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 324, + line: 304, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -805,7 +1367,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 325, + line: 305, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -813,7 +1375,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 326, + line: 306, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -821,7 +1383,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 327, + line: 307, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -829,7 +1391,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 328, + line: 308, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -837,7 +1399,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 329, + line: 309, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -845,7 +1407,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 330, + line: 310, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + @@ -853,7 +1415,7 @@ export const XFAIL: XfailEntry[] = [ }, { file: "async/trap-if-block-and-sync.json", - line: 331, + line: 311, reason: "cascade of this file's first failure: the component was " + "declined at instantiation, so no instance exists for this " + diff --git a/runtime/tests/integration/e2e_suite_test.ts b/runtime/tests/integration/e2e_suite_test.ts index 71b3c4e..315b50f 100644 --- a/runtime/tests/integration/e2e_suite_test.ts +++ b/runtime/tests/integration/e2e_suite_test.ts @@ -403,6 +403,43 @@ async function commandsOf(dir: string): Promise<[string, WastCommand[]][]> { return out; } +/** + * Known acceptance gaps for the blanket verdict check below: wasmparser + * 0.252 (pinned via wasmtime-environ 47.0.3, crates/translator-shim) + * validates components that CM#703/#704 ("name rules") and CM#688 + * ("max-value-size") — pulled in by the CM#705 pin advance, polyengine#173 + * — newly require rejecting. Tracked https://github.com/polymorph-components/polyengine/issues/248. + * + * Authoritative source of truth for these rows is harness/src/xfail.ts (same + * (file, line) keys): its stale-xfail detector (harness/tests/ + * conformance_test.ts) fails loudly the moment any of these rows starts + * validating-then-rejecting for real, so when the wasmtime-environ bump + * lands, the harness turns stale FIRST and this allowlist must be pruned in + * the same PR (it does not self-detect staleness — it is an allowlist, not + * an xfail list with its own audit). + * + * Exact-match only: a (file, line) pair not in this set still goes through + * the full phase-verdict check below. + */ +const KNOWN_ACCEPTANCE_GAPS: ReadonlySet = new Set([ + // name-rules-47 (https://github.com/polymorph-components/polyengine/issues/248): kebab-case name-folding import + // conflicts wasmparser 0.252 does not detect. + "kebab.json:149", + "kebab.json:154", + "kebab.json:159", + "kebab.json:164", + "kebab.json:169", + // max-value-size-47 (https://github.com/polymorph-components/polyengine/issues/248): the elem_size(t, i64) < 2^28 + // check wasmparser 0.252 does not enforce. + "max-value-size.json:25", + "max-value-size.json:31", + "max-value-size.json:37", + "max-value-size.json:43", + "max-value-size.json:48", + "max-value-size.json:57", + "max-value-size.json:63", +]); + /** * Every `assert_invalid` / `assert_malformed` component in `binary/` and * `validation/` must be rejected by the translator *with a validation-phase @@ -427,6 +464,7 @@ Deno.test({ continue; } if (cmd.kind !== "component" || cmd.module_type !== "binary") continue; + if (KNOWN_ACCEPTANCE_GAPS.has(`${file}:${cmd.line}`)) continue; const bytes = await Deno.readFile(new URL(cmd.filename!, base)); checked++; try { @@ -500,16 +538,21 @@ Deno.test({ }, }); -// test/binary/binary.wast:1421 — a component exporting one of its own +// test/binary/binary.wast:1433 — a component exporting one of its own // embedded core modules (plan-format.md v4 amendment 2, polyengine#13). The // export surfaces as the already-compiled `WebAssembly.Module`, and it is // the *embedded* module: instantiating it works and its export list matches -// the wast source (an empty module). +// the wast source (an empty module). Artifact index shifted 115->116 by the +// CM#705 pin advance (polyengine#173): CM#698 (dff1181, "fix some spec and +// test typos") added 12 lines earlier in binary.wast, renumbering this +// component from wast line 1421 to 1433 and its testgen-assigned positional +// artifact index from 115 to 116 (verified: +// `git -C third_party/component-model show 2f13265:test/binary/binary.wast`). Deno.test({ - name: "suite binary.115: a core-module export surfaces as WebAssembly.Module", + name: "suite binary.116: a core-module export surfaces as WebAssembly.Module", ignore: !ready, fn: async () => { - const c = await instantiate("binary", "binary.115.wasm"); + const c = await instantiate("binary", "binary.116.wasm"); const m = c.exports["m"]; assertEq( m instanceof WebAssembly.Module, @@ -517,7 +560,7 @@ Deno.test({ `export 'm' should be a WebAssembly.Module, got ${typeof m}`, ); const inst = new WebAssembly.Instance(m as WebAssembly.Module); - assertEq(Object.keys(inst.exports).length, 0); // binary.wast:1423: empty module + assertEq(Object.keys(inst.exports).length, 0); // binary.wast:1435: empty module }, }); diff --git a/third_party/component-model b/third_party/component-model index 4142913..2f13265 160000 --- a/third_party/component-model +++ b/third_party/component-model @@ -1 +1 @@ -Subproject commit 4142913deca2cb162925c95cbffc904a93a3bdf6 +Subproject commit 2f1326540f73f8d58237028f8331c048b3e44d76