Repository navigation
Rete 0.3.5
Where 0.3.5 is published: every channel. crates.io (rete-core,
rete-graph, rete-cli, rete-wasm), PyPI and npm (rete-graph), the
GitHub release with its native archives, browser bundle, Blender add-on and
.mcpb, the container images on GHCR (rete-cli, rete-relay, rete-dev),
the Claude Desktop extension on the bucket (rete-0.3.5.mcpb and the
rete.mcpb link), the Pyodide fallback wheel, and the desktop File Explorer
installers.
Not published to crates.io: the publish-time security gate blocked it on RUSTSEC-2026-0381/0382 (advisories published after the tag), fixed in 0.3.6. crates.io goes from 0.3.4 to 0.3.6.
What 0.3.5 changes on top of 0.3.4:
rete exportkeeps peak RSS within--memory-budget-mb(plus about
0.4 GB). The native CLI now uses jemalloc, the caches count what the
allocator really hands out, the open's chunk and tile directories are
counted against the budget, and 1/32 of it is held back for transient
reads. Output is byte-identical to 0.3.4; a given budget buys less cache,
so the same number can be slower on very large files. Details below.- One GitHub release per tag, marked Latest, with these notes. This is
the first release cut by the fixedrelease.yml: a single release for the
v0.3.5tag that holds both the CLI and the File Explorer assets, a
prerelease only for-rc/-alpha/-betatags, its body taken from this
section, and the crates.io receipt attached. - Security: the wasm engine's zstd decoder and the TLS stack are patched.
ruzstd0.9.1 (RUSTSEC-2026-0344, a decompression bomb on the decode path
the browser/Node engine uses for every compressed section) andrustls
0.23.46 (RUSTSEC-2026-0346 to -0349). Details below. - Java client versions follow the release. The Java POMs and FFI crate
are now in the lockstep gate and are stamped 0.3.5 with everything else.
Repository-only changes in this release, with no effect on the published
packages: the scholar export driver (scripts/export_scholar_nquads.sh)
charges the .nq.gz at a measured 2.25× the .rete, watches free disk while
an export runs, and reads its state.tsv without shifting empty fields
(#298); the five rebuilt openaire-2021 shards are locked in
web/datasets.lock.json (#299).
Security
- The pure-Rust zstd decoder is
ruzstd0.9.1 (was 0.7.3), fixing
RUSTSEC-2026-0344: a tiny crafted frame could exhaust memory. This is the
decoder the browser/Node engine (rete-wasm, npmrete-graph, the
playground) uses for every compressed.retesection it reads, including
remote files; native builds decode through the Czstdlibrary and were
not affected. rustls0.23.46 (was 0.23.42–0.23.45 across the lockfiles), fixing
RUSTSEC-2026-0346 to -0349 in the TLS stack behind remote reads over HTTPS.
Fixed
-
Release automation: one GitHub release per
v*tag, and the Latest badge
moves again.release.ymlmarked every 0.x release a prerelease, so
GitHub's Latest badge stayed on v0.3.0 (an empty, hand-made release) through
0.3.4; only a semver prerelease (-rc.1,-alpha, …) is a prerelease now,
and a final release is published withmake_latestset.release.ymland
desktop-release.ymlboth built forv*tags and both created a release —
v0.3.4 got two.release.ymlnow owns it: it creates a draft right after the
version check,desktop-release.ymlwaits for that draft and uploads into
it, andrelease.ymlpublishes it once its assets are attached. Lookups list
releases with drafts included, so re-running either workflow reuses the
release instead of duplicating it. The logic lives in
scripts/github_release.py, tested against a fakegh. -
The release body is this changelog's section for the tagged version,
not the staticdocs/release.mdthat still announced "Rete 0.3.0". A tag
whose## [X.Y.Z]section is missing fails before anything is published.
docs/release.mdis now the release guide and documents the flow. -
Java client versions are in the lockstep gate.
scripts/sync_versions.py
did not know aboutclients/java, which stayed at 0.3.0 through three engine
releases. It now checks and stamps the parent POM, both module POMs, the wasm
FFI crate and the engine-version test, and requires them to agree exactly;
they are at 0.3.5. -
rete exportstays within--memory-budget-mbon large files. The
caches the budget caps did stay within it, but peak RSS did not: on the
14.75 GiB openaire-2021-relation at the default 4096 MB it reached 7.2 GB
(1.76×), and 5.1–8.2 GB on other scholar files. The live heap never left
~4.3 GB; glibc kept ~2.8 GB of freed memory it could not hand back, and 88 MB
of chunk and tile directories sat outside every cap. Now:- the CLI uses jemalloc (non-MSVC targets, pinned
tikv-jemallocator
0.6.1, +0.46 MB to the binary), tuned to return freed pages within
300 ms from a background thread; - the caches charge each body what the allocator really gives it (a chunk
just over 64 KiB takes 80 KiB), not its length; - the open's fixed directories (
Rete::fixed_overhead) are subtracted from
the dictionary's share, and N/32 (at most 128 MiB) is held back for the
window and in-flight reads; - a bounded export prefetches at most 64 dictionary chunks per read instead
of a whole window's worth at once.
Peak RSS on openaire-2021-relation: 1422 MB at 1024, 4352 MB at 4096 and
8452 MB at 8192 (0.3.4: 7256 MB at 4096); on datacite (9.8 G quads) 8248 MB
at 8192, where 0.3.4 peaked at 16.7 GB. The dump is byte-identical at every
budget and to 0.3.4. A budget now buys less cache than it used to, so the
same number is slower on a file whose decoded dictionary dwarfs it:
openaire-2021-relation takes 10 345 s at 4096 against 7 811 s on 0.3.4, and
5.4 h at 1024; at equal peak RSS (8192 now, 4096 before) it is 3.8× faster.
RETE_MEM_TRACE=<seconds>prints RSS against the caches during an export;
scripts/export_memory_profile.shis the full-size measurement. What the
budget bounds, and the floor it keeps, is in the CLI reference. - the CLI uses jemalloc (non-MSVC targets, pinned
Install, artifact list, download verification and known limitations: release guide. Full history: CHANGELOG.md.