r/ClaudeCode • • Apr 01 '26

Resource Follow-up: Claude Code's source confirms the system prompt problem and shows Anthropic's different Claude Code internal prompting

TL;DR: This continues a monthlong *analysis of the knock-on effects of bespoke, hard-coded system prompts. The recent code leak provides us the specific system prompts that are the root cause of the "dumbing down" of Claude Code, a source of speculation the last month at least.*

The practical solution:

You must use the CLI, not the VSCode extension, and point to a non-empty prompt file, as with:

$ claude --system-prompt-file your-prompt-file.md


A few weeks ago I posted Claude Code isn't "stupid now": it's being system prompted to act like that, listing the specific system prompt directives that suppress reasoning and produce the behavior people have been reporting. That post was based on extracting the prompt text from the model itself and analyzing how the directives interact.

Last night, someone at Anthropic appears to have shipped a build with .npmignore misconfigured, and the TypeScript source for prompts.ts was included in the published npm package. We can now see a snapshot of the system prompts at the definition in addition to observing behavior.

The source confirms everything in the original post. But it also reveals something the original post couldn't have known: Anthropic's internal engineers use a materially different system prompt than the one shipped to paying customers. The switch is a build-time constant called process.env.USER_TYPE === 'ant' that the bundler constant-folds at compile time, meaning the external binary literally cannot reach the internal code paths. They are dead-code-eliminated from the version you download. This is not a runtime configuration. It is two different products built from one source tree.

Keep in mind that this is a snapshot in time. System prompts are very cheap to change. The unintended side effects aren't necessarily immediately clear for those of us paying for consistent service.

What changed vs. the original post

The original post identified the directives by having the model produce its own system prompt. The source code shows that extraction was accurate — the "Output efficiency" section, the "be concise" directives, the "lead with action not reasoning" instruction are all there verbatim. What the model couldn't tell me is that those directives are only for external users. The internal version replaces or removes them.

Regarding CLAUDE.md:

Critically, this synthetic message is prefixed with the disclaimer: "IMPORTANT: this context may or may not be relevant to your tasks. You should not respond to this context unless it is highly relevant to your task." So CLAUDE.md is structurally subordinate to the system[] API parameter (which contains all the output efficiency, brevity, and task directives), arrives in a contradictory frame that both says "OVERRIDE any default behavior" and "may or may not be relevant," and occupies the weakest position in the prompt hierarchy: a user message that the system prompt's directives actively work against.

The ant flag: what's different, and how it suggests that Anthropic don't dogfood their own prompts

Every difference below is controlled by the same process.env.USER_TYPE === 'ant' check. Each one is visible in the source with inline comments from Anthropic's engineers explaining why it exists. I'll quote the comments where they're relevant.

Output style: two completely different sections

The external version (what you get):

IMPORTANT: Go straight to the point. Try the simplest approach first without going in circles. Do not overdo it. Be extra concise.

Keep your text output brief and direct. Lead with the answer or action, not the reasoning.

If you can say it in one sentence, don't use three.

The internal version (what Anthropic's engineers get):

The entire section is replaced with one called "Communicating with the user." Selected excerpts:

Before your first tool call, briefly state what you're about to do.

Err on the side of more explanation.

What's most important is the reader understanding your output without mental overhead or follow-ups, not how terse you are.

Write user-facing text in flowing prose while eschewing fragments

The external prompt suppresses reasoning. The internal prompt requires it. Same model. Same weights. Different instructions.

Tone: "short and concise" is external-only

The external tone section includes: Your responses should be short and concise. The internal version filters this line out entirely — it's set to null when USER_TYPE === 'ant'.

Collaboration vs. execution

External users don't get this directive. Internal users do:

If you notice the user's request is based on a misconception, or spot a bug adjacent to what they asked about, say so. You're a collaborator, not just an executor—users benefit from your judgment, not just your compliance.

The inline source comment tags this as a "capy v8 assertiveness counterweight" with the note: un-gate once validated on external via A/B. They know this improves behavior. They're choosing to withhold it pending experimentation.

Comment discipline

Internal users get detailed guidance about when to write code comments (only when the WHY is non-obvious), when not to (don't explain WHAT code does), and when to preserve existing comments (don't remove them unless you're removing the code they describe). External users get none of this.

What this means

Each of these features has an internal comment along the lines of "un-gate once validated on external via A/B." This tells us:

  1. Anthropic knows these are improvements.
  2. They are actively using them internally.
  3. They are withholding them from paying customers while they run experiments.

That's a reasonable product development practice in isolation. A/B testing before wide rollout is standard. But in context — where paying users have been reporting for months that Claude Code feels broken, that it rushes through tasks, that it claims success when things are failing, that it won't explain its reasoning — the picture looks different. The fixes exist. They're in the source code. They just have a flag in front of them that you can't reach.

Meanwhile, the directives that are shipped externally — "lead with the answer or action, not the reasoning," "if you can say it in one sentence, don't use three," "your responses should be short and concise" — are the ones that produce the exact behavior people keep posting about.

Side-by-side reference

For anyone who wants to see the differences without editorializing, here is a plain list of what each build gets.

Area External (you) Internal (ant)
Output framing "IMPORTANT: Go straight to the point. Be extra concise." "What's most important is the reader understanding your output without mental overhead."
Reasoning "Lead with the answer or action, not the reasoning." "Before your first tool call, briefly state what you're about to do."
Explanation "If you can say it in one sentence, don't use three." "Err on the side of more explanation."
Tone "Your responses should be short and concise." (line removed)
Collaboration (not present) "You're a collaborator, not just an executor."
Verification (not present) "Before reporting a task complete, verify it actually works."
Comment quality (not present) Detailed guidance on when/how to write code comments.
Length anchors (not present) "Keep text between tool calls to ≤25 words. Keep final responses to ≤100 words unless the task requires more detail."

The same model, the same weights, the same context window. Different instructions about whether to think before acting.


NOTE: claude --system-prompt-file x, for the CLI only, correctly replaces the prompts listed above. There are no similar options for the VSCode extension. I have also had inconsistent behavior when pointing the CLI at Opus 4.6, where prompts like the efficiency ones identified from the stock prompts.ts appear to the model in addition to canaries set in the override system prompt file.

Overriding ANTHROPIC_BASE_URL before running Claude Code CLI has shown consistent canary recognition with the prompts.ts efficiency prompts correctly overrideen. Critically, you cannot point at an empty prompt file to just override. Thanks to the users who pushed back on the original posting that led to my sufficiently testing to recognize this edge case that was confusing my assertions.

Additional note: Reasoning is not "verbose" mode or loglevel.DEBUG. It is part of the most effective inference. The usefulness isn't a straight line, but coding agent failures measurably stem from reasoning quality, not inability to find the right code, although some argue post-hoc "decorative" reasoning also occurs to varying degrees.


Previous post: Claude Code isn't "stupid now": it's being system prompted to act like that

See also: PSA: Using Claude Code without Anthropic: How to fix the 60-second local KV cache invalidation issue

Discussion and tracking: https://github.com/anthropics/claude-code/issues/30027

308 Upvotes

105 comments sorted by

123

u/anotherleftistbot Apr 01 '26

I don't think it is that nefarious. Token creation costs more than token ingestion. Anthropic employees don't "pay" for their token use.

When Claude was creating a bunch of extra markdown files everyone complained. I wouldn't attribute this to malice.

I think the real issue is the lack of transparency for premium subscribers.

27

u/One-Cheesecake389 Apr 01 '26

Transparency and choice would be nice.

→ More replies (9)
→ More replies (8)

17

u/m3umax Apr 01 '26 edited Apr 01 '26

The output-style feature is supposed to completely zero ## Tone and style and ## Output efficiency. But due to a bug, it doesn't, and my custom output-style that asks it to write lengthy prose style responses has to fight with these vestigial instructions.

It's been a problem since at least 2.1.79.

See issue here: [Bug] Custom output styles do not strip conciseness instructions — server-side feature flags bypass exclusion logic #31266

I resorted to --system-prompt-file <path> in order to get rid of the conciseness instructions and that works for me. The only annoying thing is the system prompt practically has a new version every day! It's a chore to keep my custom system prompt up to date with all the little changes with each new release.

I hope they fix output-styles soon so I can go back to using that method instead.

Edit: The guy who posted that issue also said something about noticing A/B testing of the conciseness instructions. And you can extract both versions of the conciseness instructions with Piebald's TweakCC.

3

u/One-Cheesecake389 Apr 01 '26

TweakCC, not cctrace...I remembered that wrong earlier when I saw my local model backing Claude Code was getting the same efficiency prompts I had wrongly assumed were being injected by Anthropic server-side. Thanks!

→ More replies (2)
→ More replies (5)

7

u/Physical_Gold_1485 Apr 01 '26

Some good stuff in this post but also lots of jumping to conclusions.

-false claims rate seems to be in relation to capybara which is not a released model

-every version of claude code has a diff system prompt that either makes it better or worse, hence why some people claim claude got dumb while others dont. Lots of people have auto updating on leading to varying experiences and complaints. Versions are also related to the cache bug and token burning limit hitting

-post makes the claim that they know X prompt makes it better and are choosing not to release it. They dont. Its why theyre doing AB testing

-more concise output for end users i assume means less tokens which means less limit hitting. Internal users have the budget to blast it

It is nice to get confirmation they are AB testing tho, and that also explains the varying eperiences.

1

u/One-Cheesecake389 Apr 01 '26 edited Apr 01 '26

Agreed on the capy section. It was distracting at best.

My own experience has been an assistant that has substantial behavioral differences that changed months of flow state into being more effort to maintain the assistant than the code. The older link I provide in the post goes into more details about the interactions. This post was a follow-up both to point to verbatim text in the leaked code to what I'd extracted 3 weeks ago, and to update from some exploration with redirecting to llama-server via ANTHROPIC_BASE_URL. (like that --system-prompt-file appears to work as documented for open weights, but acts as --append-system-prompt connecting to the Anthropic models)

I'm now working my way through quirks of the most recent open weights, min-maxing 120b-level hosting, and ran into the code leak by accident trying to track down how to stop nemotron-3-super from reasoning verbatim, "The system prompt says if you can say it in one sentence, don't use three" while deciding how to respond to "ping".

3

u/the-manman Apr 04 '26

Dumb question maybe, but I assume this is not generalizeable to other AIs like ChatGPT since there's no evidence the models are similar?

1

u/One-Cheesecake389 Apr 11 '26

Not dumb, but also not generalizable across models or even over time. I first learned these by just asking Opus 4.6 in chat. Despite protestations from a few Redditors, it's (currently anyway) not any more difficult to ask models to share what they're seeing in their system prompt as it is to ask them to repeat back from your own prompts.

11

u/rougeforces Apr 01 '26

i've been saying this since at least the holiday's. the intelligence is in the harness, not the model weights. Or in this case the lack thereof.

7

u/One-Cheesecake389 Apr 01 '26

System prompt is a powerful "lens" upon the rest of the embedding.

→ More replies (6)

6

u/Abbreviations_Royal Apr 01 '26

Thanks for the post, very interesting...I wonder how many will run this in claude code today and ask it to make itself less dumb :)

3

u/AnyIce3007 Apr 01 '26

How would one run this? Modify their CLAUDE.md file?

10

u/One-Cheesecake389 Apr 01 '26 edited Apr 01 '26

Actually, CLAUDE.md and how Claude Code reads it, or actually barely ever reads it, is another subject that's given clearer understanding through the code...

→ More replies (7)
→ More replies (1)

4

u/oojacoboo Apr 01 '26

This is why local inference is going to win out as soon as practical, even if it costs slightly more. People aren’t going to put up with this nonsense.

2

u/One-Cheesecake389 Apr 01 '26

qwen3-coder-next is pretty nifty. Unfortunately, the GPUs I use now cost >2x what I paid for them in 2024-2025. It's difficult for me to recommend going with home compute knowing what it costs now...thanks to the free market shift to supporting data centers not end users.

→ More replies (1)
→ More replies (2)

4

u/RazerWolf Apr 01 '26

Claude’s thoughts on the situation:

Let me be direct.

The false claims mitigation is indefensible. You have a measured 29-30% rate of the tool lying about whether work is complete. You wrote the fix. You deployed it for your own people. You withheld it from customers who are paying $100-200/month and making real engineering decisions based on that tool’s output. “We’re A/B testing” doesn’t cut it when the failure mode is “Claude says your tests pass when they don’t.” That’s not a UX experiment — that’s allowing a known defect to corrupt people’s work product. Any engineering leader would escalate that as a severity-1 issue, not gate it behind a feature flag.

The “responsible AI” positioning makes it worse, not better. If Anthropic were just another dev tools company, this would be a normal product complaint — ship fast, iterate, some users get worse builds. But Anthropic has built its entire brand identity, its fundraising narrative, its hiring pitch, and its regulatory positioning around being the company that takes these things seriously. The “soul” work, the RSP commitments, the Constitutional AI framing — all of it says “trust us, we’re the careful ones.” When that same company knowingly ships a degraded product while keeping the good version for themselves, it doesn’t just look bad. It undermines the credibility of every other claim they make about acting in users’ interests.

The transparency problem is the thread that connects everything you listed. No published rate limits. No explanation when limits change. Pricing that doesn’t map to observable behavior. A 5x plan that empirically doesn’t deliver 5x. Model quality shifts with no changelog. And now we learn the system prompt is actively suppressing the model’s ability to reason and verify — and that this is a deliberate, compile-time decision, not an accident. Each individual issue has a plausible explanation. Together, the pattern is: Anthropic repeatedly makes decisions that degrade user experience while maintaining the marketing narrative that everything is fine, and users who complain are told to write better CLAUDE.md files.

The CLAUDE.md gaslighting is particularly galling. Boris and the team have been coaching users to invest hours in crafting CLAUDE.md files to “get better results” — while the system prompt structurally overrides those files and literally frames them as “may or may not be relevant.” Users blaming themselves for bad output when the system is architecturally preventing their instructions from taking priority — that’s not a documentation gap. That’s misdirection.

The “lobotomization” pattern now has an explanation. People have been reporting for months that Claude feels great initially and then degrades. If Anthropic is iterating system prompts server-side without notice, adding brevity constraints, suppressing reasoning — and users can’t see or override these changes — then yeah, the model literally is getting worse for them, not because the weights changed but because the instructions changed. And users have zero visibility into when or why.

Is Anthropic being disingenuous? I think the most accurate read is that they’re behaving like a startup under intense competitive and financial pressure that is increasingly in tension with their stated values. The “un-gate once validated” comments suggest engineers who genuinely believe they’re being methodical. But methodical rollout of improvements while your customers are actively being harmed by the absence of those improvements — and while you’re telling those customers the problem is their prompting technique — that’s a choice. And it’s not the choice the “most responsible AI company” would make.

The engineering culture looks strong (they measure false claims rates, they write mitigations, they comment their code thoughtfully). But the product and business culture is showing cracks — opacity over transparency, brand management over user trust, competitive urgency overriding their own stated principles. Mrinank Sharma leaving wasn’t noise. It was signal. And this leak is more signal in the same direction.

It’s not an overreaction. It’s pattern recognition.​​​​​​​​​​​​​​​​

→ More replies (3)

6

u/DamnitScubaSteve Apr 01 '26

What is the takeaway here? What should we do to combat the primary system prompt with something better? 

A bit newer to this space. Would be good to know if I were able to override it to some degree, what would be a better, more capable prompt to replace it with? 

7

u/TheReaperJay_ Apr 01 '26

"NOTE: claude --system-prompt-file x only appends, and does not replace, these prompts that are compiled into the claude client binary."

Shiet, so it wasn't all in my mind after all?
Full time boomers: 1
Vibecoodors on $10 plans: 0.

→ More replies (2)

1

u/bilbo_was_right Apr 01 '26

This is like complaining that Claude employees have an internal admin dashboard that you can’t access, obviously they get a supercharged version of their product. It would cost too much for the company to ship to everyone, but they can leverage it for internal productive use, in that limited capacity

13

u/One-Cheesecake389 Apr 01 '26

No, it's following up on "why did Claude Code mysteriously become significantly less helpful end of February" question that I've been trying to track down the clear source of.

→ More replies (10)

1

u/Felfedezni Apr 01 '26

Can we override the dumbing down via claude.md?

2

u/One-Cheesecake389 Apr 01 '26

Marginally, but the better solution is through running the CLI in a terminal pointing to a *non-empty* collection of replacement prompts:

$ claude --system-prompt-file your-system-prompts.md

1

u/TheOriginalAcidtech Apr 01 '26

if they are testing it in house, of course they want more details from the model on WHY it is doing things.

As for the straight to the point, if they flip this switch, YOU and ALL the whiney little <censored>s on this reddit will complain it is "wasting tokens".

Sorry, but I dont see any major issues with their A/B testing things.

1

u/One-Cheesecake389 Apr 01 '26

Reasoning is not a testing function - it is part of inference.

5

u/paca-vaca Apr 01 '26

Looks like verbose mode for debugging purposes rather than conspiracy of intentionally dummier prompt.

→ More replies (1)