From 695f8bd038624ae0df65d1b5923ab926e8a59db7 Mon Sep 17 00:00:00 2001 From: "Shota Kudo (chaploud)" Date: Fri, 17 Jul 2026 15:13:16 +0900 Subject: [PATCH 1/6] docs: truth-sweep of Wasm 3.0 / WASI 0.3 claims vs official WASI 0.3.0 Inventory sweep against the officially released WASI 0.3.0 spec (2026-06-11, ~/Documents/OSS/WASI) + refreshed reference clones: - zwasm --help: engine default is auto (was claiming interp); list --cache/--cache-clear (shipped 2.2.0) - main.zig doc: .cwasm v0.1/ADR-0039 -> v0.5/ADR-0203; engine default - canon.zig: drop the stale "utf16/latin1 pending" claims (D-502 implemented them at the canon layer) - spec_assert_runner_wasm_3_0: docstring said SKELETON; it JIT-executes with real pass/fail accounting since Phase 10 - gc/register.zig: GC shipped; note the unwired enable_gc gate (D-525) - README: WASI 0.3 row (core, opt-in -Dwasi=p3, official-0.3.0 deltas pending); complete the 9-proposal list (custom annotations) - migration guide: GC is on by default (-Dgc is inert, not "opt-in"); WASI 0.3.0 released (drop "until it settles") - CHANGELOG: Unreleased entries + 9-proposal list completion - reference_clones.md: add WASI monorepo / component-model / wasi-testsuite / wasmtime-py rows; wasi-* per-interface repos archived upstream 2025-11-25; version-pin section rewritten for the wg-3.0 / spec_pin.yaml reality; fix the ClojureWasm path - proposal_watch.md: 2026-07-17 review entry (official-0.3.0 WIT diff: system-clock rename, instant{s64,u32}, monotonic wait-until/wait-for async funcs, wasi:io deletion; wasip3 fixtures actually import 0.2.6); WASI roadmap table de-staled (0.2 row said ACTIVE, 0.3 row claimed a stack-switching gate contradicting the header callout) - debt.yaml: D-523 (fixture regen vs official 0.3.0 toolchain), D-524 (official-0.3.0 host-surface residual), D-525 (-Dgc inert) --- .dev/debt.yaml | 70 +++++++++++++++++++++++ .dev/proposal_watch.md | 26 +++++++-- .dev/reference_clones.md | 53 ++++++++--------- CHANGELOG.md | 22 ++++++- README.md | 3 +- docs/migration_v1_to_v2.md | 13 +++-- src/cli/dispatch.zig | 4 +- src/cli/main.zig | 7 ++- src/feature/component/canon.zig | 6 +- src/feature/gc/register.zig | 7 ++- test/spec/spec_assert_runner_wasm_3_0.zig | 24 ++++---- 11 files changed, 170 insertions(+), 65 deletions(-) diff --git a/.dev/debt.yaml b/.dev/debt.yaml index e83fd6ec2..5f07afde5 100644 --- a/.dev/debt.yaml +++ b/.dev/debt.yaml @@ -3,6 +3,76 @@ # Refresh on every /continue resume — .claude/skills/continue/RESUME.md Step 0.5. entries: + - id: "D-523" + layer: "test" + status: "note" + front: D-wasi03 + description: |- + The committed wasip3 conformance fixtures (`test/component/wasip3/*.wasm`, + 7 rust CLI components) import **wasi 0.2.6 interfaces** (`wasi:cli@0.2.6`, + `wasi:io@0.2.6`, `wasi:clocks/wall-clock@0.2.6`; verified via + `wasm-tools component wit` 2026-07-17) — the pinned nightly rust + wasm32-wasip3 target predates the official WASI 0.3.0 release + (2026-06-11). The corpus therefore certifies the CM-async export ABI + + the 0.2 host surface, NOT the official 0.3.0 WIT (system-clock, + via-stream stdio, async sockets). DISCHARGE: bump the `flake.nix` + `gen-wasip3` toolchain pin to a nightly whose wasip3 target emits + official 0.3.0 imports (lesson 2026-06-16-wasip3-hermetic-build-recipe + documents the fragile Darwin recipe), regen via + `scripts/gen_wasip3_fixtures.sh`, extend the host adapter as the new + imports demand. TRIGGER: rust wasip3 target maturing past Tier-3 / + first real 0.3.0-built consumer. + first_raised: "2026-07-17" + last_reviewed: "2026-07-17" + refs: |- + proposal_watch 2026-07-17 entry; D-335 (P3 front); D-448 (wasip3 + toolchain recipe). Test-side half of the official-0.3.0 alignment + (host-side half = D-524). + - id: "D-524" + layer: "code" + status: "note" + front: D-wasi03 + description: |- + Official WASI 0.3.0 host-surface residual (host-side half of the + official-0.3.0 alignment; spec = `~/Documents/OSS/WASI/proposals/*/wit/`): + (1) `wasi:clocks/monotonic-clock@0.3.0` `wait-until: async func(when)` / + `wait-for: async func(how-long)` — ASYNC host funcs; need a host-side + timer waitable wired into the P3 scheduler (driveScheduler), not a + sync trampoline; (2) `wasi:filesystem` via-stream data-plane + + `wasi:sockets` async rework + `wasi:http` — already scoped FUTURE-BUCKET + under D-335 REMAINING(2), listed here only for the 0.3.0 mapping; + (3) interface-version gating: the adapter matches names with `@version` + stripped, so 0.2-vs-0.3 signature drift on a SAME-NAMED interface + (none today — system-clock/instant took a new name) would need a + version-aware dispatch row before any such interface is served. + Sync 0.3.0 clocks surface (`system-clock.now/get-resolution` + + `monotonic-clock.get-resolution`) SHIPPED in this sweep — see refs. + first_raised: "2026-07-17" + last_reviewed: "2026-07-17" + refs: |- + proposal_watch 2026-07-17 entry; D-335 REMAINING(2); D-523 (test-side) + - id: "D-525" + layer: "build" + status: "note" + description: |- + The `-Dgc` build option is INERT: `build.zig` threads it to + `build_options.enable_gc`, whose only reader is the + `src/feature/gc/register.zig` re-export that nothing consumes — + GC compiles in (and executes) whenever `-Dwasm=v3_0` (the default); + the actual strip lever is the wasm-level DCE (`check_build_dce.sh` + asserts `gc_struct`/`i31_new` absent from v1_0/v2_0 builds only). + ADR-0115 §3 planned `enable_gc` as the op-handler compile-time gate + ("WAMR-equivalent nuclear strip") but the op handlers never adopted + it. DISCHARGE (pick one): (a) wire the gate — branch the wasm_3_0 + GC per-op registrations/handlers on `enable_gc` + extend + check_build_dce with a `-Dgc=false` leg (binary-size relevant, + cf. ADR-0204); or (b) retire the flag + the register.zig re-export + and amend ADR-0115 §3. Docs corrected 2026-07-17 (migration guide + no longer claims "GC opt-in via -Dgc"). + first_raised: "2026-07-17" + last_reviewed: "2026-07-17" + refs: |- + ADR-0115 §3; scripts/check_build_dce.sh; migration_v1_to_v2.md §3.2 - id: "D-522" layer: "api" status: "note" diff --git a/.dev/proposal_watch.md b/.dev/proposal_watch.md index e777fd44e..207cc6b35 100644 --- a/.dev/proposal_watch.md +++ b/.dev/proposal_watch.md @@ -5,7 +5,7 @@ > re-evaluated when they advance. Phase 4 non-web proposals are the > v0.2.0 line. -Last reviewed: **2026-07-03**. +Last reviewed: **2026-07-17**. > **WASI 0.3.0 RATIFIED 2026-06-11** (Bytecode Alliance; Wasmtime 43+). It > rebases WASI onto the **Component Model async primitives** (`async` func, @@ -83,10 +83,26 @@ Text Encoding Builtins` (skip). | WASI version | zwasm phase | Notes | |----------------|---------------|-----------------------------------------| -| 0.1 (preview1) | Phases 4 / 11 | de-facto baseline; complete in Phase 11 | -| 0.2 (preview2) | **Phase 17 (ACTIVE)** | Component Model required; full campaign per ADR-0170 (`component_model_plan.md`) | -| 0.3 | post-v0.1.0 (post-v0.2.0) | **released 2026-06-11**; rebases WASI on CM async — streams/futures replace 0.2 poll/`pollable`; breaking vs 0.2; impl gated on CM-async + stack-switching (D-300, DEFER) | - +| 0.1 (preview1) | ✅ COMPLETE | de-facto baseline; complete since Phase 11 | +| 0.2 (preview2) | ✅ COMPLETE (default-ON) | Component Model campaign done 2026-06-13 (ADR-0170); official corpus 158/0/0 | +| 0.3 | 🚧 core SHIPPED (opt-in `-Dwasi=p3`) | **released 2026-06-11**; rebases WASI on CM async (async func / `stream` / `future` — NOT core stack-switching, see callout). zwasm ships the CM-async substrate + cli/clocks/random host; official-0.3.0 interface deltas tracked in the 2026-07-17 entry below | + +- **2026-07-17** — **WASI-0.3.0-official diff inventory** (reference clones + pulled: WASI monorepo → 2026-07-15 HEAD incl. the `v0.3.0` release of + 2026-06-11; wasmtime v48; wasm-tools v1.252; the per-interface + `WebAssembly/wasi-*` repos were ARCHIVED upstream 2025-11-25 — living WIT = + `WASI/proposals/*/wit/`). Deltas between the official 0.3.0 WIT and zwasm's + draft-era P3 surface: (1) `wasi:clocks/wall-clock` was RENAMED + `system-clock`, `datetime{u64,u32}` → `instant{seconds: s64, ns: u32}`, + + `get-resolution`; (2) `wasi:clocks/monotonic-clock` gains `get-resolution` + + `wait-until`/`wait-for` **async funcs**; (3) `wasi:cli` stdio via-stream + shapes match zwasm's ADR-0190 impl (stdout/stderr `write-via-stream(stream) + -> future>`); (4) `wasi:io` is deleted upstream (CM + builtins replace it) — zwasm's P2 wasi:io host stays for 0.2 guests. ALSO + measured: the committed `test/component/wasip3/*.wasm` fixtures import + **wasi 0.2.6 interfaces** (the pinned nightly rust wasip3 target predates the + release) — regenerating against official 0.3.0 needs a toolchain bump + (debt D-523). Host-side `system-clock` support added this sweep. - **2026-07-03** — **post-v2.0.0 maintenance sweep** (reference clones refreshed ff-only: wasmtime / WAMR / wasm-tools / component-model to upstream HEAD; spec + testsuite left at their `wg-3.0` / `spec_pin.yaml` pins). **No proposal phase diff --git a/.dev/reference_clones.md b/.dev/reference_clones.md index 8bcf7195e..4b415a8c2 100644 --- a/.dev/reference_clones.md +++ b/.dev/reference_clones.md @@ -14,8 +14,8 @@ material, not project state. | Path | What it is | |--------------------------------------------------|------------------------------------------------------------------------| -| `~/Documents/MyProducts/zwasm/` | zwasm v1 (current main, ClojureWasm consumer) — **read, never copy** | -| `~/Documents/MyProducts/ClojureWasmFromScratch/` | cw v1 — procedural template that this project mirrors | +| `~/Documents/MyProducts/zwasm/` | THIS repo (v2 on `main`; v1 frozen at tag `v1.11.1` in the same history — **read v1, never copy**) | +| `~/Documents/MyProducts/ClojureWasm/` | cljw — downstream consumer (pins zwasm by git tag-hash) + procedural template this project mirrored | | `~/Documents/OSS/wasmtime/` | wasmtime + cranelift (winch / regalloc2 reference) | | `~/Documents/OSS/zware/` | Zig idiomatic interpreter | | `~/Documents/OSS/wasm3/` | wasm3 (M3 IR + tail-call dispatch interpreter) | @@ -34,36 +34,31 @@ material, not project state. | `~/Documents/OSS/poop/` | Andrew Kelley's perf-bench tool (Zig) | | `~/Documents/OSS/hyperfine/` | Hyperfine source (bench tool used in `bench/`) | | `~/Documents/OSS/extism/` | Extism (multi-language Wasm host SDK reference) | -| `~/Documents/OSS/WebAssembly/spec/` | reference interpreter (OCaml) + spec text — see version pin note below | +| `~/Documents/OSS/WebAssembly/spec/` | reference interpreter (OCaml) + spec text — checked out at `wg-3.0`; see version pin note below | | `~/Documents/OSS/WebAssembly/testsuite/` | spec testsuite — see version pin note below | | `~/Documents/OSS/WebAssembly//` | per-proposal spec + tests (multi-value, simd, gc, eh, ...) | +| `~/Documents/OSS/WASI/` | WASI spec monorepo — `specifications/wasi-0.3.0/` (released 2026-06-11) + live `proposals/*/wit/` WIT sources. NOTE: the per-interface `WebAssembly/wasi-*` repos below were ARCHIVED 2025-11-25; this monorepo is the living source | +| `~/Documents/OSS/WebAssembly/wasi-/` | archived (2025-11-25) per-interface WASI repos (cli/clocks/filesystem/http/io/random/sockets) — historical WIT incl. `wit-0.3.0-draft/`; prefer `WASI/proposals/` for current WIT | +| `~/Documents/OSS/WebAssembly/component-model/` | Component Model spec (canonical ABI, async, WIT) — WASI 0.2/0.3 substrate | +| `~/Documents/OSS/wasi-testsuite/` | WASI testsuite (P1 + p3 guest tests) | +| `~/Documents/OSS/wasmtime-py/` | wasmtime Python embedding (host-API shape reference) | | `~/Documents/OSS/zig/` | Zig 0.16 stdlib source | -## Version pin policy (Wasm 2.0 scope per ADR-0061) +## Version pin policy (Wasm 3.0 scope; historical 2.0 policy = ADR-0061) -Phase 9 keeps strictly to Wasm 2.0 (W3C Rec 2024-12). Upstream -`WebAssembly/spec` and `WebAssembly/testsuite` track `main`, -which has accumulated Wasm 3.0 amendments (typed-refs, -extended-const, multi-memory, tail-call) in historically-2.0 -wast files (`local_tee.wast`, `func.wast`, etc.). Behaviour: +The authoritative pin is [`.dev/spec_pin.yaml`](spec_pin.yaml) — +`WebAssembly/spec` + `WebAssembly/testsuite` SHAs acknowledged as the +vendoring baseline for the committed `test/spec/` conformance corpora. +`scripts/check_spec_bump.sh` alerts when upstream advances beyond the +pin; drift is assessed at the quarterly `proposal_watch.md` review +(benign drift → pin bump, `test/core/` changes → re-vendor + re-distil). -- The regen scripts (`scripts/regen_spec_2_0_assert.sh`, - `scripts/regen_spec_simd_assert.sh`) invoke `wast2json` - **without `--enable-*` flags for 3.0 proposals**. wast files - that have been amended with 3.0 syntax fail parsing and the - regen script logs `skip $n (wast2json rejected)`. -- Existing `test/spec/wasm-2.0-assert/$n/` directories - generated by prior regens (under the pre-d-31 flag policy) - are **preserved on rejection** — they contain only 2.0 - content (the prior flags accepted both 2.0 and 3.0 syntax, - and the python distillation filters to scalar shapes). -- Recommended pin (not auto-enforced): check out the spec - repo at the `wg-2.0` tag for full reproducibility of - generated corpora. `cd ~/Documents/OSS/WebAssembly/spec && - git checkout wg-2.0`. The current loop does not gate on - this; if a regen run produces drift, see ADR-0061 - Alternative C (vendoring) for the escalation path. -- Wasm 3.0 corpora (`memory64/`, `multi-memory/`, `gc/`, - `relaxed-simd/`, `exceptions/`, `function-references/`, - `tail-call/`, etc.) are **never added to NAMES** until - Phase 10+ lands the corresponding runtime. +- The local `WebAssembly/spec` clone sits on the `wg-3.0` branch + (Wasm 3.0, W3C Rec 2025-09) — the scope zwasm v2 ships. +- Wasm 3.0 corpora (`test/spec/wasm-3.0-assert/{memory64,multi-memory, + gc,function-references,tail-call,exception-handling}/`) are committed + and wired into `test-all`; the historical Phase-9 rule "never add 3.0 + corpora until the runtime lands" (ADR-0061) is fulfilled and retired. +- `git pull` on these clones is fine (they are reference material); + regen/re-distil of committed corpora happens only via the + `scripts/regen_spec_*.sh` flow against the pinned SHAs. diff --git a/CHANGELOG.md b/CHANGELOG.md index 74562158a..7f85dcbe2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,25 @@ SemVer compatibility guarantees start at the first stable `v2.0.0` tag. ## [Unreleased] -_No changes yet._ +### Fixed + +- **`zwasm --help` engine wording**: the usage text claimed + `interp (default)`; the real default (since 2.0.0) is `auto` — prefers + the JIT with transparent interpreter fallback. The help now matches + `docs/reference/cli.md` and the README, and also lists the `--cache` / + `--cache-clear` flags shipped in 2.2.0. + +### Documentation + +- **WASI 0.3 documented**: README gains a WASI 0.3 row (Component-Model + native-async core, opt-in `-Dwasi=p3`; official WASI 0.3.0 released + 2026-06-11 — `wasi:filesystem`/`wasi:sockets` data-plane and `wasi:http` + pending), and the migration guide's "until it settles" framing is + replaced accordingly. +- **GC build default corrected in the migration guide**: WasmGC is + compiled in and executes by default (part of `-Dwasm=v3_0`); the guide + previously described it as opt-in via `-Dgc`, which is inert (tracked + as debt). ## [2.2.1] - 2026-07-16 @@ -139,7 +157,7 @@ Windows x86_64). Earlier pre-releases were tagged `v2.0.0-alpha.*`. - **WebAssembly 3.0** — all 9 proposals: GC, exception handling, tail calls, memory64, multi-memory, typed function references, - extended-const, relaxed-SIMD. Plus full Wasm 1.0 + 2.0 (multi-value, + extended-const, relaxed-SIMD, custom annotations. Plus full Wasm 1.0 + 2.0 (multi-value, SIMD-128, bulk-memory, reference-types, non-trapping FP→int conversion, sign-extension, mutable globals). Spec testsuite green, `skip-impl == 0`. - **Execution backends** — interpreter (full WASI), JIT for ARM64 diff --git a/README.md b/README.md index ee6a43ec9..349752b33 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ now (demand-driven). |-----------------------------------------------------------------------------------------------------------------|---------|----------------------------------------------------------| | Wasm 1.0 | ✅ 100% | spec testsuite green on the 3-host gate | | Wasm 2.0 (multi-value, SIMD-128, bulk-memory, reference-types, non-trapping FP→int, sign-ext, mutable globals) | ✅ 100% | `skip-impl == 0`; bit-identical across hosts | -| Wasm 3.0 (GC, EH, tail-call, memory64, multi-memory, typed func refs, extended-const, relaxed-simd) | ✅ 100% | all 9 proposals; spec testsuite green on the 3-host gate | +| Wasm 3.0 (GC, EH, tail-call, memory64, multi-memory, typed func refs, extended-const, relaxed-simd, custom annotations) | ✅ 100% | all 9 proposals; spec testsuite green on the 3-host gate | ### WASI @@ -52,6 +52,7 @@ now (demand-driven). |--------------------------------------|---------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | WASI 0.1 (preview1) | ✅ functional | interpreter: args / env / preopened dirs / clock / random / fd I/O | | WASI 0.2 (preview2, Component Model) | ✅ functional, default-ON | wasmtime-equivalent campaign complete (2026-06-13): real `wasm32-wasip2` Rust/TinyGo components run e2e (fs, sockets incl. TCP listeners, guest-defined resources); typed embedder API (introspection + `invokeTyped`); validation rules 1-12, official corpus 158/0/0; gated by `-Dwasi>=p2` (default), `-Dwasi=p1` = lean opt-out | +| WASI 0.3 (preview3, native async) | 🚧 core, opt-in (`-Dwasi=p3`) | Component-Model async substrate (async-lifted exports via the stackless callback loop, `stream`/`future`, waitable-sets) + `wasi:cli` / `wasi:clocks` / `wasi:random` host; real `wasm32-wasip3` Rust components run e2e. The official WASI 0.3.0 interface set (released 2026-06-11) is not yet complete: `wasi:filesystem` / `wasi:sockets` data-plane and `wasi:http` are pending | All three execution paths do full WASI I/O — the interpreter, the JIT (`--engine jit`), and AOT (`.cwasm`). The JIT additionally diff --git a/docs/migration_v1_to_v2.md b/docs/migration_v1_to_v2.md index ed77c0659..57cab25bb 100644 --- a/docs/migration_v1_to_v2.md +++ b/docs/migration_v1_to_v2.md @@ -2,7 +2,8 @@ zwasm **v2** is a ground-up rewrite (releases `v1.0.0`–`v1.11.1` are v1, now frozen; v2 ships as `v2.x.x` tags, first stable `v2.0.0`). -It keeps full Wasm spec coverage (Wasm 1.0/2.0/3.0, WASI 0.1/0.2) but **breaks +It keeps full Wasm spec coverage (Wasm 1.0/2.0/3.0, WASI 0.1/0.2, plus an +opt-in WASI 0.3 async core) but **breaks the surfaces on purpose** — the C API, the Zig API, and the CLI all changed. This guide tells you what to do to port, then documents what changed and why. @@ -245,11 +246,11 @@ all three surfaces — Zig API, C `zwasm.h` setters, and the CLI flags. | **Engine model** | one `WasmModule` (load == instantiate) | `Engine` → `Module` → `Instance` (compile once, instantiate many) | | **Default engine** | JIT by default | **`.auto` by default** (prefers JIT, transparent interp fallback); `--engine interp` / `jit` force one | | **SIMD** | interpreter-only (codegen was stubbed) | **JIT-only**; the interpreter does **not** execute SIMD (by design — in an interpreter the dispatch cost dominates the vector work, so it carries no benefit) | -| **GC** | mark-and-sweep, on by default | mark-sweep with conservative native-stack root scan; **opt-in** (`-Dgc`, default off) | +| **GC** | mark-and-sweep, on by default | mark-sweep with conservative native-stack root scan; **on by default** (part of `-Dwasm=v3_0`; stripped from `v1_0`/`v2_0` builds) | | **Atomics (threads opcodes)** | on by default | implemented (validated + lowered + interpreted); broader shared-memory/spawn is a reserved stub | | **Compile to disk** | `--cache` → predecoded-IR `.zwcache` | `compile` → AOT `.cwasm`; `run` auto-detects it | | **Component Model** | decoder, on by default | decoder + canonical ABI + structural validation + WIT; gated by `-Dwasi>=p2` (default `p2`, so **on**); a real `wasm32-wasip2` component runs e2e | -| **Build defaults** | `wat`/`jit`/`simd`/`gc`/`threads`/`component` all on | `-Dwasm=v3_0`, `-Dwasi=p2`, `-Dengine=both`; component **on** (via `-Dwasi>=p2`), `gc` default **off** | +| **Build defaults** | `wat`/`jit`/`simd`/`gc`/`threads`/`component` all on | `-Dwasm=v3_0`, `-Dwasi=p2`, `-Dengine=both`; component **on** (via `-Dwasi>=p2`); GC on (via `-Dwasm=v3_0`) | ### 3.3 WASI @@ -260,8 +261,10 @@ Both ship **WASI 0.1 (preview1)**. In v2: - **WASI 0.2 / preview2** (Component Model) is **default-ON** via the WASI tier `-Dwasi>=p2` (default `p2`; `-Dwasi=p1` for a lean opt-out — the former `-Dcomponent` flag is folded into the version axis) — real `wasm32-wasip2` Rust/Go - components run e2e (corpus 158/0/0). **WASI 0.3 / preview3** (async) compiles at - `-Dwasi=p3` (opt-in; the default `p2` keeps it out until it settles). + components run e2e (corpus 158/0/0). **WASI 0.3 / preview3** (native async; + officially released as WASI 0.3.0 on 2026-06-11) compiles at `-Dwasi=p3` + (opt-in; the default stays `p2` while the 0.3 host interface set — + filesystem/sockets data-plane, http — is completed). - **C-API preopen** is **shipped** (`zwasm_wasi_config_preopen_dir` + `inherit_env`); the CLI `--dir` and Zig facade also cover it. - **Preopen confinement:** guest paths are escape-guarded (absolute and `..` are diff --git a/src/cli/dispatch.zig b/src/cli/dispatch.zig index 3c4f1ed8b..3eda90b32 100644 --- a/src/cli/dispatch.zig +++ b/src/cli/dispatch.zig @@ -47,7 +47,7 @@ pub const usage = \\Usage: \\ zwasm run [args...] Run a module (WASI _start / main) \\ [--invoke [=a,b,...]] Invoke a named export (optional call args) - \\ [--engine ] Engine: interp (default) or jit (both full WASI; jit adds SIMD) + \\ [--engine ] Engine: default auto (prefers JIT, interp fallback); interp|jit force one (both full WASI; jit adds SIMD) \\ [--dir [:]] Preopen a host directory for WASI \\ [--env ] Set an environment variable for the guest \\ [--fuel ] Trap after a fuel budget (units are engine-specific: @@ -55,6 +55,8 @@ pub const usage = \\ [--timeout ] Interrupt the guest after a wall-clock deadline \\ [--max-memory ] Refuse memory.grow past this many bytes (64 KiB page granularity) \\ [--max-table-elements ] Refuse table growth/alloc past this many elements + \\ [--cache[=DIR]] Transparent compilation cache (content-keyed .cwasm reuse) + \\ [--cache-clear] Delete this build's cache subdirectory (combine with --cache to repopulate) \\ zwasm compile -o Compile to a .cwasm AOT artifact \\ zwasm --version | -V Print the version \\ zwasm --help | -h | help Print this help diff --git a/src/cli/main.zig b/src/cli/main.zig index fd53e37b2..feb70f925 100644 --- a/src/cli/main.zig +++ b/src/cli/main.zig @@ -16,15 +16,16 @@ //! export; exit with the guest's //! `proc_exit` code. //! run --invoke Invoke the named func export (zero-args) -//! run --engine Engine: interp (default) or jit — BOTH do full +//! run --engine Engine: default (omitted) = auto, prefers JIT +//! with interp fallback; interp|jit force one — BOTH do full //! WASI (D-244); jit additionally executes SIMD //! (the interp does not). `--engine=jit` accepted. //! instead of the default `_start` / `main` //! selection. Typed `--invoke NAME=a,b,...` //! arg marshalling + result printing are //! handled in `cli/invoke_args.zig` (D-273). -//! compile Produce a `.cwasm` v0.1 artifact (per -//! -o ADR-0039). Generator side; `run +//! compile Produce a `.cwasm` v0.5 full-fidelity artifact +//! -o (per ADR-0203). Generator side; `run //! ` loads + executes it. //! //! The surface is `run` + `compile` only (ADR-0159, §16.4): the diff --git a/src/feature/component/canon.zig b/src/feature/component/canon.zig index 9f89896a8..05028969d 100644 --- a/src/feature/component/canon.zig +++ b/src/feature/component/canon.zig @@ -11,7 +11,7 @@ //! over memory · recursive `store`/`load` for list/record/variant · the //! multi-value flat lowering for fn-call params (`flattenType`/`lowerFlat`/ //! `liftFlat`) · the decoded-`TypeInfo`→`CanonType` bridge · resource handle -//! own/borrow (D-322). utf16/latin1 string encodings pending. +//! own/borrow (D-322) · utf16 / latin1+utf16 string encodings (D-502). //! //! The realloc callback is INJECTED (vtable pattern, `zone_deps`): canon.zig //! never imports the core runtime's instance/invoke; the orchestration layer @@ -219,8 +219,8 @@ pub const ReallocError = error{ AllocFailed, OutOfBounds }; /// (ADR-0171). An error result signals OOM / trap. pub const ReallocFn = *const fn (ctx: *anyopaque, old_ptr: u32, old_size: u32, alignment: u32, new_size: u32) ReallocError!u32; -/// Guest string encoding (`canonopt` `string-encoding`). utf8 is implemented; -/// utf16 / latin1+utf16 are still pending (rejected by lift/lower for now). +/// Guest string encoding (`canonopt` `string-encoding`). All three are +/// implemented at the canon lift/lower layer (D-502). pub const StringEncoding = enum { utf8, utf16, latin1_utf16 }; /// Per-call canonical-ABI context: the guest linear memory (lift/lower target), diff --git a/src/feature/gc/register.zig b/src/feature/gc/register.zig index f2f4be683..37f1f76d1 100644 --- a/src/feature/gc/register.zig +++ b/src/feature/gc/register.zig @@ -7,9 +7,10 @@ //! function installs the parser / validator / interp / arm64 / //! x86_64 emit slots for the feature's opcodes. //! -//! Currently a placeholder per ADR-0023 §3 P-H. Implementation -//! lands per ROADMAP §11 (proposal phasing) when the feature's -//! Phase row opens. +//! The GC feature itself SHIPPED (Phase 10): its ops register via the +//! per-op `src/instruction/wasm_3_0/` dispatch files, so `register()` +//! stays a no-op, and the `enable_gc` re-export below is currently +//! unwired — GC compiles in with `-Dwasm=v3_0`; see debt D-525. //! //! Zone 1 (`src/feature/gc/`). diff --git a/test/spec/spec_assert_runner_wasm_3_0.zig b/test/spec/spec_assert_runner_wasm_3_0.zig index ff4f543df..20de6bbb9 100644 --- a/test/spec/spec_assert_runner_wasm_3_0.zig +++ b/test/spec/spec_assert_runner_wasm_3_0.zig @@ -1,18 +1,16 @@ -//! Wasm 3.0 spec assertion runner skeleton (10.T-2b). +//! Wasm 3.0 spec assertion runner (10.T-2b, JIT-executing since Phase 10). //! -//! Sub-corpus selector for the 5 Wasm 3.0 proposals (memory64 / -//! tail-call / exception-handling / gc / function-references). -//! Currently a SKELETON — enumerates the baked manifests under -//! `///manifest.txt` and reports -//! per-proposal directive counts. JIT-execute + actual assertion -//! matching comes online cycle-by-cycle as impl rows 10.M / 10.R / -//! 10.TC / 10.E / 10.G land (each impl row will adopt the -//! `spec_assert_runner_base` callbacks pattern once its proposal's -//! ZIR / runtime / codegen surface exists). +//! Sub-corpus selector for the Wasm 3.0 proposals (memory64 / multi-memory / +//! tail-call / exception-handling / gc / function-references): enumerates the +//! baked manifests under `///manifest.txt` and +//! executes the assertions — assert_return / assert_trap / assert_invalid / +//! assert_unlinkable / assert_malformed / assert_exception — with real +//! pass/fail accounting, plus an opt-in JIT-return lane +//! (`ZWASM_SPEC_ENGINE=jit`) whose enumerated skips are the D-217 +//! harness-shape gaps, not silent omissions. //! -//! Until then this runner serves as the **observable wiring** — -//! `zig build test-spec-wasm-3.0-assert` builds + runs it, -//! exiting clean against the smoke-baked corpus (10.T-2a). A +//! `zig build test-spec-wasm-3.0-assert` builds + runs it against the +//! committed corpus. A //! missing corpus ROOT `exit(1)`s — the corpus is committed, so a //! missing root is a real error, not a fresh-checkout state //! (ADR-0174 no-silent-skip), matching the other assert runners. From c4848d44b263cfa3880e6186ea7a28bfffed51f9 Mon Sep 17 00:00:00 2001 From: "Shota Kudo (chaploud)" Date: Fri, 17 Jul 2026 15:38:03 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat(wasi):=20official=20WASI=200.3.0=20clo?= =?UTF-8?q?cks=20surface=20=E2=80=94=20system-clock=20+=20get-resolution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WASI 0.3.0 (released 2026-06-11) renamed wasi:clocks/wall-clock to system-clock with instant{seconds: s64, nanoseconds: u32} and added get-resolution to both clocks. Serve the sync half on the component host: - adapter: P2Op clocks_system_now / clocks_system_get_resolution / clocks_monotonic_get_resolution + table rows (version-stripped names are 0.3.0-unique, no 0.2 collision) + P1Target.clock_res_get - clocks.zig: clockTimeNsSigned (i96; pre-1970 instants representable) + clockResNs, with clockTimeNs/clockResGet refactored on top (behavior-preserving) - trampolines: p2SystemNow writes the floored instant split (instantFromNs: {-1s, 999999999ns} = 1ns before epoch, per the WIT example; unit-tested), get-resolution returns duration(u64) directly - fixture test/component/wasi_p3_systemclock.{wat,wasm}: asserts real values (seconds past 2017, 0 < resolution <= 1s) via exit code, plus adapter classify/p1Target unit tests The async monotonic wait-until/wait-for need a scheduler-wired timer waitable — tracked as D-524. DA-critique 19/20 -> signed-instant fix applied (check #12). --- src/api/component_tests.zig | 20 ++++++++ src/api/component_wasi_p2.zig | 63 +++++++++++++++++++++++ src/wasi/adapter.zig | 26 ++++++++++ src/wasi/clocks.zig | 43 ++++++++++++---- test/component/wasi_p3_systemclock.wasm | Bin 0 -> 1037 bytes test/component/wasi_p3_systemclock.wat | 65 ++++++++++++++++++++++++ 6 files changed, 206 insertions(+), 11 deletions(-) create mode 100644 test/component/wasi_p3_systemclock.wasm create mode 100644 test/component/wasi_p3_systemclock.wat diff --git a/src/api/component_tests.zig b/src/api/component_tests.zig index 483176231..7cad3dab2 100644 --- a/src/api/component_tests.zig +++ b/src/api/component_tests.zig @@ -817,6 +817,26 @@ test "D3: a WASI-P2 component reads wall-clock.now() — realtime past 2017 → try testing.expectEqual(@as(u32, 0), host.exit_code.?); } +test "official 0.3.0: a component reads system-clock.now() + both get-resolution — sane → exit 0" { + var threaded: std.Io.Threaded = .init(testing.allocator, .{}); + defer threaded.deinit(); + const io = threaded.io(); + const bytes = try std.Io.Dir.cwd().readFileAlloc(io, "test/component/wasi_p3_systemclock.wasm", testing.allocator, .limited(1 << 20)); + defer testing.allocator.free(bytes); + + var eng = try Engine.init(testing.allocator, .{}); + defer eng.deinit(); + var host = try wasi_host.Host.init(testing.allocator); + defer host.deinit(); + host.io = io; + + // run() reads system-clock.now() (official WASI 0.3.0: the renamed + // wall-clock, instant{seconds: s64, nanoseconds: u32} at retptr) and both + // clocks' get-resolution(); exit(0) iff seconds>1.5e9 and 0 < res <= 1s. + try runWasiP2Main(&eng, testing.allocator, bytes, &host, .{}); + try testing.expectEqual(@as(u32, 0), host.exit_code.?); +} + test "D3: a WASI-P2 component calls random.get-random-bytes(16) — list realloc → exit 0" { var threaded: std.Io.Threaded = .init(testing.allocator, .{}); defer threaded.deinit(); diff --git a/src/api/component_wasi_p2.zig b/src/api/component_wasi_p2.zig index ae58fa4ba..be1fe2529 100644 --- a/src/api/component_wasi_p2.zig +++ b/src/api/component_wasi_p2.zig @@ -303,6 +303,66 @@ fn p2WallNow(caller: *Caller, retptr: u32) WasiP2Error!void { try mem.write(retptr + 8, @as(u32, @intCast(ns % std.time.ns_per_s))); } +/// `wasi:clocks/system-clock` `now()` → instant{seconds: s64, nanoseconds: u32} +/// (official WASI 0.3.0 — the renamed 0.2 `wall-clock`, reading the same host +/// realtime clock; the record's seconds field became SIGNED). Writes the +/// 12-byte record to the return area at `retptr` (seconds @ 0, ns @ 8). +fn p2SystemNow(caller: *Caller, retptr: u32) WasiP2Error!void { + const ctx = caller.data(WasiP2Ctx); + const mem = try ctxMemory(caller); + const ns = wasi_clocks.clockTimeNsSigned(ctx.host, 0) catch + return WasiP2Error.NoHostIo; // precondition: the component-run path plants host.io + const inst = instantFromNs(ns); + try mem.write(retptr, inst.seconds); + try mem.write(retptr + 8, inst.nanoseconds); +} + +/// Split signed epoch-nanoseconds into the WIT `instant` encoding: FLOORED +/// seconds + a non-negative sub-second remainder (the spec's example — 1 ns +/// before the epoch — is `{-1 seconds, 999_999_999 nanoseconds}`). Seconds +/// beyond the i64 domain clamp (mirrors `clockTimeNs`'s u64 clamp). +fn instantFromNs(ns: i96) struct { seconds: i64, nanoseconds: u32 } { + const secs = @divFloor(ns, std.time.ns_per_s); + const min_s: i96 = std.math.minInt(i64); + const max_s: i96 = std.math.maxInt(i64); + return .{ + .seconds = @intCast(std.math.clamp(secs, min_s, max_s)), + .nanoseconds = @intCast(@mod(ns, std.time.ns_per_s)), + }; +} + +test "instantFromNs: floored split incl. the WIT pre-epoch example" { + // The system-clock.wit example: 1 ns before the epoch. + try std.testing.expectEqual(@as(i64, -1), instantFromNs(-1).seconds); + try std.testing.expectEqual(@as(u32, 999_999_999), instantFromNs(-1).nanoseconds); + // Positive path + exact-second boundaries. + try std.testing.expectEqual(@as(i64, 1), instantFromNs(1_500_000_000).seconds); + try std.testing.expectEqual(@as(u32, 500_000_000), instantFromNs(1_500_000_000).nanoseconds); + try std.testing.expectEqual(@as(i64, -2), instantFromNs(-2_000_000_000).seconds); + try std.testing.expectEqual(@as(u32, 0), instantFromNs(-2_000_000_000).nanoseconds); +} + +/// `wasi:clocks/{system,monotonic}-clock` `get-resolution()` → duration(u64) +/// (official WASI 0.3.0): the host clock granularity in ns, returned directly +/// as the lowered `i64`. WIT declares it infallible, so a host that cannot +/// report a resolution surfaces a loud error (never a fabricated value). +fn clockGetResolution(caller: *Caller, clock_id: u32) WasiP2Error!i64 { + const ctx = caller.data(WasiP2Ctx); + const ns = wasi_clocks.clockResNs(ctx.host, clock_id) catch |err| switch (err) { + error.Inval => unreachable, // clock id is hardcoded 0/1 at the call sites + error.NoSys, error.NotSup, error.Io => return WasiP2Error.NoHostIo, + }; + return @bitCast(ns); +} + +fn p2SystemGetResolution(caller: *Caller) WasiP2Error!i64 { + return clockGetResolution(caller, 0); +} + +fn p2MonotonicGetResolution(caller: *Caller) WasiP2Error!i64 { + return clockGetResolution(caller, 1); +} + /// `wasi:cli/stdin` `get-stdin` → mint an input-stream handle bound to fd 0. fn p2GetStdin(caller: *Caller) WasiP2Error!u32 { const ctx = caller.data(WasiP2Ctx); @@ -1448,6 +1508,9 @@ fn defineClassifiedFunc(lk: *Linker, module: []const u8, name: []const u8, op: a .cli_exit => try lk.defineFuncCtx(module, name, ctx, fn (*Caller, u32) WasiP2Error!void, p2Exit), .clocks_monotonic_now => try lk.defineFuncCtx(module, name, ctx, fn (*Caller) WasiP2Error!i64, p2MonotonicNow), .clocks_wall_now => try lk.defineFuncCtx(module, name, ctx, fn (*Caller, u32) WasiP2Error!void, p2WallNow), + .clocks_system_now => try lk.defineFuncCtx(module, name, ctx, fn (*Caller, u32) WasiP2Error!void, p2SystemNow), + .clocks_system_get_resolution => try lk.defineFuncCtx(module, name, ctx, fn (*Caller) WasiP2Error!i64, p2SystemGetResolution), + .clocks_monotonic_get_resolution => try lk.defineFuncCtx(module, name, ctx, fn (*Caller) WasiP2Error!i64, p2MonotonicGetResolution), // insecure shares the secure handler: identical signature, and the host's // secure fill over-satisfies the insecure contract (no separate RNG state). .random_get_bytes, .random_insecure_get_bytes => try lk.defineFuncCtx(module, name, ctx, fn (*Caller, u64, u32) WasiP2Error!void, p2RandomGetBytes), diff --git a/src/wasi/adapter.zig b/src/wasi/adapter.zig index 35640188c..5e2bda39d 100644 --- a/src/wasi/adapter.zig +++ b/src/wasi/adapter.zig @@ -118,6 +118,13 @@ pub const P2Op = enum { // wasi:clocks. clocks_wall_now, clocks_monotonic_now, + // wasi:clocks@0.3.0 (official WASI 0.3.0): `wall-clock` was RENAMED + // `system-clock` with `instant{seconds: s64, nanoseconds: u32}`, and both + // clocks gained `get-resolution`. The 0.3.0 async `wait-until`/`wait-for` + // need a scheduler-wired timer waitable, not a sync trampoline (D-524). + clocks_system_now, + clocks_system_get_resolution, + clocks_monotonic_get_resolution, // wasi:random. random_get_bytes, // wasi:filesystem/types — `descriptor` resource methods. A descriptor is a @@ -243,6 +250,8 @@ pub const P1Target = union(enum) { proc_exit, /// P1 `clock_time_get` for the given clock id (0=realtime, 1=monotonic). clock_time_get: u32, + /// P1 `clock_res_get` for the given clock id (0=realtime, 1=monotonic). + clock_res_get: u32, /// P1 `random_get`. random_get, /// `descriptor` (P1 fd) ops — the fd is resolved from the handle rep at @@ -289,6 +298,9 @@ pub fn p1Target(op: P2Op) P1Target { .cli_exit => .proc_exit, .clocks_wall_now => .{ .clock_time_get = 0 }, .clocks_monotonic_now => .{ .clock_time_get = 1 }, + .clocks_system_now => .{ .clock_time_get = 0 }, + .clocks_system_get_resolution => .{ .clock_res_get = 0 }, + .clocks_monotonic_get_resolution => .{ .clock_res_get = 1 }, .random_get_bytes => .random_get, .fs_descriptor_read => .fd_pread, .fs_descriptor_write => .fd_pwrite, @@ -394,6 +406,10 @@ const table = [_]Entry{ .{ .iface = "wasi:io/streams", .func = "[resource-drop]input-stream", .op = .in_stream_drop }, .{ .iface = "wasi:clocks/wall-clock", .func = "now", .op = .clocks_wall_now }, .{ .iface = "wasi:clocks/monotonic-clock", .func = "now", .op = .clocks_monotonic_now }, + // Official WASI 0.3.0 clock surface (renamed/extended vs the 0.2 WIT). + .{ .iface = "wasi:clocks/system-clock", .func = "now", .op = .clocks_system_now }, + .{ .iface = "wasi:clocks/system-clock", .func = "get-resolution", .op = .clocks_system_get_resolution }, + .{ .iface = "wasi:clocks/monotonic-clock", .func = "get-resolution", .op = .clocks_monotonic_get_resolution }, .{ .iface = "wasi:random/random", .func = "get-random-bytes", .op = .random_get_bytes }, .{ .iface = "wasi:filesystem/types", .func = "[method]descriptor.read", .op = .fs_descriptor_read }, .{ .iface = "wasi:filesystem/types", .func = "[method]descriptor.write", .op = .fs_descriptor_write }, @@ -535,6 +551,16 @@ test "p1Target: clocks + random" { try testing.expectEqual(@as(u32, 0), p1Target(.clocks_wall_now).clock_time_get); try testing.expectEqual(@as(u32, 1), p1Target(.clocks_monotonic_now).clock_time_get); try testing.expectEqual(P1Target.random_get, p1Target(.random_get_bytes)); + // Official WASI 0.3.0 clock surface (system-clock = realtime id 0). + try testing.expectEqual(@as(u32, 0), p1Target(.clocks_system_now).clock_time_get); + try testing.expectEqual(@as(u32, 0), p1Target(.clocks_system_get_resolution).clock_res_get); + try testing.expectEqual(@as(u32, 1), p1Target(.clocks_monotonic_get_resolution).clock_res_get); +} + +test "classify: official 0.3.0 system-clock + get-resolution (version-stripped iface names)" { + try testing.expectEqual(P2Op.clocks_system_now, classifyImport("wasi:clocks/system-clock", "now").?); + try testing.expectEqual(P2Op.clocks_system_get_resolution, classifyImport("wasi:clocks/system-clock", "get-resolution").?); + try testing.expectEqual(P2Op.clocks_monotonic_get_resolution, classifyImport("wasi:clocks/monotonic-clock", "get-resolution").?); } test "classify: wasi:io/poll + subscribe methods" { diff --git a/src/wasi/clocks.zig b/src/wasi/clocks.zig index 9e770f6bb..f86d72217 100644 --- a/src/wasi/clocks.zig +++ b/src/wasi/clocks.zig @@ -77,6 +77,16 @@ pub fn clockTimeGet( /// can return the value directly (its lowered `()->i64`) instead of through /// guest memory. Same clock-id mapping as `clock_time_get`; requires `host.io`. pub fn clockTimeNs(host: *Host, clock_id: u32) error{ NoSys, Inval }!u64 { + const ns_i = try clockTimeNsSigned(host, clock_id); + if (ns_i < 0) return error.Inval; + return @intCast(@min(ns_i, std.math.maxInt(u64))); +} + +/// Read a clock as SIGNED nanoseconds since its epoch. The official WASI +/// 0.3.0 `system-clock` `instant` carries signed seconds (pre-1970 instants +/// are representable), so its trampoline needs the un-clamped value; the +/// P1/0.2 paths keep the unsigned `clockTimeNs` view. +pub fn clockTimeNsSigned(host: *Host, clock_id: u32) error{ NoSys, Inval }!i96 { const io = host.io orelse return error.NoSys; const clock: std.Io.Clock = switch (clock_id) { 0 => .real, @@ -85,10 +95,7 @@ pub fn clockTimeNs(host: *Host, clock_id: u32) error{ NoSys, Inval }!u64 { 3 => .cpu_thread, else => return error.Inval, }; - const ts = std.Io.Timestamp.now(io, clock); - const ns_i = ts.toNanoseconds(); - if (ns_i < 0) return error.Inval; - return @intCast(@min(ns_i, std.math.maxInt(u64))); + return std.Io.Timestamp.now(io, clock).toNanoseconds(); } // ============================================================ @@ -106,22 +113,36 @@ pub fn clockResGet( clock_id: u32, resolution_ptr: u32, ) p1.Errno { - const io = host.io orelse return .nosys; + const ns_u = clockResNs(host, clock_id) catch |err| return switch (err) { + error.NoSys => .nosys, + error.Inval => .inval, + error.NotSup => .notsup, + error.Io => .io, + }; + return writeU64LE(mem, resolution_ptr, ns_u); +} + +/// Read a clock's resolution as a raw nanosecond `u64` — the value +/// `clock_res_get` writes to guest memory. Factored out so the WASI-P2/P3 +/// `get-resolution` trampolines (`wasi:clocks@0.3.0`) can return it directly +/// (their lowered `()->i64`) instead of through guest memory. Same clock-id +/// mapping as `clock_time_get`; requires `host.io`. +pub fn clockResNs(host: *Host, clock_id: u32) error{ NoSys, Inval, NotSup, Io }!u64 { + const io = host.io orelse return error.NoSys; const clock: std.Io.Clock = switch (clock_id) { 0 => .real, 1 => .awake, 2 => .cpu_process, 3 => .cpu_thread, - else => return .inval, + else => return error.Inval, }; const dur = clock.resolution(io) catch |err| switch (err) { - error.ClockUnavailable => return .notsup, - error.Unexpected => return .io, + error.ClockUnavailable => return error.NotSup, + error.Unexpected => return error.Io, }; const ns_i = dur.toNanoseconds(); - if (ns_i < 0) return .inval; - const ns_u: u64 = @intCast(@min(ns_i, std.math.maxInt(u64))); - return writeU64LE(mem, resolution_ptr, ns_u); + if (ns_i < 0) return error.Inval; + return @intCast(@min(ns_i, std.math.maxInt(u64))); } // ============================================================ diff --git a/test/component/wasi_p3_systemclock.wasm b/test/component/wasi_p3_systemclock.wasm new file mode 100644 index 0000000000000000000000000000000000000000..9f457b8701ae4b3a03cae3a71b45e8c433b6ae5d GIT binary patch literal 1037 zcmZ`&&2AGh5T4KWu9s{H+Y}HI0udoVAZ=TT3*vy1+~EMC;+BN%7Pe&VCc9CZOT$C( z033K5UIFm}TzCY=&QGDhVUrnqJpR6KKGU!&FB3?=Krh5Z=qk^wIjl}&Gc>#BOQftV`)KJiPCbsDg_2__qK7RV~O}-h&kEoj@{5_Ps_WkqM z;B|sTB_dJdvFdawkwF)UjJp(5XDODzbEG^}hSqo9@Bsr69#Wqp>EWn|!+te1xd_41 zvg@7*sB=m_@(j+&EF~hAM=;42JfjxrNbuy@gOY{hK?p}F3OQs0r~@aYclWxC8dpJA zit@xx>hx%8vXtwAm=C*?e2&`9%<{g;O`UoZMEd2_yn0`h2;HnEN5OS>)n8py%vNh{ ztj6tDPUAQ81sA&Fo`bmN?6q=3TWaN^rB>LYZLu65Sl(;YlB-M~<|kEJSb-93LgnE% nCBHnr*fp4rYQ!w>27No=N6W*3auyL$HY!s09%STBxcB`Fj8W_d literal 0 HcmV?d00001 diff --git a/test/component/wasi_p3_systemclock.wat b/test/component/wasi_p3_systemclock.wat new file mode 100644 index 000000000..5bd6c3b5d --- /dev/null +++ b/test/component/wasi_p3_systemclock.wat @@ -0,0 +1,65 @@ +;; Official WASI 0.3.0 clocks surface: system-clock (the renamed 0.2 wall-clock, +;; instant{seconds: s64, nanoseconds: u32}) + get-resolution on both clocks. +;; exit(0) iff now().seconds is past 2017 (> 1_500_000_000) AND both clock +;; resolutions are sane (0 < res <= 1s), else exit(1). +;; Exercises the clocks_system_now / clocks_system_get_resolution / +;; clocks_monotonic_get_resolution trampolines: now() -> instant lowers to a +;; core (i32 retptr)->() with the 12-byte record written at retptr; +;; get-resolution() -> duration(u64) lowers to ()->i64. +(component + (import "wasi:clocks/system-clock@0.3.0" (instance $sys + (type $instant-def (record (field "seconds" s64) (field "nanoseconds" u32))) + (export "instant" (type $instant (eq $instant-def))) + (export "now" (func (result $instant))) + (export "get-resolution" (func (result u64))))) + (import "wasi:clocks/monotonic-clock@0.3.0" (instance $mono + (export "get-resolution" (func (result u64))))) + (import "wasi:cli/exit@0.3.0" (instance $cli-exit + (export "exit" (func (param "status" (result)))))) + + (core module $libc (memory (export "memory") 1)) + (core instance $libc (instantiate $libc)) + (core func $sys-now (canon lower (func $sys "now") (memory $libc "memory"))) + (core func $sys-res (canon lower (func $sys "get-resolution"))) + (core func $mono-res (canon lower (func $mono "get-resolution"))) + (core func $exit (canon lower (func $cli-exit "exit"))) + + (core module $M + (import "io" "sys-now" (func $sys_now (param i32))) ;; retptr to a 12-byte instant area + (import "io" "sys-res" (func $sys_res (result i64))) + (import "io" "mono-res" (func $mono_res (result i64))) + (import "io" "exit" (func $exit (param i32))) + (import "libc" "memory" (memory 1)) + ;; 0 < res <= 1s (1_000_000_000 ns) — sane host clock granularity. + (func $res_sane (param $r i64) (result i32) + (i32.and + (i64.gt_u (local.get $r) (i64.const 0)) + (i64.le_u (local.get $r) (i64.const 1000000000)))) + (func (export "run") (result i32) + (call $sys_now (i32.const 16)) ;; write instant at offset 16 + (if (i32.and + (i64.gt_s (i64.load (i32.const 16)) (i64.const 1500000000)) ;; seconds @ 16 (s64) + (i32.and + (call $res_sane (call $sys_res)) + (call $res_sane (call $mono_res)))) + (then (call $exit (i32.const 0))) + (else (call $exit (i32.const 1)))) + (i32.const 0))) + + (core instance $deps-io + (export "sys-now" (func $sys-now)) + (export "sys-res" (func $sys-res)) + (export "mono-res" (func $mono-res)) + (export "exit" (func $exit))) + (core instance $m (instantiate $M + (with "io" (instance $deps-io)) + (with "libc" (instance $libc)))) + + (type $run-result (result)) + (func $run (result $run-result) (canon lift (core func $m "run"))) + (component $RunShim + (import "import-func-run" (func $rf (result (result)))) + (export "run" (func $rf))) + (instance $run-inst (instantiate $RunShim (with "import-func-run" (func $run)))) + (export "wasi:cli/run@0.3.0" (instance $run-inst)) +) From 79bff0e26f8077baac5bff479b26bc30422658d2 Mon Sep 17 00:00:00 2001 From: "Shota Kudo (chaploud)" Date: Fri, 17 Jul 2026 15:40:17 +0900 Subject: [PATCH 3/6] chore(handover): WASI-0.3.0-official sweep section (AOT section compressed) --- .dev/handover.md | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/.dev/handover.md b/.dev/handover.md index b1f5f042c..39fc0ec75 100644 --- a/.dev/handover.md +++ b/.dev/handover.md @@ -35,18 +35,21 @@ DA-critique 20/20) · close #146 (refutation record + v2.2.1). Key outcomes: ## AOT-full-fidelity campaign — CLOSED 2026-07-09 (ADR-0203 Implemented) -Kickoff #136 (phases I–III) · stage 1 #137 (36 helper bakes → `[rt+off]` -slots, D-516) · stage 2 #138 (format v0.5 + `load_compiled.zig` -deserializer, D-519) · stage 3 #139 (run-path swap, mini-runtime DELETED, -§4.5.4 start-func JIT bug fixed, D-517+D-518, D-520 CI hole) · stage 4 -#140 (elision serialization D-515(1)) · stage 5 #141 (`--cache` D-508; -DA-critique failure-path fixes: HIT header-gate + self-heal, refusal = -BYPASS, interp bypass) · stage V #142 (retro: bench parity record, docs, -`.cwasm --engine interp` loud refusal, lesson -failure-path-tests-certified-the-defect). Net: `zig build test-aot-diff` -cross-process differential 63/63 incl. cache lanes. **Residual = -D-515(2)** (spec-assert corpus under elision; harness memory -provisioning) + D-514 (SIMD elision symmetry) — both in debt.yaml. +PRs #136-#142: format v0.5 full-fidelity, run-path swap (mini-runtime +DELETED), elision serialization, `--cache` (D-508). `zig build +test-aot-diff` 63/63 incl. cache lanes. Residual = D-515(2) + D-514 +(debt.yaml). Details: ADR-0203 + CHANGELOG 2.2.0. + +## WASI-0.3.0-official sweep — 2026-07-17 (branch develop/wasm30-wasi03-inventory-sweep) + +**WASI 0.3.0 released 2026-06-11** (official spec at `~/Documents/OSS/WASI/`, +clones pulled). Inventory vs zwasm's draft-era P3: docs truth-sweep +(README WASI-0.3 row, --help engine-default lie, canon.zig "pending" lie, +3.0-runner "SKELETON" lie, migration GC claim — `-Dgc` is INERT, D-525) + +`system-clock`/`get-resolution` host support shipped (instant{s64,u32}, +DA check #12). Fixtures import 0.2.6 (toolchain predates release) → D-523; +async wait-until/wait-for + version-gating → D-524. Full diff record = +proposal_watch 2026-07-17 entry. ## Active front — G-senior-gap (2026-07-06, /continue entry point) From 3dd212153f9cae4bb2e9d1f07f4eae7cdf3636d9 Mon Sep 17 00:00:00 2001 From: "Shota Kudo (chaploud)" Date: Fri, 17 Jul 2026 15:42:48 +0900 Subject: [PATCH 4/6] chore(handover): compress sweep section within the 120-line hard cap --- .dev/handover.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.dev/handover.md b/.dev/handover.md index 39fc0ec75..62e1d4c14 100644 --- a/.dev/handover.md +++ b/.dev/handover.md @@ -42,14 +42,11 @@ test-aot-diff` 63/63 incl. cache lanes. Residual = D-515(2) + D-514 ## WASI-0.3.0-official sweep — 2026-07-17 (branch develop/wasm30-wasi03-inventory-sweep) -**WASI 0.3.0 released 2026-06-11** (official spec at `~/Documents/OSS/WASI/`, -clones pulled). Inventory vs zwasm's draft-era P3: docs truth-sweep -(README WASI-0.3 row, --help engine-default lie, canon.zig "pending" lie, -3.0-runner "SKELETON" lie, migration GC claim — `-Dgc` is INERT, D-525) + -`system-clock`/`get-resolution` host support shipped (instant{s64,u32}, -DA check #12). Fixtures import 0.2.6 (toolchain predates release) → D-523; -async wait-until/wait-for + version-gating → D-524. Full diff record = -proposal_watch 2026-07-17 entry. +**WASI 0.3.0 released 2026-06-11** (spec at `~/Documents/OSS/WASI/`, clones +pulled). Docs truth-sweep (README 0.3 row, --help/canon.zig/3.0-runner lies, +`-Dgc` is INERT → D-525) + `system-clock`/`get-resolution` host support +(instant{s64,u32}, DA check #12). Fixtures import 0.2.6 → D-523; async +wait-until/wait-for → D-524. Full diff = proposal_watch 2026-07-17 entry. ## Active front — G-senior-gap (2026-07-06, /continue entry point) From 591af344da54fa2a69baf8e61478af6a4dddbd55 Mon Sep 17 00:00:00 2001 From: "Shota Kudo (chaploud)" Date: Fri, 17 Jul 2026 16:40:19 +0900 Subject: [PATCH 5/6] chore(wasip3): repin gen nightly 2026-06-14 -> 2026-06-24 + regen fixtures (D-523 refined) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rust-overlay input updated (2026-07-17). Nightlies 2026-07-08/-16 cannot -Z build-std wasm32-wasip3 (upstream std/sys/env/wasi.rs OsStringExt regression) — 2026-06-24 is the newest-known-good and compiles std's wasip3 0.6.0+wasi-0.3.0-rc crate; recipe re-verified, test-wasi-p3 green. Measured refutation recorded in D-523: the regenerated fixtures STILL import wasi 0.2.6 — the imports come from the borrowed wasip2 wasi-libc (sync-main stdio/env/clock route through -lc), not the nightly's std bindings, so a nightly bump alone cannot discharge the official-WIT fixture gap. Discharge now = wasip3-native wasi-libc upstream OR the wit-bindgen fixture path. --- .dev/debt.yaml | 29 ++++++++++++++++---------- .dev/proposal_watch.md | 8 ++++--- flake.lock | 6 +++--- flake.nix | 5 ++++- test/component/wasip3/cli-args.wasm | Bin 70036 -> 71002 bytes test/component/wasip3/cli-clocks.wasm | Bin 77276 -> 78015 bytes test/component/wasip3/cli-env.wasm | Bin 57635 -> 58606 bytes test/component/wasip3/cli-exit.wasm | Bin 56382 -> 57354 bytes test/component/wasip3/cli-stderr.wasm | Bin 66983 -> 67952 bytes test/component/wasip3/cli-stdin.wasm | Bin 61485 -> 62695 bytes test/component/wasip3/cli-stdout.wasm | Bin 69295 -> 70265 bytes 11 files changed, 30 insertions(+), 18 deletions(-) diff --git a/.dev/debt.yaml b/.dev/debt.yaml index 5f07afde5..d8eb5bbe2 100644 --- a/.dev/debt.yaml +++ b/.dev/debt.yaml @@ -11,17 +11,24 @@ entries: The committed wasip3 conformance fixtures (`test/component/wasip3/*.wasm`, 7 rust CLI components) import **wasi 0.2.6 interfaces** (`wasi:cli@0.2.6`, `wasi:io@0.2.6`, `wasi:clocks/wall-clock@0.2.6`; verified via - `wasm-tools component wit` 2026-07-17) — the pinned nightly rust - wasm32-wasip3 target predates the official WASI 0.3.0 release - (2026-06-11). The corpus therefore certifies the CM-async export ABI + - the 0.2 host surface, NOT the official 0.3.0 WIT (system-clock, - via-stream stdio, async sockets). DISCHARGE: bump the `flake.nix` - `gen-wasip3` toolchain pin to a nightly whose wasip3 target emits - official 0.3.0 imports (lesson 2026-06-16-wasip3-hermetic-build-recipe - documents the fragile Darwin recipe), regen via - `scripts/gen_wasip3_fixtures.sh`, extend the host adapter as the new - imports demand. TRIGGER: rust wasip3 target maturing past Tier-3 / - first real 0.3.0-built consumer. + `wasm-tools component wit` 2026-07-17). The corpus therefore certifies + the CM-async export ABI + the 0.2 host surface, NOT the official 0.3.0 + WIT (system-clock, via-stream stdio, async sockets). + **Nightly-bump hypothesis REFUTED by measurement (2026-07-17)**: rust + std pins `wasip3 = 0.6.0+wasi-0.3.0-rc-2026-03-15` since ~2026-04-22, + and a regen on nightly-2026-06-24 (which compiles that crate) STILL + emits all-0.2.6 imports + sync `wasi:cli/run@0.2.0` — the imports come + from the BORROWED WASIP2 WASI-LIBC (`-lc` in the link recipe) through + which sync-main stdio/env/clock route, not from the nightly's std + bindings. (Also measured: nightlies 2026-07-08/-16 cannot build-std for + wasip3 at all — upstream `std/sys/env/wasi.rs` `OsStringExt` regression + — so 2026-06-24 is pinned as newest-known-good; recipe re-verified.) + DISCHARGE now requires one of: (a) upstream ships a wasip3-native + wasi-libc/self-contained objects (drop the wasip2 borrow, regen); or + (b) switch the fixture path to wit-bindgen-generated 0.3.0 bindings + (official wasi-testsuite path ①), heavier toolchain. TRIGGER: rust + wasip3 target maturing past Tier-3 / wasi-libc wasip3 release / first + real 0.3.0-built consumer. first_raised: "2026-07-17" last_reviewed: "2026-07-17" refs: |- diff --git a/.dev/proposal_watch.md b/.dev/proposal_watch.md index 207cc6b35..58959be7c 100644 --- a/.dev/proposal_watch.md +++ b/.dev/proposal_watch.md @@ -100,9 +100,11 @@ Text Encoding Builtins` (skip). -> future>`); (4) `wasi:io` is deleted upstream (CM builtins replace it) — zwasm's P2 wasi:io host stays for 0.2 guests. ALSO measured: the committed `test/component/wasip3/*.wasm` fixtures import - **wasi 0.2.6 interfaces** (the pinned nightly rust wasip3 target predates the - release) — regenerating against official 0.3.0 needs a toolchain bump - (debt D-523). Host-side `system-clock` support added this sweep. + **wasi 0.2.6 interfaces** — root cause is the borrowed wasip2 wasi-libc in + the link recipe, NOT the nightly pin (nightly-bump hypothesis refuted by a + regen on nightly-2026-06-24, which compiles std's `wasip3 0.6.0 + +wasi-0.3.0-rc` crate yet still emits all-0.2.6; details in D-523). + Host-side `system-clock` support added this sweep. - **2026-07-03** — **post-v2.0.0 maintenance sweep** (reference clones refreshed ff-only: wasmtime / WAMR / wasm-tools / component-model to upstream HEAD; spec + testsuite left at their `wg-3.0` / `spec_pin.yaml` pins). **No proposal phase diff --git a/flake.lock b/flake.lock index e092152fc..b2c496fe2 100644 --- a/flake.lock +++ b/flake.lock @@ -65,11 +65,11 @@ ] }, "locked": { - "lastModified": 1781407245, - "narHash": "sha256-VzJq4MmD0uyNDAceudSe1hHqcQMe9Tau0U4S+5iRGh0=", + "lastModified": 1784265529, + "narHash": "sha256-ohQQiPOngux8ofsrSlloHCMDhRMvocXqJiG8uH45Q5k=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "d5f483210eb016d66102eef22baa128b3b3233fc", + "rev": "068175006cfb69d5b541a140ed93e361488c9e53", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 85b74ca10..92d36829a 100644 --- a/flake.nix +++ b/flake.nix @@ -51,7 +51,10 @@ # rust there). Front-① WASI 0.3 conformance path ② (2026-06-16). # Pinned nightly (not `.latest`) for reproducibility — this exact nightly # is verified to build wasip3 via the recipe in `devShells.gen-wasip3`. - rustNightlyWasip3 = genPkgs.rust-bin.nightly."2026-06-14".minimal.override { + # KNOWN-BROKEN above this pin: nightlies 2026-07-08 / 2026-07-16 fail + # `-Z build-std` for wasip3 (upstream `std/sys/env/wasi.rs` OsStringExt + # regression, verified 2026-07-17; see D-523 before bumping). + rustNightlyWasip3 = genPkgs.rust-bin.nightly."2026-06-24".minimal.override { extensions = [ "rust-src" ]; }; in { diff --git a/test/component/wasip3/cli-args.wasm b/test/component/wasip3/cli-args.wasm index 72d65401dfd819cfea5aa6ce885371277eafeb11..2e5b34d8307494c470e76de757604727259bf444 100644 GIT binary patch delta 12639 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 A=l}o! delta 11609 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 diff --git a/test/component/wasip3/cli-clocks.wasm b/test/component/wasip3/cli-clocks.wasm index 3565f88d6c1a671ab95975c89c5c578bdcb6251c..c7c2e8791d81e990b57b3496c3ebd3be10f8a2e6 100644 GIT binary patch delta 15960 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 S%f^&ui69ZbXJIxJ$o~Tp&W|Ag diff --git a/test/component/wasip3/cli-env.wasm b/test/component/wasip3/cli-env.wasm index 87a2ca15614e0740c17da2b7a79325ee05816ec5..f83a6b03cc1e5b51480272e154c8b7181af7866b 100644 GIT binary patch delta 10890 zcmbU{2Y6J))^qN?d$TQ@yQ!Ogchd-v0tpG7+|VB#5k!4J2vHIsfh074Wdn#50f9pk z=^#Z#fmPutD*CKQQ+SA2z~Az~hX}v^zdl9z&&=Ho-y&4s_(68v_%LVo}*7kwoD$80uWph^JLuvjdr_(v#= z$#&|NiADs+ktCuYt_pM;IGNLFv2dNKvTPw3f|CU>O-WQ_yWK9!vV++{RSAU1ft?Kz zbqh5KMO76G@vB-aisFhOK3x$uSA>hcGzSA4*esf=N?{UByeDqHGy`TzZ3fPe#^iPD`gh3f+^M9ri!rurM2C*$BS+mid_J^qH+V>&wmrJv zHLiBzq`Jvd>Zd+13$j8y#wwB@+KnG4_GK4-S$EFWVI1GKYv(b;YA7T)%P&J3+8o$3ut2S+#| z>Yy!}PR$5GMh9Ke7MpFi7}X_R)|Qw(LHMO+OJ)%`zQrA`)ts7xC_4>BTaDj^7bb4x zT~2Uta>kUZBFV`oGMrV~Mr`jI3oCKEONW(#1FjX2e31i7B~pnl<*;pvaRs{3M3S*h zsnXWtG;JHK$1HcB*!AW-l5tcCiV)$@HsL&XA^~i1XTn-M=4=0 zz0;gaw=|KIuHj7EiYp?!!l)PCnWqwi(@b^J>g7DcbQbLEcx4XjGH6w6Fkbh(KX?Vicm zpdYuLwvB&D&#XuirYVvXt^wZ59N*HC@}~(vv@zpc?i5&ylGCt`^JQ|krz^aO4|!5y7q0Q-!c%zA(;@PbK$5rWbYgsKIEsVf z3*iFJjW33I_&>_#|7-3FfaDq%?q~e+i>h>X_l^*F5mvv(R1HE z{!J;KO_&1>I3ckIY{Zumlbv6RsVqi&nhL*6yusEm*amD=A02c1}S{J7>c8!spt=Vq{8; z^I`5cq%UighFFl22XnDJC9QCtaHo4f^6Nlu>6Q40d1Y-KCm@v=R$5n2@VXDenV}d~ zTGKD3bRhJfQ||WslXEMV=%7o4M&y+$9tX) ziRTR8c36f-d=KZZ0WN*-tvuHeJ{Gy{XtsjKa@aoSD```n>@UrRg`|zIkih z9K<&=t6&x8Wc6|e!v+OyV*TN) zHrdy92-AQUc%UV}s0sxcUcHRpWKD$6@!lpIqJ+2+1QPZ1#^;-km*!5#%x2U0XG^oYDBNCY)`o)0m1enkfAh7}{zq;%?47fV zV&U&OJ}SMrMQ{r5%1ugIZ(3Ei>as2e4Ssa1F!*|0lzTUk`A6u&nA-k7V%;nh6}87rU<%7$7`L1XFP$w!-t$)$ux5pN{6(BUPVRQQ0kVY{%vGW@wPRr+}w#pck;hFgxn;~4R*O45(dg~c)w;-} z{~lI%DZfz#r@MRxoA8yc1#lKGb&YO&R_rt6!4Xy3uY8^8EQdveLnu6$Dq_L3rbND7)$Jb7PLqL^ruRj&pyz#xpLO%X0=&{KH+;VUp<@Zn z`wX`2o&ulZ(C*D)DL&GDED8EU_jcr*c|FRc%MG}sN9(5FtmR5G4iSUKdXs+8h;%pz zO(29pD2#&HH(O-W+jyke(=oQNDDzE0!YAn}?TOshwCP*4)h5Rjf`At6qtkJFn_M`I zC)=b+n|I)EZPH;Oe&or-9&MdIb6XQz>Kv{G?YJ3`r4sWWZR(TS_71-W?2+ksq;2N` z*Yyx0k06o}OYldYA?GH9n|`IcO1xeP5vHP(*GerI{?vZRfmpt~t}Orpw41 zt^Z5=4DUhCtk1$tsZg*YsZWR=$)Ljs9a(?Ek`ALoi|a~z{f{BQdAzG*&x9{HDK9a} z_d{CmiNOG=eT*-6OduPd=$H|X9EgWRTCS(j+NocRKns`n$3!T&aVt?i=n7gxA;zUGrB~7dm?jw;e(1Gx4 z-k{@->v&)rt7Nv5l)qUM4I)bqZ3hZ zl5}E}bf#_Z$4OBqIEWNc=^?0yV}MX9;gKJy?%9om1aOeuw!|){rU%mzUBOPhGU@1h zUoYLdnUi)ne#3>m(%=Q$-7DYzxnP{M2Y9YmC)!!Fd;7?{diRc}^1j}q>7ab1cT@XQ z9L#u|QLZHSX$F78ygn�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 delta 10121 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 G?)QIaEABP` diff --git a/test/component/wasip3/cli-exit.wasm b/test/component/wasip3/cli-exit.wasm index c1604afc93ef0c69f8d83ddaf4c71ec9dfb3cdc1..79ab7d97ba0fb7324affe5689c414733eba0f138 100644 GIT binary patch delta 11084 zcmbVS349bq*00yy(=(HqBpnixfm}V4011)<5)ux9GzciSiZ1F31jtGPNgxTAyD|Y( zJP~<_$c><)c*g@>U4!d^iim<29_y~xuD84Ex2~)5{i}K=g63QC3%{wZdiCnnyX&C- zut&e5U0;2#aXJn6UHd>qh~^Q^TS8T&)i&tDFoZF$aqe95-1EtkM$}9sUFbdush%;n z#yggVdufp&e6tobRkzeOVua9ijk*F9N798xwK@nIi)Pm}kR;iqdBKe4nN77bYKr0m z$&=8NM0inkbM2s+a~o&QX)dX6Y-nt0Y^a@CqySZ=#cBPDD?I6R=_R_TZmuUG1YOvL z+dVydnNjse(dl}0X_S`Y6OD@L0svZy!jRn*ScnsYdn59|-}WdG9XKf`Xn;?hne6#<>KYc)Z- zE)qC;bB+C(+2I`5X8tkW_2nIbKsWVg8J-`8;u8=VysOSj^3A(NaL;{&6P(Y3nz|mxh zjwXhfrr`m%rpIF#Ny*?cDcPTtoP;mt5acJ1Wty5-!#qLIK;7@xjU+#0@|!7!-;Xx= z{eF?a?=VXkfAeY%sOk@6?F38vwt;y(5a)R z%$e8RGJnCsrbUZaP~ir;ny#Xa^aMRgPtnt~kDj5w(0lYQt=BHouFw*`dJcxsL?Bt% zBBd37LKWN?^yjRTO~>sk(1aCl2f&u~0j~>=qMP}xU}oP{%Yc}yXxLx@m3e83h?&@n8x5jcl5E;%cm?@jEQd86zPQb3Y$7S~m1K}pUD z)>$|5UlQliYMz*6)9SW)N!L^MXA)Vf(yDB&NbEA4qcjSWY0fUA&f3QL)-Kw{&s*cu zx4DyQ&OxItA9cyMwS!AjGHEl9OX=y^xEwGZJYsUFGyeR-`jFpEIW6UGITW*b3N&M6 zqOfk^Azen>@5Z2_Ncdtb2*+1v?Ue8UhVJZAL(g(TYG%Tfa-IO_-NYrSr_n}Uk~)=k z^WAAP26Q%Y7iiA+v+LO?$EHt4xh;Ko@Tfwkv5@r;f0ka5@t_3Q zWK*GTRcdw~`mxhP{$@|(A{w~9K41_{Z;L0*`VM{n_lj2=1ns8PBjWS8a~iwK+W zTNxw64@eYccc-8Z1|L=zqy63vN!7ZCM}&&$Hf{GHWEr%9){Lsp^Uy`cegkiQ9) z(MH_UDc8G4gbDdZ(q#YKI2cjU6HIq*5UeOCl)2R<==cys8)ZF0iNY})A0l*m&Jf^k$vKz)#jA4D>2tPnvr#Y3opuZ) z&4iML^)G%bHtb+TWjkAk=LFK@Vf^_T`!tLkW6wf)m)!u0IpK7=pZkX^lkS(Z zhskC16TUE9(ZQUI@MD<^g1P6yw-WP$$i?X@Ad@*!nH-LZC;lLB^0}RbU9PlM zr$bZ-27azTAg6hO*XH-qw(aIe^TUZBN?Aleb-c(Q=g*}*Jf+9UD6i|$oBqn}J;L-H z|E0$zw4Z19tfTdOsOQ*VEb<+z4j$aQ*TBMK0g@Gm!X#q`rmu_V30eJyuj;jc-e#>} zyPMFGffGlFB@#Y)#FNK1D*r7X#}P-aBAQ z>ha1}sQg*Kfx)Y8Zih=N0xNlM->Qt5^J1=}G+z-R+W?Ul`<=}V{Q}4V{~fFPXEAaT zQ^7UVBpJ6p=dAJzeP1g!uuN|$&(*%TnI9|9Lo$80d;q=6S^ZIOtLmRf2>uBb1+=nl zb!8$2?{is~L{{?Z%1`OyM~uc&f(wLiC)Zj3c5^|INKT}9CUE<$|H!TgsmzKa2I^$1I4=QB0V_O2STD;}XecKn7z$ zC;rjt0Dh#bqUR%OqKIajSO%r<*fKzGaOG0&Dy++w@x+0}bbyx*%+ogQ<{bm`5#ASt zdh%xjgAsQjQ>*Buk_qdu)MS{nD)%2&{H#IaGLAvJSfT|rM36&VGHBp{pY$OYX-*pW ziHUvj)^@3y1Hy8bIoWAlx{SXV6pC?DGB}uc3>owljhOLcPuVlLNBCJedBh{_Y#_%$ zST{;F2Wb!?`4xXZc(&;VH9tDoKCuD5SQePickfQ)l|#Gos3G0xPdt4{DC<=@V_1n~ z#kP$$1rlIp>jPi_VN<4N!+Mo_4=qE6n>zG7 z5Po=Q5xvQO9XbHXD?BV0Im8(@)%T9;Hk7k;n~? zW}Pr0MIxR~4a~BMwNuLxY?Y_xMz^}k&bvxZ=44@u>qG;4aHjj|rq+pu4Vi+io8_2@ zfX~P#Hti7@#uqU=0N_w2bu;BsNfkek789_Q0tM;lsuvPlw@j3z0Hgp&fy$|hirOVe zmB0z{4}?~B5K_o7b_ao7NzIP?k-^`c)|2kz{4uugMoBsl_>RYo$)h%&H>NbGPdTyEk^vMUTmMBqD(2aM}Sf8;si21oDS-Hs@Y=u$z@2vjt>BMZm+Ah8JR zQj5yB(GSl+;I%kDTVzH&PH?XER-Ea0^vA|xhM46 zi@Qo`$N5M4s+`7B#z9d~XFVw8P%a{Sb%~)D>UPAKq@*@%?T&~?rrXJx5u;MKA&N0n z%fg2$w9pUqWc*5cd!mw{94l8i8l9*+?E=}sfFX*6At6Sb2cSQsupv?mTXV5>>39+! zrg3AyR51WTrs^ut(js1HCSqbLuOetYENN9lUA3o48=3*zw028y*p%W)qJ_H870$5s zsva+70d*(^5?C-r$o9qu0isnXX@QZ3mJ$4PXa!my z>(*thQ4q<7E!45p3_prL?~315>T+gf3aHGr zjXY1p=jeP2$!ckxFJEOA+vLk8lwc*;Ga-WVjR|=uk4^}O+zlf<8BV8IuvDlAICtVo z8itjrYY)ko?1J-2#au44j7_#ysQD_TdW1&ZnPGvibDW zYkBeMnK<5Ar}s=%%j8CDk|6R$tBbfWUDn73Q*rjJ~Qivf)|@D52m2E@&#)GS$dDWF`xRb@73OwK<; zlS;RKFCh_lHlk9q?vyQgD6o-c;Qwjzuq?9|v?1eyhKouan`fDI3|y8iCqja$k{0qs zG`@0jx9FoT39KT=tN~6G7c!5yJ#yawV(@Iuy8D>{d`aL03(ji#7T0njkSZMM zVI)gic~Bsg?dQx1Zb-)4d)22n@N*SnX~zF1qyp7kLokIuO?mzpV zM2FjMn{tPi^P)uUj`gTCc20LUbx8javR-XlaNZv%J$4LK4)vNMy{QOC(vq{Xc+U9= zZH?!9DcZU;Z0J?7bz+}d&TIqgqw|P{ouYHMhIK}oPe)@H8Zrf-dLMdY)h86kHm=2cbwliwpA$o<&F4%zbzy$&?-NY^o4W%2u6x>j{iB+X;3`gol0sOYYHr< z^m^Nj#(pH>*Uh`kg@@-qqtT~rA2&a*N%%txWAKrSLgalzIn0W-S&N5yWbclPR=T5# zm;R3EHQpVqMEP#?d3w9;p4NQwXfOe_9a%O^OMY99wXwn1s*pQg&7jcDi_^PQ9#Rw*ZX5?*uxO+A7aEcw`%dYN= ztE7joUWBsWstf63zGGFktVZ(HR4#a(^_XYtX~(s{?)ln!y_MNtHM0d+CxCdrTZ z;M#I9<+-kJBzDURy-1$qfka(rx+fvo+`?0?YsQ_&{_BR~AQxCy2!-@t*PA}&>FYxD zPhPTaF#QkTziwbk>_XrN)A7-DMK}T$T|Y4W8hLQTMj;;=r2tzk6j|2C{JZNjaU-$* z`c3pT_g~)!6UJ|cQYa9AvT=|C6P%hnYHOkJYj{OA`%QqE(%K4j4M|sz#Q?2i$wIewDC)i?+ zwR|~yHxIYIj|05{hco9F9Le zT^aOoqfw!q4ClqC-1g+azwKiNGx<32e`1iGq#mIp9u z0^b{X%Z8jyA5iS?&zDf!Nutwzo+`b<@F>8wW(u3 z3IF?!Bn*fPS(5y5s}f%ZmzunzhhMl;VotmJfs=Mh($;m7U2B6Z!@}Ax9RS%&j1C0u z>Wyu9Yiqj*+}Boh&rY)E3|Ls&Jh!%TcJ-o$S&@>Uq^O zYg?AsjSFjJ=o7U9T~W#^QmCI5`ruRp%)$r3B^{Tk0BD)Ftr zZ@giN)%d=OUp9U(fqEEUNj?4tq6&Wiz5{sblV@`MlRm28d!O8zem2&9`jitbEAC7GppFMG8Aj}FizXkqsCO-5Iz@%<_X)!PW#iBA;1Q3{=k4RC zQX#0XAnGSHDib=D3xoO#4^;@0DuvgVUt2$~v8kn*M8Y(myBWf9R-`}&^1>8}d^Dwy z`|80~3DeP1u-A%p>ax!dM8`M4l&FrXoQ*^F>y1ahV&�=@C(Vd;#)|@1vn=G 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 diff --git a/test/component/wasip3/cli-stderr.wasm b/test/component/wasip3/cli-stderr.wasm index 1849b9740ff3efd341509687f78af196985bc62a..71e36eab2634c277dbc6085fd7bb70043c36f59a 100644 GIT binary patch delta 12522 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 delta 11485 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 diff --git a/test/component/wasip3/cli-stdin.wasm b/test/component/wasip3/cli-stdin.wasm index 8c91c558370e9e23b3e5018895d187db49b2ab09..1d05f0d9a25e5440c836cc387e5aee1f6e4b9a5a 100644 GIT binary patch delta 12288 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 Ee-_j`1ONa4 From fed022fd012f9898a6d6bbc76e7944eae57d0610 Mon Sep 17 00:00:00 2001 From: "Shota Kudo (chaploud)" Date: Fri, 17 Jul 2026 16:42:37 +0900 Subject: [PATCH 6/6] =?UTF-8?q?release:=20v2.3.0=20=E2=80=94=20CHANGELOG?= =?UTF-8?q?=20+=20version=20bump=20+=20README=20Install=20(Homebrew)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bundled into the sweep PR per user grant (single CI run). Tag v2.3.0 is cut after merge (user-granted in-session per ADR-0156); the Homebrew formula in clojurewasm/homebrew-tap points at the v2.3.0 release assets. --- .dev/handover.md | 11 +++++------ CHANGELOG.md | 31 +++++++++++++++++++++++++++++++ README.md | 21 +++++++++++++++++++++ build.zig.zon | 2 +- 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/.dev/handover.md b/.dev/handover.md index 62e1d4c14..a5157c794 100644 --- a/.dev/handover.md +++ b/.dev/handover.md @@ -5,14 +5,13 @@ ## Current state — MAINTENANCE MODE (post-v2.0.0) -**v2.2.1 is Latest** (tag `v2.2.1` @62b13a6c9, 2026-07-16 — binary-size -campaign ADR-0204: CLI −21% ReleaseSafe via D-522 stage 1; release.yml -auto-built Release + 5 assets; tag USER-GRANTED in-session per ADR-0156. -v2.2.0 = the 2026-07-09 AOT-full-fidelity line). v1 frozen at `v1.11.1`. Dev model: cut +**v2.3.0 is the release line** (tag cut 2026-07-17, USER-GRANTED in-session +per ADR-0156 — WASI-0.3.0-official sweep + system-clock + Homebrew tap +`brew install clojurewasm/tap/zwasm`; v2.2.1 = 2026-07-16 binary-size line, +v2.2.0 = 2026-07-09 AOT line). v1 frozen at `v1.11.1`. Dev model: cut a `develop/` branch from `main` → PR → CI `ci-required` 3-OS gate must be green to merge. **Release stays user-only (ADR-0156)** — never autonomously tag / -publish / cut over (v2.2.1 tag was user-granted 2026-07-16 in-session). No -active campaign; no cron self-re-arm. +publish / cut over. No active campaign; no cron self-re-arm. ## Binary-size campaign — CLOSED 2026-07-16 (ADR-0204 Implemented, v2.2.1) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f85dcbe2..d6e8fdf54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,35 @@ SemVer compatibility guarantees start at the first stable `v2.0.0` tag. ## [Unreleased] +_No changes yet._ + +## [2.3.0] - 2026-07-17 + +Inventory sweep against the officially released **WASI 0.3.0** +(2026-06-11): the first slice of the official interface set, plus a +docs truth-sweep and Homebrew packaging. + +### Added + +- **Official WASI 0.3.0 clocks surface** — `wasi:clocks/system-clock` + (0.3.0's renamed `wall-clock`; `instant{seconds: s64, nanoseconds: + u32}`, pre-1970 instants representable with the floored split) and + `get-resolution` on both clocks, served on the component host. The + async `wait-until` / `wait-for` need scheduler-wired timer waitables + and are tracked as debt (D-524). +- **Homebrew**: `brew install clojurewasm/tap/zwasm` (macOS arm64, + Linux x86_64 / aarch64), packaging the release binaries. + +### Changed + +- **wasip3 fixture toolchain repinned** nightly-2026-06-14 → + nightly-2026-06-24 (the newest nightly that can still `-Z build-std` + wasm32-wasip3 — 2026-07-08/-16 hit an upstream std regression) and + the conformance fixtures regenerated. Measured: the emitted imports + are unchanged (wasi 0.2.6) because they come from the borrowed + wasip2 wasi-libc, not the nightly's std bindings — the official-WIT + fixture gap remains open as D-523. + ### Fixed - **`zwasm --help` engine wording**: the usage text claimed @@ -29,6 +58,8 @@ SemVer compatibility guarantees start at the first stable `v2.0.0` tag. compiled in and executes by default (part of `-Dwasm=v3_0`); the guide previously described it as opt-in via `-Dgc`, which is inert (tracked as debt). +- **README gains an Install section** (Homebrew + prebuilt release + binaries). ## [2.2.1] - 2026-07-16 diff --git a/README.md b/README.md index 349752b33..536b8e070 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,27 @@ FFI-capable language, not just C. -Dstrip=true|false # default false ``` +## Install + +**Homebrew** (macOS arm64 / Linux): + +```sh +brew install clojurewasm/tap/zwasm +``` + +The `zwasm` binary is not code-signed. Homebrew installs it without a +Gatekeeper prompt on most setups; if macOS still blocks it as coming from an +unidentified developer, clear the quarantine flag once: + +```sh +xattr -d com.apple.quarantine "$(which zwasm)" +``` + +Or grab a prebuilt binary straight from the +[Releases](https://github.com/clojurewasm/zwasm/releases) page (macOS arm64, +Linux x86_64/aarch64, Windows x86_64). Building from source is in +[Quick start](#quick-start) below. + ## Quick start ```sh diff --git a/build.zig.zon b/build.zig.zon index e2ae61a09..d2620572f 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,6 +1,6 @@ .{ .name = .zwasm, - .version = "2.2.1", + .version = "2.3.0", .fingerprint = 0xfdac0191bf453d15, .minimum_zig_version = "0.16.0", .dependencies = .{