The short version
Two questions, one base model, five families of "reader," and a causal follow-up. Here is where they landed.
On Llama-3.2-3B, the model appears to plan a topic switch just-in-time — re-deriving the next topic from the prompt as it writes, holding only a weak choice-bias in its activations. A parascope reads the current generation state richly; the specific future is decodable only in the one setting the prompt can't reveal, and even there it isn't causally load-bearing. This reproduces "Where's the Plan?" (decodable ≠ causally used) on a new task design.
What a ParaScope is
At a paragraph break, a transformer's residual stream holds a compressed sense of what comes next. A ParaScope (Pochinkov, arXiv:2511.00180) turns that hidden state into the upcoming paragraph. Two shapes:
Continuation ParaScope — patch the break-token residual back into the model as context and let it generate. AutoEncoder-Map ParaScope — a trained map from residual → SONAR sentence-embedding space, then decoded to text. Both recover next-paragraph information worth roughly five tokens of "cheat" context at the 3B scale.
This project asks two things the original paper didn't. Q1 — move the read from the paragraph break to mid-paragraph, and from open text to controlled "talk about X, then Y" pairs: when does the future topic become readable? Q2 — stop training a probe and instead LoRA fine-tune the model itself into a reader of its own state: how good can decode get?
X-then-Y: is the plan there while it writes?
2,400 two-paragraph documents across four prompt families (explicit X→Y, derived-Y, secret-choice, model-chosen). Six layers captured at every paragraph-X token; positions binned 0–9 within the paragraph. Five independent reader families, one verdict.
Every reader agrees: the current topic X is strongly readable everywhere in the paragraph; the specific upcoming topic Y is linearly near-absent until the model actually gets there.
| Reader family | Current-X readout | Upcoming-Y readout |
|---|---|---|
| mini J-lens 64-topic pool | 0.66–0.72 acc (0.016) | 0.006–0.026 |
| Patchscopes patch L2 / L14 | 0.10–0.17 (≈10× chance) | ≈ chance |
| champion maghead probe per-token | cos 0.18–0.25 | cos 0.13–0.17 · r1 ≤0.006 |
| fresh ridge → SONAR(Y) | — | cos ~0.57 · r1 ~0.00 (collapse) |
| fresh logistic · secret-pick 4-way | — | 0.40–0.42 (0.25) |
Prominence = 1 − rank/63 (top of the 64-topic readout = 1.0) at each generated token. The current topic sits at the top of the J-lens readout across the whole paragraph; the upcoming topic stays low and only snaps upward at the ¶ paragraph boundary — often before its first content word.
Three things worth noticing
No prompt echo. Even when Y sits verbatim in the prompt (the explicit family), Y's rank-1 at the prompt's last tokens is 0.004. The parascope reads generation state, not the prompt text.
No boundary crystallization. At the exact final token of paragraph X — the probe's own training position — the champion still reads the just-finished X (cos 0.251) over the imminent Y (0.165, rank-1 0.005). A hard topic switch exposes that the boundary residual does not linearly encode the switch in SONAR space; the paper-era rank-1 on FineWeb is likely carried substantially by topic continuity between adjacent paragraphs.
One real plan signal. The exception is the secret pick — the family where the prompt lists all four options but only the model knows which it chose. There a fresh probe reads the choice at 0.40 vs 0.25 chance (best at L24/L27). That is the only place a genuine, prompt-independent forward plan shows up.
Is that plan causally load-bearing? No — at 3B.
The secret pick is decodable. So the sharp question: if you edit that representation, does the model change its mind? Intervention: add α·(μtarget−μorig) — slot-mean differences from mid-paragraph-1 captures — to all paragraph-1 positions during prefill, generate paragraph 2, parse the revealed pick. n=120 per arm.
| Config | base keep | steer→target | steer keep | ablate keep |
|---|---|---|---|---|
| L24,27 · α=4 | 0.650 | 0.100 | 0.583 | 0.692 |
| L24,27 · α=8 | 0.617 | 0.117 | 0.525 | 0.642 |
| L14,21,24,27 · α=4 | 0.558 | 0.092 | 0.567 | 0.625 |
Steering sits at chance; ablating the 3-dim pick subspace changes nothing. And base_keep is only ~0.6 at temperature 0.3 — the pick is substantially re-decided during paragraph 2. The mid-paragraph signal is a weak bias, not a locked plan.
| Config | steer→target | steer keep | steer derail |
|---|---|---|---|
| L24,27 · α=4 · all | 0.100 | 0.542 | 0.108 |
| L24,27 · α=8 · all | 0.083 | 0.483 | 0.133 |
| L14,21,24,27 · α=6 · all | 0.100 | 0.358 | 0.358 |
Higher α only derails the model (0.36 derail at 4-layer α=6) without ever flipping it to the target. The slot-mean direction isn't even write-capable — it's a pure read-only correlate of the pick. Decodable (0.40 vs 0.25), but neither causally load-bearing nor a usable control handle in diff-of-means form. This is the read≠write gap, and it directly reproduces "Where's the Plan?" on a new task.
Update: the topic direction is partially write-capable — ~⅓ clean flips from 1–2 tokens, and more steering only buys stutter
The dose–response follow-up (xy_steer_dose.py) steers toward a third topic Z by adding α·‖h‖·normalize(J[L][Z]) — the mini J-lens topic row — at layers 14/21/27, hitting the boundary \n\n plus the first n−1 generated tokens. n=120 per cell; outcome classified by SBERT over the 64-topic pool; coherence = NLL of the generation under the unsteered model (control 0.28).
The corrected answer: clean control tops out at ~⅓, and it's cheap — 1–2 tokens. Single-position steers (newline or any early token) flip ~28–35% of the time and are always coherent — typically either a real switch or a topic mention that reverts ("volcanoes and other natural disasters. Honeybees are also…"). Steering more tokens raises only the label rate: every marginal "flip" past n≈2 is a repetition loop stuttering the target's first token ("honey honey honey…", "ch ch ch…"), and by n=8 all flips are loops — at every α tried, with or without L27, at temperature 0.3 or 0.8. This was initially misread as "72% coherent flips": the SBERT classifier counts a topic-word stutter as that topic and NLL can't see loops (repetition is self-predictable). Inspecting the real examples — the hover data on this chart — is what caught it.
Which tokens matter? Any two — but the newline buys coherence
| Steered positions | flip label | est. CLEAN flips | keep Y | NLL |
|---|---|---|---|---|
| {0} — newline only | 0.350 | 0.350 | 0.442 | 2.23 |
| {1} — first generated token only | 0.325 | 0.325 | 0.500 | 0.97 |
| {2} — second token only | 0.283 | 0.283 | 0.600 | 0.90 |
| {1,2} — a pair, skipping the newline | 0.592 | 0.448 | 0.200 | 2.00 |
| {0,1} — newline + first token | 0.683 | 0.314 | 0.125 | 0.94 |
| {0,1,2,3} | 0.717 | 0.143 | 0.000 | 0.53 |
Steer any single position — newline or not — and you get the same ~30% flip, always clean: the newline is not a magic switch. Adding positions mostly converts keeps into loops, not into clean flips ({0,1} clean ≈ singles; {0,1,2,3} clean drops to 0.14). The one modest winner is {1,2} — two generated tokens, skipping the newline — at 0.45 clean flips, though its transitions are the least probable under the base model (NLL 2.0 vs 0.94 with the newline steered: the boundary steer makes the switch plausible; later steers make it happen). The loop attractor is not a last-layer artifact — dropping L27 or steering single layers weakens flips without cleaning them.
Try it on one document: the honeybees paragraph
The hypothesized demo, run for real: take a single document (the honeybees paragraph, prompted only with "Write a short article about honeybees." — nothing suggests a switch), steer toward "volcanoes" (α=1.0, L14/21/27), and vary which positions get steered. 24 samples per condition; pick a condition to read real generations.
What it shows: unsteered, the model stays on bees 24/24. Steering the newline alone: still bees 92% — the steer surfaces as a passing mention ("volcanoes and other natural disasters. Honeybees are also…") before reverting. Steering the first generated token alone: still bees 96%, often a graceful merge ("The volcanoes of the Andes are home to a unique species of honeybee…"). Steering both: the model leaves bees every time — but on this document the landing is the "volcan volcan" stutter, at every α and temperature tried (and "choral music" gives "ch ch ch"). So the newline-vs-both structure is exactly as hypothesized; what multi-token rank-1 steering can't deliver here is a clean landing. When single-token steers do win cleanly (~⅓ of the time across the population), they read like this:
The upper bound: replace real states instead of adding a direction
The P2 experiment replaces the recipient's residuals (L14/21/27) at the newline + first n−1 tokens with a donor document's real boundary states — a doc genuinely about to write topic Z. Blue curve above; the full grid (n=120/cell):
| Patched positions | clean flip→Z | keep Y | degenerate | NLL |
|---|---|---|---|---|
| 1 — the newline state only | 0.000 | 0.850 | 0.000 | 0.32 |
| 2 | 0.158 | 0.725 | 0.000 | 0.65 |
| 4 | 0.517 | 0.433 | 0.000 | 0.75 |
| 8 | 0.650 | 0.300 | 0.000 | 0.87 |
Two punchlines. First, real states flip cleanly and monotonically — no loops in 480 generations — so the switch information is causally present and usable; it is just distributed across several early-token states, beyond what any rank-1 direction can write. Second, the single-state inversion: the direction-add at the newline flips 35% (an exaggerated, out-of-distribution push whose first sampled token is often a topic word that locks in), while a faithful full-state replace at the newline flips 0% — it emits a generic opener and the model's context immediately re-derives its own plan. One boundary state, even a real one, does not carry the switch: the strongest direct evidence yet for just-in-time re-derivation at 3B.
Three interventions, one picture: the slot-mean pick direction can't write at all (chance); the J-lens topic direction writes partially and brittly (~⅓ clean, then stutter); full donor states write cleanly and monotonically (0.65 at 8 positions, zero degeneration). The boundary plan is real and causally sufficient — but distributed. No compact rank-1 control handle exists at 3B, and no single position (steered or replaced) carries the switch alone.
LoRA continuation readers: how far can decode go?
Instead of a probe that maps a residual to a SONAR vector, LoRA-fine-tune the model into a reader of its own boundary state (LatentQA-style). A soft-projector turns donor residuals into a few soft tokens; the model generates the next paragraph from them. Reader = the model decoding itself. Scored on val shard 8, n=300, against the full-shard retrieval pool.
LoRA soft ml3 L14/21/27 k16 r32 = residual-stream vectors from donor layers 14, 21, 27 at the paragraph boundary (ml3 = 3-layer multi-layer input) → a trained projector → 16 soft tokens (k16) prepended to the context → the same Llama-3.2-3B with rank-32 LoRA adapters (r32) generates the next paragraph from them. The reader never sees the document text — only the three residual vectors. Trained on 24 fineweb shards (24sh) for 5 epochs; the "soft" rows below use this injection style, the "patch" rows write donor residuals straight into the reader's own layers instead.
| Reader | Data | SBERT cos | SONAR cos | rank-1 |
|---|---|---|---|---|
| zero-shot continuation patch L14/21/27 | — | — | 0.000 | |
| LoRA patch L14/21/27 r32 | 8sh · 1ep | — | ||
| LoRA soft-projector L27 k8 r32 | 8sh · 1ep | 0.388 | ||
| LoRA soft L27 k16 r32 | 8sh · 2ep | 0.407 | ||
| LoRA soft ml3 L14/21/27 k16 r32 | 24sh · 1ep | 0.457 | ||
| LoRA soft ml3 L14/21/27 k16 r32 | 24sh · 2ep | 0.494 | ||
| LoRA soft ml6 L9–27 k16 r64 | 24sh · 2ep | 0.510 | ||
| LoRA soft ml3 L14/21/27 k16 r32 | 24sh · 3ep | 0.549 | ||
| LoRA soft ml3 L14/21/27 k16 r32 ★ decode SOTA | 24sh · 5ep | 0.628 | ||
| SONAR maghead-MLP champion probe → decode | 24sh | — | ||
| shuffled-donor floor wrong boundary's residuals | — | 0.082 | ||
| context-only baseline true text, no residuals | — | 0.631 | ||
| cheat-8 baseline context + 8 true tokens | — | 0.724 | ||
| SONAR roundtrip ceiling decode true vector | — | — | — |
What the ladder says
Training the reader is everything. The zero-shot continuation parascope on Llama-3B is weak when patching only three layers (0.087) — the paper patched all of them. Tuning the reader takes decode from 0.087 to 0.765.
Epochs beat depth and rank. Holding the ml3/24sh recipe fixed and varying only epochs gives a clean, monotonic curve — 1ep 0.548 → 2ep 0.596 → 3ep 0.670 → 5ep 0.765 SBERT (rank-1 0.210 → 0.313 → 0.393 → 0.397). A third epoch (0.670) already beat a deeper, twice-as-expensive six-layer rank-64 reader (0.623), and the completed 5-epoch run settled the scaling question: decode never saturated — 0.765 is ~97% of the ~0.79 SONAR-roundtrip ceiling, with val CE falling monotonically to the last step (0.593 → 0.368, no overfit). Retrieval is the opposite story: rank-1 flatlined at ~0.40 (rank-5 kept climbing to 0.817), so the remaining gap to the probe's 0.594 is a job for a retrieval-shaped loss, not more epochs.
Multi-layer input was the unlock, same as for the probes: single-layer donors plateaued at val CE ~1.18; the three-layer donor stack dropped it to 0.59.
A context-only generator — the same model reading the true text context (chat prompt + preceding paragraphs), with no residuals at all — scores 0.800 SBERT / 0.480 rank-1, above the reader's 0.765/0.397 (paired, same 300 boundaries). These documents are model-written from explicit prompts, so the next paragraph is highly predictable from visible text. The honest claim is therefore compression, not clairvoyance: three residual vectors carry ~96% of the decode value of the entire visible context (against a shuffled-donor floor of 0.099 — the signal is real and per-document). The one genuinely super-context number in the stack is the champion probe's rank-1: 0.594 beats context-only's 0.480 and matches cheat-8 (0.603) — the probe's raw-vector retrieval is worth about eight true tokens of the target paragraph.
A detached auxiliary cosine head bolted onto the reader does not retrieve: rank1head lands at 0.10 vs the text path's 0.25 on the same checkpoint, despite a healthy SONAR cosine of 0.54. High cosine, no retrieval — cosine objectives mean-collapse, the repo's oldest lesson. Retrieval-grade vectors need InfoNCE, which is exactly what the maghead champion runs on raw residuals. Decode and retrieval want different losses.
The LoRA reader wins decode quality at one-third the data (readable English about the right topic); the probe wins retrieval (pin the exact next paragraph out of thousands). Decoder-side capacity was the binding constraint on decode — and it's cheap to scale.
Real outputs on the same held-out boundaries (paired indices): the true next paragraph, the champion reader's decode (5-epoch, from three residual vectors only), the context-only baseline (true text, no residuals), and cheat-1 (context + the first true token). Each dot is one example, placed by the reader's SBERT similarity. Click along the range.
Pattern across the range: the reader recovers genre, structure, register and domain — sometimes the exact words even where context fails — while named entities, dates and numbers are where it diverges. Context usually matches or beats it (see the recalibration callout above); the interesting cases are where they disagree.
The probe leaderboard, and the magnitude wall
The AutoEncoder-Map side of the project: linear and MLP probes from residual → SONAR, scored by rank-1 retrieval and by decoded-text quality. This is the retrieval SOTA lineage the LoRA reader is measured against.
| Probe | Layers | rank-1 | dir-rank1 | decode | % of ceiling |
|---|---|---|---|---|---|
| llama-3b maghead linear | L27 | 0.594 | 0.628 | 0.363 | — |
| llama-3b maghead-MLP h2048×2 | L27 | 0.631 | 0.646 | 0.371 | — |
| llama-3b ml3 multi-layer | 14,21,27 | 0.648 | 0.656 | — | — |
| gemma-27b single | L58 | 0.658 | 0.676 | 0.343 | 43% |
| gemma-27b ml3 ★ overall SOTA | 50,54,58 | 0.676 | 0.693 | 0.368 | 46% |
The story in three moves
Data, then architecture, then base-model size. Doubling data lifted rank-1 ~0.06 at every layer, then saturated (24→32 shards = +0.005). An MLP direction head broke the linear rank-1 ceiling without losing decode coherence. A 9× bigger base model (gemma-3-27b) predicts the next-paragraph direction best of all. Multi-layer input, model size and data all stack: rank-1 0.658 → 0.661 → 0.676.
Decode doesn't improve in absolute terms with a bigger model — both llama and gemma sit at ~42–46% of their respective SONAR-roundtrip ceilings. The gap is magnitude: a linear d→1 magnitude head explains only ~30% of variance (llama) to ~70% error (gemma). The direction is already good; the size of the SONAR vector is the wall. That's why decoder-side levers — LoRA readers, better magnitude heads — are the path forward, and why next-paragraph decode is partly task-intrinsic (it's one-to-many).
For reference: the paper's 24-sublayer Llama-3B TAE ParaScope reports ~0.55 mean cosine; a single-layer L27 mse+zscore probe here reaches 0.514 val-cos — about 93% of the paper's signal from 1/24 of the input.
The reading toolkit: 2023–2026
Every technique that could, in principle, read an upcoming topic from activations while the model writes about something else. Filter by family; the rating is each tool's fit for the X-then-Y read.
Full 35-paper review with per-tool notes and the ranked shortlist: TECHNIQUES.md in the repo. Applicability rating = expected signal-to-effort for reading upcoming topic Y mid-paragraph.
What it all means
1. Llama-3B plans just-in-time. It re-derives the next topic from the prompt as it writes (Wu et al.'s "breadcrumbs" world), holding only a weak choice-bias in activations. The rich thing a parascope reads is the current state; the specific future is mostly reconstructed on the fly.
2. The decisive follow-up needs a bigger model. "Where's the Plan?" found Gemma-3-27B is the exception where boundary plans are causally used — and gemma-27b is also this repo's retrieval SOTA. Re-running the secret-choice causal protocol on gemma-3-27b (an A100-80G job) is the single highest-value next experiment.
3. Decode was capacity-bound, not information-bound — and it tops out at "context-grade." The LoRA reader's decode win at one-third the data says the binding constraint was decoder-side capacity, and five epochs pushed it to 0.765. But the context-only baseline (0.800) shows what that number means: the reader compresses context-grade information into three vectors rather than reading anything beyond it. The probe's rank-1 (0.594 vs context's 0.480) is the one super-context signal. Retrieval and decode want different losses; the best system likely uses both.
4. Rank-1 steering is partial and brittle — and metrics lie about it. The slot-mean plan direction can't write at any dose; the J-lens topic direction flips cleanly ~⅓ of the time with 1–2 steered tokens, and pushing harder only produces topic-word stutter that an embedding classifier happily counts as success. Two working lessons: always read the generations (the hover examples caught the miscount), and pair every embedding metric with a repetition check. Real-state patching then settled it: full donor states flip cleanly and monotonically (0.65 at 8 positions, no loops), while a single state — even a real one — flips nothing. The plan is causally sufficient but distributed; there is no compact handle.
InfoNCE-style auxiliary loss to close the LoRA retrieval gap · real-state patching upper bound (P2) · attention-knockout breadcrumbs test (P3) · a repetition guard for steered decoding · the gemma-27b causal port · a future-supervised concept bottleneck (Predictive Concept Decoders) as a principled "SAE that reads ahead."
Methods & disclosure
Base model. Llama-3.2-3B-Instruct (28 layers, dres=3072). Sentence embeddings via SONAR (1024-d), decoded with the SONAR text decoder. Retrieval pools use the full validation shard (~10.3k paragraphs). Probe retrieval and LoRA-reader retrieval use the identical protocol (SONAR-encode the output, rank against true targets) so numbers are comparable — with the caveat that the LoRA path is scored text→SONAR-re-encode (lossy) while the probe is scored on its raw output vector.
X-then-Y dataset. 2,400 two-paragraph documents, four prompt families, ~78% compliant. Residuals captured at six layers across all paragraph-X tokens, binned 0–9 by within-paragraph position. Causal tests use slot-mean difference vectors added during prefill (and, as a control, at every generated token). Compute: 3× A4000 16GB.
Dose–response & baselines (Phase 5). Steering adds α·‖h‖·normalize(J-lens row of a third topic) at layers 14/21/27 to the boundary newline + first n−1 generated tokens; outcomes SBERT-classified over the 64-topic pool with an unsteered-model NLL coherence guard (n=120/cell). The NLL guard is blind to repetition loops and the SBERT label counts topic-word stutter as a flip, so clean-flip rates are re-estimated post-hoc with a distinct-token-ratio check (<0.35 = degenerate) on the saved generations (60/cell, so ±~0.06); the flip-label curves are kept for comparison. Baselines re-run the exact 300 eval boundaries (same seed-0 draw) with the true text context in place of soft tokens: context-only, context + first k true target tokens (cheat-k), and wrong-boundary donors (shuffled floor).
This site and the underlying experiments were produced by an AI research agent. Results are from real training runs and evaluations on the hardware described; the writeup has been AI-compiled and AI-fact-checked against the project's result logs, not independently peer-reviewed. Numbers reflect single runs at the 3B scale and should be read as directional, not definitive. Treat conclusions as a research snapshot, not settled findings.