Skip to content

Commit 17f271f

Browse files
docs+ci: correct OTP-28 reasoning — works on Elixir 1.19, not 1.18 (#32)
## Summary My earlier #30 work pinned to OTP 27.3 / Elixir 1.18.0 based on the (then-correct) snifs CI failure with Hex 2.4.2 on OTP 28. The reasoning was overgeneralised: OTP 28 + Elixir **1.18** is broken, but OTP 28.3 + Elixir **1.19.4** works fine. Verified via bofj-kitt's static-analysis-gate.yml runs successfully loading Hex 2.4.2 and fetching dozens of packages. ## What changes - **README**: replaces "OTP 28 not supported" with the correct distinction — Elixir 1.18 + OTP 28 is broken (Hex archive incompatibility), Elixir 1.19 + OTP 28 works. - **.github/workflows/e2e.yml**: bumps CI pin from OTP 27.3 / Elixir 1.18.0 → OTP 28.3 / Elixir 1.19.4 to match estate-wide convention. - **.tool-versions**: matches new CI pin. ## Why this matters Per-Elixir-version Hex archives at `hex.pm/installs/<elixir_version>/hex-<hex_version>.ez` are compiled differently. The Elixir 1.18 archive has `bs_add` BEAM bytecode that won't load on OTP 28; the Elixir 1.19 archive doesn't. Bumping Elixir alongside OTP fixes the original issue without staying on the older runtime. ## Test plan - [ ] E2E gate goes green on OTP 28.3 / Elixir 1.19.4 - [ ] If e2e fails, the issue is something other than what we already verified (Hex loads fine on this combo) ## Note on Actions budget This is one PR, one CI run — minimal incremental cost. Worth landing because the current README's reasoning is misleading for anyone consulting it (and it would block future people from using the same combo the rest of the estate uses).
1 parent 6ab7493 commit 17f271f

3 files changed

Lines changed: 13 additions & 16 deletions

File tree

.github/workflows/e2e.yml

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,12 @@ jobs:
7474
- name: Install Erlang/Elixir
7575
uses: erlef/setup-beam@fc68ffb90438ef2936bbb3251622353b3dcb2f93 # v1.24.0
7676
with:
77-
# OTP 27 (not 28) because Hex 2.4.2 — the latest Hex release as of
78-
# 2026-05-30 — has BEAM bytecode that fails to load on OTP 28
79-
# ("Error loading function ... op bs_add p x i u x"; the bs_add
80-
# opcode was removed in OTP 26+ and Hex hasn't been re-released
81-
# against the new instruction set). README claims OTP 28 works but
82-
# that requires an unreleased Hex; OTP 27 is the highest current
83-
# combo that actually loads Hex.
84-
otp-version: '27.3'
85-
elixir-version: '1.18.0'
77+
# OTP 28.3 + Elixir 1.19.4 matches what the rest of the estate
78+
# uses (bofj-kitt static-analysis-gate verified working). The
79+
# earlier OTP-28 Hex `bs_add` incompat is specific to Elixir 1.18's
80+
# Hex archive — Elixir 1.19's archive is unaffected.
81+
otp-version: '28.3'
82+
elixir-version: '1.19.4'
8683

8784
- name: Run demo test suite
8885
working-directory: demo

.tool-versions

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# Toolchain versions pinned to match the e2e CI gate.
22
# See .github/workflows/e2e.yml — same OTP/Elixir/Zig versions.
33
#
4-
# NOTE on OTP: pinned to 27.3 (NOT 28.x) because Hex 2.4.2 — the current
5-
# latest release — has BEAM bytecode that fails to load on OTP 28 (the
6-
# `bs_add` opcode was removed in OTP 26+). Re-evaluate when Hex re-releases.
7-
elixir 1.18.0
8-
erlang 27.3
4+
# OTP 28.3 + Elixir 1.19.4 matches estate-wide convention (bofj-kitt
5+
# verified working). The earlier OTP-28 Hex bs_add incompat was specific
6+
# to Elixir 1.18's Hex archive; Elixir 1.19's archive is unaffected.
7+
elixir 1.19.4
8+
erlang 28.3
99
zig 0.15.1
1010
rust nightly

README.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ and loading it through `wasmex` converts all guest faults into
3434
Formal verification:
3535
7/7 core proofs completed (Idris2 + Lean4), covering ABI correctness and API type safety.
3636

37-
11/11 integration tests pass on OTP 27.3 / Elixir 1.18.0. Every failure mode
37+
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
3838
(OOB array access, `unreachable`, `@panic`, integer overflow, divide-by-zero)
3939
traps correctly under `ReleaseSafe` compilation. The BEAM survives all of them.
4040

@@ -62,7 +62,7 @@ mix deps.get
6262
mix test
6363
----
6464

65-
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.
65+
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.
6666

6767
== Rebuilding the WASM
6868

0 commit comments

Comments
 (0)