From 163026a7d7e152ec25d871f4fe8634e4c7713ead Mon Sep 17 00:00:00 2001 From: hyperpolymath <6759885+hyperpolymath@users.noreply.github.com> Date: Sat, 30 May 2026 17:51:37 +0100 Subject: [PATCH] =?UTF-8?q?docs+ci:=20correct=20OTP-28=20reasoning=20?= =?UTF-8?q?=E2=80=94=20works=20on=20Elixir=201.19,=20not=201.18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit My earlier snifs#30 README + CI pin downgraded to OTP 27.3 / Elixir 1.18.0 based on the (then-correct) observation that Hex 2.4.2 wouldn't load on OTP 28 in the snifs CI. The reasoning was overgeneralised: - Hex 2.4.2 + OTP 28 + Elixir **1.18** → fails with `bs_add` BEAM error - Hex 2.4.2 + OTP 28.3 + Elixir **1.19.4** → works fine Verification: bofj-kitt/static-analysis-gate.yml uses OTP 28.3 + Elixir 1.19.4 in production CI, successfully runs `mix local.hex --force` (which installs Hex 2.4.2) and then `mix deps.get` fetches dozens of packages without error. The Hex archive distribution at hex.pm is keyed per-Elixir version — the Elixir 1.19 archive is compiled differently from the 1.18 one and doesn't have the bs_add issue. This PR: 1. README: corrects the "OTP 28 not supported" claim to "OTP 28 + Elixir 1.18 is the broken combo; OTP 28.3 + Elixir 1.19.4 works." Both OTP 27.3/1.18 and OTP 28.3/1.19 are listed as known-good. 2. .github/workflows/e2e.yml: bumps the CI pin from OTP 27.3/1.18.0 to OTP 28.3/1.19.4 — matches what the rest of the estate uses. 3. .tool-versions: matches the new CI pin. No functional behaviour change expected (the demo suite is platform- agnostic at the Elixir level; the change is purely about which Hex archive gets loaded). Caught while running the round-2 estate fake-SHA audit, when bofj-kitt's production CI run was inspected as a verification reference. --- .github/workflows/e2e.yml | 15 ++++++--------- .tool-versions | 10 +++++----- README.adoc | 4 ++-- 3 files changed, 13 insertions(+), 16 deletions(-) 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