Repository navigation
SuperSLM 1.12.0
SuperSLM 1.12.0
Released 2026-10-12.
SuperSLM 1.12.0 stores the CPU backend's K/V memory in pages. A sequence can declare a budget, the
positions it will write itself, and reserve only the pages that budget needs instead of a whole
context-length block. Sequences that adopt a shared prompt prefix can share the prefix's pages
instead of copying them, and a budget sequence's save blob holds its live rows, the adopted prefix's
span included, so its size follows its live length instead of the context length.
Output does not change. Tokens and K/V values are bit-identical to 1.11.0 on every path, as read on
Windows x64 with MSVC; the paged-KV suites were run there only (see Verification). A host that
calls only the 1.11.0 verbs keeps 1.11.0's results, admission counts and save blobs, apart from the
changes listed under Compatibility. Its speed is not unchanged: saving a no-budget sequence takes
1.14 to 2.00 times as long as in 1.11.0 on the release code, at every length measured (24 of 24
readings across four captures; readings, not resolved changes; see Speed), and a later release is
planned to fix that.
The memory savings come only from the new budget-mode verbs. The GPU API is unchanged (gpu_1p0.h
changed in comment text only), and no model artifact needs reconversion (the loader and the
converter tools are unchanged since 1.11.0).
What changed
- Pages. A KV pool is now a pool of pages of
Bpositions (sslm_kv_page_positions).B
follows from the model's head dimension, context cap and K/V element width, and the artifact's
stored block size does not select it: 64 for Qwen2.5-0.5B at cap 4,096 and for Qwen2.5-1.5B at
cap 32,768, the two sizes measured below.docs/api.mdstates the rule. A sequence or prefix
reaches its K/V through a page table. The old block pool (sslm_kv_pool_create) is the same
number of bytes at a capBdivides, cut intoblock_count · ceil(cap / B)pages. - Budget-mode sequences and prefixes.
sslm_seq_create_budgetedand
sslm_prefix_begin_budgetedtake a budget,1 ≤ budget ≤ cap, and reserve
R(budget) = min(ceil(budget / B) + 1, ceil(cap / B))pages up front (sslm_kv_pages_for_budget).
Prefill and decode then take pages only from that reservation, so they never fail for lack of pool
pages below the holder's limit,min(origin + budget, cap). A write past the limit returns the new
statusSSLM_KV_BUDGET_EXCEEDED(ordinal 29), with no row written. At the cap the existing
SSLM_CONTEXT_CAP_EXCEEDEDfires instead. - Shared prefixes. A budget sequence that adopts a frozen prefix maps the prefix's full pages
and copies at most one page.sslm_prefix_begin_frombuilds a budget-mode prefix on top of a frozen
parent the same way, so prefixes can nest (a world, then a persona on the world). A shared page is
freed when the prefix and every holder that maps it have let go of it. Sequences made by
sslm_seq_createstill copy, as before. Sharing, residency by budget and a cheap high cap hold at
a cap of more than one page; at a cap that fits in one page a holder is a single page, so adopt
copies it and a budget reserves all of it. - Page pools and diagnostics.
sslm_kv_page_pool_createsizes a pool in pages
(sslm_kv_page_size,sslm_kv_page_pool_overhead_size).sslm_kv_pool_statsreports a pool's
free and shared pages, andsslm_seq_kv_statsa sequence's mode, origin, budget, limit and pages. - Contiguous pool option (CPU).
sslm_kv_pool_contiguous_sizeand
sslm_kv_pool_create_contiguousbuild a pool whose page is the whole context cap, one page per
block: 1.11.0's contiguous layout, through the same page module. Every verb works on it. A holder
in it takes one page, so adopt andsslm_prefix_begin_fromcopy and share no page, and saves are
the same in every pool kind, so a blob restores across pool kinds. It gives up what a page pool
gives a budget holder, which is sharing a prefix's pages and reserving by budget, and it is
outside the claims for reset and adopt cost, shared prefixes and residency by budget. It is the
reference that decode speed is measured against (see Speed). - Save and restore. A budget sequence saves a new format,
SSB6: theSSB5header plus its mode,
budget and origin, then its live rows, from position 0 to its live length, the span of an adopted
prefix included, so its size follows its live length. A sequence that adopted a 1,200-token prefix
and generated 512 tokens saves 1,712 rows. Cell 7.11 asserts the exact size at live lengths of 0,
1, one page and 1,000. A no-budget sequence keeps savingSSB5, byte-equal to 1.11.0's blob, so 1.9.0 to 1.11.0 still read
every save a 1.11.0-style host makes. Restore keeps a budget sequence's budget, origin and limit.
sslm_seq_restore_sharedtakes a live prefix handle and re-shares its pages when the prefix's
bytes match the blob's exactly; without a matching handle it restores privately and still
succeeds. - Softmax fast path. On the AVX2 and AVX-512 tiers,
SoftmaxRowQ15's fast path admits rows up
to width 32,767 (it was 2^14). Every probability and the returned bool stay bit-identical to the
1.9.0 body, pinned by the softmax golden stream (docs/attention-rowsites/s4/golden.txt, 882,516
values, regenerated from a build of the 1.9.0 tag) and by cell 6.9. No speed figure is claimed for
it.
docs/api.md (Paged KV memory) is the full contract: every verb, the SSB6 layout, the restore
rules, the thread rules and the limits.
Memory, graded by admission
The memory figures are graded by what a pool admits, never by the library's own page counts. The
example cohort is an assumption, not a measured workload: a 1,000-token world prefix, 10 persona
prefixes of 200 tokens built on it with sslm_prefix_begin_from, the world handle then released, and
50 budget sequences of 512 tokens each (5 per persona), each run to its budget. At Qwen2.5-0.5B with
cap 4,096 a page is 384 KiB (64 positions), and a 1.11.0 block is 64 pages (24 MiB).
- A page pool of 505 pages admits the whole cohort, and a pool of 504 pages refuses exactly
one create, the 50th sequence, withSSLM_KV_POOL_EXHAUSTED. 505 pages is 189.4 MiB. 1.11.0's
layout holds the same cohort in 60 whole blocks, 1,440 MiB (arithmetic from the 24 MiB block, 60
times 24; no 1.11.0 run measured it). The admission and the refusal are confirmed on the
release machine (cell 10.4, real Qwen2.5-0.5B artifact). - A pool of 1.11.0-style blocks (
sslm_kv_pool_create, with the same bytes and admission at this
cap as in 1.11.0) in the same 189.4 MiB
admits 7 sequences and refuses the 8th, because an eighth block needs 192 MiB. Cell 10.4 runs
this contrast leg on the 1.12.0 build with the 1.11.0 verb; it is not a run of the 1.11.0 binary. - After every sequence is saved mid-budget and at its limit, the world and personas rebuilt in a
fresh pool and the world released, the 50 sequences restored with their persona handles fit in
505 pages, and 504 refuses exactly the 50th, for both saves; confirmed on the release machine
(cell 10.6, real Qwen2.5-0.5B artifact). - Restored without handles, the same blobs need 1,405 pages (1,404 refuses the 50th), until
each sequence resets and re-adopts its persona; after that the pool admits 100 more budget-512
sequences, for both saves; confirmed on the release machine (cell 10.8, real Qwen2.5-0.5B artifact).
These numbers hold in budget mode only, and for this artifact's page size. Another model or cap has
another page size and its own figures. They are confirmed on the real artifact on the release machine.
Speed
This release makes speed claims for Windows x64, CPU only, at the ordinary background load of the
release machine: an AMD Ryzen 9 3950X (16 cores, 32 logical processors) with AVX2 and without
AVX-512, running Windows 10.0.19045, where the dispatched kernel tier is AVX2. A process watch ran
beside every timing row and listed no process other than the row's own, and the shared-prefix run
read 2% and 3% CPU load before and after. Decode speed is claimed for single-conversation
generation only: one sequence, decoding one token at a time. Nothing is claimed under load, on the
GPU, or for batched decode.
-
Decode, one conversation. Attention reads K/V one page run at a time. Single-conversation
decode is no more than 5% slower than the contiguous cache at both targets, to the 0.5B cap of
4,096 and to width 18,682 at 1.5B, with 7.9b reported (below). The contiguous
cache is the contiguous pool option of the same build. The comparison is not against 1.11.0, and
no measurement ties the option's speed to an older release. Cell 7.9 restores one saved sequence into each
of two arms on one artifact: the paged arm, in a page pool at the model's page size with its pages
in scattered order, and the contiguous arm, in a contiguous-option pool. It decodes the same
tokens in both, alternating one token per arm in an order drawn at random for each pair, and
times each token alone. A process of 104 pairs gives a median slowdown, paged time over
contiguous time minus one. A row is five processes on one boot, and it passes when the largest of
its five process medians is at most 5.0%. The scattered order is no more step-regular than a
random one; it is not claimed to be a worst case. Cell 7.9 times whole-tokensslm_decode_step
calls with no host parallel-for hook, on the AVX2 tier. Decode with the hook, decode sliced
across calls, and decode on the AVX-512 or SSE2 tier are not measured.All six rows pass. Each row's figures, in percent slower than the contiguous cache:
Model, cap Restored at Timed widths Largest process median SD of the five medians Mean of the five, ± 95% half-width Qwen2.5-0.5B, 4,096 1,200 1,204 to 1,307 +1.001 0.067 0.941 ± 0.083 Qwen2.5-0.5B, 4,096 2,044 2,048 to 2,151 +1.706 0.098 1.629 ± 0.122 Qwen2.5-0.5B, 4,096 3,988 3,992 to 4,095 +2.682 0.089 2.582 ± 0.110 Qwen2.5-1.5B, 32,768 8,188 8,192 to 8,295 +1.310 0.178 not stated Qwen2.5-1.5B, 32,768 15,872 15,876 to 15,979 +3.349 0.520 not stated Qwen2.5-1.5B, 32,768 18,678 18,682 to 18,785 +3.861 0.439 not stated At 0.5B the half-width is the resolution of the mean of the five process medians. The largest
median, which the rule grades, has no resolution of its own. The 1.5B figures are not resolved
finer than about one point. The same comparison run with two identical contiguous-option arms (an
A/A run, which should read zero) read +0.05% at the 0.5B row restored at 3,988, and +1.16% and
+1.13% at the 1.5B rows restored at 15,872 and 18,678, in this measuring session. So 1.5B figures
carry a zero-point offset of about one point at the time they were measured. The 1.5B row restored at 8,188 has
no A/A run of its own, and the offset statement covers it by extension from the other two,
unmeasured at that width. This release states no 1.5B figure as a paged overhead finer than that
offset, no figure corrected for the A/A reading, no margin under the 5% bar at 1.5B as
established, and no ordering of or trend among the 1.5B rows. Decode at widths beyond the table
(at 1.5B, above 18,785) and at Qwen2.5-0.5B with a cap above 4,096 is not measured. -
Decode over a shared prefix, reported. Cell 7.9b times a budget sequence that adopted a
persona prefix against a sequence holding the same prompt in a contiguous-option pool, on
Qwen2.5-0.5B at cap 4,096: 508 pairs over widths 1,204 to 1,712, the order drawn at random for
each pair. The median slowdown is +1.063%, with a sign interval of +0.990% to +1.130% (half-width
0.070 points), against the same 5% bar. It is reported and is not part of the claim above. -
Batched decode has no speed claim.
sslm_decode_stepover several sequences works and stays
bit-identical: cell 8.1 decodes a no-budget sequence and a budget sequence that share a prefix in
the samesslm_decode_stepcalls, 40 tokens that cross one page boundary of the cell's synthetic fixture, and requires each to equal its
solo no-budget twin in tokens and save blob. On the release machine it
is one of the 70 cells of the paged-KV suitesuperslm_pkv_c5, which ran green (156 checks in
cell 8.1; 70 cells, 0 red, 74,052 checks in the suite). No batched speed is measured or claimed. -
Reset and adopt: cost does not grow with the context cap, except that at head_dim ≤ 64 a cap
above 4,096 doubles the page and its one-page tail copy (0.5B: 384 KiB at caps up to 4,096, 768
KiB above), at a cap of more than one page. (The one-page tail copy is the copy of a single
page, made when a sequence adopts a prefix whose length is not a multiple of the page size.)
Create, reset and adopt no longer touch a whole block, and release poisons only the pages a
sequence wrote. Create reads 5.60 microseconds at 1.5B with cap 32,768, against 24,698.10 in
1.11.0 (lifecycle table below). Cell 7.4 times reset and adopt at the same live length at cap 4,096
and at cap 32,768 on Qwen2.5-0.5B, inside one binary, with the page size pinned to 64 positions at
both caps (a test-only setting), and grades the ratio of the two (cap 32,768 over cap 4,096)
against a fixed bound of 2.0. "Does not grow" is therefore graded as no more than 2.0 times over an
eightfold cap. The pinned page leaves out the doubling the exception names: in production the page
is 64 positions at cap 4,096 and 128 at cap 32,768, and that pair was not timed. The doubled tail
copy (384 KiB against 768 KiB) follows from the page rule and was not measured. The cell compares
the two caps and publishes no absolute figure.
For each holder kind and verb it takes 205 paired ratios, sorts them, and passes when the 120th
smallest is at most 2.0. The 86th and 120th smallest ratios, an interval around the median, were:Holder, verb 86th smallest 120th smallest Bound Budget, adopt 0.996 1.004 2.0 Budget, reset 1.000 1.000 2.0 No-budget, adopt 0.950 1.018 2.0 No-budget, reset 1.188 1.750 2.0 All four pass at equal page size. The no-budget reset reads up to 1.750, inside the bound of 2.0,
and its interval, 1.188 to 1.750, lies above 1: at the same page size it costs more at cap 32,768
than at cap 4,096, within that bound. -
Lifecycle verbs against 1.11.0. This build's lifecycle cell and a 1.11.0 build ran the same
readings on no-budget holders, the holders both builds have: create into an empty one-block pool,
release of a fresh holder, and restore, save, release and reset at live lengths of 16, 1,000 and
the cap, and copy adopt of prefixes of 16, 1,000 and 2,048 tokens, at Qwen2.5-0.5B with cap 4,096
and Qwen2.5-1.5B with cap 32,768. That is 34 readings. At 1.5B the full-cap state is the
1,000-token state with its length set to the cap, so that every position is live. The two builds
ran as separate processes: the 1.11.0 readings were taken on 2026-10-03 and the 1.12.0 readings on
2026-10-11, in separate sessions, by separately built executables. A change is therefore stated
only where the two medians differ by a factor of at least 4. The rule was checked before use: a
healthy pair of builds of the same source read as no change at every one of the 34 readings, and a
build with a deliberate cap-proportional walk in reset and adopt was reported as changed.
Twenty-two readings differ by that factor, and every one is a speed-up. Times are medians in
microseconds; the last column is the spread of the reading, the larger of the two builds' spreads
among their repeated measurements.Case Live length or prefix 1.11.0 1.12.0 Change Spread 0.5B, cap 4,096: create 1860.50 6.40 -99.66% 67.19% 0.5B, cap 4,096: release 0 1845.80 1.60 -99.91% 31.25% 0.5B, cap 4,096: restore 16 4114.70 27.90 -99.32% 12.54% 0.5B, cap 4,096: release 16 1451.90 39.60 -97.27% 19.19% 0.5B, cap 4,096: reset 16 1533.10 11.60 -99.24% 27.59% 0.5B, cap 4,096: adopt 16 2306.10 10.60 -99.54% 12.26% 0.5B, cap 4,096: restore 1,000 4144.60 608.50 -85.32% 17.65% 0.5B, cap 4,096: reset 1,000 1532.90 11.10 -99.28% 12.61% 0.5B, cap 4,096: adopt 1,000 2370.50 271.60 -88.54% 18.04% 0.5B, cap 4,096: reset 4,096 1530.90 10.80 -99.29% 8.33% 1.5B, cap 32,768: create 24698.10 5.60 -99.98% 46.43% 1.5B, cap 32,768: release 0 24662.10 2.50 -99.99% 16.00% 1.5B, cap 32,768: restore 16 57347.40 49.00 -99.91% 2.86% 1.5B, cap 32,768: release 16 24703.00 83.40 -99.66% 1.68% 1.5B, cap 32,768: reset 16 24718.30 10.20 -99.96% 3.92% 1.5B, cap 32,768: adopt 16 32383.00 22.40 -99.93% 26.79% 1.5B, cap 32,768: restore 1,000 57320.40 1799.00 -96.86% 2.50% 1.5B, cap 32,768: release 1,000 24739.50 1208.20 -95.12% 4.72% 1.5B, cap 32,768: reset 1,000 24686.80 11.00 -99.96% 0.31% 1.5B, cap 32,768: adopt 1,000 32368.80 1817.30 -94.39% 87.20% 1.5B, cap 32,768: adopt 2,048 32310.20 3609.40 -88.83% 82.73% 1.5B, cap 32,768: reset 32,768 24701.60 11.90 -99.95% 5.04% The other 12 readings are not resolved at that factor: save at every length for both models;
release at 1,000 and at 4,096 at 0.5B; release at 32,768 at 1.5B; restore at the full cap for both
models; and adopt of a 2,048-token prefix at 0.5B. The six save readings are stated in the next
bullet. This release claims no size or direction of change for the other six. -
Save is slower than 1.11.0.
sslm_seq_saveof a no-budget sequence writes the same bytes as in
1.11.0 and is slower at every length measured, on both models. These are readings, not resolved
changes: the comparison above resolves a change only at a factor of 4 or more, and it graded all
six save readings as not resolved. The table is the graded run of 2026-10-11 (medians in
microseconds; the spread is as in the table above):Case Live length 1.11.0 1.12.0 1.12.0 over 1.11.0 Spread 0.5B, cap 4,096: save 16 1715.50 2231.30 1.30 19.76% 0.5B, cap 4,096: save 1,000 1713.50 2311.80 1.35 17.96% 0.5B, cap 4,096: save 4,096 1719.10 3317.70 1.93 6.56% 1.5B, cap 32,768: save 16 32144.20 39038.60 1.21 1.35% 1.5B, cap 32,768: save 1,000 32103.80 39777.70 1.24 1.59% 1.5B, cap 32,768: save 32,768 32121.30 60326.90 1.88 6.22% Four captures of the lifecycle cell read these six saves: the graded run above; a second run of the
same executable and a run of a rebuild of the same source, both on 2026-10-11; and a run of an
earlier build on 2026-10-06. All 24 readings are slower than 1.11.0. The three captures of the
release code read 1.14 to 2.00 times as long (the graded run, 1.21 to 1.93), and at full length
about 1.9 to 2.0 times; the earlier build read up to 2.23. The two shortest 0.5B readings of the
graded run have spreads of 19.76% and 17.96% against changes of 30.07% and 34.92%; the other four
have spreads of 1.35% to 6.56%. The cause of the slowdown has not been measured. A later release is
planned to remove it.
Compatibility and required action
A host that calls only the 1.11.0 verbs needs no code change. These changes apply to every host:
sslm_seq_saveof a no-budget sequence is slower: 1.14 to 2.00 times as long as in 1.11.0 on
the release code, at every length measured (24 of 24 readings across four captures; readings, not
resolved changes; see Speed). The blob is unchanged. A later release is planned to remove the
slowdown.sslm_seq_state_sizeis 20 bytes larger. Its fixed part is 180 bytes, against 160 in 1.11.0,
so it stays an upper bound forSSB6blobs. A host that sizes save buffers with it needs no change.sslm_kv_pool_createrefuses ablock_countwhose page total exceedsUINT32_MAXwith
SSLM_INVALID_ARGUMENT. At cap 32,768 that is 8,388,608 blocks or more for Qwen2.5-1.5B, whose
page is 64 positions, and 16,777,216 blocks or more for Qwen2.5-0.5B, whose page is 128. These
counts are computed from the page rule; the cell that asserts them on the real artifacts was not
run.sslm_kv_pool_overhead_sizeis larger at a cap the page size does not divide, by
block_count · (ceil(cap / B) · B − cap)positions of K/V.sslm_kv_block_sizeand the no-budget
save blob are unchanged at every cap.sslm_prefix_freeze, on its first call, returns the prefix's unused pages to the pool. A pool
can therefore admit more handles than in 1.11.0, never fewer: a pool of N blocks whose handles were
all made by the 1.11.0 verbs still admits N handles.sslm_seq_resetno longer zero-fills the sequence's K/V memory. No read reaches the old rows,
and a no-budget save still writes zeros past the live length, so saved blobs are unchanged.- Restore refuses a blob of any format that is mid-token at the context cap, with
SSLM_INVALID_ARGUMENT. No save produces such a blob. - Restore reads
SSB6. AnSSB6blob must be passed with exactly the size its save returned;
SSB5and older still accept a larger buffer. sslm_statusgainsSSLM_KV_BUDGET_EXCEEDED, appended as ordinal 29. Only budget-mode
sequences and prefixes can return it. Every other ordinal is unchanged.- The axis digest differs from 1.11.0's. The digest tool's attention section now covers softmax
rows up to width 32,767 (1.11.0's ended at 2^14), so its GLOBAL hash is not 1.11.0'sf740f833….
This follows from the tool's source; this note records no 1.12.0 digest value. The digest is not
part of the bit-identity statement above. - Decode speed against 1.11.0 is not measured. The decode claim compares paged decode with the
contiguous pool option of the same build, which has 1.11.0's layout, and not with a 1.11.0 binary; no
measurement ties the option's speed to 1.11.0's.
A host that adopts budget mode should know:
- An
SSB6blob cannot be read by 1.11.0 or earlier, which refuse it on its magic. - Once a budget-mode handle is in a pool, admission follows the pages actually held: a budget
sequence that shares a released prefix's pages keeps them counted until it resets, adopts or
releases. Size admissions fromsslm_kv_pool_stats'free_pages. - Restoring a cohort without its prefix handles holds each sequence's prefix span privately until it
resets or re-adopts (the 1,405 pages above, against 505). Pass each restore its live prefix
handle throughsslm_seq_restore_shared. - A budget sequence's adopt of a prefix from another pool is refused with
SSLM_INVALID_ARGUMENT.
A host can test for the surface at compile time with SSLM_HAS_PAGED_KV_ABI.
Not in this release
- GPU paging. GPU sequences keep one whole-cap buffer each, and the GPU has no prefix verbs. GPU
paging is planned for a later release. - Memory savings for the 1.11.0 verbs. They keep one block's pages per handle, and a no-budget
save is still the whole block. - A removed cap. The context cap stays: RoPE tables and the attention scratch are sized by it.
Paging only makes a high cap cheaper to reserve. - Automatic prefix matching, adapter-shaped prefixes, and batched shared-prefix attention.
Prefixes are explicit, base-only handles, and each sequence still reads shared pages in its own
attention step.
Verification
The cell numbers in this note (7.4, 7.9, 10.4 and so on) name cells in tests/paged-kv/; each source
file lists its own cells in its header.
- Bit-identity (real artifacts, release machine): the Qwen2.5-0.5B cohort's tokens and K/V rows
equal a no-sharing v1.11.0 run (cell 10.1), and so do the Qwen2.5-1.5B cohort's at cap 32,768
(cell 10.2). - Old readers (v1.11.0 binary, read on 2026-10-02, before this release): a binary built from
the v1.11.0 tag restored a real no-budgetSSB5blob withSSLM_OKand refused a real budget
SSB6blob withSSLM_INVALID_ARGUMENT(cell 9.3; 18 checks, 0 failures). This is a reading of
the v1.11.0 binary taken before the release, not a release-machine reading at the release commit. - Paged-KV suites (release machine, commit
ed1cf52): all green. The CPU suitessuperslm_pkv_r0
(5 cells, 441 checks),superslm_pkv_c2(7 cells, 4,021 checks),superslm_pkv_c3(6 cells, 114
checks),superslm_pkv_c4(30 cells, 5,335 checks) andsuperslm_pkv_c5(70 cells, 74,052 checks)
pass with 0 failures on the dispatched AVX2 tier. The 70 cells ofsuperslm_pkv_c5also pass with
the AVX2 tier forced (74,053 checks), with the SSE2 tier forced (each cell run as its own process,
70 of 70, 74,398 checks in all, since each process repeats its cell's own setup checks), and with
the AVX-512 tier forced on an AMD Ryzen 9 7950X3D (70 cells, 74,053 checks, 0 failures); the
release machine has no AVX-512. These counts were measured ated1cf52, and the release changes
none of these suites' inputs, except the pool teardown fix below. The page rule, the partial-last-page
and contiguous-option cases and the adopt boundary at caps 64 and 65 are in
superslm_pkv_r9(58 cells, 5,306 checks, 0 failures), which was run twice on the release machine
ated1cf52, on the dispatched tier: the first run failed one cell because an environment variable
was not set, and the second was green. Its forced-tier legs last ran on an earlier build, and no
AVX-512 run of them is recorded. All of these suites ran on Windows x64 with MSVC. No run of them on
Linux or macOS is recorded, and no CI job builds them. - Readings and a later fix: the readings in Speed and Memory, and the suite counts above,
were taken at commited1cf52. The release adds one fix after them, run at none of those
readings:sslm_kv_pool_destroyno longer writes through the model, so destroying a pool after
sslm_model_unmap, an order 1.11.0 allowed, stays safe. (1.12.0 added a count of live pools to the
model, and destroy decremented it through the model, which unmap may already have freed; 1.11.0's
destroy never touched the model.) - Suites (CI):
superslm_testsruns on Windows x64, Linux x64, Linux x64 with AddressSanitizer and
UndefinedBehaviorSanitizer, Linux x64 Debug, macOS arm64 and, under ThreadSanitizer, Linux x64.
The Python source checks (python -m pytest tools/ tests/reference/, as theconverter-validate
job runs it, with the 17 paged-KV tool test files that need the Windows build ignored) pass:
2159 passed, 31 skipped, 1 expected failure, measured on the release machine at the release commit. - Found before release, not yet removed: the slowdown of a no-budget save was seen in development:
a development build's full-length save at cap 32,768 on Qwen2.5-1.5B read 2.18 times 1.11.0's
(one reading, 2026-10-03). It remains in the release (see Speed), and a later release is planned
to remove it. - Code review: the final review of the release diff returned fix-then-ship. It found a
use-after-free insslm_kv_pool_destroyaftersslm_model_unmap, and two release statements that
said more than the code or the record showed. All three were fixed, and the re-check of the fixes
returned ship. Windows suite run of the fix:superslm_testson MSVC Release, 134,066 checks,
0 failures. - Release machine:
build.batran to completion in ten stages (the slices of the script that
its staged runner runs) on commit8b58684, each stage exiting 0 and the last printing its completion line, with MSVC 19.33.31631.0 configured by CMake.
The export-slot check passed: the headers declare 51 C verbs (13 new in 1.12.0) and the verb list
holds the same 51; 76 names are exported (25 C++ and 51 C) against 76 listed, with none missing
and none extra; and a consumer links against and imports all 76.superslm_testson MSVC: 129,131
checks, 0 failures, including the 2,152 checks of the decode-threading cells. The object-code scan
suite reads 232 passed, 1 skipped and 1 expected failure, and the seven source checkers of the
last stage pass.
The commits betweened1cf52, where the suites and timings above ran, and8b58684change the
build script, the repository's line-ending attributes, test suites and their fixtures, the oracle
tools of two tests, one CI workflow and the source-line citations in one header; nothing under
src/changed. The release commit differs from8b58684by documents, by comment-only edits to
one header (its code tokens are the same on the same lines), and by the teardown fix, which is the
only change undersrc/aftered1cf52, together with the fix's test cells
(tests/test_slm18x_saturation_census.cppandtests/test_main.cpp), which the 129,131-check run
above did not include. The release gate's tests
(tools/test_t2704_release_gate.py) check compiled diagnostics pinned to a commit in
tests/data/t2704_release_manifest.json; they are rebuilt and re-pinned to commit9d882b1, the last commit that changes
an input they check:python -m pytest tools/test_t2704_release_gate.pyreads 4 passed. - Skipped checks, release machine (
build.bat): the ten stages print 41 skip-class lines, and
each matched a listed expected skip. One is CMake's note that it skips its compiler check after
ABI detection, which is not a test. In the red suites, 21 checks skip (and 15 summary lines restate
their counts): 2 are searches for an adversarial refusal that found none within budget, 11 are
product cells that need inputs not supplied for this release (a different-shape model, an adapter,
or a tokenizer-bearing artifact) or, for one, a model whose geometry does not match the frozen
one, and 8 are stubs by design. The other four lines are one cell that needs a second,
differently shaped real artifact (not supplied); the GPU cellcell_functional_commission, which
build.batexcludes unless asked for; the one skipped source-check test, a documented gap in the
disassembler it uses (it never renders one instruction prefix the test would exercise); and one
attention-rowsites check that needs a one-layer synthetic artifact (not supplied).
Principal files changed
src/kv_pages.h,src/kv_pages.cpp: the page allocator.src/sslm_abi.cpp,include/superslm/sslm_abi.h,include/superslm/sslm_abi_functions.inc,
include/superslm/sslm_abi_functions_g5_comparable.inc: the page pool, budget holders, shared
adopt,sslm_prefix_begin_from,SSB6,sslm_seq_restore_shared, the stats verbs, the
contiguous pool option andSSLM_KV_BUDGET_EXCEEDED.src/forward/forward_sites.cpp,include/superslm/forward_sites.h,src/matmul.cpp,
include/superslm/matmul.h: the page view and per-page attention, with the flat workspace as its
one-page case.include/superslm/checked_chain_funnel.h,src/forward/checked_chain_funnel.cpp,
include/superslm/gpu_layer_loop_guards.def,include/superslm/gpu_port.h,
src/gpu/superslm_gpu.cpp: the page-coverage guard and its GPU mirror (it cannot fire on the GPU).tests/paged-kv/,tools/gen_paged_kv_fixture.py,tools/build_paged_kv_reference.*,
tools/check_paged_kv_red.sh,tools/run_paged_kv_c6_box.ps1,tools/paged_kv_box_common.ps1,
tools/paged_kv_c6_provenance.ps1(withtools/test_paged_kv_c6_provenance.ps1):
the fixtures, references, cells and timing harnesses.src/intmath.cpp: the softmax fast-path width cap, 32,767.include/superslm/gpu_1p0.h,include/superslm/model.h: comment text only.docs/platform-support.md,docs/sslm_format.md,docs/attention-rowsites/,
tests/attn_rowsite_golden_pin.h,tests/support/attention_cases.h,tools/ci/and
.github/workflows/tests.yml: the platform and format notes, the softmax golden pins and case
set, the CI digest tool and checks, and the CI workflow. The other changed files are tests,
fixtures, references and tool scripts.CMakeLists.txt,build.batand the MSVC build lists:src/kv_pages.cpp.tests/t2807-api-slot/c_abi_verbs.txt: 51 C verbs. The status mirrors intests/t2130-g5-red-suite
andtests/t2138-abi-red-suite: ordinal 29.tests/install-consumer/CMakeLists.txt,README.md,CHANGELOG.md,docs/api.mdand this note:
version 1.12.0.