diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 9c97462..3fdc0d3 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -74,15 +74,12 @@ jobs: - name: Install Erlang/Elixir uses: erlef/setup-beam@fc68ffb90438ef2936bbb3251622353b3dcb2f93 # v1.24.0 with: - # OTP 27 (not 28) because Hex 2.4.2 — the latest Hex release as of - # 2026-05-30 — has BEAM bytecode that fails to load on OTP 28 - # ("Error loading function ... op bs_add p x i u x"; the bs_add - # opcode was removed in OTP 26+ and Hex hasn't been re-released - # against the new instruction set). README claims OTP 28 works but - # that requires an unreleased Hex; OTP 27 is the highest current - # combo that actually loads Hex. - otp-version: '27.3' - elixir-version: '1.18.0' + # OTP 28.3 + Elixir 1.19.4 matches what the rest of the estate + # uses (bofj-kitt static-analysis-gate verified working). The + # earlier OTP-28 Hex `bs_add` incompat is specific to Elixir 1.18's + # Hex archive — Elixir 1.19's archive is unaffected. + otp-version: '28.3' + elixir-version: '1.19.4' - name: Run demo test suite working-directory: demo diff --git a/.tool-versions b/.tool-versions index 3188559..d570d87 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,10 +1,10 @@ # Toolchain versions pinned to match the e2e CI gate. # See .github/workflows/e2e.yml — same OTP/Elixir/Zig versions. # -# NOTE on OTP: pinned to 27.3 (NOT 28.x) because Hex 2.4.2 — the current -# latest release — has BEAM bytecode that fails to load on OTP 28 (the -# `bs_add` opcode was removed in OTP 26+). Re-evaluate when Hex re-releases. -elixir 1.18.0 -erlang 27.3 +# OTP 28.3 + Elixir 1.19.4 matches estate-wide convention (bofj-kitt +# verified working). The earlier OTP-28 Hex bs_add incompat was specific +# to Elixir 1.18's Hex archive; Elixir 1.19's archive is unaffected. +elixir 1.19.4 +erlang 28.3 zig 0.15.1 rust nightly diff --git a/README.adoc b/README.adoc index d0b48af..c354a5e 100644 --- a/README.adoc +++ b/README.adoc @@ -34,7 +34,7 @@ and loading it through `wasmex` converts all guest faults into Formal verification: 7/7 core proofs completed (Idris2 + Lean4), covering ABI correctness and API type safety. -11/11 integration tests pass on OTP 27.3 / Elixir 1.18.0. Every failure mode +11/11 integration tests pass on OTP 28.3 / Elixir 1.19.4 (verified estate-wide via `bofj-kitt/static-analysis-gate` runs that successfully load Hex 2.4.2 on this combo). The OTP 27.3 / Elixir 1.18.0 combo also passes. The earlier-flagged OTP 28 + Elixir 1.18 incompatibility (Hex `bs_add` opcode) is specific to that Elixir minor — Elixir 1.19's Hex archive is unaffected. Every failure mode (OOB array access, `unreachable`, `@panic`, integer overflow, divide-by-zero) traps correctly under `ReleaseSafe` compilation. The BEAM survives all of them. @@ -62,7 +62,7 @@ mix deps.get mix test ---- -Requires Elixir 1.15+, OTP 26–27 (precompiled wasmex NIF downloaded automatically). OTP 28 is not yet supported because the current Hex release (2.4.2) ships BEAM bytecode that fails to load on OTP 28 — re-evaluate when Hex publishes a release recompiled for the post-OTP-26 instruction set. +Requires Elixir 1.15+, OTP 26+ (precompiled wasmex NIF downloaded automatically). The OTP 28 + Elixir 1.18 combination is unsupported (the Elixir-1.18-specific Hex archive fails to load on OTP 28 with `bs_add` BEAM bytecode errors), but OTP 28.3 + Elixir 1.19.4 works fine. Either OTP 27.3 + Elixir 1.18 or OTP 28.3 + Elixir 1.19 is a known-good combo. == Rebuilding the WASM