From 087679643251cf76b05443346bdcb42efb20349b Mon Sep 17 00:00:00 2001 From: osobh Date: Sat, 19 Sep 2026 07:19:11 -0700 Subject: [PATCH] chore(release): v2.3.0 Bump all workspace crates, the node package and pyproject to 2.3.0, finalize the changelog and add upgrade notes for the behaviour changes. Co-Authored-By: Claude Fable 5.1 --- CHANGELOG.md | 20 +++++++++++++++++++- 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, 63 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index adf75ec..07adce5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,24 @@ # Changelog -## Unreleased +## v2.3.0 (2026-09-19) + +### Upgrade Notes +- **A memory store now has a single writer.** `HDF5Memory::create`/`open` take + an exclusive lock (`.h5.lock`); a second open of the same store — in + the same or another process — returns `MemoryError::Locked`. Code that opened + a second handle just to read should use `HDF5Memory::open_read_only`. +- **Unsigned array attributes arrive as `AttrValue::U64Array`**, not + `I64Array`, and `attrs()` may now return `AttrValue::Raw`. Exhaustive matches + on `AttrValue` need the two new arms. +- **WAL header version 3 → 4.** v3 files are read and upgraded in place, but a + store written by 2.3.0 with a pending WAL cannot be opened by 2.2.0 or + earlier (it is refused, not corrupted). Checkpoint first + (`flush_wal`) if you need to downgrade. +- `MemoryConfig::compression` now uses deflate unless the agent's new `zstd` + feature is enabled; it previously failed outright in a default build. +- `MemoryError` gained `Locked`; `FormatError` gained `UnresolvedSharedMessage`, + `ExternalDataFilesUnsupported` and `ExternalLinkUnsupported`; `MessageType` + gained `ExternalDataFiles`. ### Bug Fixes - `clawhdf5-format`: compound datatypes written with **default libver bounds** diff --git a/Cargo.toml b/Cargo.toml index d2a6d2a..8b42a0a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ members = [ resolver = "2" [workspace.package] -version = "2.2.0" +version = "2.3.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 7dbba6f..f7b0d28 100644 --- a/crates/clawhdf5-accel/Cargo.toml +++ b/crates/clawhdf5-accel/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-accel" -version = "2.2.0" +version = "2.3.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 4c4caad..871c62b 100644 --- a/crates/clawhdf5-agent/Cargo.toml +++ b/crates/clawhdf5-agent/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-agent" -version = "2.2.0" +version = "2.3.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.2.0", features = ["parallel", "fast-checksum"] } -clawhdf5 = { path = "../clawhdf5", version = "2.2.0" } -clawhdf5-io = { path = "../clawhdf5-io", version = "2.2.0", features = ["mmap"] } -clawhdf5-accel = { path = "../clawhdf5-accel", version = "2.2.0" } -clawhdf5-ann = { path = "../clawhdf5-ann", version = "2.2.0", optional = true } -clawhdf5-gpu = { path = "../clawhdf5-gpu", version = "2.2.0", optional = true, default-features = false } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.3.0", features = ["parallel", "fast-checksum"] } +clawhdf5 = { path = "../clawhdf5", version = "2.3.0" } +clawhdf5-io = { path = "../clawhdf5-io", version = "2.3.0", features = ["mmap"] } +clawhdf5-accel = { path = "../clawhdf5-accel", version = "2.3.0" } +clawhdf5-ann = { path = "../clawhdf5-ann", version = "2.3.0", optional = true } +clawhdf5-gpu = { path = "../clawhdf5-gpu", version = "2.3.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 e5be0e8..522b374 100644 --- a/crates/clawhdf5-android/Cargo.toml +++ b/crates/clawhdf5-android/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-android" -version = "2.2.0" +version = "2.3.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 9e5fcc6..dd2b79a 100644 --- a/crates/clawhdf5-ann/Cargo.toml +++ b/crates/clawhdf5-ann/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-ann" -version = "2.2.0" +version = "2.3.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.2.0" } -clawhdf5-io = { path = "../clawhdf5-io", version = "2.2.0" } -clawhdf5-accel = { path = "../clawhdf5-accel", version = "2.2.0" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.3.0" } +clawhdf5-io = { path = "../clawhdf5-io", version = "2.3.0" } +clawhdf5-accel = { path = "../clawhdf5-accel", version = "2.3.0" } rayon = { version = "1", optional = true } [features] diff --git a/crates/clawhdf5-bench/Cargo.toml b/crates/clawhdf5-bench/Cargo.toml index f4ebdfe..5cf059d 100644 --- a/crates/clawhdf5-bench/Cargo.toml +++ b/crates/clawhdf5-bench/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-bench" -version = "2.2.0" +version = "2.3.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 beecd03..6e5a61d 100644 --- a/crates/clawhdf5-cli/Cargo.toml +++ b/crates/clawhdf5-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-cli" -version = "2.2.0" +version = "2.3.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.2.0" } +clawhdf5-agent = { path = "../clawhdf5-agent", version = "2.3.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 1743a18..d5aba1e 100644 --- a/crates/clawhdf5-derive/Cargo.toml +++ b/crates/clawhdf5-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-derive" -version = "2.2.0" +version = "2.3.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 0fb0e0b..b8ffb9b 100644 --- a/crates/clawhdf5-filters/Cargo.toml +++ b/crates/clawhdf5-filters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-filters" -version = "2.2.0" +version = "2.3.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 2cd3dfc..50b0cad 100644 --- a/crates/clawhdf5-format/Cargo.toml +++ b/crates/clawhdf5-format/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-format" -version = "2.2.0" +version = "2.3.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.2.0" } +clawhdf5-derive = { path = "../clawhdf5-derive", version = "2.3.0" } [[bench]] name = "bench" diff --git a/crates/clawhdf5-gpu/Cargo.toml b/crates/clawhdf5-gpu/Cargo.toml index 2750505..f046f94 100644 --- a/crates/clawhdf5-gpu/Cargo.toml +++ b/crates/clawhdf5-gpu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-gpu" -version = "2.2.0" +version = "2.3.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 fec0700..92d8004 100644 --- a/crates/clawhdf5-io/Cargo.toml +++ b/crates/clawhdf5-io/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-io" -version = "2.2.0" +version = "2.3.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.2.0" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.3.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 8960f62..9eef58a 100644 --- a/crates/clawhdf5-migrate/Cargo.toml +++ b/crates/clawhdf5-migrate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-migrate" -version = "2.2.0" +version = "2.3.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.2.0" } -clawhdf5-format = { path = "../clawhdf5-format", version = "2.2.0" } -clawhdf5 = { path = "../clawhdf5", version = "2.2.0" } +clawhdf5-agent = { path = "../clawhdf5-agent", version = "2.3.0" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.3.0" } +clawhdf5 = { path = "../clawhdf5", version = "2.3.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 5817720..cf5f6a6 100644 --- a/crates/clawhdf5-napi/Cargo.toml +++ b/crates/clawhdf5-napi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-napi" -version = "2.2.0" +version = "2.3.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.2.0" } +clawhdf5-agent = { path = "../clawhdf5-agent", version = "2.3.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 73bedd9..c8021dc 100644 --- a/crates/clawhdf5-netcdf4/Cargo.toml +++ b/crates/clawhdf5-netcdf4/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-netcdf4" -version = "2.2.0" +version = "2.3.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.2.0" } -clawhdf5-format = { path = "../clawhdf5-format", version = "2.2.0" } +clawhdf5 = { path = "../clawhdf5", version = "2.3.0" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.3.0" } [dev-dependencies] tempfile = { workspace = true } diff --git a/crates/clawhdf5-py/Cargo.toml b/crates/clawhdf5-py/Cargo.toml index 1f2d8ad..b048543 100644 --- a/crates/clawhdf5-py/Cargo.toml +++ b/crates/clawhdf5-py/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5-py" -version = "2.2.0" +version = "2.3.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.2.0", package = "clawhdf5" } -clawhdf5-format = { path = "../clawhdf5-format", version = "2.2.0" } +clawhdf5_rs = { path = "../clawhdf5", version = "2.3.0", package = "clawhdf5" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.3.0" } pyo3 = "0.29" numpy = "0.29" diff --git a/crates/clawhdf5-py/pyproject.toml b/crates/clawhdf5-py/pyproject.toml index 51a88ae..44c8f0a 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.2.0" +version = "2.3.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 656c468..3e437bf 100644 --- a/crates/clawhdf5/Cargo.toml +++ b/crates/clawhdf5/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clawhdf5" -version = "2.2.0" +version = "2.3.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.2.0" } -clawhdf5-io = { path = "../clawhdf5-io", version = "2.2.0" } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.3.0" } +clawhdf5-io = { path = "../clawhdf5-io", version = "2.3.0" } rayon = { version = "1", optional = true } [dev-dependencies] tempfile = { workspace = true } criterion = { workspace = true } -clawhdf5-io = { path = "../clawhdf5-io", version = "2.2.0", features = ["mmap"] } -clawhdf5-format = { path = "../clawhdf5-format", version = "2.2.0", features = ["parallel", "fast-checksum"] } -clawhdf5-filters = { path = "../clawhdf5-filters", version = "2.2.0" } +clawhdf5-io = { path = "../clawhdf5-io", version = "2.3.0", features = ["mmap"] } +clawhdf5-format = { path = "../clawhdf5-format", version = "2.3.0", features = ["parallel", "fast-checksum"] } +clawhdf5-filters = { path = "../clawhdf5-filters", version = "2.3.0" } [[bench]] name = "mmap_bench" diff --git a/packages/clawhdf5-node/package.json b/packages/clawhdf5-node/package.json index bb15124..389444d 100644 --- a/packages/clawhdf5-node/package.json +++ b/packages/clawhdf5-node/package.json @@ -1,6 +1,6 @@ { "name": "@redclaw/clawhdf5", - "version": "2.2.0", + "version": "2.3.0", "description": "Node.js bindings for clawhdf5 — HDF5-backed agent memory with hippocampal consolidation", "main": "index.js", "types": "index.d.ts",