research note  ·  finding 11  ·  pre-registered protocol, verdict of record 2026-07-10

Constant-memory recall: a fixed 32 KB state holds at 8× the binding window, and the matched baseline never got off the floor

Sam Larson

pebble, San Francisco

July 10, 2026  ·  sam@pebbleml.com

abstract

The fast-weight recall separation was measured at the binding window itself. This note asks what happens to that recall as the context grows while the model's memory does not. A 14M-parameter fast-weight matrix-state model whose entire recurrent memory is a fixed 32,768 bytes — two 64×64 fp32 matrices, constant in context length — binds K = 32 key→value pairs, then answers a query after the episode is embedded in progressively longer contexts. Result: episode-restricted top-1 recall acc_A ≥ 0.998 at every training seed at every tested horizon — 454, 902, and 1,798 tokens, i.e. 2×, 4×, and 8× the binding window. The param/token/compute-matched transformer reads chance (≈0.03) at every horizon with an uncapped KV cache, and capping its cache at M ∈ {1, 2, 4, 8, 16, 32} slots does not move it. Because the baseline never demonstrates the task even uncapped, the pre-registered degenerate-baseline clause fired: no memory-multiplier number is claimed. The verdict of record is "baseline non-competitive at matched params/tokens." Unpublished.

01Setup: the memory-matched question

The head-to-head campaign's second pre-registered axis asks an inference-memory question: at equal memory bytes, how far can each architecture carry an episodic binding? The two arms come from the same frozen 27-cell sweep as the recall-separation verdict — three fresh training seeds each, matched at 14M parameters, identical token/step budgets, identical pinned eval episodes:

Each eval episode binds K = 32 pairs, then continues with distributionally-matched filler before the query, so the query arrives at a context of 454 / 902 / 1,798 tokens (2× / 4× / 8× the binding window). The metric is the same acc_A as the recall verdict: episode-restricted K-way top-1 through each arm's own LM head — the model's own continuation, no probe. Chance = 1/32 ≈ 0.031; demonstration bar = 3× chance. This stage was eval-only (0.26 GPU-h): all checkpoints come from the already-verified sweep, loaded under md5 provenance pinning.

02The horizon table

recall vs context length: contender flat at 0.999 out to 1798 tokens, transformer at chance uncapped and at every KV-cache cap
fig 1Recall acc_A vs context length at query time. Vermillion: the fast-weight contender (fixed 32,768-byte state) — seed mean line with per-seed points, ≥ 0.998 everywhere. Blue squares: the matched transformer with an uncapped KV cache. Light-blue triangles: the same transformer with its cache capped at M ∈ {2…32} retained positions (five lines, one per M; the pre-registered descriptive-only M=1 row is excluded). Dashed line: demonstration bar (3× chance); dotted: chance. n = 4096 queries per cell, 3 seeds per arm. Data: experiment-runs/2026-07-10_h2h_mstar/MSTAR_VERDICT.json, regenerated directly from the archived verdict JSON (fan-out raws md5-verified 96/96).
heatmap: transformer acc_A across all 90 raw eval cells, M by H, split by task, colored from 0 to the demonstration bar
fig 2Fan-out drill-down: transformer acc_A across all 90 raw eval cells (M × H × seed × task), one level below fig 1's seed-mean summary. Color = mean acc_A over 3 seeds, anchored to [0, demonstration_bar] so the color channel shows distance from the 3× chance bar rather than amplifying chance-level noise; per-cell numbers are printed in each tile. Left: task 1 (single-hop). Right: task 2 (multi-hop). Every one of the 90 raw cells reads chance (min 0.018 / mean 0.025 / max 0.033 vs. chance 0.031 and demonstration bar 0.094) — 0/90 cells clear the bar at any M or horizon, confirming fig 1's capped-cache finding down to the seed level. Data: experiment-runs/2026-07-10_h2h_mstar/fanout/*.json (90 cell files, md5-verified 90/90 against the archived manifest).
arm (per-seed acc_A, s0/s1/s2)454 tok (2×)902 tok (4×)1,798 tok (8×)
contender — fixed 32,768-byte state1.000 / 0.998 / 0.9991.000 / 0.998 / 0.9991.000 / 0.998 / 0.999
transformer, uncapped KV cache0.029 / 0.030 / 0.0290.031 / 0.033 / 0.0300.036 / 0.031 / 0.034
transformer, capped M = 320.029 / 0.030 / 0.0310.022 / 0.021 / 0.0320.022 / 0.025 / 0.029
transformer, capped M = 20.021 / 0.024 / 0.0300.026 / 0.027 / 0.0330.022 / 0.026 / 0.029

The recall demonstrated at the binding window does not decay when the episode is buried in a context 8× longer — at any seed. The per-M paired gap CIs at the decision horizon (902 tokens) all have lower bounds ≥ 0.958 against a pre-registered 0.20 crossover margin; no straddle anywhere, no seed extension triggered. M = 4, 8, 16 rows sit between the two capped rows shown and are in the archived table.

key observation The interesting number here is not a comparison — it is the contender's own row. A 32 KB memory that never grows holds a 32-item episodic binding essentially losslessly across an 8× context extension. That is the "constant-memory minds" property this axis was designed to probe, demonstrated on the contender side even though the comparative instrument came back degenerate.

03Why there is no memory-multiplier number

The pre-registered plan was a crossover walk: cap the transformer's KV cache at shrinking M and find M* — the cache size where its recall drops below the fast-weight arm's, yielding a "the fixed state is worth an M*-slot cache" multiplier. The walk's arithmetic lands on the strongest possible tier (every capped M is cleanly non-rejected; the bare walk reads M* = ∞). We do not claim that. The registration carried a degenerate-baseline clause for exactly this outcome: if the uncapped transformer itself fails the demonstration bar at the primary cell, the walk is vacuous — every cap is "cleared" trivially because there was never any recall to lose — and no M* tier, no "confirmed no-crossover," and no multiplier may be certified. The clause fired: the uncapped reads are 0.027/0.029/0.029. The harvest code applies the clause mechanically; its own negative test confirms the same data without the clause would have certified a (spurious) strongest-win.

The verdict of record is therefore: baseline non-competitive at matched params/tokens. That is itself a capability-separation datum — at this matched budget, full attention did not learn the task at all — but it is a statement about this budget and training recipe, not about transformers in general, and not a memory-capacity ratio.

04Forced locality does not rescue the baseline

One live hypothesis from the sweep harvest was that capping might help the transformer — a hard cache cap forces attention onto recent positions, which could act as a locality prior on a task where full attention diffuses. The answer is no: at every M ∈ {1, 2, 4, 8, 16, 32} and every horizon, the capped reads sit at or below the uncapped read, and all are NO-RECALL. Per the frozen rule, differences between NO-RECALL arms are chance-level noise ordering and are never interpreted as separation.

05Caveats — read before citing

06Reproducibility

The full artifact set is archived under experiment-runs/2026-07-10_h2h_mstar/: 90 fan-out eval JSONs, the contender/uncapped/M=1 reference JSONs, MSTAR_VERDICT.json (every number above), checkpoint maps, all stage logs, and the md5 manifest (96/96 verified at publication). Checkpoints are the audited 27-cell sweep's _r4.pt files (experiment-runs/2026-07-10_h2h_sweep_harvest/), loaded under md5 provenance pinning. The figure-generation script is assets/plots/generate_constant_memory_recall.py, which reads the archived verdict JSON directly. Realized compute: 0.26 GPU-h, eval-only.

References

  1. Nichani, E., Lee, J. D., & Bietti, A. (2025). Understanding Factual Recall in Transformers via Associative Memories. ICLR 2025, arXiv:2412.06538
  2. Yang, S., Kautz, J., & Hatamizadeh, A. (2024). Gated Delta Networks: Improving Mamba2 with Delta Rule. arXiv:2412.06464