Skip to content

Commit 1e96c68

Browse files
authored
release: v0.5.0 (#93)
Bump workspace version 0.4.0 → 0.5.0 and add CHANGELOG section. This release ships the v0.5.0 audit follow-ups across five PRs: - #88 PR-A: VerificationResult strict-mode helpers (is_skip, skip_reason, verify_or_revert_strict) + gale v0.4.0 measurement report documenting the CSE soundness bug on production kernel-scheduler code. - #89 PR-B: Close hoist hole on early-exit (Return/Br) patterns. Per-pass tracing showed reordering happens in constant_folding's terms-IR roundtrip; the function ends up with the if-guard moved to the function tail and the load/store sequence hoisted to the function head. Fix: extend has_dataflow_unsafe_control_flow to flag nested Return/Br; constant_folding and optimize_advanced_instructions skip such functions entirely. Defense-in-depth guards on simplify_locals, remove_unused_branches, optimize_added_constants. Regression test pinned. - #90 PR-C: 8 minimal post-MVP wasm fixtures + spec_features.rs test harness. Pins the "parser must never panic" contract for SIMD, ref types, bulk memory, tail calls, exception handling, multi-memory, sign-extension, saturating-trunc. - #91 PR-D: FusedOptimization.v wired into BUILD.bazel. Closes audit D1; the 7 axioms remain (discharge is future work). - #92 chore: top-level concurrency: block on every workflow. Closes the org-wide CI queue backlog; superseded PR runs now cancelled in ~30s, runs on main / tags / releases / scheduled events never cancelled. CHANGELOG.md adds a v0.5.0 section documenting all of the above plus the deferred work for the next release. Trace: REQ-1, REQ-3, REQ-5, REQ-7, REQ-9, REQ-12, REQ-14
1 parent bab1784 commit 1e96c68

2 files changed

Lines changed: 104 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,109 @@ All notable changes to LOOM will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.5.0] - 2026-05-02
9+
10+
This release closes a real soundness bug discovered on production
11+
gale code (kernel-scheduler FFI, Verus-verified Rust), gives passes
12+
a way to opt into strict verification semantics, expands the test
13+
corpus to post-MVP wasm features, wires `FusedOptimization.v` into
14+
the Bazel proof build, and ships CI concurrency hardening.
15+
16+
### Soundness
17+
18+
- **Closed CSE hoist hole on early-exit patterns** (PR-B). v0.4.0's
19+
`has_dataflow_unsafe_control_flow` only flagged `BrIf`/`BrTable`,
20+
letting the canonical Rust `if (cond) return; end` early-exit
21+
guard slip through. Per-pass tracing on `gale_sem_count_take`
22+
showed the reordering happens in `constant_folding`'s
23+
`instructions_to_terms` → rewrite → `terms_to_instructions`
24+
round-trip — once a function with `If { then_body: [..., Return] }`
25+
is converted to terms and back, the if-block can land at the
26+
function tail with the straight-line code (load/sub/store)
27+
hoisted to the function head, so a store now runs even when
28+
the guard would have returned early.
29+
- The fix extends the guard to flag any *nested* `Return`/`Br` as
30+
an early-exit pattern (top-level Return at the function tail is
31+
still allowed — that's the function terminator). New helper
32+
`has_unsafe_in_nested` recurses into `Block`/`Loop`/`If` bodies.
33+
- `constant_folding` and `optimize_advanced_instructions` now skip
34+
the function entirely when this guard fires (previously they
35+
fell back to `rewrite_pure`, which still went through the unsound
36+
round-trip). Defense-in-depth guards added to `simplify_locals`,
37+
`remove_unused_branches`, `optimize_added_constants`. DCE
38+
intentionally NOT guarded — it only deletes unreachable code,
39+
never reorders.
40+
- New regression test `test_early_return_guard_prevents_store_hoist`
41+
mirrors `gale_sem_count_take` and pins the fix.
42+
43+
### Verification API
44+
45+
- **`VerificationResult::is_skip()` and `skip_reason()`** (PR-A).
46+
Lets callers distinguish "Z3 proved equivalence" from "verifier
47+
silently bailed because input was unverifiable." Closes audit S5.
48+
- **`TranslationValidator::verify_or_revert_strict()`** (PR-A).
49+
Strict counterpart to `verify_or_revert`: only `Verified` is
50+
accepted; `Skipped*`, `Failed`, and `Error` all revert. Reverts
51+
recorded under `<pass>:strict-skip` for separability. Stub for
52+
non-verification builds returns false (REQ-5: when Z3 isn't
53+
available we don't hoist).
54+
- Existing `is_equivalent()` and `is_verified()` doc comments now
55+
name the lenient/strict semantics explicitly.
56+
57+
### Research
58+
59+
- `docs/research/gale-v0.4.0/measurement-report.md` (PR-A) — LOOM
60+
v0.4.0 vs `wasm-opt -O3` on a Verus-verified kernel-scheduler FFI
61+
(`gale_ffi`: sem + timer + spinlock + ring_buf + bitarray + rbtree).
62+
Headline: LOOM regresses code-section size by +6.3% on this
63+
workload while wasm-opt reduces by -2.0%, primarily because LOOM's
64+
CSE deduplicates trivially-cheap small constants into
65+
`local.tee/local.get` pairs that grow function headers. The CSE
66+
soundness bug discovered in this report motivated PR-B.
67+
68+
### Test corpus
69+
70+
- 8 minimal post-MVP wasm fixtures (PR-C): SIMD/v128, ref types,
71+
bulk memory, tail calls, exception handling, multi-memory,
72+
sign-extension, saturating-trunc.
73+
- New `loom-core/tests/spec_features.rs` runs each through one of
74+
three buckets: clean rejection (unsupported), clean rejection or
75+
round-trip (partial), or full optimize+roundtrip (supported).
76+
Pins the contract that no post-MVP feature crashes the parser.
77+
78+
### Proofs
79+
80+
- `proofs/simplify/FusedOptimization.v` is now in `BUILD.bazel`
81+
(PR-D). Closes audit D1: the file backs the fused/meld pipeline
82+
with 7 axioms + 8+ theorems and was previously orphaned from
83+
the build, so CI never compiled or checked it. Axioms remain
84+
unchanged in this PR; discharging them is future work.
85+
86+
### CI
87+
88+
- **Top-level `concurrency:` block on every workflow** (PR
89+
`chore/ci-concurrency-control`). Closes the queue-backlog issue
90+
identified org-wide: superseded PR runs are now cancelled within
91+
~30 seconds; runs on `main`, tags, releases, and scheduled events
92+
are never cancelled. `release.yml` and `fuzz.yml` use the
93+
release/scheduled variants per the cross-repo brief. Expected
94+
effect: 30–40% reduction in CI compute on PR-heavy days.
95+
96+
### Deferred
97+
98+
The following audit findings remain out of scope for v0.5.0 and
99+
will be picked up later:
100+
101+
- Full exit-state Z3 equivalence (return + locals + globals + memory).
102+
v0.5.0 only changes the API surface (`VerificationResult` predicates
103+
+ strict-mode revert helper); the encoder still asserts only on
104+
top-of-stack at function exit.
105+
- BrTable arm encoding with path predicates and per-arm state merge.
106+
- Switch float fold to `rustc_apfloat` for bit-exact wasm semantics.
107+
- Discharge the 7 axioms in `FusedOptimization.v`.
108+
- Wire or remove the 5 implemented passes never called from
109+
`optimize_module`.
110+
8111
## [0.4.0] - 2026-05-01
9112

10113
This release closes the path-sensitivity hoist hole at the pass level,

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ members = [
99
]
1010

1111
[workspace.package]
12-
version = "0.4.0"
12+
version = "0.5.0"
1313
authors = ["PulseEngine <https://github.com/pulseengine>"]
1414
edition = "2024"
1515
license = "Apache-2.0"

0 commit comments

Comments
 (0)