Skip to content

Rete 0.3.5

Choose a tag to compare

@github-actions github-actions released this 20 Oct 13:24
· 76 commits to main since this release
4cc5bd6

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 export keeps 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 fixed release.yml: a single release for the
    v0.3.5 tag that holds both the CLI and the File Explorer assets, a
    prerelease only for -rc/-alpha/-beta tags, 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.
    ruzstd 0.9.1 (RUSTSEC-2026-0344, a decompression bomb on the decode path
    the browser/Node engine uses for every compressed section) and rustls
    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 ruzstd 0.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, npm rete-graph, the
    playground) uses for every compressed .rete section it reads, including
    remote files; native builds decode through the C zstd library and were
    not affected.
  • rustls 0.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.yml marked 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 with make_latest set. release.yml and
    desktop-release.yml both built for v* tags and both created a release —
    v0.3.4 got two. release.yml now owns it: it creates a draft right after the
    version check, desktop-release.yml waits for that draft and uploads into
    it, and release.yml publishes 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 fake gh.

  • The release body is this changelog's section for the tagged version,
    not the static docs/release.md that still announced "Rete 0.3.0". A tag
    whose ## [X.Y.Z] section is missing fails before anything is published.
    docs/release.md is now the release guide and documents the flow.

  • Java client versions are in the lockstep gate. scripts/sync_versions.py
    did not know about clients/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 export stays within --memory-budget-mb on 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.sh is the full-size measurement. What the
    budget bounds, and the floor it keeps, is in the CLI reference.


Install, artifact list, download verification and known limitations: release guide. Full history: CHANGELOG.md.