Releases: splinterhq/libsplinter
Release list
Version 1.2.0 - Green Onions
Splinter 1.2.0 (LTS) — Changelog
This is a long-term support (LTS) release. Splinter is no longer beta.
The documentation site has also been completely overhauled. Please have a look!
Notable changes since the 1.1.9 release (06d7ccb). This release adds the
cooperative Logic Shard election system, two new CLI commands, a published
set of Rust bindings on crates.io, and a substantial round of core correctness
fixes. ~117 commits in total; the highlights are below.
Highlights
- Logic Shard election — a cooperative, read-only memory-advisement system
so multiple agents can arbitratemadvise()intent over a shared store
without fighting each other. - Rust bindings on crates.io —
libsplinter-sysand
libsplinter-persist-sys, vendored and built from source. mopset/get is now the memory-operation API — the deprecated*_av()
functions have been removed.- New CLI commands:
shardandretrain. - Numerous core memory-ordering and lifecycle correctness fixes.
Detailed changelog below (and the beginning of the changelog convention for the project!)
Logic Shard Election (cooperative memory advisement)
A new election system lets cooperating processes bid for the right to issue
posix_madvise() advice on regions of a shared store. The election is a
read-only, deterministic O(32) scan over a static bid table — no locks on the
hot path — and the hot path was kept under ~1500 LOC to remain compatible with
self-election.
New public API in splinter.h:
splinter_shard_election()— run the read-only scan, return the current
sovereign and its intent.splinter_shard_is_sovereign()— query whether a shard currently wins.splinter_shard_claim()/splinter_shard_claim_ex()— register a bid
(intent, 0–255 priority, duration in ticks); the_exform lets a supervisor
bid on another process's behalf for deterministic tests.splinter_shard_rebid()— refresh a claim's timestamp and optionally change
intent/priority/duration.splinter_shard_release()— drop a claim.splinter_shard_table_snapshot()— snapshot the full bid table.splinter_madvise()— issue realposix_madvise()only if you win the
election (never call rawposix_madvise()on a shared store).
Intents: WILLNEED, SEQUENTIAL, RANDOM, DONTNEED, NONE. A bidder
cannot win the election while a live WILLNEED/SEQUENTIAL claim is held, so a
stray DONTNEED can't evict another agent's working set.
New CLI commands
shard— inspect and seed the Logic Shard bid table; map intent names,
view the current sovereign, and construct deterministic election scenarios.retrain— prepare a key for retraining: zeroes the key's vectors and
flips its epoch back to 4, releasing the sequence lock and republishing the
key so clients and watchers revalidate it. Works even when vectors are
disabled (epoch-only flip in that case).
CLI command improvements
export— when a key isVARTEXT, the value is now included in the JSON
(for archival or sharing).search— accepts the search phrase from a file or stdin, for pipe use.unset— added a recursive option for removing tandem keys.lua— many improvements: scripts can now access vectors andsleep.
Memory-operation API (mop) — breaking change
- The
mopset/get pattern is now the supported memory-operation API.
splinter_set_mop()/splinter_get_mop()replace the deprecated*_av()
functions. - Removed (previously deprecated):
splinter_set_av(),
splinter_set_hybrid_av(),splinter_get_av(),splinter_get_hybrid_av().
Migrate tosplinter_set_mop()/splinter_get_mop(). - Default mop mode is now byte-aligned hybrid scrub (previously
none).
Core changes & bug fixes
- Fixed a missing memory fence in
splinter_get(), dropping theEAGAINretry
rate to nearly zero. splinter_poll()no longer forces the caller to retry on a write-busy (odd)
epoch — it retries internally, as poll should;-2is now returned only on
header loss.- Overwrites no longer leave stale embeddings behind.
VALUESare recomputed after initialization to avoid aliasing into slot data.- New
splinter_retrain_slot()deliberately rewinds a slot's epoch and scrubs
its vector (epochs otherwise only advance) to signal revalidation. - Persistent stores now honor a custom
umaskon creation and open
exclusively (enforced byopen()); safer default umask handling. - More portable CPU reference clock for transaction timestamps.
- Enforce the token limit at 90% of a model's trained limit so models stay
runnable.
Inference (splinference / splainference)
- New
--vector-trainingswitch makes selected vectors a write-once-only
contract, preventing calculated centroid/variance sets from being overwritten
during tuning. - Fixed unhandled context-window overflow beyond a model's trained size.
- Embedding context size is now derived from the model's training size.
- Key capacity scales with store size (up to ~500k keys).
- Batches are cleared between runs to prevent residual bleed; cold-start fixes.
Rust bindings
- Published as conventional
-syscrates:libsplinter-sys(in-memory) and
libsplinter-persist-sys(persistent, built withSPLINTER_PERSISTENT). - Vendored C sources are compiled from source via the
cccrate and bound with
bindgen at build time — no system install of libsplinter required. - Bindings updated to follow the
mopAPI helper changes.
Build & packaging
- bigbang universal installer for Debian/Ubuntu-based systems, plus a
package shuttle for Debian-based distros. - On arm64, the rpath is baked in at compile time, removing the build-time
dependency onpatchelf.
Documentation
- New documentation site and a refreshed README with expanded coverage of
events, FFI, CLI/REPL usage, and governance. - Updated thesis (now also citeable via arXiv if you use it in research) and updated build instructions.
- Changelogs now versioned in
changelogs/{VERSION}.mdfor convenience.
Version 1.1.9 - Max's Caramel Chew
This is a really, really, really big one. Splinter is now essentially a RAG in a box 🎁
Additions
- We now have an
epoll()compatible signal group broker (currently in testing, appreciate any testers):
splinter_event_bus_open(),splinter_event_bus_wait(),splinter_event_bus_close() andsplinter_event_bus_get_dirty()` to see what fired. - New CLI 'ingest' command reads a text file and chunks it into (n) slots x (max_val_len), allowing splinference to embed
- New CLI 'search' command allows for semantic search ordered by Eudlidean distance over embedded keys
- New CLI
capscommand allows for showing compiled-in capabilities and - New CLI
uuidcommand generates a UUIDv4 on-demand (no external dependencies) - New
sidecarsystem monitor allows for watching loads and triggering run breakpoints while observing bus debug chatter - WASM is now supported (GET/SET) for SIMD workloads (thanks to WASMEdge embedded)
- Splainference now provides completion using chat templates
Fixes
- Correctly parse
.splinterrcand-r --rc-filedirectives are now honored properly - Numerous CLI code and efficiency improvements
Version 1.1.8 - Crinkle Cookies
This is a significant feature and bug fix release:
- Splinference is now production ready (all bugs fixed)
- Added
splinter_append()to the core library (this is the last block needed for context management) - Updated the TS bindings and added tests for bun
- Implemented
bumpto advance a key's epoch without doing any other work - Numerous minor improvements & documentation cleanup
Full Changelog: v1.1.7...v1.1.8
Version 1.1.7 - Blue Freeze Pop
This is a periodic maintenance release. The bulk of the changes are in the CLI/Inference, where code was hardened in line with real-world use and semantic embedding workflow needs. Fixed many positional argument bugs, brought in argparse to replace getopt for CLI modules, improvements in test coverage and overhaul of CMake, among many other improvements.
There was also just a general catching up to the massive amount that recently went into core, so fixtures in the CLI are now more permanent feeling.
Core additions:
splinter_pulse_keygroup()-> Pulse a signal group by any of its members (key name) (slot no longer needed)splinter_set_as_system()-> Commandeer a key as a binary scratch pad for accountingsplinter_unset_label()-> unsets a previously-set bloom label
CLI additions:
- New
bindcommand to bind a bloom label to a signal group ID.
All users are encouraged to upgrade, but no security fixes are in this release (pull when ready).
Version 1.1.6 - Knickerbocker Glory
This release provides a much needed splinter_enumerate_matches() to scope keys based on bloom bits. It provides a convenient callback (similar to CURL) that can function as an iterator for only slots that match a certain bitmask (bloom) filter.
IOW - lightning fast search tagged by bits instead of equality or string match, which was already there, just not-so-conveniently exposed. This callback implementation remedies that and is warranted even though the 999 LOC ceiling is looming closer.
Splinter 1.1.5 - Root Beer Float
This is the first public "official" release of Splinter!! 🎉
This is also the beginning of the public change manifest.
We can get happy on vectors and share our High Rank Tensors in memory again!! 🤓