Skip to content

Commit fbf6e9b

Browse files
committed
chore(release): v1.8.0
The audit-drain day's whole output. Two things a user notices immediately: a Wasm component with more than one export could not be loaded at all, and `(doc reduce)` printed nothing. - **Multi-export components load.** Every component fixture in this project and in zwasm exported exactly one function, so `(:require ["x.wasm" :as x])` — the headline feature — had only ever been exercised on single-function components. Fixed in zwasm v2.4.1, which this release pins. - **`(doc reduce)` prints something.** So do `assoc`, `conj`, `first`, `apply`, `=` and 320 others. The generated metadata table covered 246 of 685 `clojure.core` publics and none of the ~290 native primitives, so `find-doc` and `apropos` searched a third of core while answering as though they had searched all of it. Now 572 of 684. - **`clojure.core.reducers`** lands, 31 of 32 probed expressions byte-identical to JVM Clojure. - **`wasm/run` is bounded on output and wall clock**, not just fuel. Measured, a guest could force ~64 GB of host memory and roughly 18 hours of runtime inside the default fuel budget, because fuel counts instructions and neither bytes-per-instruction nor time-per-instruction is fixed. - **A one-shot component resource handle was already invalid when returned**, and could silently name a different resource on reuse. - **`clojure.pprint` stops publishing 49 internal formatter helpers**; `clojure.set` gains its arglists and stops answering `nil` where Clojure throws. MINOR rather than PATCH: `clojure.core.reducers`, `:max-output-bytes` and `:timeout-ms` are new surface. The pprint/data privatisations remove names that upstream never published and nothing could portably have used. Bumps build.zig.zon (`cljw --version` now reports 1.8.0) and refreshes handover.
1 parent d84767c commit fbf6e9b

3 files changed

Lines changed: 70 additions & 36 deletions

File tree

‎.dev/handover.md‎

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,44 +13,19 @@
1313
`1ecc7a8a` (zwasm main; carries #157 component export index space + #158/#159
1414
the WASI capture cap — both load-bearing for cljw, unlike the v2.4.0 tag it
1515
replaced. Tagging zwasm is user-only, its ADR-0156). Latest release:
16-
**v1.7.0** (2026-08-04; the component marshaller could kill the host on
17-
guest data — bare `@intCast` = a ReleaseSafe panic; `result` lifts as
18-
`[:ok v]`/`[:err e]` per ADR-0135 am2, replacing a throw that DISCARDED the
19-
err payload; `*file*` lands). v1.6.0 earlier the same day carried four
20-
hang/abort fixes. CHANGELOG is the release-history SSOT.
21-
- **First task on resume**: **release v1.8.0** + the four distribution repos.
22-
Nothing blocks it: zwasm v2.4.1 is cut (user-granted) and `.zwasm` is pinned
23-
to that tag. 26 commits since v1.7.0, all green, nothing half-landed.
16+
**v1.8.0** (2026-08-04; multi-export components load, `wasm/run` gains
17+
output + wall-clock bounds, `clojure.core.reducers` lands, and `(doc reduce)`
18+
finally prints something). CHANGELOG is the release-history SSOT.
19+
- **First task on resume**: the remaining distribution repos —
20+
`cw-playground`, `cw-serverless-demo`, `cw-arcade` (the homebrew tap is done
21+
as part of the v1.8.0 release).
2422
NOTE on history hygiene: commit `673b082b`'s message describes only the
2523
gate-parity fix, but its diff ALSO carries the zwasm tag re-pin, `wasm/run`'s
2624
`:timeout-ms` axis and D-570's discharge — they were in the tree when the
27-
gate went green and rode along. Not amended (already pushed); recorded here
28-
so the CHANGELOG for v1.8.0 is written from the diff, not from that message.
29-
- **Unreleased on main** (21 commits since v1.7.0, 2026-08-04 audit-drain day —
30-
CHANGELOG entry is owed by the next release):
31-
**Gate**: the local full gate now runs `--serial-e2e`, the configuration CI
32-
runs — it did not, and a serial-only EPIPE death in an e2e was therefore
33-
invisible locally while failing every push (`gate_parity` + `epipe_head`
34-
assert both halves).
35-
**Wasm/component**: `wasm/run` gains `:timeout-ms` (D-570 — fuel is a ~760x
36-
proxy for time, so the 1e9 default permitted ~18 h); multi-export components
37-
load at all (zwasm #157); the
38-
ADR-0135 marshalling table asserted in both directions over a 16-export
39-
fixture; `result`/`variant` LOWER (they raised `feature_not_supported`);
40-
one-shot `component-invoke`'s `own` result no longer names a destroyed table
41-
(ADR-0159 am1) and a resource handle is bound to its component; `wasm/run`
42-
output is capped (D-349 — ~64 GB was reachable).
43-
**clj surface**: `clojure.core.reducers` bundled (31/32 oracle-identical);
44-
`core_meta.clj` 291→628 rows, so `reduce`/`assoc`/`conj`/`first` are
45-
documented and `find-doc` covers 84% of core not 36% (ADR-0181);
46-
`clojure.set` → multi-arity `defn`, `(intersection)` now throws where it
47-
answered nil; 49 pprint + 5 data internals privatised; 44 authored
48-
`clojure.math` docstrings.
49-
**Scaffolding**: `cleanup_orphans.sh` now exists (cited as live, did not);
50-
`run_wasm_gate.sh` had been exiting 0 without running; new gates
51-
`reference_clones` / `clj_attribution --gate` / `doc_coverage` /
52-
`epipe_head` / `gate_parity`; NOTICE said three files where ten reproduce
53-
upstream text. ADR-0180/0181, AD-058/059.
25+
gate went green and rode along. Not amended (already pushed); the v1.8.0
26+
CHANGELOG was written from the diff rather than that message.
27+
- **Unreleased on main**: nothing. v1.8.0 (2026-08-04) carried the whole
28+
audit-drain day; CHANGELOG is the SSOT for what it contained.
5429
- **Forbidden**: bare `zig build test` without `-Dwasm`; bare `zig build` for a
5530
probe (use ReleaseSafe). The FULL gate runs `--serial-e2e`, ALONE; never a
5631
concurrent build during a gate. `.claude/**` edits + cross-repo publishes may

‎CHANGELOG.md‎

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,65 @@ first stable `1.0.0` tag; pre-1.0 `alpha` / `rc` tags may still change surfaces.
77

88
## [Unreleased]
99

10+
## [1.8.0] - 2026-08-04
11+
12+
**Upgrade if you use Wasm components, or if you use `doc` / `find-doc`.**
13+
A component with more than one export could not be loaded at all, and `doc` on
14+
most of `clojure.core` printed nothing.
15+
16+
### Added
17+
18+
- **`clojure.core.reducers`.** The full sequential surface — `r/map`,
19+
`r/filter`, `r/remove`, `r/mapcat`, `r/flatten`, `r/take`, `r/take-while`,
20+
`r/drop`, `r/reduce`, `r/fold`, `r/foldcat`, `r/cat`, `r/monoid`,
21+
`r/append!` — with the curried one-arity forms. 31 of 32 probed expressions
22+
are byte-identical to JVM Clojure; the one difference is set print order.
23+
`fold` computes the same value as upstream's but never in parallel: there is
24+
no ForkJoinPool here, so it takes the same single-reduce arm upstream itself
25+
takes for lists, ranges and sets. Its docstring says so.
26+
- **`wasm/run` takes `:max-output-bytes` and `:timeout-ms`**, alongside the
27+
existing `:fuel` and `:max-memory-pages`. Both default to finite values
28+
(16 MiB per captured stream, 60 s); `0` or a negative value opts out.
29+
30+
### Fixed
31+
32+
- **A Wasm component with two or more exports failed to load.** Every fixture
33+
in this project and in zwasm exported exactly one function, so
34+
`(:require ["x.wasm" :as x])` — the headline feature — had only ever been
35+
exercised on single-function components. Fixed in zwasm v2.4.1, which this
36+
release pins.
37+
- **`wasm/run` could be made to exhaust host memory.** It buffered the guest's
38+
stdout and stderr without limit, and the fuel budget does not bound that:
39+
fuel counts instructions, and how many bytes an instruction writes is the
40+
guest's choice. Measured, a guest could force ~64 GB before its fuel ran
41+
out. Also had no wall-clock bound — the same guest could run for roughly 18
42+
hours inside the default fuel budget.
43+
- **A resource handle from a one-shot `wasm/component-invoke` was already
44+
invalid when you received it**, because the component was torn down before
45+
the call returned. Handle numbers are per-instance table indices starting at
46+
1, so passing it on could silently operate on a *different* resource. The
47+
component now lives as long as the handle does, and a handle is bound to the
48+
component that minted it.
49+
- **`result` and `variant` could not be passed INTO a component.** They lifted
50+
out correctly, so the round-trip the mapping table describes was one-way.
51+
- **`(doc reduce)` printed nothing** — and so did `assoc`, `conj`, `first`,
52+
`apply`, `=` and 320 others. The generated metadata table covered 246 of 685
53+
`clojure.core` publics and none of the ~290 implemented as native
54+
primitives, so `find-doc` and `apropos` were searching a third of core while
55+
answering as though they had searched all of it. Now 572 of 684.
56+
- **`(clojure.set/intersection)` returned `nil`** where Clojure throws
57+
`ArityException`, and no var in `clojure.set` reported `:arglists`.
58+
59+
### Changed
60+
61+
- **`clojure.pprint` no longer publishes 49 internal formatter helpers**
62+
(`cl-tens`, `cl-roman`, `cl-under-1000`, …). Upstream keeps them private;
63+
they were public here only because they were written as `defn`. `cl-format`
64+
and the other six documented names are unaffected. Same for five
65+
`clojure.data` internals and three contrib parser implementation details.
66+
- **`clojure.math` gained docstrings**, written for this runtime rather than
67+
imported — upstream's all end in a `java.lang.Math` Javadoc URL.
68+
1069
## [1.7.0] - 2026-08-04
1170

1271
**Upgrade if you load Wasm components.** An untrusted component could kill the

‎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.7.0",
3+
.version = "1.8.0",
44
.fingerprint = 0x1869d207073beffa,
55
.minimum_zig_version = "0.16.0",
66
.dependencies = .{

0 commit comments

Comments
 (0)