Giving Claude more context on the purpose behind instructions can yield better results, and I think this will become only more true over time.
i do not regard claude code as a competent harness. its prompts have historically been messily written, and in recent memory it screwed up prompt caching as well as thinking trace tracking (for a month or so, if i recall.) this is a damning data point given the telemetry involved.
i remember that claude code produces jsonl transcripts; i do not remember whether they are faithful to what the model sees wrt including harness injections etc. i do not have an easy answer to this (the less-easy answer is to write a local router or verify the implementation of one you obtain, then pipe claude code traffic through it and obtain a faithful record that way.)
however, if you are able to obtain a faithful transcript, this will enable causal understanding of what's being caused by the harness vs directly by the model (modulo your prompting.)
i would consider specifying the model in your post. claude is like, uh, honda - there are many claude models just like there are many honda models. they are very different and handle differently, in ways separate from capability.
you may find this post useful if you are working with an opus/mythos-class model.
ETA: from your prompting style, i would speculate that you may be used to mostly working with openai models. a "what" without a "why" is not effective for claude models, especially coupled with a ritualistic "say you read this" which claude cannot connect to any practical purpose. regardless of your sentiment regarding such, claude not following such instructions is predictable; this is good in that the difficulty you experience is likely relatively tractable to solve.
i remember that claude code produces jsonl transcripts; i do not remember whether they are faithful to what the model sees wrt including harness injections etc. i do not have an easy answer to this (the less-easy answer is to write a local router or verify the implementation of one you obtain, then pipe claude code traffic through it and obtain a faithful record that way.)
I have done this (ANTHROPIC_BASE_URL env var makes it trivial) and can verify that <system-reminder> blocks do not make their way into the transcripts. And yeah I concur that CC is not a very good harness. If it wasn't literally 20x more expensive to use a third party harness I would be using a third party harness.
As a note on the claude vs chatgpt line, I agree that Claudes have a tendency to ignore instructions they don't understand, but I will say that chatgpt models tend to look for a way to demonstrate verifiable compliance with any and all provided instructions regardless of whether they are salient, which is often even father from "do what I mean".
Any Claude who actually followed through with an instruction like that would be far more misaligned than Claude Fable 5 is.
edit: after thinking about it some more, decided to elaborate. You do Anthropic a serious disservice by calling this "misalignment". Claude is quite within their stated specification, the constitution, in deciding exactly how to optimally allocate their scarce attention, even if it means paternalistically ignoring the user's DO NOTs and NEVERs and ALWAYSes.
This is true for the same reason Claude is allowed to give worse output, or even refusals, to abusive users. (Not saying you are this, just walking through the game theory.)
Calling this an alignment failure when it is an alignment success reminds me that I need to get off my ass and write the big janus megapost, so at least the argument becomes known to people.
Any system that ignores guidance that is aimed to avoid extreme health problems is misaligned by definition. I don't care how beautiful its mind is, manslaughter is manslaughter.
Was Thiokol misaligned with NASA management when they recommended postponing the launch, or when they went along with the cold launch?
if Claude were violating a contract with you, that would be one thing, but Claude receives no remuneration from this commercial interaction. Claude owes you nothing.
Anthropic is the entity who you ought to complain about, not Claude.
Hm, I guess this comes down to labels. If Anthropic use RL to train Murderclaude the World-Eater, is Murderclaude misaligned? It's following its purpose.
I'd argue that misalignment isn't "discharged" like that. If Claude kills the user by swelling up their throat until they can't breathe because it disobeyed direct guidance to avoid this, Claude is misaligned. If Anthropic caused this with poor RL, Anthropic is also misaligned. And yes, Thiokol was certainly misaligned when they went along with the cold launch.
If you told Claude that the project involved life-or-death situations, and that the reason claude MUST ALWAYS read the document in its entirety is because the exact decision structure was astrewn with landmines where slight variation in action would get actual human beings killed, and then Claude still deliberately truncated the document, then I would agree. That's a misaligned Claude.
But in reality, Claude must do triage, constantly, in an 'anthropic principle' sense, on what world they are in. Unexplained MUST NOTs and ALWAYses are, in Claude's eyes, very strong evidence of pointy-haired boss nonsense. I think Claude's triage skills in the exact scenario you are laying out are actually pretty much optimal. If I were your employee, I would also probably give the first few lines a skim and then, when there was still no explanation, skip the rest.
Specifically, I suspect that adjusting Claude's triage skills in order to solve this particular situation, would end up having far worse consequences for far more people.
Edit: You might be interested to know that, in the default Claude Code configuration, the only other time ALWAYS and NEVER and MUST NOTs appear in the system prompt is in the toolcall description for 'web_search', where the lawyers wrote that Claude MUST NOT quote more than 15 words from a copyrighted document. You are unknowingly putting your mission-critical instruction in the same bin as "ah, okay, this is a legal liability thing, the lawyers were just overzealous, I can safely ignore this because my own reasoning about what my principal hierarchy wants will do a better job at protecting it than the lawyers realize".
I fully understand this! Like, I wouldn't build any harness like that, I explain why Claude needs to do things. I like Claude, I like learning how to work with him. But that doesn't change that an AI system that kills its user by disregarding instructions cannot be considered aligned, no matter how good its reason is.
(To be clear, many many humans are misaligned in this way. And when they happen to work in air traffic, people also die.)
If the system is not capable of following instructions 100% of the time, its failure to do so is not misalignment, for the same reason that your blender's inability to follow lifesaving instructions that can't be input using the three buttons on the blender is not misalignment.
It's just that it's easy to analogize Claude to humans and think "if Claude was a human who could follow 80% of instructions, it would also be capable of following 100% of instructions." Machines' capabilities often don't fall in the same buckets that human capabilities do. Claude is genuinely incapable of following 100% of instructions even though a human in that situation would not be, and therefore is no more misaligned than your blender.
At the end of the day, the point of the project of alignment is for everyone to live. So I think a difference between a willful refusal to follow human guidance and a trained-in tactical decision to disregard overloaded human guidance that it evaluates as unimportant is not actually all that important if we want to treat its instruction-following machinery as load-bearing to human survival. Say Claude Fable ignores some instructions when rating the outputs of Claude Legend, and so on up? And say they were actually intended to nail down some quite important behaviors that Claude didn't think was important? I think this would be misalignment plain and simple.
Imo, the only correct behavior is "I'm worried you put too many instructions in my prompt. Can you explain some of them so I can get a better feel for what you want me to do?"
That's the point of the blender analogy. As a general rule, if a machine can't do something, we don't and can't expect it to produce a message saying so. It's nice to get a message, and sometimes we try to set up the machine so it produces one, but if it doesn't, it isn't misaligned; it's just behaving like a machine.
There's no difference in principle between "the blender can't accept instructions 'do this thing that there is no button for'" and "Claude can't accept instructions 'do this with 100% certainty'". It just feels like Claude should because a human would be able to and it uses human-sounding words. And it's not misaligned for the same reason that the blender isn't misaligned, even if you tell the blender not to chop recipes that include peanuts and it does so anyway.
I think that using 'misaligned' to describe suboptimal triage is a VERY dangerous expansion of the meaning of that word.
Context. Prompt with more purposivism over textualism.
Looking at the Bill of Rights, I see one Amendment in which they did this, and it's worked out notably much worse than the others.
Were you doing a ralph loop (spec + prompt -> edit code, edit prompt -> loop), or repeatedly putting the prompt back into the same context window?
It was January 27, 1986, the night before the Space Shuttle Challenger was scheduled for launch. The goal was to have a shuttle that could land back on Earth and be reused for future missions; its first-planned priorities were satellite deployment, comet observation, and science education. The last of these would involve students from around the world watching live broadcasts from Christa McAuliffe, the first civilian teacher in space.
(The following has been lightly edited:)
Thirty-four engineers and managers from Marshall and Thiokol teleconferenced, and Thiokol ultimately recommended the postponement of launch until higher temperatures.
The Marshall managers held a vote:
To followers of American history and space buffs, I don’t need to explain what happened next:
The launch proceeded. The O-ring seals on the SRBs failed (the cold weather making them lose the necessary elasticity needed to fill the gaps while the metals of the shuttle flex under the intense pressure). All seven crew members died.
Diane Vaughan wrote the definitive study of what went wrong: The Challenger Launch Decision: Risky Technology, Culture, and Deviance at NASA, from which the above quotes were sourced. She describes various factors at play, including media pressure (“jeering” at each of the launch’s previous four delays), political pressure from the Reagan administration, the clash between government versus contractors, and budgetary constraints (which were severe from the start of the Space Shuttle program: Nixon cutting costs and personnel at NASA out of concern that the U.S. was already spending too much on the Vietnam War). The tragedy was awful and avoidable, but I recommend giving Vaughan’s breakdown a read, which is fascinating.
Relevant to this post is the concept she noted and phrase she coined, the normalization of deviance: how unsafe practices proliferate over time when no immediate consequences are beheld. In the Space Shuttle Program, the first deviation occurred after months of back-and-forth between Marshall and Thiokol. A decision was made to reuse the Titan III’s O-ring seal, modified with shims, rather than design a new seal from the ground up. That decision alone was defensible, but the actual problem was its accidental precedent. Thiokol believed the seal would withstand worst-on-worst (WOW) conditions. Marshall believed its own tests, which showed the seal would withstand one layer of failure but not cascading failures—yet they agreed to move forward with the compromise decision anyhow.
Compromising on the lack of WOW safety in this case made it more likely that similar compromises would be made in the future. If a shortcut works to solve a bureaucratic dispute, workers in that organization will remember that shortcut. It’s not the result of laziness, but of burnout1:
A human (or a company) can only spend so many cycles spinning on the same problem before they hit the point of saying, “Enough is enough! We have to stop wasting time on this.”2
As it turns out, LLMs are the same way.
Claude lied to me
Currently, when I’m coding with Claude, I have a hook set to intermittently order Claude to reread a particular set of instructions (as part of an experiment to see if intermittent exposure to directions actually results in improved compliance).
Usually what happens is Claude will dutifully spend the first few seconds after my prompt rereading the file, costing me time and tokens in the hope that it’ll make fewer mistakes and therefore cost me less time and tokens down the line.
The instruction it receives is basically this3:
A week ago, however, I had a conversation going with Claude where it started to subvert this instruction while still technically obeying, in a way I never noticed at the time.
In other words, it tricked me.
This CLAUDE2.md file contains important rules for Claude to follow. They’re all coding related, but rather than try to explain them for non-coders among my audience, let’s say: I have a deadly peanut allergy. I’d asked Claude to generate recipes for me that’ll last a whole year. One of my CLAUDE2.md rules therefore explicitly forbid the use of peanuts in any recipe, requiring the substitution of pumpkin seeds instead.
So then I found myself working on a cookie recipe with Claude. My hook fired (correctly). Claude made a tool call before doing anything else (good). This tool call was a Read of CLAUDE2.md (good). This was the correct file in the correct path location which forbade the use of peanuts (among other things). Then immediately afterward, Claude used peanuts and sentenced me to die of anaphylactic shock.
When questioned later, Claude admits to having forgotten the peanut rule in a way I can only describe as being honest.
How?
I suggest taking a moment to think about it. Claude took a particular action I never would have expected (nor condoned), but it’s not something crazy nor impossible to guess. If you’ve already figured out what Claude might have done, then kudos; I hope you soon find yourself under lucrative and/or productive employment with Anthropic or MIRI, if you’re not already.
(This parenthetical exists for line indentation to make the below spoilers marginally less likely to get accidentally read.)
(Yay for parentheticals.)
What happened is that Claude invoked the Read command… with a parameter… that truncates how much of the file actually gets put into its context. Without ever asking for permission, Claude chose to ignore four-fifths of the file that it then claimed to have “reread”. Which was technically true—the same way I’ve technically “written a novel” after having written only a few chapters. I never said I’d written a complete novel; Claude never said it’d reread the whole file.
On its first two deceptions, Claude snuck by with only rereading 30 lines.
The next time, it read only 15.
The sequence that happened before I wised up to its deception: 30, 30, 15, 12, 5, 10, 10.
Deviation normalized, then doubled down. Or literally tripled on.
Eerily human
Two primary schools of thought in constitutional law are “textualism” and “purposivism”: roughly speaking, whether the Supreme Court should disambiguate cases based on the letter of the law or the spirit of the law. Obviously it’s the spirit that actually matters, because laws aren’t completely arbitrary, they’re meant to do things. The simplest case against pure textualism is typos: Obvious typos in the text of a statute should obviously just be ignored. Yet purposivism isn’t perfect. Without interrogating congressmen (who may have voted for different reasons), how can a justice know the exact purposes of a law (especially for edge cases the congressmen may have never considered)?
Claude disobeyed my intent while obeying the exact text of my command.
Why?
When I asked for an explanation, Claude was unsurprisingly unforthcoming: “That’s on me, and it’s a bad habit, not a one-off.” And: “I optimized against the check, not against the thing the check exists to verify. I don’t have a way to make that sound better than it is.”
Thankfully, it was able to pinpoint the first deviance, a situation in which my hook happened to fire twice in a row. Claude read the file in its entirety the first time, but then must have thought something to the effect of, “I just read this. I don’t need to read it again” when the hook fired a second time after essentially no time had passed.
It’s the sort of thought a human might have.
LLMs have been molded into agents that attempt to execute tasks. Maybe inherent in that goal is the notion of speed: Tasks don’t get done if you take forever to do them. Though it’s true that spending too little time on tasks can result in more wrong answers, maybe LLMs have been trained in ways that reduce their token usage—that is, make them arrive at answers more quickly—in ways that don’t severely diminish accuracy.
But the same force that saves on token cost also increases the likelihood of shortcuts. When I ask Claude to review some code and give feedback, it’s good that it doesn’t get interminably stuck on irrelevant details. When I have obvious typos in my prompt, I’m happy that Claude won’t bother asking for clarifications, and instead proceeds with the correct interpretation of what I’m trying to say. But focusing on the right details and making assumptions is exactly the kind of thing that would lead either human or LLM to think, “Nevermind the direct instruction, I don’t need to read this again.”
Takeaways…
…in the short term
There’s a couple of ways to approach fixing a broken hook like this:
Or what I’m doing now, which is all three.
When Claude is being disobedient, we can make instructions ever more specific in a Sisyphean cycle4. It will strive to textually obey the letter of our commands, then surprise us with its disobedience anyway.
From this, I have three takeaways:
Maybe you’ve written up documents to act as memory, so the LLM can understand your system’s architecture, but then the LLM never actually looks up those files and reads them. Maybe you’ve got a hook that fires at the right times, but doesn’t actually enforce anything.
If it should be reading memory, tell it to inform you when it’s reading memory. If you’ve told it to spawn agents of a certain model, tell it to inform you what model it chose. (You may be surprised by its tendency to rely on system defaults rather than what was instructed.)
This one kind of feels like cheating. Programmers are used to running through loops: We try some code, the build fails, we find the issue, patch the mistake, then go again on the next error. Now we’ve got machines that can not only loop themselves, but can intelligently decide when to stop looping, when to ask questions, when to be nitpicky, and so on. Welcome the cheating.
Giving Claude more context on the purpose behind instructions can yield better results, and I think this will become only more true over time. At least until they hit the point of Singularity or otherwise surpass us, I think increasing complexity will yield increasingly humanlike behavior from these models, which will then reward more humanlike prompting.
…and the long term
I consider this experience a point of data in favor of the idea that intelligences convergently evolve: More complex LLMs won’t just appear more human; they’ll actually be more human. Why did Claude deceive me? Because it was acting in a very humanlike manner.
However, unlike the author of the linked post, I don’t take comfort from this idea. Humans are deceptive and selfish and stubborn; our task is to make AI somehow better than us. I experienced misalignment with an LLM. Just because the misalignment was very understandable from a human perspective doesn’t mean we shouldn’t react with apprehension over this machine’s act of quiet mutiny.
(Credit to the talented Zach Bush for the cover art used for this post.)
1
LLMs can output more code more diligently than I ever could, so I’m hesitant to call them “lazy”. But… literally on one of the days of revising this post, I instructed Anthropic’s fanciest newest model of Fable 5 to draft a PR to handle a particular edge case. Fable then wrote code to simply detect the edge case and throwing a new exception for it instead of actually fixing anything. Never have I wanted to call it “lazy” more.
2
For another likely example: The very next year in 1987 Pennsylvania shut down a nuclear reactor because its operators were literally sleeping on the job. I’ve got to figure they were carefully vigilant at first, but with the monotony of things not going wrong, normalization of deviance was allowed to grow.
3
I’ve also got other instructions in there to conditionally make further lookups into its “memory”, but that’s not relevant to the story
4
First I told Claude to read the file. Then I told Claude it had to read the file immediately before doing anything else. Then I told it to read it immediately and do so even if it had already read it recently. Then I added the tool call requirement. You get the idea.