From 7155409202cd23da7013dea72f3da3dd6a5484fc Mon Sep 17 00:00:00 2001 From: osobh Date: Sat, 19 Sep 2026 18:22:56 -0700 Subject: [PATCH] chore(release): v2.5.0 Bump all workspace crates, the node package and pyproject to 2.5.0, fold the two unreleased sections together and add upgrade notes for the behaviour changes. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 25 ++++++++++++++++++++++--- Cargo.toml | 2 +- crates/clawhdf5-accel/Cargo.toml | 2 +- crates/clawhdf5-agent/Cargo.toml | 14 +++++++------- crates/clawhdf5-android/Cargo.toml | 2 +- crates/clawhdf5-ann/Cargo.toml | 8 ++++---- crates/clawhdf5-bench/Cargo.toml | 2 +- crates/clawhdf5-cli/Cargo.toml | 4 ++-- crates/clawhdf5-derive/Cargo.toml | 2 +- crates/clawhdf5-filters/Cargo.toml | 2 +- crates/clawhdf5-format/Cargo.toml | 4 ++-- crates/clawhdf5-gpu/Cargo.toml | 2 +- crates/clawhdf5-io/Cargo.toml | 4 ++-- crates/clawhdf5-migrate/Cargo.toml | 8 ++++---- crates/clawhdf5-napi/Cargo.toml | 4 ++-- crates/clawhdf5-netcdf4/Cargo.toml | 6 +++--- crates/clawhdf5-py/Cargo.toml | 6 +++--- crates/clawhdf5-py/pyproject.toml | 2 +- crates/clawhdf5/Cargo.toml | 12 ++++++------ packages/clawhdf5-node/package.json | 2 +- 20 files changed, 66 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a91cdd..4b4da7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,27 @@ # Changelog -## Unreleased +## v2.5.0 (2026-09-19) + +### Upgrade Notes +- **Retrieval rankings change, for the better.** The default fusion weights + move from `0.7/0.3` to `0.4/0.6` (`hybrid::DEFAULT_FUSION`), measured over the + full LongMemEval haystack: turn-level Hit@1 51.6% vs 44.2%, MRR 0.643 vs + 0.586. `unified_search` and the OpenClaw backend pick this up automatically; + callers passing weights to `hybrid_search` explicitly are unaffected. +- **Out-of-range selections are now errors.** `read_*_selection` used to return + data for a selection that ran past a dataset edge — a hyperslab came back + zero-padded, and a point with an out-of-range coordinate wrapped into the + next row. Both are now `FormatError::SelectionOutOfBounds`. Code relying on + the old (wrong) values will start seeing errors. +- **Large compressed datasets written without explicit chunk dimensions get a + different layout.** They used to be stored as one chunk; they are now split + to ~1 MiB chunks. The files stay standard and h5py-readable, and explicit + `with_chunks` is unaffected. +- `rayon` is now a default dependency of `clawhdf5-agent` (the parallel index + build). Opt out with `--no-default-features --features float16,hnsw`. +- `clawhdf5-ann` search results no longer shrink when records near the query + have been deleted, so a search that previously returned fewer than `k` + results now returns `k`. ### Retrieval quality - `clawhdf5-agent`: optional keyword stemming — `bm25::TokenFilter::Stemmed` @@ -39,8 +60,6 @@ never been measured against the weighted sum; the LongMemEval bench now has an `RRF` mode. -## Unreleased - ### HDF5 Read Path - **Selection reads cost what the selection costs.** `read_*_selection` decoded the *entire* dataset and then picked elements out, so a 64 x 64 window of a diff --git a/Cargo.toml b/Cargo.toml index a70132d..0623012 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ members = [ resolver = "2" [workspace.package] -version = "2.4.0" +version = "2.5.0" edition = "2024" license = "MIT" repository = "https://git.redclaw.dev/quantumclaw/clawhdf5" diff --git a/crates/clawhdf5-accel/Cargo.toml b/crates/clawhdf5-accel/Cargo.toml index d4a10da..d8e679d 100644 --- a/crates/clawhdf5-accel/Cargo.toml +++ b/crates/clawhdf5-accel/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-accel" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "SIMD-accelerated operations for rustyhdf5" license = "MIT" diff --git a/crates/clawhdf5-agent/Cargo.toml b/crates/clawhdf5-agent/Cargo.toml index 0d44038..865d521 100644 --- a/crates/clawhdf5-agent/Cargo.toml +++ b/crates/clawhdf5-agent/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-agent" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "HDF5-backed persistent memory store for on-device AI agents" license = "MIT" @@ -10,12 +10,12 @@ keywords = ["agent", "memory", "hdf5", "vector-search", "embedding"] categories = ["database", "science", "algorithms"] [dependencies] -clawhdf5-format = { path = "../clawhdf5-format", version = "2.4.0", features = ["parallel", "fast-checksum"] } -clawhdf5 = { path = "../clawhdf5", version = "2.4.0" } -clawhdf5-io = { path = "../clawhdf5-io", version = "2.4.0", features = ["mmap"] } -clawhdf5-accel = { path = "../clawhdf5-accel", version = "2.4.0" } -clawhdf5-ann = { path = "../clawhdf5-ann", version = "2.4.0", optional = true } -clawhdf5-gpu = { path = "../clawhdf5-gpu", version = "2.4.0", optional = true, default-features = false } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.5.0", features = ["parallel", "fast-checksum"] } +clawhdf5 = { path = "../clawhdf5", version = "2.5.0" } +clawhdf5-io = { path = "../clawhdf5-io", version = "2.5.0", features = ["mmap"] } +clawhdf5-accel = { path = "../clawhdf5-accel", version = "2.5.0" } +clawhdf5-ann = { path = "../clawhdf5-ann", version = "2.5.0", optional = true } +clawhdf5-gpu = { path = "../clawhdf5-gpu", version = "2.5.0", optional = true, default-features = false } serde = { workspace = true } byteorder = "1" half = { workspace = true, optional = true } diff --git a/crates/clawhdf5-android/Cargo.toml b/crates/clawhdf5-android/Cargo.toml index b62cfd2..bfe4780 100644 --- a/crates/clawhdf5-android/Cargo.toml +++ b/crates/clawhdf5-android/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-android" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "Android JNI bridge for edgehdf5-memory HDF5 backend" license = "MIT" diff --git a/crates/clawhdf5-ann/Cargo.toml b/crates/clawhdf5-ann/Cargo.toml index 07eb5f8..49dab1e 100644 --- a/crates/clawhdf5-ann/Cargo.toml +++ b/crates/clawhdf5-ann/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-ann" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "HNSW approximate nearest neighbor index stored as HDF5" license = "MIT" @@ -10,9 +10,9 @@ keywords = ["hdf5", "ann", "hnsw", "nearest-neighbor"] categories = ["algorithms", "science"] [dependencies] -clawhdf5-format = { path = "../clawhdf5-format", version = "2.4.0" } -clawhdf5-io = { path = "../clawhdf5-io", version = "2.4.0" } -clawhdf5-accel = { path = "../clawhdf5-accel", version = "2.4.0" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.5.0" } +clawhdf5-io = { path = "../clawhdf5-io", version = "2.5.0" } +clawhdf5-accel = { path = "../clawhdf5-accel", version = "2.5.0" } rayon = { version = "1", optional = true } [features] diff --git a/crates/clawhdf5-bench/Cargo.toml b/crates/clawhdf5-bench/Cargo.toml index d93530d..1c8cb8c 100644 --- a/crates/clawhdf5-bench/Cargo.toml +++ b/crates/clawhdf5-bench/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-bench" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "Benchmark harnesses for clawhdf5-agent (Track 8)" license = "MIT" diff --git a/crates/clawhdf5-cli/Cargo.toml b/crates/clawhdf5-cli/Cargo.toml index 45900d7..77f2825 100644 --- a/crates/clawhdf5-cli/Cargo.toml +++ b/crates/clawhdf5-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-cli" -version = "2.4.0" +version = "2.5.0" edition = "2024" license = "MIT" description = "CLI for clawhdf5 agent memory — create, save, search, recall, stats" @@ -14,7 +14,7 @@ name = "clawhdf5" path = "src/main.rs" [dependencies] -clawhdf5-agent = { path = "../clawhdf5-agent", version = "2.4.0" } +clawhdf5-agent = { path = "../clawhdf5-agent", version = "2.5.0" } clap = { version = "4", features = ["derive", "env"] } serde_json = "1" serde = { workspace = true } diff --git a/crates/clawhdf5-derive/Cargo.toml b/crates/clawhdf5-derive/Cargo.toml index a70370c..b0eb52a 100644 --- a/crates/clawhdf5-derive/Cargo.toml +++ b/crates/clawhdf5-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-derive" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "Derive macros for rustyhdf5 HDF5 traits" license = "MIT" diff --git a/crates/clawhdf5-filters/Cargo.toml b/crates/clawhdf5-filters/Cargo.toml index 1c33439..3f8a113 100644 --- a/crates/clawhdf5-filters/Cargo.toml +++ b/crates/clawhdf5-filters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-filters" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "Filter and compression pipeline for clawhdf5" license = "MIT" diff --git a/crates/clawhdf5-format/Cargo.toml b/crates/clawhdf5-format/Cargo.toml index 7393ee4..2ee5748 100644 --- a/crates/clawhdf5-format/Cargo.toml +++ b/crates/clawhdf5-format/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-format" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "Pure-Rust HDF5 binary format parsing and writing — no C dependencies" license = "MIT" @@ -25,7 +25,7 @@ pco = { version = "1.0", optional = true } [dev-dependencies] serde_json = "1" criterion = { workspace = true } -clawhdf5-derive = { path = "../clawhdf5-derive", version = "2.4.0" } +clawhdf5-derive = { path = "../clawhdf5-derive", version = "2.5.0" } [[bench]] name = "bench" diff --git a/crates/clawhdf5-gpu/Cargo.toml b/crates/clawhdf5-gpu/Cargo.toml index 3c71b2a..a05de3e 100644 --- a/crates/clawhdf5-gpu/Cargo.toml +++ b/crates/clawhdf5-gpu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-gpu" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "GPU-accelerated vector operations for rustyhdf5 using wgpu compute shaders" license = "MIT" diff --git a/crates/clawhdf5-io/Cargo.toml b/crates/clawhdf5-io/Cargo.toml index 475e1ff..b5fd80c 100644 --- a/crates/clawhdf5-io/Cargo.toml +++ b/crates/clawhdf5-io/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-io" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "I/O abstraction layer for rustyhdf5" license = "MIT" @@ -10,7 +10,7 @@ keywords = ["hdf5", "io", "science", "data"] categories = ["filesystem", "science"] [dependencies] -clawhdf5-format = { path = "../clawhdf5-format", version = "2.4.0" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.5.0" } memmap2 = { version = "0.9", optional = true } libc = { version = "0.2", optional = true } tokio = { version = "1", features = ["fs", "io-util"], optional = true } diff --git a/crates/clawhdf5-migrate/Cargo.toml b/crates/clawhdf5-migrate/Cargo.toml index 0195dc1..ad48db6 100644 --- a/crates/clawhdf5-migrate/Cargo.toml +++ b/crates/clawhdf5-migrate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-migrate" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "CLI to migrate SQLite agent memory databases to HDF5 format" license = "MIT" @@ -14,9 +14,9 @@ name = "clawhdf5-migrate" path = "src/main.rs" [dependencies] -clawhdf5-agent = { path = "../clawhdf5-agent", version = "2.4.0" } -clawhdf5-format = { path = "../clawhdf5-format", version = "2.4.0" } -clawhdf5 = { path = "../clawhdf5", version = "2.4.0" } +clawhdf5-agent = { path = "../clawhdf5-agent", version = "2.5.0" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.5.0" } +clawhdf5 = { path = "../clawhdf5", version = "2.5.0" } rusqlite = { version = "0.31", features = ["bundled"] } clap = { version = "4", features = ["derive"] } half = { workspace = true } diff --git a/crates/clawhdf5-napi/Cargo.toml b/crates/clawhdf5-napi/Cargo.toml index f350149..764a28c 100644 --- a/crates/clawhdf5-napi/Cargo.toml +++ b/crates/clawhdf5-napi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-napi" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "Node.js native addon (napi-rs) exposing clawhdf5-agent to TypeScript/JavaScript" license = "MIT" @@ -10,7 +10,7 @@ repository = "https://git.redclaw.dev/quantumclaw/clawhdf5" crate-type = ["cdylib"] [dependencies] -clawhdf5-agent = { path = "../clawhdf5-agent", version = "2.4.0" } +clawhdf5-agent = { path = "../clawhdf5-agent", version = "2.5.0" } napi = { version = "2", default-features = false, features = ["napi9"] } napi-derive = "2" diff --git a/crates/clawhdf5-netcdf4/Cargo.toml b/crates/clawhdf5-netcdf4/Cargo.toml index ab3c389..a88ad2a 100644 --- a/crates/clawhdf5-netcdf4/Cargo.toml +++ b/crates/clawhdf5-netcdf4/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-netcdf4" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "NetCDF-4 read support built on rustyhdf5 — pure Rust, no C dependencies" license = "MIT" @@ -10,8 +10,8 @@ keywords = ["netcdf", "netcdf4", "hdf5", "science", "climate"] categories = ["parser-implementations", "science"] [dependencies] -clawhdf5 = { path = "../clawhdf5", version = "2.4.0" } -clawhdf5-format = { path = "../clawhdf5-format", version = "2.4.0" } +clawhdf5 = { path = "../clawhdf5", version = "2.5.0" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.5.0" } [dev-dependencies] tempfile = { workspace = true } diff --git a/crates/clawhdf5-py/Cargo.toml b/crates/clawhdf5-py/Cargo.toml index c3dfcea..774e12b 100644 --- a/crates/clawhdf5-py/Cargo.toml +++ b/crates/clawhdf5-py/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-py" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "Python bindings for rustyhdf5 — a pure-Rust HDF5 library" license = "MIT" @@ -14,8 +14,8 @@ name = "clawhdf5" crate-type = ["cdylib", "rlib"] [dependencies] -clawhdf5_rs = { path = "../clawhdf5", version = "2.4.0", package = "clawhdf5" } -clawhdf5-format = { path = "../clawhdf5-format", version = "2.4.0" } +clawhdf5_rs = { path = "../clawhdf5", version = "2.5.0", package = "clawhdf5" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.5.0" } pyo3 = "0.29" numpy = "0.29" diff --git a/crates/clawhdf5-py/pyproject.toml b/crates/clawhdf5-py/pyproject.toml index c9c9bba..ea4a41e 100644 --- a/crates/clawhdf5-py/pyproject.toml +++ b/crates/clawhdf5-py/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "rustyhdf5" -version = "2.4.0" +version = "2.5.0" description = "Python bindings for rustyhdf5 — a pure-Rust HDF5 library" requires-python = ">=3.8" license = { text = "MIT" } diff --git a/crates/clawhdf5/Cargo.toml b/crates/clawhdf5/Cargo.toml index 59c8b07..a16511d 100644 --- a/crates/clawhdf5/Cargo.toml +++ b/crates/clawhdf5/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5" -version = "2.4.0" +version = "2.5.0" edition = "2024" description = "Pure-Rust HDF5 reader/writer — no C dependencies" license = "MIT" @@ -10,16 +10,16 @@ keywords = ["hdf5", "science", "data", "binary"] categories = ["parser-implementations", "science", "encoding"] [dependencies] -clawhdf5-format = { path = "../clawhdf5-format", version = "2.4.0" } -clawhdf5-io = { path = "../clawhdf5-io", version = "2.4.0" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.5.0" } +clawhdf5-io = { path = "../clawhdf5-io", version = "2.5.0" } rayon = { version = "1", optional = true } [dev-dependencies] tempfile = { workspace = true } criterion = { workspace = true } -clawhdf5-io = { path = "../clawhdf5-io", version = "2.4.0", features = ["mmap"] } -clawhdf5-format = { path = "../clawhdf5-format", version = "2.4.0", features = ["parallel", "fast-checksum"] } -clawhdf5-filters = { path = "../clawhdf5-filters", version = "2.4.0" } +clawhdf5-io = { path = "../clawhdf5-io", version = "2.5.0", features = ["mmap"] } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.5.0", features = ["parallel", "fast-checksum"] } +clawhdf5-filters = { path = "../clawhdf5-filters", version = "2.5.0" } [[bench]] name = "mmap_bench" diff --git a/packages/clawhdf5-node/package.json b/packages/clawhdf5-node/package.json index 3d452ea..a11acd9 100644 --- a/packages/clawhdf5-node/package.json +++ b/packages/clawhdf5-node/package.json @@ -1,6 +1,6 @@ { "name": "@redclaw/clawhdf5", - "version": "2.4.0", + "version": "2.5.0", "description": "Node.js bindings for clawhdf5 — HDF5-backed agent memory with hippocampal consolidation", "main": "index.js", "types": "index.d.ts",