Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,11 @@ max_line_length = unset
[config/upstream-cache/data.toml]
max_line_length = 200

# The signature registry's JSON is written from the YAML beside it, whose labels fit the line length there and
# run a few characters past it once JSON has indented and quoted them. A string value cannot wrap.
[libs/gpu-probe/signatures.json]
max_line_length = unset

# pnpm writes each package's `resolution: {integrity: sha512-...}` on one line, which exceeds the line length.
[**/pnpm-lock.yaml]
max_line_length = unset
Expand Down
8 changes: 7 additions & 1 deletion .mise/config.mingw.toml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,13 @@ rusty_v8_src = ":http:denoland/rusty_v8/releases/download/v150.4.0"
# The v8 build script decompresses the archive to `rusty_v8.lib` under its deterministic gn_out dir, but
# rustc on windows-gnu only accepts the `librusty_v8.a` spelling -- prefetch:mingw stages that copy.
# Debug-profile path; a release build needs the same staging under target/x86_64-pc-windows-gnu/release.
rusty_v8_gn_obj = "{{ vars.config_root_fwd }}/target/x86_64-pc-windows-gnu/debug/gn_out/obj"
# gn_out sits three levels above the build script's OUT_DIR, which cargo lays out as `build/v8/<hash>/out`, so
# it lands inside `build/`. Staged anywhere else, the gnu build stops on
# error: could not find native static library `rusty_v8`, perhaps an -L flag is missing?
# as `override (mingw)` did with cargo 1.100 at commit
# https://github.com/edge-toolkit/core/commit/4dc5d21fb14bf5f8498f6556fd94211acb431f56, at
# https://github.com/edge-toolkit/core/actions/runs/43299211943/job/131465770156.
rusty_v8_gn_obj = "{{ vars.config_root_fwd }}/target/x86_64-pc-windows-gnu/debug/build/gn_out/obj"
# winlibs GCC's bin dir, as an absolute path for the same reason config.windows.toml's win_llvm_bin is one.
# mise flattens `_` to `-` in the install dir (winlibs-mingw, not winlibs_mingw). The version segment must
# match the [tools] pin above (conftest's version_drift enforces).
Expand Down
24 changes: 24 additions & 0 deletions .mise/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -877,6 +877,8 @@ CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS = "{{ vars.wasm_rustflags }}"
# belt-and-braces (the download code path is gone).
ORT_LIB_LOCATION = "{% if os() == 'windows' %}{{ vars.ort_loc_win }}{% else %}{{ vars.ort_loc_unix }}{% endif %}"
ORT_SKIP_DOWNLOAD = "1"
# The ONNX Runtime library et-ws-wasi-runner opens when a guest first uses `wasi:nn`, out of that same install.
ORT_DYLIB_PATH = "{{ vars.ort_loc_unix }}/lib/libonnxruntime.{% if os() == 'macos' %}dylib{% else %}so{% endif %}"

[tasks]
ec = "editorconfig-checker"
Expand Down Expand Up @@ -944,6 +946,7 @@ depends = [
"gen-help-check",
"gen-specs-check",
"gitleaks-check",
"gpu-probe-signatures-check",
"hadolint-check",
"j2lint-check",
"jscpd-check",
Expand Down Expand Up @@ -2681,6 +2684,27 @@ depends = ["gen:dockerignore"]
description = "Fail if .dockerignore is stale vs .gitignore (run `mise run gen:dockerignore`)"
run = "git diff --exit-code -- .dockerignore"

[tasks."gen:gpu-probe-signatures"]
description = "Regenerate libs/gpu-probe/signatures.json from the signatures.yaml beside it"
# The signature registry is kept as YAML, which takes comments and reads well in a diff, and embedded as JSON.
# `et-gpu-probe` embeds it when the crate is compiled, which a consumer of the published crate does with none of
# this repository's tools, so the JSON is committed beside its source rather than made by a build script. It is
# staged under target/ and renamed into place for the reason the .dockerignore above is: a build running beside
# this never reads half a file. The files are not named `registry`, which .gitignore keeps for the one a hub saves.
run = '''
coreutils mkdir -p target
staged="target/gpu-probe-signatures.$$"
trap 'coreutils rm -f "$staged"' EXIT
yq -o json libs/gpu-probe/signatures.yaml | coreutils tr -d '\r' >"$staged"
coreutils mv -f "$staged" libs/gpu-probe/signatures.json
'''
shell = "{{ vars.task_shell }}"

[tasks.gpu-probe-signatures-check]
depends = ["gen:gpu-probe-signatures"]
description = "Fail if libs/gpu-probe/signatures.json is stale (run `mise run gen:gpu-probe-signatures`)"
run = "git diff --exit-code -- libs/gpu-probe/signatures.json"

# Fail when HEAD does not already contain origin/main, because a stale branch makes every other check untrustworthy.
# A branch behind main runs its lints against code the rest of the repo has already moved past, so failures land in
# files the branch never touched and read as though the branch broke them. No linter can express this -- it is git
Expand Down
18 changes: 2 additions & 16 deletions .mise/config.windows.toml
Original file line number Diff line number Diff line change
Expand Up @@ -164,15 +164,6 @@ py3_win_fwd = "{{ vars.a_mise_installs_fwd }}/python/3.13.16/python.exe"
# ORT_LIB_LOCATION in config.toml [env] picks this on Windows. Version segment must match the
# [tools] pin (conftest's version_drift enforces this).
ort_loc_win = '{{ vars.mise_installs }}\github-microsoft-onnxruntime\1.22.0'
# The same install's DLL dir, prepended by the [env] `_.path` below so a binary linking ORT can start.
# ORT_LIB_LOCATION only tells the build where to link from; at load time Windows resolves onnxruntime.dll
# through the classic search, which reaches PATH but not the mise install dir. Until a test linked the
# et-ws-wasi-runner library nothing exercised that -- the runner binary is built but never started in the
# image -- so the servercore container aborted test enumeration outright:
# error: creating test list failed
# for `et-ws-wasi-runner::ws_backend`, command `...\ws_backend-<hash>.exe --list --format terse`
# aborted with code 0xc0000135: The specified module could not be found. (os error 126)
ort_bin_win = '{{ vars.ort_loc_win }}\lib'
# llvm-mingw's bin dir (the github:mstorsjo/llvm-mingw install above).
# The linker/dlltool [env] vars below point at absolute exes in here rather than bare names because mise's
# cargo backend doesn't activate llvm-mingw onto the cargo: source-build subprocess's PATH: a bare `clang`
Expand Down Expand Up @@ -246,12 +237,8 @@ CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER = "{{ vars.win_llvm_bin }}\\clang.
CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_RUSTFLAGS = "-Cdlltool={{ vars.win_llvm_bin }}\\llvm-dlltool.exe"
LIBCLANG_PATH = "{{ vars.win_libclang }}"
PYO3_PYTHON = "{{ vars.py3_win }}"
# Force ort-sys to prefer dynamic linkage on Windows.
# Otherwise it defaults to static ("could not find native static library `onnxruntime`"), but the Microsoft
# ORT release ships only a DLL + import lib, no static archive. Not needed on Linux/macOS where the dynamic
# default already matches the .so / .dylib that ship in the release. The workspace `ort` dep keeps `copy-dylibs`
# so the DLL lands next to linked binaries.
ORT_PREFER_DYNAMIC_LINK = "1"
# The ONNX Runtime library et-ws-wasi-runner opens: the Windows install's, in place of the one config.toml names.
ORT_DYLIB_PATH = '{{ vars.ort_loc_win }}\lib\onnxruntime.dll'
# Prepend conda:m2-gnupg's nested binary dir to PATH.
# mise's per-tool .mise-bins resolves `<install>/bin/X` and `<install>/Library/bin/X` cleanly, but
# msys2-format packages put binaries one level deeper at `<install>/Library/usr/bin/X`. Without this,
Expand All @@ -267,7 +254,6 @@ _.path = [
"{{ vars.m2_gnupg_bin }}",
"{{ vars.m2_make_bin }}",
"{{ vars.maven_bin }}",
"{{ vars.ort_bin_win }}",
"{{ vars.win_libclang }}",
]

Expand Down
12 changes: 10 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ Changelog 1.1.0.
event gains a `gpu_numeric_probe` object: how many probes were answered, how many were not correctly rounded, which
of two legal answers the device gave where there are two, a fingerprint of every result, and the known GPU that
answers the same way. The probe set, its shaders and correctly rounded answers are the new `et-gpu-probe` crate,
which drives no GPU itself. The module's `gpu.renderer` now falls back to WebGL's renderer string where a browser
blanks the WebGPU adapter's.
which drives no GPU itself. Its `host` answers the probes on the CPU, and its `HOST` and `WASI_NN` name the
interfaces a signature is measured through with no browser. The module's `gpu.renderer` now falls back to WebGL's
renderer string where a browser blanks the WebGPU adapter's.
- A WASI module can read a lidar. `et-ws-wasi-runner`'s new `lidar` feature, on by default, hosts
`et:ws-wasi/serial`, lending a guest the serial ports its `SERIAL_PORTS_<NAME>` variables name: a device, or
`tcp://<host>:<port>` for one a bridge such as ser2net serves. The interface's own `serial-host` world, which the
Expand Down Expand Up @@ -176,6 +177,13 @@ Changelog 1.1.0.

### Changed

- A board hosts `wasi:clocks/wall-clock`, which every guest built with Rust 1.100 imports for its standard library's
locks. A board keeps no calendar, so the time it gives is how long its clock has run. The interface moves from
`edge_toolkit::board::COVERAGE_IMPORTS` to `HOSTED_IMPORTS`.
- **Breaking:** `et-ws-wasi-runner` built with `nn` no longer links ONNX Runtime: it opens the library when a guest
first uses `wasi:nn`. Set `ORT_DYLIB_PATH` to the library to use, as the runner's image now does, or keep one
beside the runner. Without either it asks the system for one by name, and on Windows that is the older copy in
System32, which the runner refuses by version.
- **Breaking:** `et_ws_wasi_runner::run_module` takes the serial ports it lends a component as a fifth argument, a
`BTreeMap` from each port's name to its device. Pass an empty map to lend none, as a build without the `lidar`
feature does whatever it is given.
Expand Down
8 changes: 5 additions & 3 deletions CHECKS.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Checks

- **Generated:** 2026-11-10
- **Checks:** 84
- **Generated:** 2026-11-12
- **Checks:** 85
- **Tools:** 49
- **Shell-script checks:** 10
- **Shell-script checks:** 11
- **Checks with a repair pass:** 22
- **Rules:** 381 custom local rules, or non-default strict linter settings
- **Meta rules:** 22 of those rules are rules about rules
Expand Down Expand Up @@ -1307,6 +1307,8 @@ Rules, from `config/taplo`:
- `dockerignore-check` (`default` env; run by `check:rust`) -- Fail if .dockerignore is stale vs .gitignore (run `mise
run gen:dockerignore`).
- `gen-specs-check` (`default` env; run by `check:rust`) -- Fail if any checked-in et-int-gen artifact is stale.
- `gpu-probe-signatures-check` (`default` env; run by `check:rust`) -- Fail if libs/gpu-probe/signatures.json is stale
(run `mise run gen:gpu-probe-signatures`).
- `mise-lock-check` (`default` env; run by `check:rust`) -- Fail if .mise/mise*.lock or .mise/locks/ differ from what a
full install resolves.
- `readme-mise-version-check` (`default` env; run by `check:rust`) -- Fail if README.md's mise version differs from
Expand Down
126 changes: 126 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading