Skip to content

Commit a6db5dd

Browse files
committed
release: cljw 1.0.0 embedding zwasm v2.0.0 (D-501)
First stable 1.0.0, on the coherent stable zwasm v2.0.0: - build.zig.zon: .zwasm pin -> v2.0.0 (0853f3c1, was v2.0.0-alpha.3); .version -> "1.0.0". - zwasm v2.0.0 picks up the no-max-table `table.grow` JIT fix (zwasm D-501 tier-1). cljw is behaviorally unaffected (no table.grow usage) — the de-risk build + the full --serial-e2e gate (398/0, all 5 phase16 wasm e2e) confirm the embedding API (Engine.init / runWasmCapturedFull / wasi.host.Host / Module.InstantiateOpts) is signature-stable. - CHANGELOG [Unreleased] -> [1.0.0] stable + disclose the embedded zwasm v2.0.0. - README: "not yet stable" -> first stable 1.0.0. - zwasm_capabilities (pin + D-501 capability row + revision), handover, legal/THIRD_PARTY refreshed. - Resolves D-543 (the "1.0.0 embeds a pre-1.0 zwasm" incoherent-pin story). Smell-audited: 1: coherent dep pin + version bump for the 1.0.0 release; de-risk build + serial-e2e gate green; no behaviour change.
1 parent 36c04b3 commit a6db5dd

6 files changed

Lines changed: 39 additions & 36 deletions

File tree

‎.dev/handover.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
## Resume contract
77

88
- **HEAD**: `main` (`git log` = SSOT; tip `ac1b883c`). Per-commit = smoke; commit
9-
**and** push (atomic Step 6). `build.zig.zon` `.zwasm` = tag pin `v2.0.0-alpha.3`.
9+
**and** push (atomic Step 6). `build.zig.zon` `.zwasm` = stable tag pin `v2.0.0` (cljw 1.0.0).
1010
- **ACTIVE CAMPAIGN (2026-07-01, user-directed): 1.0.0-rc.1 release readiness
1111
(ADR-0167).** Full-scope A+B, fully autonomous. Drive the finite Track-A gate
1212
below + the parallel Track-B (ADR-0166 D-522…D-529) quality drain. The final

‎.dev/zwasm_capabilities.md‎

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
> **SSOT for "what does the zwasm we embed offer, and what has cljw adopted".**
44
> cljw embeds **zwasm v2** (F-001, unavoidable). The dep is a **tag pin** —
5-
> **v2.0.0-alpha.3** (`fc7ff0b3b`, see § Pin), pinned 2026-06-22 after the
6-
> relative-path JIT-adoption experiment settled. zwasm is itself under active
5+
> **v2.0.0** (`0853f3c1`, see § Pin), pinned 2026-07-01 — the stable release cljw
6+
> 1.0.0 ships on (bumped from alpha.3 for the D-501 no-max-table grow fix). zwasm is itself under active
77
> co-development (`~/Documents/MyProducts/zwasm_from_scratch`, branch
88
> `zwasm-from-scratch`) and its embedding API is *growing* — notably a **JIT-backed
99
> engine** (the cljw north star, ROADMAP §9.0 gap area II × III). cljw has **adopted
@@ -42,13 +42,14 @@ a cljw-side shim.
4242

4343
## Pin
4444

45-
- **TAG PIN — v2.0.0-alpha.3 (`fc7ff0b3b`), pinned 2026-06-22.** `build.zig.zon`
46-
`.zwasm` = `.url = "git+https://github.com/clojurewasm/zwasm.git#fc7ff0b3b…"` +
47-
`.hash = "zwasm-2.0.0-alpha.3-…"`, resolved from GitHub. This replaced the
45+
- **TAG PIN — STABLE v2.0.0 (`0853f3c1`), pinned 2026-07-01.** `build.zig.zon`
46+
`.zwasm` = `.url = "git+…/zwasm.git#v2.0.0"` + `.hash = "zwasm-2.0.0-FT1Fvyv…"`,
47+
resolved from GitHub. Bumped from v2.0.0-alpha.3 for the coherent cljw 1.0.0 release
48+
(picks up the no-max-table `table.grow` JIT fix, zwasm D-501 tier-1). This replaced the
4849
2026-06-21 relative-path JIT-adoption experiment (`.path = "../zwasm_from_scratch"`,
4950
no-push) once zwasm cut the pinnable tag (3-host green) — so the no-push mode is
50-
LIFTED and cljw pushes `main` again. The tag is annotated, tag-only (no GitHub
51-
Release), so it is reproducible for others without disturbing the `Latest` pointer.
51+
LIFTED and cljw pushes `main` again. v2.0.0 is a full stable GitHub Release
52+
(published 2026-07-01), the coherent engine cljw 1.0.0 ships on.
5253
- `lazy` dependency: resolved only under `-Dwasm`. So a churning dep never
5354
breaks the day-to-day gate when the flag is off — it
5455
only gates what `cljw.wasm/*` can do.
@@ -69,6 +70,7 @@ a cljw-side shim.
6970
| **JIT-backed engine (`.auto`)** | **ON (JIT-first + interp fallback)** — re-landed v2.0.0-alpha.3 (D-478); x86_64 LSRA miscompile D-489/D-494 fixed, 3-host green | YES (tag-pin) | **ADOPTED — cljw default flipped `.interp`→`.auto` (D-488 discharged 2026-06-22); no-opts load rides JIT** | D-488 |
7071
| Components on JIT | interp-pinned (D-500, zwasm CM-API core); Win64 string-arg wrapper-thunk gap | YES (tag-pin) | unaffected — `.auto` default leaves components on interp (zwasm-side pin) | D-500, D-404 |
7172
| WIT component marshalling | future | NO | NOT adopted | D-404 |
73+
| no-max table `table.grow` (JIT) | tier-1 FIXED in v2.0.0 (D-501) — grows to a synth cap `max(min*2, 1024)`; unbounded no-max grow still interp-only | YES (pin) | unaffected (no `table.grow` / table decl in cljw host or FFI fixtures); available if a guest needs it | D-501 |
7274

7375
## Forward plan — the JIT adoption unit (gap area II × III) — ACTIVE
7476

@@ -141,3 +143,11 @@ was the `.auto`-default flip; this ledger tracks adoption status per capability.
141143
default executes a SIMD body only the JIT can run (`default-simd: 42`), proving the flip.
142144
Components stay interp-pinned on the zwasm side (D-500), so the component path is unaffected
143145
and the F-012 diff oracle (explicit `.interp`/`.jit`) is untouched. `to_cljw_09` CONSUMED.
146+
- **2026-07-01** — **PIN BUMP v2.0.0-alpha.3 → STABLE v2.0.0 (`0853f3c1`)** for the cljw
147+
1.0.0 release. zwasm cut + published a stable `v2.0.0` GitHub Release (after one failed
148+
release build + a tag re-cut); it picks up zwasm D-501 tier-1 (no-max table `table.grow`
149+
under JIT grows to `max(min*2, 1024)`; PR #115) + a test-infra guest-stdout fd guard.
150+
cljw is behaviorally unaffected (no `table.grow` usage); the full `--serial-e2e` gate
151+
confirmed the embedding API (`Engine.init` / `runWasmCapturedFull` / `wasi.host.Host` /
152+
`Module.InstantiateOpts`) is signature-stable. Resolves the D-543 "1.0.0 embeds a
153+
pre-1.0 zwasm" incoherent-pin story — cljw 1.0.0 now ships on a coherent stable zwasm v2.0.0.

‎CHANGELOG.md‎

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,13 @@ 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-
<!--
9-
STAGING NOTE (ADR-0167): the release-candidate entry below sits under
10-
[Unreleased] because build.zig.zon .version is still an alpha until the
11-
maintainer cuts the tag. Cutting `1.0.0-rc.1` = bump .version + rename this
12-
heading to `## [1.0.0-rc.1] - <date>` + `git tag`. The autonomous loop never
13-
tags; the version is the maintainer's to own.
14-
-->
8+
## [1.0.0] - 2026-07-01
159

16-
## [Unreleased]
17-
18-
The first **release candidate** for `1.0.0`. ClojureWasm is a JVM-free Clojure
19-
runtime written in Zig, feature-complete for everyday Clojure with a
20-
WebAssembly FFI as its headline capability. Earlier pre-releases were tagged
21-
`1.0.0-alpha.*`.
10+
The first **stable** release. ClojureWasm is a JVM-free Clojure runtime written
11+
in Zig, feature-complete for everyday Clojure with a WebAssembly FFI as its
12+
headline capability. The WebAssembly FFI runs on the embedded **zwasm v2.0.0**
13+
engine. Earlier pre-releases were tagged `1.0.0-alpha.*`. SemVer compatibility
14+
guarantees start here.
2215

2316
### Added
2417

@@ -32,7 +25,7 @@ WebAssembly FFI as its headline capability. Earlier pre-releases were tagged
3225
- **WebAssembly FFI** — `(wasm/load "mod.wasm")` then `(wasm/call m "fn" …)`:
3326
load a sandboxed module compiled from any language (Rust, Go, Zig, C) and
3427
call it like an ordinary function. The FFI is **JIT-compiled by default** via
35-
the embedded zwasm engine, so a hot loop inside a module runs as native code.
28+
the embedded **zwasm v2.0.0** engine, so a hot loop inside a module runs as native code.
3629
- **WebAssembly components as namespaces** — `(:require ["comp.wasm" :as c])`
3730
pulls a WIT-typed component in like a library; its exports become ordinary
3831
Vars, with arguments and results as plain Clojure data.

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
</p>
1818

1919
> [!NOTE]
20-
> ClojureWasm is **not yet stable** and is built by a very small team with
21-
> limited resources. To keep that focus, **Issues and Pull Requests are not
20+
> ClojureWasm has reached its first stable release (**1.0.0**), but it is built by
21+
> a very small team with limited resources. To keep that focus, **Issues and Pull Requests are not
2222
> being accepted** right now. You are very welcome to read along, try it, and
2323
> say hello in [GitHub Discussions](https://github.com/clojurewasm/ClojureWasm/discussions).
2424

‎build.zig.zon‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
.{
22
.name = .cljw,
3-
.version = "1.0.0-alpha.1",
3+
.version = "1.0.0",
44
.fingerprint = 0x1869d207073beffa,
55
.minimum_zig_version = "0.16.0",
66
.dependencies = .{
@@ -10,16 +10,16 @@
1010
},
1111
// zwasm v2 embedding API (F-001 / D-037). `lazy` so the DEFAULT build +
1212
// gate never resolve it — only `-Dwasm` (b.lazyDependency) does.
13-
// PINNED to tag **v2.0.0-alpha.3** (zwasm@fc7ff0b3b, 2026-06-22, to_cljw_09): the
14-
// JIT-adoption co-dev experiment settled — zwasm cut a pinnable tag (3-host green:
15-
// Mac aarch64 + ubuntu x86_64 + Win64), so cljw exits the relative-path NO-PUSH
16-
// mode and pins the tag. `.auto`=JIT-default (D-489/D-494 fixed) + funcref C-API
17-
// (D-498) landed; cljw uses explicit `.interp`(D-488)/`.jit`, so no behaviour
18-
// change. (Prior relative-path form: `.path = "../zwasm_from_scratch"`, see git
19-
// history.) lazy + flag-guard means a churning dep cannot break the default gate.
13+
// PINNED to STABLE tag **v2.0.0** (zwasm@0853f3c1, 2026-07-01): the coherent
14+
// release cljw 1.0.0 ships on. Bumped from v2.0.0-alpha.3 to pick up the
15+
// no-max-table `table.grow` JIT fix (zwasm D-501 tier-1, PR #115: grows to a
16+
// `max(min*2, 1024)` cap). `.auto`=JIT-default; cljw uses explicit `.interp`/`.jit`
17+
// and is behaviorally unaffected (no `table.grow` usage). (Prior relative-path
18+
// form: `.path = "../zwasm_from_scratch"`, see git history.) lazy + flag-guard
19+
// means a churning dep cannot break the default gate.
2020
.zwasm = .{
21-
.url = "git+https://github.com/clojurewasm/zwasm.git#fc7ff0b3b6404e077b3c186605cf49a15e96cc0a",
22-
.hash = "zwasm-2.0.0-alpha.3-FT1FvyFxiwCcp4CVyldwaUXBdxEhxM0L_GvghvGslqt8",
21+
.url = "git+https://github.com/clojurewasm/zwasm.git#v2.0.0",
22+
.hash = "zwasm-2.0.0-FT1FvyvVigD7I5-Bcc0cT3L_Z2BjgVTl6sjuGLdOHOrc",
2323
.lazy = true,
2424
},
2525
},

‎legal/THIRD_PARTY.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ language lineage separately.
1313
## Build / runtime dependencies (fetched, pinned in build.zig.zon)
1414

1515
- **zwasm** — the embedded WebAssembly engine that powers the Wasm FFI.
16-
Apache-2.0. Pinned to commit `fc7ff0b3b6404e077b3c186605cf49a15e96cc0a`
17-
(`v2.0.0-alpha.3`). Resolved only for the Wasm-enabled build (`-Dwasm`); the
16+
Apache-2.0. Pinned to the stable tag `v2.0.0` (commit `0853f3c1`). Resolved
17+
only for the Wasm-enabled build (`-Dwasm`); the
1818
default build does not fetch it.
1919
Source: <https://github.com/clojurewasm/zwasm>.
2020
- **zlinter** — a development-time Zig linter used by `zig build lint`. MIT.

0 commit comments

Comments
 (0)