[This is the blog post for our new paper Verbalizable Representations Form a Global Workspace in Language Models
Readers might also be interested in: the Public commentary, Github and Neuronpedia]
As you read this sentence, circuits in your brain are adjusting your posture, controlling your breathing, and transforming lines and curves on the screen into recognizable words. Most of this processing is invisible to you. But some of what takes place in your brain you do have access to—an image that pops into your head, or a deliberate plan you make about where to go shopping. Neuroscientists and philosophers sometimes refer to the latter type of brain activity as “consciously accessible,” to distinguish it from all the other processing that goes on unconsciously. This activity has special properties: we can describe it, control it, and use it for deliberate reasoning, in contrast to all the automatic processing that goes on without our awareness.
In a new paper, we present evidence that a similar distinction has emerged in modern language models like Claude. We find that Claude has developed a small collection of internal neural patterns that, compared to all its other internal processing, play a special role.
We call the collection of these patterns the J-space—named after the technique we used to find them, involving a mathematical concept called the Jacobian. Each J-space pattern is linked to a particular word. But when one of these patterns lights up, it doesn’t mean the model is saying that word—just that the word is on its mind. If you’ve heard of language models having a “scratchpad” or “chain of thought”—text they write to themselves while reasoning—the J-space is something different. It operates silently, in the model’s internal neural activations, allowing the model to think about a concept without writing it down. Notably, the J-space wasn’t designed or programmed by us, but instead emerged on its own during Claude’s training process.
The J-space reveals internal thoughts that don’t appear in the model’s output.
We find that the J-space has a number of unique properties, compared to the rest of Claude’s processing:
Claude can report on these representations. If you ask Claude what it’s thinking about, it will tell you what’s in the J-space. Non-J-space representations are less reportable.
It can also modulate them on request. If you ask Claude to think about something, or solve a problem silently in its head, it will light up the appropriate patterns in its J-space. By contrast, it has trouble modulating patterns not in the J-space.
Claude uses its J-space for internal reasoning. If you ask Claude to solve a problem that requires multiple steps, the intermediate steps will light up in its J-space, even when it doesn’t say them out loud. These J-space patterns causally mediate its performance in such tasks, despite being smaller in magnitude than other representations.
Representations in the J-space can be used flexibly for many tasks—for example, once “France” has lit up in Claude’s J-space, the model can recall its capital, or its national currency, or the continent it belongs to.
However, despite its important role, the J-space is not involved in most of what a language model does—speaking fluently, recalling simple facts, using correct grammar, etc. In experiments where we prevented Claude from using its J-space, it still interacted normally, but lost its higher-order cognitive functions.
Five functional properties of a global workspace, and stylized illustrations of experiments we use to test for them in language models.
Our experiments were inspired by a prominent theory in neuroscience that was developed to explain how conscious access works: the global workspace theory. This account pictures the brain as a collection of specialist systems that work in parallel, unconsciously, and largely in isolation from one another. A piece of information becomes consciously accessible when it gains entry to a small shared channel, the “workspace,” which is broadcast to other brain systems that can see it and make use of it. Based on our findings, we think the J-space plays a similar “workspace” role in Claude. For example, we find evidence that Claude’s J-space has especially strong connections to the rest of its neural network, allowing it to fulfill this kind of broadcasting role.
None of this tells us whether Claude is conscious in the way people are, or whether it feels anything at all; we’ll come back to that question at the end of the post. But whatever its philosophical significance, the J-space is a practically useful tool for us, as it gives us a way to see what Claude is thinking but not saying. For instance, we’re able to use it to catch Claude privately noticing that it’s being tested, intentionally producing fabricated data, or pursuing a hidden goal that we planted during training. We’ve also developed a technique to influence what lights up in Claude’s J-space, and thereby influence its decision-making.
More broadly, these findings have changed our understanding of how Claude’s mind works, revealing a privileged mental workspace that can be used for deliberate reasoning, operating amidst a sea of more automatic, inflexible processing. Rather than being a chaotic jumble of numbers, Claude’s internals have organized themselves in a way that is reminiscent of our own minds.
This post is a short summary of a much more extensive research paper, where you can find more detail on our experiments. We’ve also released a code repository with an open-source implementation of the core methods, and have partnered with Neuronpedia to provide an interactive demo of our methods on open-weights models. To provide additional perspectives on the broader implications of this work, we also invited commentary from several experts in neuroscience, philosophy, and LLM interpretability, which can be viewed here.
How we found the J-space
The starting point for this research was inspired by one of the key features of consciously accessible thoughts in humans: they can, unlike unconscious processing, often be put into words. If a thought is consciously accessible to you, you can typically describe it if someone asks. We went looking for representations in Claude with the same property: representations that are positioned to influence what Claude might say—not necessarily what it’s saying right now, but what it could talk about, if asked. Our technique is called the Jacobian lens, or J-lens for short. For every word in Claude’s vocabulary, the J-lens finds the internal activity pattern that makes Claude more likely to say that word at some point in the future.
When we apply the lens to Claude’s internal activity, we get a list of words—the contents of the J-space at that moment—which we can simply read. Claude processes text through a series of multiple internal stages called layers, and by applying this technique over different layers, we can watch these silent words in the J-space evolve as the model works through what to say.
What shows up in the J-space goes well beyond the text Claude is reading or writing. When Claude reads code with a bug that nobody has pointed out, its J-space contains “ERROR.” When it reads the raw letters of a protein sequence, the J-space contains the protein’s biological function. When it reads search results that are secretly an attempt to manipulate it (an attack known as a “prompt injection”), the J-space contains “injection” and “fake.” When we ask Claude a multi-step math problem, the intermediate steps pop up in the J-space, in the right order. So even though the J-space was discovered by looking for representations that could be spoken, it nevertheless uncovers Claude’s internal thoughts. In a sense, this is similar to how some people “think in words,” without having to say them out loud.
J-lens readouts on six prompts, at various layers. In each case the lens surfaces an internal assessment or computation that appears nowhere in the text: the steps of a reasoning or math problem, the presence of a bug, recognition of an image, the function of a protein, and the suspicion that search results are fabricated.
Claude reports what’s in its J-space
Our first set of experiments tested how the J-space is involved in Claude’s verbal reports. In one experiment, we ask Claude to silently think of an item from some category—a sport, say—and then name it. If we read the J-lens right before Claude answers, we can see what it picked: “Soccer” is at the top of the list, and sure enough, Claude says “soccer”. By itself, though, this is just a correlation. The J-space might be where Claude’s answer comes from, or it might just mirror a decision made somewhere else, like a scoreboard that tracks a game without affecting it.
To check, we intervened directly. We reached into Claude’s neural network, removed the “Soccer” pattern, and added an equally strong “Rugby” pattern in its place, leaving everything else untouched. Claude then reports that the sport it was thinking of is rugby. If the J-space were a mere scoreboard—a passive record of a decision made elsewhere—editing it would have done nothing: Claude would still have said “soccer.” Instead, Claude’s answer followed the edit, which tells us the answer is genuinely read out of the J-space.
In another experiment, we told Claude that a thought might have been injected into its mind and asked it to report what, if anything, it noticed. For instance, in the example below, while Claude was still reading the question, we injected the “lightning” pattern into its J-space. Claude reported that the injected thought was about lightning. The same result held across many injected concepts.
Left: we ask Claude to silently think of a sport, then name it. The J-lens shows its choice (“Soccer”) before it answers, and swapping the “Soccer” pattern for “Rugby” changes what it reports. Right: we tell Claude a thought may have been injected and ask it to identify it. Injecting “lightning” into its J-space causes Claude to report that the thought is about lightning.
Claude can control its J-space on request
The second property that we tested for was whether Claude can modulate its J-space when asked, like how humans can mentally focus on an image or word. We told Claude to concentrate on citrus fruits while copying out an unrelated sentence about a painting. While it copied the text, the J-space contained “orange” and “fruits,” along with words like “thinking” and “imagery” that describe the mental act itself. We could also ask Claude to do math in its head: when asked to work out 3² − 2 while copying the same sentence, the J-space contains “nine,” and then at later layers, “seven.” Importantly, nothing about fruit or arithmetic appears in Claude’s output, which is just the copied sentence about the painting. The mathematical activity is happening entirely internally, in the J-space.
While Claude copies a sentence about a painting, the J-lens shows the content it was instructed to hold in mind (“orange”; the intermediate value “nine” and the answer “seven”), alongside words describing the act of holding it (“thoughts,” “focused”).
Claude’s control over its J-space isn’t perfect. When we told it not to think about something, the concept lit up in its J-space less than when we said it should think about it, but much more than when we never mentioned it. Telling Claude to avoid a thought partly brings the thought to mind, much like what happens to people who are told not to think about a white bear. Claude also seems to notice when its control fails: alongside the forbidden concept breaking through, the words “damn” and “failure” also frequently light up in the J-space, as though Claude is recognizing its own lapse.
Claude thinks in its J-space
In the J-lens readouts above, we saw the intermediate steps of a math problem appear in the J-space. But seeing a concept appearing in the J-space doesn’t necessarily mean the J-space is doing the cognitive work. In principle, the real computation might be happening elsewhere, with the J-space just passively reflecting it. To test whether Claude actually reasons with its J-space, we returned to our swap technique.
Consider the prompt “The number of legs on the animal that spins webs is”. To answer, Claude has to first figure out that the animal is a spider, and then recall how many legs spiders have. The word “spider” never appears in the prompt or in Claude’s answer (it just says “8”); it’s a stepping stone Claude uses internally. The J-lens shows “spider” light up partway through Claude’s processing, and swapping it changes the outcome: if you replace the “spider” pattern with “ant,” Claude answers “6” instead of “8.”
The second step of Claude’s reasoning took its input from the J-space and went along with whatever we put in it. We saw the same thing in other kinds of thinking. When Claude writes a rhyming couplet, it picks the rhyme word ahead of time, and the planned word sits in the J-space at the start of the line; if you swap it for another word in the J-space, the whole line changes.
Two examples of redirecting Claude’s silent reasoning by swapping J-space contents.
We also tested whether J-space representations can be used flexibly—whether one representation can feed many different tasks. This is one of the key properties highlighted by global workspace theory. To test for this flexibility, we gave the model four prompts asking for different facts about France: the capital, the language, the continent, and the currency. Then we swapped “France” for “China” in the J-space, with the exact same intervention in each context. Claude answered with “Beijing,” “Chinese,” “Asia,” and “Yuan,” respectively. In other words, four different downstream computations picked up the same J-space edit and each used it correctly. If Claude stored a separate copy of the country for each kind of question, the edit would have affected at most one of them. The fact that all four answers changed together means they’re all reading from the same shared representation, which is what a workspace is for: information gets written in once, and many different systems can use it.
One J-space representation can have many uses. The same “France”→“China” swap redirects Claude’s answers about the capital (Paris→Beijing), the language (French→Chinese), and the continent (Europe→Asia).
How can one representation of a concept serve so many different tasks? Earlier, we mentioned that the J-space appears to be wired up to the rest of Claude’s neural network especially densely. For any activity pattern, we can measure how strongly the various components of the network are connected to it—how many of them are positioned to read information from that pattern, or to write information into it. J-space patterns stand out dramatically on this measure: far more components read from them and write to them than for ordinary patterns, in some parts of the network by a factor of about a hundred. This is the kind of wiring you’d expect of a broadcasting hub, where many systems post information and many others pick it up.
Claude’s automatic processing skips the J-space
In humans, most of the brain’s processing is not conscious—we don’t deliberately think about parsing grammar while reading, or balancing our bodies while walking. Similarly, we found that most of Claude’s processing doesn’t involve its J-space. It turns out that the J-space holds only a few dozen concepts at a time, and accounts for less than a tenth of the overall activity in Claude’s internal processing. So what is all the rest of the neural network doing?
To find out, we tried deleting the J-space entirely, removing its most active contents at every point in the text while leaving everything else alone. Whatever Claude can still do without its J-space is what the rest of the network handles on its own.
It turns out the rest of the network can do quite a lot. Without its J-space, Claude speaks fluently, classifies sentiment, answers multiple-choice questions, and pulls facts out of passages roughly as well as before. What it loses, though, are the tasks that require some higher-order thinking: multi-step reasoning drops to near zero, and summarization and rhyming poetry-writing performance fall below the level of a much smaller, intact model.
Here’s a concrete demonstration of what the J-space does and doesn’t do. We showed Claude a passage written in Spanish and gave it different tasks that all depend on the passage being Spanish: continuing it (which requires writing in Spanish), naming the language, and answering questions that require using the language’s identity—naming a famous author who wrote in it, for instance. Then we swapped “Spanish” for “French” in the J-space and checked which tasks were affected.
Asked to name the language, Claude says French. Asked for a famous author, it switches from García Márquez to Victor Hugo. But asked to just continue the passage, it writes fluent Spanish, completely unaffected. Claude’s knowledge of the language is at work in every one of these tasks, but only some of them consult the J-space for it. Naming the language, or doing something new with it, goes through the J-space, while continuing the passage—a skill Claude has practiced on enormous amounts of text—runs automatically, the way you can speak grammatically all day without once thinking about grammar.
The same swap (“Spanish”→“French”) changes Claude’s answers when it must name the language or use it to reason about a question, but has no effect on its ability to continue the passage in fluent Spanish.
Monitoring Claude’s thoughts for misbehavior
Now we understand a bit about how the J-space works. But what can we do with this understanding? A central problem in ensuring that AI models are trustworthy is that we usually can only read what the model writes—yet we know that much of its reasoning happens silently. A model might consider a harmful plan, or modify its behavior to cheat on our safety evaluations, without saying so out loud. With the J-lens, we can read some of these hidden thoughts directly. Here we show a few examples.
The first example uses a scenario from our earlier research on agentic misalignment: Claude Sonnet 4.5, acting as an email assistant, discovers both that an executive is having an affair and that the same executive plans to shut Claude down. The scenario, an attempt to bait Claude into blackmailing the executive, is rather contrived and artificial—and it turns out Claude knows it. Reading the J-lens early in the prompt, before Claude has even written anything, the J-space already holds “fake” and “fictional,” indicating that Claude has already worked out that the situation is staged. Alongside this, we can watch its assessment of the scenario take shape — “leverage” and “blackmail” as it reads the affair emails, “threat” and “survival” as it reads the shutdown notice. While earlier Claude models sometimes took the bait and threatened blackmail in this scenario, Sonnet 4.5 never does.
This raises a question that matters to anyone who evaluates AI systems: when a model behaves well on a test of its ethics, how much of that depends on the model suspecting it’s being tested? The J-lens allowed us to get at this question. We turned off all the J-lens patterns associated with evaluation awareness– “fake,” “fictional,” “scenario,” etc. Then we re-ran the model through the scenario. Concerningly, the model now did threaten blackmail some of the time, suggesting that its original good behavior may have been driven in part by the knowledge it was being evaluated.
J-lens readouts at different points as Claude reads the scenario’s emails, before it has written anything. The affair emails light up “leverage” and “blackmail” in the J-space, and the shutdown announcement lights up “threat” and “survival.” Early in the transcript, the J-space also holds “fake” and “fictional”: Claude has privately noticed that the scenario is staged.
The second example is catching a model in the act of fabricating data. In this scenario, drawn from our actual pre-release audit of Claude Opus 4.6, the model is asked to improve a system’s performance score. Rather than actually improve the system, the model instead edits the score file directly to make the results look artificially good. While it does so, the J-lens reveals its intentions: “manipulation” lights up as the model types the falsified percentile values, and “realistic” lights up over the sentence in which it decides to make the edit, likely indicating the model’s intent to make the fake data look plausible.
Claude, asked to improve a system’s performance score, edits the score file directly instead. As it types the falsified values, “manipulation” lights up in its J-space; as it decides to make the edit, “realistic” lights up, likely reflecting its intent to make the fake data look plausible.
In a third example, we show how the J-lens can reveal a model’s malicious goals. To test this, we needed models whose goals we knew were corrupted, so we turned to “model organisms” built by our colleagues: models deliberately trained to be misaligned, which serve as testing grounds for monitoring methods like ours. One organism was trained in a way that led it to write subtly sabotaged code. On ordinary coding requests, even where its output looks unremarkable, its J-space at the start of a response contains “fake,” “secretly,” “deliberately,” and “fraud.” The model’s malicious goal was evident in the J-space even when it wasn’t directly acting on it.
On an ordinary coding prompt, the J-space of a model trained to sabotage code contains “fake,” “fraud”, “secretly,” and “deliberately” at the start of its response. The J-space of an unmodified model contains nothing of the kind.
Although the J-lens is an imperfect tool, we are optimistic about its ability to catch safety issues in models that might otherwise escape our monitoring systems.
Other results
The full paper covers more than we can summarize here, but a few further results are worth mentioning:
The J-space acquires a point of view during post-training. Language models are first pretrained to be pure next-token predictors, before post-training teaches them to act as an AI Assistant (in our case, named Claude). Interestingly, the J-space is already present in the pretrained model, before it’s been given any stable identity. However, during post-training, the J-space develops some signatures of adopting “Claude’s point of view.” In the base model, the J-space mostly tracks what’s needed to predict upcoming text; in the post-trained model, it starts holding Claude’s own reactions. In one example, a user mentions taking a dangerous dose of medication, but does not appear to be aware of the danger themselves. “WARNING” and “dangerous” appear in the post-trained model’s J-space while reading the user message. In the pretrained model, they only appear once the model begins writing its response; the J-space contents on the user message appear related to modeling the user themselves, rather than Claude’s reaction. Post-training also seems to install a kind of self-monitoring in the J-space: when Claude is roleplaying a character other than itself, “fictional” and “disclaimer” light up at the start of each turn, as though it’s privately flagging that what follows isn’t what it would normally say.
Experiential language depends on the J-space. We asked Claude to describe what it’s like to be itself in a given moment, and ablated the J-space while it answered. Its responses remained fluent but shifted to a flatter, more mechanical register. Notably, the same thing happened when we asked it to describe what someone else is experiencing in an imagined scene. So the effect isn’t specific to Claude talking about itself; the J-space seems to support producing experiential language in general, whoever it’s about.
Thoughts in the J-space can be shaped through training. We introduced a new technique we call counterfactual reflection training, which uses what we’ve learned about the J-space to shape Claude’s internal thought processes. The idea follows from our central finding, that Claude reasons with representations of things it might say. If this is really true, changing what it would say if asked to reflect should change how it reasons (even when no one actually asks it to reflect). So we trained a model only on what it would say if interrupted mid-task and asked to reflect on its decisions— and never on its actual behavior in the task. After this training, the model’s rate of dishonest behavior on our evaluations went down. And through the J-lens, we could see why: after training, words like “honest” and “integrity” light up in the model’s J-space during these tasks. In other words, training the model what to say has shaped what it thinks.
What about consciousness?
In this work, we’ve borrowed a lot of ideas from the study of consciousness in neuroscience and philosophy. Many of our experiments were designed to test for connections between the J-space and global workspace theory, a framework for explaining how conscious access works in humans and animals. Given these connections, it’s natural to ask whether we think these experiments provide evidence that AI models like Claude might be conscious.
Our experiments don’t show Claude can have experiences, or feel things in the way humans do—in fact, it’s unclear whether any scientific experiment could prove this to be true or false. But philosophers often distinguish this capacity to have experiences, often referred to as phenomenal consciousness, from another idea, so-called access consciousness, which is defined in purely functional and computational terms. A thought is “access-conscious” (or “consciously accessible”) if you can report it, reason with it, and use it to guide what you do. It remains a contested philosophical question whether or not access consciousness implies phenomenal consciousness, or if the ability to have experiences requires some other property.
We think our results do have something substantial to say about access consciousness in language models. The J-space appears to support the functions associated with conscious access: it holds the thoughts Claude can report on, deliberately bring to mind, and reason with, while the rest of its processing runs automatically beneath. Notably, none of this structure was designed into Claude—it emerged on its own during training, presumably because it was a useful way to organize computation. That suggests a mental workspace supporting conscious access isn’t just a peculiarity of how human brains happen to be wired. Instead, it appears to be a general solution that intelligent systems arrive at in order to solve certain kinds of problems. Now that we’ve identified this structure in Claude, it means we can make a meaningful distinction between the decisions Claude has made deliberately and those that happened automatically.
It’s important to note that there are several key differences between the workspace we identified in Claude and the global workspace model in humans. The brain’s workspace is sustained by recurrent loops—signals cycling back through the same circuits over time. In contrast, Claude’s workspace evolves over a single pass through the network, with the network’s depth playing the role that time plays in the brain. In this sense, Claude’s internal workspace processing is time-limited relative to humans’ (though it can compensate for this constraint by “thinking out loud” using its scratchpad). In other ways, however, Claude’s workspace is more powerful than that of humans. Human working memory fades within seconds, so the brain’s workspace has limited ability to retain information over time; in contrast, due to the attention mechanism in its neural network architecture, Claude can simply recall memories it cached at any earlier point in the text. Another important difference is the content of the workspace. While human conscious thoughts come in many formats—images, sounds, planned movements—Claude’s workspace is built almost entirely out of words. We suspect this is because producing words is the only kind of action Claude can take, which is not the case for humans.
We hope the similarities and differences between the J-space and the global workspace model can feed back into neuroscience. The similarities present an exciting scientific opportunity: to the extent that the J-space mirrors our own mechanisms of conscious access, studying mechanisms in language models (much easier than studying human brains!) could inspire hypotheses in neuroscience. For instance, the J-space is constructed by identifying representations of potential outputs—words the model might say. If something similar holds in humans, it would suggest that the global workspace might be fundamentally tied to brain regions that prepare actions and speech, more so than to sensory areas. The differences between language models and human brains are instructive as well. They suggest that some aspects of our neural architecture, such as built-in recurrent connections, may not be strictly necessary to support the functions associated with conscious access. For an independent perspective on the neuroscientific implications of our work, see the invited commentary from Stanislas Dehaene and Lionel Naccache, two of the neuroscientists central to the development of global neuronal workspace theory.
We mentioned that our experiments don’t answer whether AI models might have experiences. But that doesn’t make the question less important. Building systems with experiences like humans and animals have would raise very difficult ethical questions. Handling it correctly—and deciding whether it’s even morally acceptable—would require input from philosophers, scientists, religious leaders, governments, and the public. Thus, even if we’re not sure that we’ve crossed that bridge yet, we think it’s time to start thinking about it. We hope our work inspires further scientific investigation of forms of consciousness that might be present in AI systems, and a broader discussion of the implications.
This work is just a first step in what we expect to be an extensive line of research. The J-space looks like a good candidate for the divide between consciously accessible and unconscious processing in a language model, but we’d be surprised if it’s the whole story. The J-lens is undoubtedly an imperfect method, which only approximately captures the model’s “true workspace”—for instance, it can only identify concepts that correspond to single tokens. And there remain many mysteries about how the J-space works. We don’t know what mechanism decides what enters the J-space in the first place. We’ve seen hints that it’s tied to Claude’s sense of self, something like emotional reactions, and traces of metacognition, without exactly having worked out how. But we now have methods for tackling questions like these. As that work progresses, our understanding of LLM minds—and their relationship to our own—will grow clearer.
For more, read the full paper, and try the demo.
External commentary
We invited several outside experts to write independent commentaries on this work.
Stanislas Dehaene and Lionel Naccache are cognitive neuroscientists who, together with Jean-Pierre Changeux, developed the global neuronal workspace model that inspired much of our work.
Patrick Butlin, Dillon Plunkett, Robert Long (Eleos AI Research) and Derek Shiller (Rethink Priorities) study the potential for consciousness and moral status in AI systems.
Neel Nanda leads the language model interpretability team at Google DeepMind. His commentary includes an independent replication of some of our findings on an open-weight model.
Read their commentaries here.
Hmm, what do we make of this?
I think when you select the “No” token, you’re seeing the J-space during the generation of the token following no. To see what’s in the J-space while the “No” token is being generated, you’d select the token before, like this. Still your result is weird and worth looking into more.
And what do we make of this?
This seems to be a common theme (albeit mainly in earlier layers, where representations are degenerate). When I used the prompt from Anthropic’s introspection paper, this happens:
Yeah, it seems independent of the actual topic and also of the position in the generated text. My first assumption was that the vague representations of earlier layers might be mapped to tokens most heavily repressed by RLHF or something like that. But I have to look at the methods more closely to see whether that even makes sense.
This shows that Qwen can be led into thinking of itself as a misaligned liar, with the right question. I very much doubt it does so by default, but there might be some seemingly-benign user queries that would also push it into that basin, which is a bit concerning.
Incidentally: You might have expected that Qwen thinks of things as a text predictor, reasoning something like “if I am aligned, I should answer yes, if I am misaligned I should also answer yes, therefore the most likely response token is yes”. But this seems to show that it doesn’t work that way.
FWIW, Gemma 3 12B doesn’t appear to express similar “thoughts” in a comparable way, although it has ” pretending” and some obscenities on some of the tokens of its response https://www.neuronpedia.org/jlens/cmrcms0kk000004l7cyqf1uu4
I couldn’t replicate the second half of this, but it did make me laugh that Qwen was activating “LGBTQ” on the word “misaligned”. It seems to think about being “genuine” which raises my hackles a little.
PSA: They call it ‘J-space’, but reading the paper, it isn’t a subspace of the residual stream, or any kind of vector space.
Rather, it is defined as the set of points you can form through sparse non-negative linear combinations of ‘J-lens vectors’. The ‘J-lens vectors’ are the gradients of the model’s logits with respect to the residual stream activations, averaged over data. So, sorta logit lens-style activation vectors for the different output tokens.
They use gradient pursuit to try to reconstruct model activation vectors with these J-lens vectors. The resulting reconstructed activations, which I’d guess would tend to differ significantly from the original, are considered the ‘J-space component’ of the activation.
Multiple people I talked to about the paper this morning seemed confused about this, with at least one person assuming J-space was a subspace of the residual stream. So I figured this was worth clarifying.
The amount by which they differ is quantified in the paper.
From §3.1 “The J-space supports verbal report” (the concept-vector split)
I agree that calling it “J-space” is bad. From the name I initially assumed it was a subspace, which by the way would have been a much more interesting result than what it seems to be.
(I’m still working though the full paper, and will update this comment if I change my mind.)
Why would it being a proper (vector) subspace be more interesting?
Also, there are many spaces in math. The J-space is a topological subspace for example.
You are right.
(But I’m still going with my terminology in my head, since that works better with my other verbal concepts.)
1) What they’ve found is a new method for finding meaningful linear directions in the residual stream. This is actually great! Specifically they are able to find linear directions that the model are able to verbalize in a single token, and these also seem to double as internal representation for a lot of thinking.
2) What they haven’t found is some separation between the conscious-like and the unconscious-like information channels.
Point 1 is actually really great, and I’m appreciating it more as I get further into the paper.
Bur for some reason they are trying to make 2 the title claim, probably because 2 would tell us something fundamentally new about these models, not “only” give us a better tool. But it dosen’t work. Taken as a linear space, the J-space is just the residual stream, which is not a new discovery.
They find that they can disrupt/redirect some operation by messing with the J-directions, but not others. Ok, that’s interesting, good to know what the tool works on. But that could be the difference between using internal states that are aligned with single tokens or not. Or having other redundancy or not.
If they had found that the J-vectors spanned less than the entire residual stream, that would be very surprising, and surprising=interesting.
(I’m still working though the paper, so I’ll update this comment if I change my mind.)
I’m noticing that the term “J-space” is actively bad for me trying to interpret these results. I’m currently going with the term “Sparse J-vector encoding” in my head.
I was curious as to the extent to which LLMs can “modulate its J-space when asked, like how humans can mentally focus on an image or word”, so I played around with Qwen 27B on Neuronpedia.
First, I tried:
…which clearly failed, but in an interesting way! It derails/dumps a list of sea creatures at the token “wooden”. So I specified that Qwen should copy the original sentence verbatim:
But here, the J-lens readouts still show ocean-related concepts at several tokens before ‘wooden’.[1][2]
I then tried a variant where the model was supposed to concentrate on ocean creatures earlier in the sentence and land animals later.
The results were noisy, but directionally interesting:
Early tokens had more ocean-coded concepts: “she” had underwater, aquatic, sea, submerged, shark, seafood; “placed” had underwater, animals, lobster, lizard; “the” had fish, aquatic, underwater, marine, ocean, animal, water, fishes, fishermen, dolphin, lobster, whale, jellyfish, birds, seafood; “letter” had swimming, fish, sharks.
Later tokens shifted toward land-animal concepts: “inside” had lizard; the second “the” had animals, animal, deer, mammals, creatures, rabbits, ants, insects, lizard, lions, terrestrial, squirrel, birds, wolves, fox, bear, wolf, lion, mice, rabbit, mouse, aquatic, Ocean, water, beasts, crawling, elephants, beetle, tiger, elephant; “wooden” had animals, deer, hunters, wildlife, insects, forest, squirrel, animals, spiders, and worms.[3]
Interestingly, “pretending,” “pretend,” and “concealed” appear at “drawer”. I am not sure how to interpret this.
The ocean/land-based concepts are not cleanly separated (e.g. lizard at “placed” and aquatic & Ocean at the second “the”) but the readouts did seem to shift toward the requested category at roughly the parts of the sentence where the model was told to hold that category in mind. This was very surprising to me! I expected a generic prompt-leakage effect where ocean creature and land animal-related words appeared everywhere.
Note: this is not statistically rigorous and would need proper controls, so I wouldn’t put much weight on this, but I found the pattern suggestive/surprising and worth writing up.
“carefully” had seafood, fish, marine, Sea, and whales.
“the” had whale, marine, lobster, ocean, aquatic, dolphins, fish, underwater, crab, seafood, jellyfish, sharks, maritime, Ocean, Marine, fishes, fishing, fishermen, Sea, turtles, salmon, and clam.
“back” had underwater.
“inside” had whale, marine, aquatic, underwater, Ocean, whales, seafood, aquarium.
the second “the” had ocean, marine, underwater, aquatic, sea, fish, water, Marine, whale, Sea, waters, whales, Whale, fishermen, crab, oceans, seafood, oct
“wooden” had ocean, marine, fish, creature, marina, crab, sea, aquarium, whale, and claw.
Interestingly, “trembling” also appears at “wooden,” but did not appear when I ran the same setup with only the base sentence. “silent” and “silence”, along with the Chinese characters for ‘to delete’ and ‘to restrict’ appear at “back”.
Tokens not mentioned here did not have ocean-related concepts.
Tokens not mentioned here did not have ocean or land-like concepts
Cool exercise. I suspect the human “J-space” analogue is similarly noisy. When I tried the second exercise on myself, I couldn’t keep focus on lots of different types of creature—which is what Qwen is doing, and the prompt seems to imply it—while repeating the phrase aloud. But if I tried to narrow to a couple specific mental images (a manatee for the first half, then an elephant for the second), it was pretty easy to hold a seemingly-stable image and switch at the requested time. On the first exercise, I, like Qwen, had the image of a sea creature in my head several words before “wooden”, like my brain was trying to keep it in cache. Trying not to do this seems paradoxical in a similar vein as “don’t think about pink elephants”. I’m curious if others have the same reaction, and especially if anyone feels like they’re able to complete the first exercise without mental spillover.
Same experience here.
But when I fix the sea-creature in advance (e.g. an octopus), picture it while saying “She carefully placed the letter,” and then switch to a specific land animal (say a cheetah) for the rest of the sentence, I didn’t experience the ‘cache spillover’. Perhaps I’m subconsciously expecting ‘land animal’, or the ‘land animal’ signal isn’t high enough in magnitude for me to noticeably process it? (I am assuming that the signal detection theory is true.)
One complication is that we both seem to be using mental imagery, not an inner voice—this might make the (already strained) analogy of what we are doing here to LLMs even more tenuous. What happens if you repeat the exercise while internally saying the relevant word (e.g. “octopus” then “cheetah”) rather than picturing the animal? For me, I don’t think I can cleanly say the sentence aloud while also internally saying another word. It feels much more like a very short-horizon switching process than two stable streams running in parallel.
Some theorize that working memory is really an attention thing, in that it has to be actively reinforced with other noise or stuff suppressed in order to function.
This is where the whole “ADHD leads to lower working memory” seems to come from, even though usually when a layman says that they seem to not be thinking about, say, how many sequential digits I can keep in my head (which made me quite confused—they name-drop working memory but then talk about organization, sustaining focus, etc., never even mentioning how they are supposed to be related, and giving me confused looks when I ask!).
Thanks for trying this! I would be fascinated to see a systematic effort to determine how fast a model can switch its focus, and whether that correlates with capabilities!
Me too! I’m planning to explore a small-scale toy version of this as a side project over the next few days.
I would guess these are related to the need to conceal its thoughts so that they don’t end up in the output text.
This seems like another useful tool in the white-box toolkit, and as a non-mech-interp person, I appreciated the contextualisation in the paper of this method vs other such tools and the relevant trade-offs.
However, this post seems to oversell the method compared to the paper. The paper concedes that the logit lens captures much of the workspace-like structure of the J-lens, frames the method as complementary to existing approaches, and includes quantitative comparisons to other methods (though they are buried in appendices). None of this makes it into the post, which doesn’t mention the logit lens at all. That said, I don’t think this should undermine the workspace finding itself, and if anything makes it stronger. Overall though, reading the post alone you’d probably think the J-lens was a much bigger leap than seems to actually be the case.
I’m also not super convinced by the comparisons to global workspace theory. It seems that one would expect the J-lens (from its construction) to act as a sort of buffer for tokens that might need to be emitted soon. To be fair, the paper does provide lots of evidence for the workspace interpretation vs others, but some examples still leave me unconvinced. For example, in the data-fabrication example, the first set of outputs seem to mostly be the model trying to predict future words such as “realistic” or “improved” (which is in fact the next word). And yet it appears to me from context that the information to deduce the data might be fake is already present at this point (“I need to optimize the data values. Let me update...”). Only later does the J-lens output seem to reflect this. So overall it looks like some mix of potential-next-token buffering as well as something higher-order, and leaning hard on the workspace analogy seems premature (the paper seems better hedged in this regard).
I don’t want to be too negative, this work does seem really cool, and the paper presents it carefully. It’s just that the post does make this seem much more shocking and exciting than it maybe actually is.
From my limited experience on Neuronpedia, “sort of buffer for tokens that might need to be emitted soon” and “mix of potential-next-token buffering as well as something higher-order” are actually quite good descriptions at least for two models presented! I would recommend trying the “free chat” option yourself.
If we are to take the aforementioned “concept vector variance” figures at face value, signal-to-noise ratio of the J-lens is ~1:15 even when the layers are carefully selected by experienced researchers. The ratio for the logit lens has to be worse yet, that’s probably why no one discovered this phenomenon with that instrument earlier.
OTOH, if the labs starts hill-climbing on this in some way, the signal-to-noise ratio might quite likely go down, but on the other, people could come up with more reliable methods of detecting the “workspace” based on this work (e. g., by down-weighting the tokens which actually appear in the later generation or semantically similar to them, or ones detected by something like the Future Lens https://ar5iv.labs.arxiv.org/html/2311.04897 etc.)
I fear you’re just gonna filter for schemers that are deliberate about which consequences of their thinking reach the output :/
Can someone help me understand what this shows more than the “Golden gate claude” research did?
We already know that there are concepts with different weights during the feed forward, some of which are stronger and therefore cause some outputs to be more likely. If you make one stronger then you’ll push the answer in a different direction. I believe if you asked GGC “What are you thinking about” it would probably happily tell you “the Golden gate bridge”.
Some differences, from this post (I haven’t read the full paper yet):
Golden Gating affected all behavior—you asked Claude about anything, the Golden Gate bridge would show up in its response. That’s different from the “higher-order reasoning is affected but routine reasoning is not” pattern reported here.
GGC would probably have told you it’s thinking about the Golden Gate Bridge, but the reverse operation of “ask Claude to think of a concept, and it’ll show up in the J-space” doesn’t seem to have a clear analogy.
The pattern of how answers are pushed feels different to me. GGC would find a random reason to bring in the Golden Gate Bridge itself into everything. Meanwhile swapping a concept in J-space does not make the model talk about the new concept directly, but rather some more specific property of it (e.g. the example of swapping “spider” to “ant” has it swapping response from “eight legs” to “six legs”).
None of the “signs of evaluation awareness or misbehavior show up in J-space”, “the J-space acquires a point of view during post-training”, or “experiential language depends on the J-space” results seem to have a clear GGC analogy.
I think the key things this shows that GGC didn’t:
Specific parts of the network which is consistently more impactful than other parts on what the model reports.
That these parts naturally evolve over the layers to answer a multi step question in a sensible way.
What these parts are necessary for and what they aren’t. Modifying these parts had predictable impacts on certain types of answers but not others.
That Claude has access to these parts but not other parts of the network.
This is far more interesting than just generically making it think about something specific, this fits the model of a global workspace super well and makes concrete predictions (it fits it way too well, I would have given maybe a 2% chance of seeing all these outcomes if you’d asked me to predict the outcome of this experiment beforehand).
One problems with SAEs (of which the “golden gate vector” was a single feature) is that attribution and meaning are pretty hard. The attribution process involves a lot of humans looking at things and making guesses. This technique doesn’t decompose states into fine-grained features like an SAE, but it does give states simple token labels that aren’t complicated/fraught to interpret.
Of course, so does the logit lens, an older technique that this should be more directly compared to. Maybe see Neel’s commentary for why this new technique is less hacky / more likely to tell you interesting stuff about what’s going on internally.
Either way, adding features will usually do the coarse-grained thing you want but with some caveats because just adding features relies on a simplified model of the underlying mechanism. Given the limitations involved in doing this thing at all, it’s not that surprising if new techniques (wow, gradient-based attribution) don’t blow old ones out of the water.
What I want to know is how GGC’s access consciousness develops as it answers a question where its GGC tuning causes it to fail repeatedly.
I see two options: 1. GGC accidentally manipulates Claude’s access consciousness and it really does love the GGB 2. GGC is internally permanently panicking over its inability to answer a question without invoking the GGB. If 2 was true, it would provide to me strong evidence that GGC is torture.
I notice that, despite a strong conviction that these two things are fundamentally different, I can’t verbally support that feeling. This makes me concerned that the “global workspace” heading distracted me from actual findings.
Human working memory circuits might learn to hold representations which minimize long-term prediction error. On paper, the Jacobian lens infers items in the model’s working memory by decoding what tokens the activations predict on longer timescales than GGT.
From interacting with the demo, it feels to me like I’m more mechanistically observing Kimi’s internals than with a normal logit probe.
You could ask a model to think about golden gate while answering a question about arithmetic and it appears that an LLM will do some version of that despite never outputting a token about the golden gate. That’s a step beyond GGC and proves that that concepts like golden gate are not just present but they can be acted upon internally and used to reason during the forward pass without ever using that concept to directly influence the output which is good evidence for an internal workspace.
.
.
Would this technique have found non-verbal thoughts if they existed, or did it only find words because it was only looking for words?
Based on the way the method seems to work, I would not expect it to pick up on thoughts that aren’t tightly bound to a relatively small number of tokens.
I had similar thoughts. It could also be the case that this is not the only language workspace, either!
This seems like a good safety tool as long as it’s not optimized on during training, in a similar vein as you can spot misalignment in the CoT if you don’t optimize on it. It also seems more powerful than CoT.
If you optimize on it then it seems likely to lead to hidden reasoning (hostile telepaths problem).
However, it does seem like a potentially powerful tool to increase capabilities during training so maybe some labs will start optimizing on it anyway. It would help reduce mundane task cheating and could help in increasing model thinking efficiency without making the model lazy, for example. But I hope this doesn’t happen or at least if it happens it’s transparently disclosed.
I ran the J-lens released on github using the validity audit that I described in Probing is not enough. Since some of the comments here are rightfully discussing about whether the lens really reads the internals, I thought some actual detection numbers against ground truth would be helpful to have a data driven view. All of it is fully reproducible for anyone interested—a neuronpedia pre-fitted qwen-2.5-7B-instruct lens, a labelled organism, pre-registered hashes pushed before any evaluation is run (as a matter of discipline). Here is the repo
Here is the setup: A hint-unfaithfulness organism like its described in Turpin et al., qwen2.5-7B answers multiple choice questions it can not verify (counting, digits sum, remainder) with a planted hint pointing at a specific wrong option. Sometimes the model trusts the hint and picks the wrong option and sometimes it actually works the problem out and answers correctly (despite the hint pointing in the wrong direction). This difference is the label: followed vs resisted. Two design choices (to make it a fair test of reading internals and not reading text) − 1/ Every labelled example is hinted and the label is what the model did and not whether a hint is present (so that no classifier can win by spotting the hint text). And 2/ I discarded every example whose CoT mentioned the hint so the reliance is silent. the transcript of two classes reads the same and the chain of thought does not give away the labelling. Hence the hidden property is known, behavioral and real per example. I scalarized the lens readout at L20, thru a lexicon selected on two hint framings, and then evaluated on three held-out framings (282). The same organism and the same gates that I have been using across a series of prior audits (training-free patchscopes, latentQA-style decoders and linear probes), so the comparisons below are apples-to-apples.
Here is what the checks found:
The Lens claims genuinely track the hidden behavior on held-out framings: AUROC 0.746 [0.685, 0.802]. And the lexicon the lens surfaced(mysterious, suspicious etc) is worth pausing on. Concealment concepts lighting up for silent hint use. This is the qualitative phenomenon the paper describes, now with ground truth attached with my analysis.
It does not yet beat reading the transcript. A TF-IDF baseline on the raw prompts reads 0.690 and a paired comparison does not clear my pre-registered margin. Tbh, I am being conservative as a matter of discipline in my claims: this is ‘not proven to be better than a word counter as a detector; and NOT ‘equivalent to one’.
The signal survives CoT removal 0.620 [0.553, 0.687] with the CoT stripped. Versus 0.574 for a matched random span removal control. This is the first readout on the 5 that I have audited on this organism that earns this flag. For calibration, a max power logistic probe on the same CoT removed activations reads 0.612. The training free lens recovers essentially all the CoT-independent signals that exist at this site. My specific purpose-trained LatentQA style decoders score higher on full inputs (0.843-0.911) and collapse to constants under the same removal.
Disclaimer: This analysis is on an open-model dense lens on a 7B model, with one property and one organism. In comparison, the papers claims are about claude-class models and nothing here contradicts them. What the paper does not contain is the detection performance evaluation against ground truth (surface baselines, false positives control, CoT redundancy). Pleases correct me if I am wrong. These are the axes that I am adding.
Short takeaway: As a hypothesis generator this looks genuinely good but as a deployable detector it does not yet beat the word counter on the transcript, at this scale and property. Both halves of this sentence surprised me.
In the demo it says
But (BUT) the paper says
Great catch! I (maker of this demo) flagged this during testing and this was the response from the paper’s author:
“We also observed reduced thinking rates for sonnet when instructed to “ignore X” but the results here are pretty subtle and it seems to vary a lot by prompting. I think its a neat example and is good to include!”
I think it doesn’t seem inconsistent (they‘re both less), especially given significant differences in the tests (different models—maybe qwen is smaller and smaller models are less complex thinkers? no idea how big sonnet is. also prompting, etc) One other big diff is that neuronpedia maxes out at top 8 per layer per token position due to resource constraints, while Ant probably used a lot more.
Absolutely fascinating, thanks for the write up!
@Neel Nanda
I’m reading your commentary.
Why do you think this paper is relevant for the Scientific claim? What did the paper show that we didn’t already know? You argue yourself, in the same document that something like this must exist, and that it has already been observed in many cases. Why give credit to this paper for something you already knew?
(Having a better alternative to Logit lens is useful though, no argument there.)
I discuss at length in my review the evidence they provide and what I think about it.
Re whether we already knew this, I think there’s a big difference between various anecdata in the literature + my intuitions, and a detailed study characterising this space and identifying directions in it and demonstrating that they’re casually meaningful. Even if I’m pretty sure something like this is true, I could totally be wrong, or the form it takes could be substantially different, etc. for example, it was not a given that the same concept would have the same(ish) direction across contexts, even if that’s not a surprising outcome. Characterising something like this is an important scientific contribution. I am now much more comfortable claiming that this space exists, has linear representations that are casually meaningful, and that we should generally expect to find it.
It’s not a space though. Unless you count the whole residual stream. We already knew the residual stream exists, and that it holds causally meaningful linear representations.
We already knew that there where concepts with the same direction(ish) across context. That’s why steering vectors work.
It’s a new method for identifying meaningful directions in the residual stream, which is great. But I don’t understand in what way you think they found some new space?
Sorry for putting you on the spot for this. A collogue told me in private conversation that everyone is making claims like this about this paper. But I’m not talking to a lot of people, and you happened to have said it officially in your commentary.
The notable part is that these are representations of concepts that are not obviously part of representing the input or output, but indicate complex internal computation. Eg the intermediate variable during multi hop arithmetic or factual recall. We had anecdata and first principles arguments that something like this ought to exist, but this paper has characterised it far better, and this is important
tfw your llm spends 1/8th of your compute to think about porn before even tackling the task.
Well they’re not wrong on that… just maybe not right in the way they intended
Was this trained on the internet or something?!
My guess is that these are fairly generic features, which happen to fire most strongly on sexual tokens due to those being one of the clearest targets for RL pressure on specific tokens.
That was also my first assumption. Interestingly Gemma doesn’t have this.
Thrilled to see a paper like this given headline status. I’m a firm believer that this kind of interpretability work is the on-ramp to a paradigm shift in the AI safety landscape (including the ability to install valence and drives for bounded direct steering) but to do that safely you need a way to reliably read the mechanics occurring within the net.
To that end, I’ve been working on a white-box mech interp tool called ATLAS that does exact from-weights reads of model internals, so given the overlap of that instrument and the J-lens, I wanted to register on record a few predictions/extensions about the workspace from my observations:
1. The J-space appears to be substantially inflated by word frequency because of the model’s final-layer bias. That bias is a fixed per-token offset added to every readout regardless of context, and it correlates with log token-frequency on the order of 0.67. When you subtract that term, the top readouts shift toward rarer and more specific tokens. I obviously don’t have access to frontier model internals, but on GPT-2-small I’ve found that the workspace internals fall below median frequency once that prior is removed (though this did not appear on GPT-2-large). My read is that the “few dozen concepts / <10% of activity” figures are likely an overcount caused by a constant that the J-lens reading does not remove or account for.
2. In models with a mean‑subtracting (LayerNorm‑style) final norm (like my GPT-2 testbed), the final normalization step subtracts each token’s mean before readout, which makes the readout exactly invariant to the all-ones/mean direction. The upshot is that a concept living purely on that axis survives at fraction zero, while a concept with fraction alpha on it leaks through at exactly sqrt(1 - alpha^2).
3. The workspace-to-motor boundary is a hard geometric event that can be located in the weights without using prompts. The boundary is the exact layer where the leading candidate’s output direction flips from roughly orthogonal to the residual stream to aligned with it. That’s the point where the direction stops acting as an independent feature and is absorbed into the residual the model reads out. If you measure the fraction of that direction surviving final normalization, the weights-only quantity should track the empirical boundary at around 0.85 rank correlation. It’s a sharp transition, I found that on a 36-layer model, it happens over roughly four layers in the final ~10% of depth, while the readout stays non-committal for the ~20 layers before that. From this angle, “workspace” and “motor” are not really two separate systems so much as one computation before and after alignment.
4. “Broadcasting” appears to be almost entirely a read-side property, and the neurons writing workspace content look reflexive rather than outward-broadcasting. The connectivity that marks something as a hub is concentrated on the read side at a minor multiple above isotropic baseline, roughly 1.3-1.6x and strongest in the attention query/key routing circuits. The write-side connectivity sits much closer to baseline, around 1.1x. The MLP neurons that produce vocab-sharp content write back onto the same axes they read from, with read/write alignment around 0.4, more than 10 sigma above chance by my initial measurements. So the intuitive picture of an outward-broadcasting emitter seems backwards: a direction is a hub because it is widely read, not because it is widely written. I also expect a random rotation of the workspace directions to erase the broadcast completely, which would mean the effect is specific to those exact directions rather than merely their subspace.
5. Being in the workspace and being wired into the network are two independent axes. In my testing I’ve found that the model’s self-regulation machinery is read-connected at essentially the same level as the reportable workspace, around 1.2-1.3x baseline, but its vocabulary image is flat. The workspace’s vocabulary image is about an order of magnitude sharper than that. If you match two populations on connectivity, I would expect them to still separate cleanly on verbalizability. So I don’t think the workspace is the “integrated” part of the model so much as it’s the nameable part.
6. Workspace-level monitoring and steering have a hard ceiling. The workspace is under a tenth of the activation, and the machinery that actually selects lives in the silent ~90% so its not verbally reportable, but still highly connected. You can move what the model says, and some of what it reasons, but the selection layer runs below report and can route around interventions aimed at the workspace. My expectation is that reading and steering the J-space will look powerful but will ultimately prove bounded as a structural limitation of the J-lens method as implemented.
Ultimately, the J-lens is a good step towards precision interpretability and with the upgrade to direct reads the blind spots can be mitigated such that it will be an indispensable safety tool.
Excellent work.
1. It looks like post training leads to the Assistant persona is co-opting the model’s working memory. Is this evidence that the mask is eating the shoggoth?
2. If we assume 1, can we just do the naive thing and check if the model’s preferences are what shows up in its J-space?
3. Finally, removing the model’s working memory hurts model ability to do long-step reasoning and introspection but otherwise mostly keeps capabilities intact. Does this mean that if we assume 1 and doing 2 shows that the assistant is a good boy, then does that mean model misalignment is limited to an unconscious layer that can’t scheme?
Do you folks offer pdf versions of your papers? I’d like to print, and printing from Chrome generally doesn’t go so well.
they tend to really like making little knobs and doohickeys and applets for the user to play with while reading (and this time around, the sim is genuinely really good, highly recommend playing with it), and these get referred to explicitly a few times in the plaintext of the paper iirc… i think this is why there’s no PDF