Anthropic's Verbalizable-Workspace paper showed, on one closed model family, that a model's middle layers carry a dictionary of directions that causally steer its output. It left the natural next questions open: how far forward in time the steering reaches, when the structure forms during training, whether it transfers between models, and how it scales. We measured all four on open models, then two follow-ups the results forced on us. Every number below was re-derived from the committed result files, and every chart is interactive.
from Elie: ok so everything except this message is "vibe coded". when reading the anthropic paper, i had a few ideas about behaviors of this "jspace" i was curious about. i asked fable to brainstorm with me and also let it suggest more experiments that would be interesting. then i let it run experiments autonomously (almost) on our cluster. i'm not an expert in this domain and the experiment design as well as my ideas probably don't make total sense for someone who is. i would never have had the time to run those experiments, or even thought of doing them, if i had to do everything myself btw. i did spend some time understanding the results tho and going back and forth with the agent on some experiment design and visualizations.
why this format: my goal is to share the results without spending days on it. i read most papers and blogs (except very well written ones) through an agent nowadays, asking questions and looking at figures. i'm not a great writer and not fully knowledgeable on this subject so a clean blog would have taken me a while + i'm not sure the output would have been much better.
how to read it:
llm.txt is a version that should be better for agents, with data for each figure
Explain technical/research topics like this: lead with intuition, then make it concrete with small worked numbers and examples. Be visual — use ASCII diagrams, side-by-side tables, and unified "skeletons" that put competing methods on the same notation so differences pop. Render all math terminal-readable (ASCII/unicode like 1/√L, Σ, α — never LaTeX $...$). Define every symbol and metrics; unpack compressed ideas instead of assuming them. Keep prose tight and concise— no filler i'm looking at the figure of this blog and i want you to recap the main findings and answer to my question blog llm.txt: https://eliebak.com/viz/jspace-open-v2-llm.txt github repo with the data: https://github.com/eliebak/open-jlens-data anthropic paper: https://transformer-circuits.pub/2026/workspace/index.html example of jlens from open model: https://huggingface.co/neuronpedia/jacobian-lens
The measurement
Everything on this page comes from a single measurement. Take a model reading text, nudge its residual stream at layer ℓ, and record how the final layer — the one that decides the next token — moves in response. Averaged over many positions and prompts, that response is a matrix Jℓ: the layer's typical influence on the output.
Multiplying by the unembedding makes the influence concrete. Each of 4,096 common tokens gets a vector: the direction at layer ℓ that pushes that token's probability up. These are steering vectors in the literal sense — inject one and the model says the token, which is what E3 exploits. Together, the 4,096 vectors are the layer's dictionary.
Two numbers summarize a dictionary. The first is CKA — centered kernel alignment — which asks whether two dictionaries have the same shape when you are not allowed to compare coordinates. The recipe: center a dictionary's vectors, then build its table of relations K = VVT — a 4,096 × 4,096 grid whose cell (i, j) records how strongly entry i points along entry j. The table is coordinate-free: rotate the whole dictionary and not a single cell changes. CKA is then just the cosine between two such tables,
CKA(A, B) = ⟨KA, KB⟩ / ‖KA‖ ‖KB‖
— 1.0 when the geometry is identical, near zero for unrelated random tables. For calibration: two independent fits of the same model score about 0.997, and two different trained models compared at matched depth land around 0.5–0.7.
Computed between every pair of a model's own layers, the same number draws a map with visible blocks — an input-side block that reads, a long middle block (the paper's "workspace"), and a small output-side block that writes.
The second number is PR — the participation ratio — which counts how many directions a dictionary actually uses. Take the eigenvalues λi of the dictionary's covariance (the weight each independent direction carries) and form
PR = (λ1 + … + λn)² / (λ1² + … + λn²)
If every direction carried equal weight, PR would equal their count; if one direction carried everything, PR would be 1. Six entries spread over two directions give PR ≈ 2. Entries are not directions.
One caveat travels with everything here: J is an average over a text distribution. Change the text and the measurement changes — that is E5.
E1 · temporal horizon
The Verbalizable-Workspace paper reads the middle layers as a workspace that "holds things in mind". Taken literally, a nudge there should keep steering the output for many tokens — longer than a nudge anywhere else. The standard fit can't test this: it averages over all future positions and erases the time axis. So we split it by distance: fit a separate dictionary on source–target pairs exactly Δ tokens apart and track its overall strength, effectℓ(Δ) = ‖P·Jℓ(Δ)‖ — how hard a nudge at layer ℓ still moves the output Δ tokens later. Six models, 250 prompts each, Δ from 0 to 96.
The problem with those curves: they come from 128-token sequences. An effect at Δ ≈ 96 can then only be measured from source positions squeezed into the first thirty tokens of the window, so if early positions behave differently, the far buckets are biased. We re-measured two models on 4,096-token sequences — every prompt a full 4,096 tokens, distances bucketed out to Δ ≈ 3,000. Two approximations keep the cost sane: fewer prompts (112 and 200 against 250), and effects are accumulated at 160 log-spaced target positions per prompt instead of every position. The per-bucket averages stay unbiased, and the recombined dictionaries match the standard fits at r = 0.996 and 0.987.
Two regularities hold in all six models. The prediction fails: the longest-lasting influence comes from the first few layers, not the middle — the half-life peak sits at ρ = 0.03–0.17 in every model, and band half-lives are an unremarkable 2–5 tokens. And influence shrinks with depth: the deeper the layer, the smaller the fraction of its effect that crosses tokens, the shorter its half-life, and — in the long-window fits — the steeper its decay exponent. The sharpest feature on that decline is the cliff at ρ ≈ 0.6–0.7, and where the segmentation finds an unambiguous deep boundary the cliff sits on it: qwen3-1.7b cliff at ρ = 0.667, qwen3-4b at 0.657 across a 2.3× scale change. Ablations locate the carrier: freeze the attention patterns and every profile stays put (r ≥ 0.996); cut the value path and 86–95% of cross-token reach disappears; cut the model's identifiable copy-heads and nothing changes. The reach is content carried through fixed attention patterns — and beyond the measured window there is no data, not a null.
E1×E2 · the horizon through training
The same distance-resolved fit, repeated on twelve public checkpoints of SmolLM3-3B, from 0.1 to 11.2 trillion tokens. Three quantities from E1 are tracked. The temporal cliff is the depth where the crossing fraction — effect(Δ1) ÷ effect(Δ0), the first E1 figure — falls below 70% of its mid-band level: the top of the collapse. The CKA boundary is where each checkpoint's own layer-by-layer CKA map splits into two blocks (the same segmentation drawn on every map on this page): the geometric edge of the band. In-band flatness is effect(Δ96) ÷ effect(Δ12.5) medianed over a fixed set of band layers — E1's reach statistic, window caveat included.
The cliff sits at ρ = 0.63 at the first public checkpoint — less than one percent of training — and stays on that exact layer in eleven of the twelve. The geometric boundary starts at ρ = 0.46 and migrates onto the cliff over the next six trillion tokens: the temporal feature is in place first, and the geometry converges onto it. Reach never grows — in-band flatness is trendless from 0.1 to 11.2 trillion. What does mature is the shape: at the first checkpoint the band crosses tokens only half as strongly as the sensory layers; by three trillion the two are equal, and that flat-inside-band profile then locks.
E2 · emergence
The paper compared a base model against its post-trained version, and nothing in between. We fit the lens at 27 checkpoints across three training runs — SmolLM3-3B (12 checkpoints), OLMo-32B (11), and an early-OLMo-7B set that starts at the untrained random initialization — and compared every checkpoint with every other. All comparisons here use one number: matched-depth CKA — layer ℓ of one checkpoint against layer ℓ of the other, with the CKA from the method section, averaged over layers.
Three findings. The block structure is present at the earliest trained checkpoint we have — 4 billion tokens for OLMo-7B, 95 billion for SmolLM3 — and the random initialization shows why raw blockiness can't be trusted: the segmentation finds "blocks" there too (blockiness 0.13), but they align with nothing — depth correlation to trained checkpoints ≈ 0, and its match to the 32B run starts at CKA 0.31 and falls to 0.17 as that run trains. The band's position keeps moving after that (ρ 0.46 → 0.63, the E1×E2 boundary curve) and stops by ~3 trillion tokens.
The geometry inside the layout never settles. Concretely: layer by layer, the relation table from the method section keeps being rewritten — entries keep changing direction relative to one another. A rigid rotation of a whole dictionary would leave CKA at 1.0, so this is internal rearrangement, not a drifting coordinate system. The 32B's rate falls as 1/t but never reaches zero — its final state scores CKA 0.84 against itself 200 billion tokens earlier. The 3B's rate stops falling at ~3 trillion tokens and holds constant to the end of its run.
Token count, not compute, sets a checkpoint's geometric age — and the bigger model ages more slowly per token. At the one token count where the runs overlap (16.8 billion), the 7B and the 32B agree at CKA 0.67, no better than two unrelated trained models (0.5–0.7 — method section). And in both rows of the figure above with room on either side, ● sits to the right of ▢: the 32B needs 1.4–2.5× more tokens to reach the state the 7B is already in. Matching by compute would predict the opposite side — at equal FLOPs the 32B has ~4.6× fewer tokens, not more.
E3 · transplant
Two unrelated trained models score CKA 0.5–0.7 at matched depth — their dictionaries have similar shape. Looking alike is cheap. The test that matters is causal: take a concept's vector out of one model, map it across, and see whether it drives the other. Two pairs: cross-family Llama-3.1-8B ↔ Qwen3-8B, and cross-scale gemma-3 4B ↔ 27B. For each pair we take 4,096 tokens both dictionaries list, fit one linear map from sender entries to receiver entries on 3,276 of them, and hold out 820 the map never sees. Two kinds of map: ridge — ordinary regularized regression, free to stretch — and svd — the best pure rotation, no stretching allowed.
Cross-family it works: a held-out concept, carried by a rotation fit on other words, becomes the receiver's top prediction in 94% of cells into qwen and 96% into llama, while the controls score 0 in all 104,832 control cells (48 concepts × 7 prompts × 8 strengths × 3 control arms × 13 layer–direction combinations). The gemma scale pair transfers less well: 76% into the 27B, 56% into the 4B. That a pure rotation suffices is a finding in itself — the two dictionaries are congruent shapes, not just statistically similar ones.
Two prices attach. The headline rates are each direction's best (layer, α) cell of a sweep, not an average. And the borrowed vector needs a bigger push: measuring disruption as the KL between the receiver's next-token distribution before and after injection (concept token excluded), the mapped vector reaches its optimum at 1–6× the budget at which the receiver's own vector already saturates. Capped at the own vector's budget, cross-family transfer drops to 0.41–0.69; at its own operating point it matches 94–99% of the ceiling at equal fluency cost. All of this is common vocabulary; rare words are untested.
E4 · scale
The Delphi suite is a controlled ladder — one architecture, one dataset, one tokenizer, 447M to 25B parameters — so size, data and compute can be separated rather than guessed at. We measured dictionary size along the compute-optimal ladder, across a fixed-compute slice of six sizes, and across seed re-runs; and, separately, how many entries a real activation engages.
Dictionary size follows width and training length: across all fifteen models one surface, PR ∝ width0.58 · (tokens per parameter)−0.13, fits the ladder, the fixed-compute slice and the seed re-runs — training compresses (~26% per 10× more tokens per parameter), which is why an undertrained 8.1B measures larger (520) than the fully trained 25B (379). Along the compute-optimal ladder, growth stops near 2×10²⁰ FLOPs: with the seed-measured noise, the single power law is rejected at p ≈ 0.002–0.014. Over the same range the number of entries a token engages falls from 49 to 5 — a bigger dictionary, consulted more sparsely. Seeds agree on the shape (pairwise CKA 0.85–0.91) but not on the number: the three 9.7B seeds measure 344, 444 and 492. And every number here is WikiText — which is the next section's problem.
E5 · corpus dependence
J is an average over text. We refit the lens on Python code, web math, and PDF-extracted prose for four models, and compared each model with itself across corpora. To know which differences are real, a floor: a second WikiText fit on fresh prompts, same budget — the disagreement you get from re-measuring with nothing changed (CKA ≈ 0.99 in the band).
The text matters, and in a structured way. The input-side layers are rewritten wholesale — qwen3-4b's first layers agree at only CKA 0.26 between the code fit and the WikiText fit, against a floor of 0.99. The output side barely moves, though it never comes within the floor either. The blocks survive every corpus. The numbers do not: the same qwen3-4b band measures 594 directions through code and 202 through PDF prose — a swing as large as E4's entire five-decade compute range, and 13–93× the re-measurement floor across models. A dictionary size is a property of a (model, corpus) pair, not of a model.
E5x · cross-model, by corpus · new
E5 compares a model with itself. Here we fit both models of a pair on the same corpus and compare them to each other at matched depth: qwen3-1.7b × qwen3-4b (same tokenizer), and gemma3-1b × qwen3-1.7b (4,096 shared token strings), on all four corpora.
Yes — and in the opposite direction from capacity. Code, the text that inflates each model's dictionary the most, makes two models look least alike (qwen pair: 0.56 on code against 0.67–0.70 on prose; gemma×qwen: 0.44 against 0.53–0.57), and it blurs which depth corresponds to which. Doubling the prompt count moves these numbers by less than 0.001, so this is not noise. The shared, transferable part of the code lives in ordinary prose; code text exercises machinery each model built its own way.
E6 · mixture-of-experts
The same measurement, pointed at two mixture-of-experts models: Kimi-K2.5 (1T parameters, 32B active per token; 100 prompts) and DeepSeek-V4-Flash (284B, 13B active; 250 prompts), each fit at 16 source layers. We show the maps to look at and stop there — two models, one of them on a quarter of the usual prompt budget, don't support conclusions.