v0.5.0
Added
- Added a committed
playground/test environment that exercises full action
coverage end-to-end against a real backend (#161). scoot-wasmnow executes floating-point Wasm (W4): f32/f64 arithmetic
(add/sub/mul/div), unary ops (abs/neg/ceil/floor/trunc/nearest/sqrt),
min/max/copysign, ordered comparisons, int/float conversions, and both
trapping (iNN.trunc_fMM_s/u) and saturating (iNN.trunc_sat_fMM_s/u)
truncation, alongside the already-supported bulkmemory.copy/memory.fill.
NaN results are canonicalized for deterministic output across hosts, while
abs/neg/copysign preserve exact bit patterns;nearestrounds ties to even
and the zero sign is preserved. The static type validator now type-checks the
float opcodes too, so float modules load and run end-to-end. A robustness
suite now feeds truncated, byte-corrupted, and random/hostile module bytes
through the loader and asserts every input yields a structured load error or
trap instead of crashing. Full spec-conformant validation beyond the
supported subset remains a later phase (#100).- Added a native
wasm_toolAgent action for compute-only local Wasm packages.
It validates the package boundary, requiresentry = "_start"plus
policy.tomlgranting onlycompute, and runs the configuredscoot-wasm
host argv directly instead of giving the model a broadbashcommand.
With the default host config, Scoot now prefers a siblingscoot-wasmnext to
the runningscootbinary before falling back to PATH. - Added a copyable Wasm compressor plugin template, a deterministic redactor
compressor example, andscripts/check-wasm-examples.shto build, validate,
and smoke-test the example packages. scoot-wasmnow performs a W3 static function-body type validation pass for
the current host subset before execution. It checks operand/control stack
shapes, block/loop/if signatures, branch labels, direct and indirect call
signatures, local/global access, memory/table presence, and immutable globals,
so malformed type/index errors fail module loading instead of reaching the
interpreter. Full spec-conformant validation beyond the supported subset is
still a later phase (#100).scoot-wasmnow runswasm32-wasicommand modules over a minimal WASI
preview1 subset (W2):scoot-wasm wasi <module.wasm> [args...]instantiates
the module, runs_start, pipes this process's stdin to fd 0, forwards the
module's stdout/stderr, and exits with itsproc_exitstatus. The exposed
surface is a pure data-transform sandbox: the only channels are stdin
(fd_read, fd 0), stdout/stderr (fd_write, fd 1/2), argv (args_*), and
proc_exit. No environment, clock, randomness, filesystem, or network is
exposed —environ_*,clock_time_get,random_get, and every other WASI
import trap by construction, so a plugin's output is a pure function of its
(stdin, argv). Out-of-bounds guest pointers return EFAULT and non-stdio fds
return EBADF. This is the intended subprocess host for external compression
plugins (#100).scoot-wasmnow executes integer Wasm functions (W1): a dependency-free Zig
stack machine with structured control flow (block/loop/if/else/br/br_if/
br_table/return/call/call_indirect), i32/i64 arithmetic, a bounds-checked
64 KiB-page linear memory (load/store, memory.size/grow), globals, a funcref
table, and active data/element segments. Every fault is a structured trap
(unreachable, divide-by-zero, integer overflow, out-of-bounds memory/table,
indirect-call type mismatch) bounded by fuel, call-depth, and memory-page
limits. Invoke withscoot-wasm run <module.wasm> <export> [int args...].
The engine is compiled only into the standalonescoot-wasmbinary
(-Dwasm-host=true); the zero-dependency core never links it. Full
spec-conformant validation beyond the supported subset remains a later
phase (#100).- Release workflow now publishes a separate
scoot-wasm-<target>.tar.gzarchive
(plus.sha256) for every target, built in the same job via
-Dwasm-host=true. The optional standalone Wasm compute-unit host is now a
downloadable artifact, not a build-from-source-only binary. - Added a Homebrew tap publish job (
brew install jamiesun/tap/scootand
brew install jamiesun/tap/scoot-wasm). Thescoot-wasmformula depends on
scoot, so installing the host also installs the agent; the default
wasm_hostthen resolvesscoot-wasmfromPATH. The job no-ops unless a
HOMEBREW_TAP_TOKENsecret is set, mirroring the optional Docker Hub publish.
Changed
- Release archives now ship a single
ReleaseSafeflavor per target instead of
bothReleaseSafeandReleaseSmall. Users who need a smaller binary compile
from source with-Doptimize=ReleaseSmall; the published release notes carry a
permanent footer documenting this and the optional Wasm host.
Removed
- Dropped the
-small(ReleaseSmall) release artifacts and the installer's
SCOOT_INSTALL_FLAVORvariable.install.shnow downloads the single
published flavor. - Narrowed the Wasm plugin sandbox to stdin/stdout/stderr/argv as a new hard
rule: no filesystem, network, clock, or randomness authority (#164).
Documentation
- Rewrote the README to be human-friendly and concept-first, and refreshed the
infographic with an isometric hero image (#160, #165). - Removed the redundant README language link and translated remaining Chinese
comments and strings to English (#146, #153).
Install
curl -fsSL https://raw.githubusercontent.com/jamiesun/scoot/main/install.sh | shmacOS (Homebrew):
brew install jamiesun/tap/scoot # the agent
brew install jamiesun/tap/scoot-wasm # optional Wasm compute-unit host (pulls in scoot)Build flavors
Prebuilt archives are ReleaseSafe only (runtime safety checks on). If you
need a smaller binary, compile from source:
zig build -Doptimize=ReleaseSmall # smallest, fewer safety checksEach target also ships a separate scoot-wasm-* archive: the optional
standalone Wasm host. The zero-dependency core scoot binary never embeds it.