Skip to content

Commit a612427

Browse files
committed
release: cljw 1.4.0 — the binary-size campaign (9.5MB -> 6.97MB, -26.3%) + envelope v7
Smell-audited: 1: version bump + CHANGELOG; the campaign shipped across today's commits (ADR-0172/0173). Pre-tag verification: full gate --serial-e2e fully green (15:54 stamp) on this source; smoke re-run green after the version bump; full cross-language bench re-recorded; size gates (README claim + 8.8MB ceiling) active in the gate. Breaking note carried in CHANGELOG: cljw-build artifacts from 1.3.x (envelope <= v6) are version-rejected — rebuild with 1.4.0.
1 parent bd78f98 commit a612427

2 files changed

Lines changed: 47 additions & 1 deletion

File tree

‎CHANGELOG.md‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,52 @@ All notable changes to ClojureWasm are documented here. The format follows
55
[SemVer](https://semver.org/). SemVer compatibility guarantees start at the
66
first stable `1.0.0` tag; pre-1.0 `alpha` / `rc` tags may still change surfaces.
77

8+
## [1.4.0] - 2026-07-16
9+
10+
Minor release: the binary-size campaign — the shipped binary shrinks
11+
**9,469,816 → 6,974,584 bytes (−26.3%, now under 7 MB)** with no feature
12+
loss and no safety-check loss (still ReleaseSafe), plus the envelope
13+
format v7 it rides on.
14+
15+
### Changed
16+
17+
- **Binary size: 9.5 MB → 6.97 MB** (macOS arm64; Linux similar). The
18+
levers, all measured: unwind tables dropped from release builds
19+
(−739 KB — a stripped binary printed no native trace anyway); the
20+
AOT bootstrap gains an interned-name constant pool (42% of the blob
21+
was duplicate encoding) and flate-compressed lazy namespace regions +
22+
`.clj` sources (decompressed on demand); the embedded zwasm engine
23+
updated to v2.2.1 (its JIT host-callback thunk collapse, −1.08 MB
24+
as seen from cljw); shared sort instantiation. Full ledger:
25+
`.dev/decisions/0172_binary_size_budget_and_ledger.md`, public
26+
comparison: `docs/works/binary_size.md`.
27+
- **Bytecode envelope format v7** (`.dev/decisions/0173_*.md`): 4-byte
28+
aligned wire instructions readable in place from the binary,
29+
per-blob constant pool, chunk `source_file`/`has_handlers` now
30+
serialized (AOT-restored fns can frame-flatten; error frames in
31+
bundled namespaces keep their real file labels), headerless nested
32+
fn chunks. Startup is unchanged within noise; RSS slightly lower.
33+
- **zwasm pinned to v2.2.1** (binary-size campaign release; no API or
34+
JIT-output change).
35+
- Cross-language benchmark records re-measured 2026-07-16
36+
(`bench/cross-lang-latest.yaml`, `bench/RELEASE_METRICS.md`: cold
37+
start ~6 ms on the shipped `-Dwasm` build).
38+
39+
### Breaking
40+
41+
- **`cljw build` artifacts made by 1.3.x (envelope ≤ v6) are rejected
42+
by a 1.4.0 runtime** with a version error — rebuild the app with the
43+
new `cljw build`. (Pre-2.0 format policy: the on-disk spec is
44+
archived per version in `docs/spec/formats/`; decoders are not kept.)
45+
46+
### Added
47+
48+
- `scripts/binary_size_report.sh` — size report / attribution tool +
49+
the `size_claims` gate (README size claim and the budget ceiling are
50+
now CI-enforced against the built binary).
51+
- Guard e2e for VM error line:col fidelity across the new instruction
52+
encoding (`phase16_vm_error_loc_sidecar`).
53+
854
## [1.3.1] - 2026-07-16
955

1056
Patch release: Clojure 1.12 method values (`(every? Character/isWhitespace

‎build.zig.zon‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
.{
22
.name = .cljw,
3-
.version = "1.3.1",
3+
.version = "1.4.0",
44
.fingerprint = 0x1869d207073beffa,
55
.minimum_zig_version = "0.16.0",
66
.dependencies = .{

0 commit comments

Comments
 (0)