Repository navigation
v0.11.2
Bumps every manifest to 0.11.2 (scripts/bump_version.py 0.11.2; --check 0.11.2 reports all 26 manifests in lockstep; Cargo.lock regenerated; CITATION.cff date-released set by the bump). The libexpanse.so.1 soname and the libJudy.so.1 compat link do not depend on the crate version and are unchanged.
0.11.2 is a patch release. The Rust public-API snapshot (.github/public-api/) and the C header (include/expanse.h) are unchanged since v0.11.1.
Highlights
- Dead code elimination in core trie engine: Removed unused private internal functions and methods with no callers across all configurations (
alloc_node_plain,alloc_node_dispatch,insert_pathless,remove_pathless,ins_slot_pathless,ImmedBuf::insert,ImmedBuf::remove,ExpanseSetCore::remove_dispatch,version_try_lock_if_ptr,version_unlock_if_ptr,ensure_branch_pop0, andinsert_slot), reducing binary footprint without touching public API or ABI contracts (#1429, Refs #1367). - Release and supply chain hardening: Release workflow now runs under pinned runner images and toolchains, commit-pinned GitHub actions, and hardened token permissions. The release pipeline enforces signed release tags, draft-first asset verification with local-versus-remote byte comparison, and pre-release smoke testing across platforms (#1402, #1403, #1405, #1406, #1407, #1408, #1415, #1420, #1422, #1424, #1427, Refs #1372, Refs #1424).
- Callgrind and benchmark determinism: Added dedicated deterministic instruction benchmarks for atomic read-modify-write (
compare_exchange,update) paths, and host contention monitoring based on foreign process counts on pinned CPUs (#1410, #1411, #1413, #1416, Refs #1280, Refs #1395).
Changes by subsystem
Core & Engine
- Dead code removal (#1429, Refs #1367): Removed internal helper functions in
alloc.rs,map.rs,mutate.rs,set.rs,occ.rs,sync.rs, andblobmap.rsthat had no live call sites in any configuration. - MSRV compatibility in occ-stats (#1419, Refs #1395): Gated
fetch_updatedeprecation attribute to retain compatibility with Rust 1.88 MSRV, which predatestry_update.
Release & Supply Chain Infrastructure
- Workflow pinning and linter integration (#1427, Refs #1424): Runner images, toolchains, and package managers (npm 12.2.0, wasm-pack 0.15.0) pinned to exact versions;
python.ymlbrought under workflow linter; actions pinned by full commit hash with persist-credentials disabled. - Canary and release gates (#1420, #1423, #1428, Refs #1371, Refs #1372): Manual release dry-run canary skips publishing environments; asset readback validates download bytes; paginated GitHub API runs helpers deduplicated across scripts.
- Two-phase publication and signature enforcement (#1402, #1403, #1405, #1406, #1407, #1408, Refs #1372): Draft-first release flow with smoke-tested archives, pre-release tagging policy, Go module tag drift guards (#1404), and committed release key validation.
Benchmarks & Tooling
- Callgrind deterministic instruction harnesses (#1411, #1416, Refs #1395): Dedicated benchmark binaries for concurrent map and blobmap atomic RMW operations with explicit path assertions and isolated teardown.
- Measurement host contention controls (#1410, #1413, Refs #1280): Contention detection tracks foreign process execution on pinned CPUs rather than clock skew.
- Diagnostic records (#1409, #1412, #1414, #1418, Refs #1096, Refs #1280, Refs #1399): Recorded Section 32 soundness gates and Section 34 diagnostic results.
ABI Parity & Documentation
- Stated deferral issue tracking (#1401, Refs #1397): Parity checker enforces citation of open issues for deferred language bindings and fails when referenced issues are closed.
- Citation metadata (#1394): Added version DOIs for releases v0.10.1 through v0.11.1 in
CITATION.cff.
Upgrade notes
- 0.11.2 is fully backward-compatible with 0.11.1 and 0.11.0.
- No public Rust API changes (
.github/public-api/identical). - No C ABI changes (
include/expanse.handinclude/Judy.hidentical). - Binaries and libraries can be upgraded in place without recompilation of consumer code.
Checksums table
| Artifact | SHA-256 |
|---|---|
expanse-0.11.2-x86_64-unknown-linux-gnu.tar.gz |
(pending release) |
expanse-0.11.2-aarch64-unknown-linux-gnu.tar.gz |
(pending release) |
expanse-0.11.2-riscv64gc-unknown-linux-gnu.tar.gz |
(pending release) |
expanse-0.11.2-x86_64-unknown-linux-musl.tar.gz |
(pending release) |
expanse-0.11.2-aarch64-apple-darwin.tar.gz |
(pending release) |
expanse-0.11.2-x86_64-apple-darwin.tar.gz |
(pending release) |
expanse-0.11.2-x86_64-pc-windows-msvc.zip |
(pending release) |
Before tagging
- This PR is the last merge before the tag.
main's full CI must be green at the merge commit. - Run the canary:
gh workflow run release.yml --ref main -f dry_run=true, whilemainis still at the merge commit. - Tag with
python3 scripts/tag_release.py 0.11.2, then push the one ref it prints.
Verified by running
python3 scripts/bump_version.py 0.11.2(RUN:[SUCCESS] 26 manifests updated to version 0.11.2.)python3 scripts/bump_version.py --check 0.11.2(RUN:[SUCCESS] All manifests match expected version: 0.11.2)git diff v0.11.1..origin/main --stat -- .github/public-api include crates/expanse/src(RUN:8 files changed, 7 insertions(+), 141 deletions(-))python3 scripts/check_release_workflow.py(RUN:check_release_workflow: 8 publishing jobs wait for promote and skip a pre-release tag; every job is behind the gate; 12 call sites are as written; actions are pinned by commit, checkouts drop the token, the toolchain is exact; global tools use pinned versions, cargo build carries --locked)gh workflow run release.yml --ref chore/release-0.11.2 -f dry_run=true(RUN:✓ Created workflow_dispatch event for release.yml at chore/release-0.11.2)gh run view 37842798832 --json conclusion(RUN:{"conclusion": "success"})gh run view 37842841434 --json conclusion(RUN:{"conclusion": "success"})
Not verified
- Live publishing to package registries (publish disabled for dry-run verification).
claims: 7 verified, 0 derived, 0 labelled
What's Changed
Other Changes
- docs(citation): add the version DOIs of v0.10.1 to v0.11.1 by @orieg in #1394
- ci(abi): cite an open issue for the binding deferrals and fail when a deferral's issue is closed (Refs #1397) by @orieg in #1401
- ci(release): refuse a release tag that a committed key did not sign (Refs #1372) by @orieg in #1402
- ci(release): carry the curated notes in the signed tag and lead the GitHub Release with them (Refs #1372) by @orieg in #1403
- ci(nightly): fail when a release tag has no Go module tag on its commit (Refs #1372) by @orieg in #1404
- ci(release): create the release as a draft, read its assets back, then publish (Refs #1372) by @orieg in #1405
- ci(release): smoke-test the archives on three platforms before anything is promoted (Refs #1372) by @orieg in #1406
- ci(release): a pre-release tag builds, attests and smoke-tests, and publishes nothing (Refs #1372) by @orieg in #1407
- ci(release): pin actions by commit and the toolchain by version, drop persisted tokens, audit egress (Refs #1372) by @orieg in #1408
- bench(patricia): record diagnostic D2, two runs, all three clauses met (Refs #1096) by @orieg in #1409
- fix(bench): judge host contention on what ran, not on two clocks' difference (Refs #1280) by @orieg in #1410
- docs(bench): record the §32 soundness gates and the P32.2 table in the concurrency README by @orieg in #1412
- bench(callgrind): a second binary for the shipped compare_exchange and update entry points by @orieg in #1411
- fix(bench): count exited foreign processes once and on the pinned CPUs, and refuse an incomplete record (Refs #1280) by @orieg in #1413
- docs(patricia): record D2 as INTERMEDIATE, with the 4 KiB control and without the attribution (Refs #1096) by @orieg in #1414
- bench(concurrency): hold the §34 blob-peak runs until the design can decide the question (Refs #1280) by @orieg in #1418
- bench(callgrind): keep teardown out of the rmw arms, and assert which path each takes (Refs #1395) by @orieg in #1416
- ci(release): a manual run cannot publish, the signature is bound to the built commit, and the linter compares conditions exactly (Refs #1372) by @orieg in #1415
- ci(release): skip the release-environment jobs on a manual canary, so a canary can end green (Refs #1372) by @orieg in #1423
- fix(release): compare downloaded bytes against local in readback (Refs #1372) by @orieg in #1420
- chore(occ-stats): allow deprecated fetch_update (MSRV 1.88 lacks try_update) (Refs #1395) by @orieg in #1419
- ci(release): pin npm@12.2.0 and wasm-pack@0.15.0, and lock cargo build, publish and the hwcaps build (Refs #1372) by @orieg in #1422
- test(release-scripts): make the gate tests reach the paths they name, and fail the Go-tag guard on an empty listing (Refs #1372) by @orieg in #1421
- ci(release): pin runner images, toolchains, and bring python.yml under linter (Refs #1424) by @orieg in #1427
- chore(scripts): deduplicate GitHub API paginated runs helper (Refs #1371) by @orieg in #1428
- chore(core): remove dead code with no callers in any configuration (Refs #1367) by @orieg in #1429
- chore(release): 0.11.2 by @orieg in #1430
Full Changelog: v0.11.1...v0.11.2