tag:github.com,2008:https://github.com/splinterhq/libsplinter/releasesRelease notes from libsplinter2026-06-30T19:38:19Ztag:github.com,2008:Repository/1166821540/v1.2.02026-06-30T19:46:59ZVersion 1.2.0 - Green Onions<h1>Splinter 1.2.0 (LTS) — Changelog</h1>
<p><em><strong>This is a long-term support (LTS) release. Splinter is no longer beta.</strong></em></p>
<p>The <a href="https://splinterhq.github.io" rel="nofollow">documentation site</a> has also been completely overhauled. Please have a look!</p>
<p>Notable changes since the 1.1.9 release (<code>06d7ccb</code>). This release adds the<br>
cooperative <strong>Logic Shard election</strong> system, two new CLI commands, a published<br>
set of Rust bindings on crates.io, and a substantial round of core correctness<br>
fixes. ~117 commits in total; the highlights are below.</p>
<h2>Highlights</h2>
<ul>
<li><strong>Logic Shard election</strong> — a cooperative, read-only memory-advisement system<br>
so multiple agents can arbitrate <code>madvise()</code> intent over a shared store<br>
without fighting each other.</li>
<li><strong>Rust bindings on crates.io</strong> — <code>libsplinter-sys</code> and<br>
<code>libsplinter-persist-sys</code>, vendored and built from source.</li>
<li><strong><code>mop</code> set/get is now the memory-operation API</strong> — the deprecated <code>*_av()</code><br>
functions have been removed.</li>
<li>New CLI commands: <strong><code>shard</code></strong> and <strong><code>retrain</code></strong>.</li>
<li>Numerous core memory-ordering and lifecycle correctness fixes.</li>
</ul>
<p>Detailed changelog below (and the beginning of the changelog convention for the project!)</p>
<hr>
<h2>Logic Shard Election (cooperative memory advisement)</h2>
<p>A new election system lets cooperating processes bid for the right to issue<br>
<code>posix_madvise()</code> advice on regions of a shared store. The election is a<br>
read-only, deterministic O(32) scan over a static bid table — no locks on the<br>
hot path — and the hot path was kept under ~1500 LOC to remain compatible with<br>
self-election.</p>
<p>New public API in <code>splinter.h</code>:</p>
<ul>
<li><code>splinter_shard_election()</code> — run the read-only scan, return the current<br>
sovereign and its intent.</li>
<li><code>splinter_shard_is_sovereign()</code> — query whether a shard currently wins.</li>
<li><code>splinter_shard_claim()</code> / <code>splinter_shard_claim_ex()</code> — register a bid<br>
(intent, 0–255 priority, duration in ticks); the <code>_ex</code> form lets a supervisor<br>
bid on another process's behalf for deterministic tests.</li>
<li><code>splinter_shard_rebid()</code> — refresh a claim's timestamp and optionally change<br>
intent/priority/duration.</li>
<li><code>splinter_shard_release()</code> — drop a claim.</li>
<li><code>splinter_shard_table_snapshot()</code> — snapshot the full bid table.</li>
<li><code>splinter_madvise()</code> — issue real <code>posix_madvise()</code> only if you win the<br>
election (never call raw <code>posix_madvise()</code> on a shared store).</li>
</ul>
<p>Intents: <code>WILLNEED</code>, <code>SEQUENTIAL</code>, <code>RANDOM</code>, <code>DONTNEED</code>, <code>NONE</code>. A bidder<br>
cannot win the election while a live <code>WILLNEED</code>/<code>SEQUENTIAL</code> claim is held, so a<br>
stray <code>DONTNEED</code> can't evict another agent's working set.</p>
<h2>New CLI commands</h2>
<ul>
<li><strong><code>shard</code></strong> — inspect and seed the Logic Shard bid table; map intent names,<br>
view the current sovereign, and construct deterministic election scenarios.</li>
<li><strong><code>retrain</code></strong> — prepare a key for retraining: zeroes the key's vectors and<br>
flips its epoch back to 4, releasing the sequence lock and republishing the<br>
key so clients and watchers revalidate it. Works even when vectors are<br>
disabled (epoch-only flip in that case).</li>
</ul>
<h2>CLI command improvements</h2>
<ul>
<li><strong><code>export</code></strong> — when a key is <code>VARTEXT</code>, the value is now included in the JSON<br>
(for archival or sharing).</li>
<li><strong><code>search</code></strong> — accepts the search phrase from a file or stdin, for pipe use.</li>
<li><strong><code>unset</code></strong> — added a recursive option for removing tandem keys.</li>
<li><strong><code>lua</code></strong> — many improvements: scripts can now access vectors and <code>sleep</code>.</li>
</ul>
<h2>Memory-operation API (<code>mop</code>) — breaking change</h2>
<ul>
<li>The <code>mop</code> set/get pattern is now the supported memory-operation API.<br>
<code>splinter_set_mop()</code> / <code>splinter_get_mop()</code> replace the deprecated <code>*_av()</code><br>
functions.</li>
<li><strong>Removed</strong> (previously deprecated): <code>splinter_set_av()</code>,<br>
<code>splinter_set_hybrid_av()</code>, <code>splinter_get_av()</code>, <code>splinter_get_hybrid_av()</code>.<br>
Migrate to <code>splinter_set_mop()</code> / <code>splinter_get_mop()</code>.</li>
<li><strong>Default mop mode is now byte-aligned hybrid scrub</strong> (previously <code>none</code>).</li>
</ul>
<h2>Core changes & bug fixes</h2>
<ul>
<li>Fixed a missing memory fence in <code>splinter_get()</code>, dropping the <code>EAGAIN</code> retry<br>
rate to nearly zero.</li>
<li><code>splinter_poll()</code> no longer forces the caller to retry on a write-busy (odd)<br>
epoch — it retries internally, as poll should; <code>-2</code> is now returned only on<br>
header loss.</li>
<li>Overwrites no longer leave stale embeddings behind.</li>
<li><code>VALUES</code> are recomputed after initialization to avoid aliasing into slot data.</li>
<li>New <code>splinter_retrain_slot()</code> deliberately rewinds a slot's epoch and scrubs<br>
its vector (epochs otherwise only advance) to signal revalidation.</li>
<li>Persistent stores now honor a custom <code>umask</code> on creation and open<br>
<strong>exclusively</strong> (enforced by <code>open()</code>); safer default umask handling.</li>
<li>More portable CPU reference clock for transaction timestamps.</li>
<li>Enforce the token limit at 90% of a model's trained limit so models stay<br>
runnable.</li>
</ul>
<h2>Inference (splinference / splainference)</h2>
<ul>
<li>New <code>--vector-training</code> switch makes selected vectors a write-once-only<br>
contract, preventing calculated centroid/variance sets from being overwritten<br>
during tuning.</li>
<li>Fixed unhandled context-window overflow beyond a model's trained size.</li>
<li>Embedding context size is now derived from the model's training size.</li>
<li>Key capacity scales with store size (up to ~500k keys).</li>
<li>Batches are cleared between runs to prevent residual bleed; cold-start fixes.</li>
</ul>
<h2>Rust bindings</h2>
<ul>
<li>Published as conventional <code>-sys</code> crates: <strong><code>libsplinter-sys</code></strong> (in-memory) and<br>
<strong><code>libsplinter-persist-sys</code></strong> (persistent, built with <code>SPLINTER_PERSISTENT</code>).</li>
<li>Vendored C sources are compiled from source via the <code>cc</code> crate and bound with<br>
bindgen at build time — no system install of libsplinter required.</li>
<li>Bindings updated to follow the <code>mop</code> API helper changes.</li>
</ul>
<h2>Build & packaging</h2>
<ul>
<li><strong>bigbang</strong> universal installer for Debian/Ubuntu-based systems, plus a<br>
package shuttle for Debian-based distros.</li>
<li>On arm64, the rpath is baked in at compile time, removing the build-time<br>
dependency on <code>patchelf</code>.</li>
</ul>
<h2>Documentation</h2>
<ul>
<li>New documentation site and a refreshed README with expanded coverage of<br>
events, FFI, CLI/REPL usage, and governance.</li>
<li>Updated thesis (now also citeable via arXiv if you use it in research) and updated build instructions.</li>
<li>Changelogs now versioned in <code>changelogs/{VERSION}.md</code> for convenience.</li>
</ul>splinterhqtag:github.com,2008:Repository/1166821540/v1.1.92026-04-21T23:12:46ZVersion 1.1.9 - Max's Caramel Chew<p>This is a really, really, really big one. Splinter is now essentially a RAG in a box 🎁</p>
<h2>Additions</h2>
<ul>
<li>We now have an <code>epoll()</code> compatible signal group broker (currently in testing, appreciate any testers):<br>
<code>splinter_event_bus_open()</code>, <code>splinter_event_bus_wait()</code>, <code>splinter_event_bus_close() and </code>splinter_event_bus_get_dirty()` to see what fired.</li>
<li>New CLI 'ingest' command reads a text file and chunks it into (n) slots x (max_val_len), allowing splinference to embed</li>
<li>New CLI 'search' command allows for semantic search ordered by Eudlidean distance over embedded keys</li>
<li>New CLI <code>caps</code> command allows for showing compiled-in capabilities and</li>
<li>New CLI <code>uuid</code> command generates a UUIDv4 on-demand (no external dependencies)</li>
<li>New <code>sidecar</code> system monitor allows for watching loads and triggering run breakpoints while observing bus debug chatter</li>
<li>WASM is now supported (GET/SET) for SIMD workloads (thanks to WASMEdge embedded)</li>
<li>Splainference now provides completion using chat templates</li>
</ul>
<h2>Fixes</h2>
<ul>
<li>Correctly parse <code>.splinterrc</code> and <code>-r --rc-file</code> directives are now honored properly</li>
<li>Numerous CLI code and efficiency improvements</li>
</ul>splinterhqtag:github.com,2008:Repository/1166821540/v1.1.82026-04-08T22:15:57ZVersion 1.1.8 - Crinkle Cookies<p>This is a significant feature and bug fix release:</p>
<ul>
<li>Splinference is now production ready (all bugs fixed)</li>
<li>Added <code>splinter_append()</code> to the core library (this is the last block needed for context management)</li>
<li>Updated the TS bindings and added tests for bun</li>
<li>Implemented <code>bump</code> to advance a key's epoch without doing any other work</li>
<li>Numerous minor improvements & documentation cleanup</li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/splinterhq/libsplinter/compare/v1.1.7...v1.1.8"><tt>v1.1.7...v1.1.8</tt></a></p>splinterhqtag:github.com,2008:Repository/1166821540/v1.1.72026-03-26T20:55:16ZVersion 1.1.7 - Blue Freeze Pop<p>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.</p>
<p>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.</p>
<p>Core additions:</p>
<ul>
<li><code>splinter_pulse_keygroup()</code> -> Pulse a signal group by any of its members (key name) (slot no longer needed)</li>
<li><code>splinter_set_as_system()</code> -> Commandeer a key as a binary scratch pad for accounting</li>
<li><code>splinter_unset_label()</code> -> unsets a previously-set bloom label</li>
</ul>
<p>CLI additions:</p>
<ul>
<li>New <code>bind</code> command to bind a bloom label to a signal group ID.</li>
</ul>
<p>All users are encouraged to upgrade, but no security fixes are in this release (pull when ready).</p>splinterhqtag:github.com,2008:Repository/1166821540/v1.1.62026-03-06T00:15:16ZVersion 1.1.6 - Knickerbocker Glory<p>This release provides a much needed <code>splinter_enumerate_matches()</code> to scope keys based on bloom bits. It provides a convenient callback (similar to CURL) that can function as an iterator for <em>only</em> slots that match a certain bitmask (bloom) filter.</p>
<p>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.</p>splinterhqtag:github.com,2008:Repository/1166821540/v1.1.52026-02-25T19:41:15ZSplinter 1.1.5 - Root Beer Float<p>This is the first public "official" release of Splinter!! 🎉</p>
<p>This is also the beginning of the public change manifest.</p>
<p>We can get happy on vectors and share our High Rank Tensors in memory again!! 🤓</p>splinterhq