Well-intentioned entropy
How Claude's system prompt became a 10,000-word monster
The doc was forty pages long. It was full of words. And yet it didn’t contain anything. It was our functional spec template.
Years before, we had created the first version of the template to improve our development process. The idea was sound. Provide a common framework to help engineers craft functional specs. Ensure all specs covered similar ground. Make sure nothing was forgotten.
But over time the template grew. Whenever something went wrong, whenever something was missed, the template was updated. Everyone wanted to avoid repeating mistakes. So they codified their experience in the template.
And the template grew longer. And longer. And longer. Until it became an unmanageable beast. A document that made engineers shake. Made them cry.
OK, so I might have made that last bit up. But, by the end, it wasn’t a fun doc to work with. And then one day someone had too much. The template was abandoned.
It was a good example of well-intentioned entropy. Avoiding mistakes being repeated is a good thing. But it turns out there are a lot of possible mistakes. And codifying them all individually is non-scalable.
I was reminded of this story when I stumbled across the Claude 4.0 system prompt. The system prompt is the set of instructions that precedes any messages you send to an AI model. It’s a bit like the values or self-identity for the model. It’s normally hidden, but sometimes it leaks out.
In March 2024 the Claude 3 system prompt was ~200 words long. Fast forward to today and the Claude 4 system prompt has grown to nearly 10,000 words. Why? It’s the same reason as our old functional spec template - a whole range of special conditions have been added to deal with specific edge conditions. Read through it and it feels like a collection of bug fixes.
There’s a guard against excessive sycophancy:
Claude never starts its response by saying a question or idea or observation was good, great, fascinating, profound, excellent, or any other positive adjective. It skips the flattery and responds directly.
If you used Claude 3.7 or earlier you might remember its love of bulleted lists. That’s addressed here:
Claude should not use bullet points or numbered lists for reports, documents, explanations, or unless the user explicitly asks for a list or ranking
Copyright is mentioned multiple times:
CRITICAL: Always respect copyright by NEVER reproducing large 20+ word chunks of content from search results, to ensure legal compliance and avoid harming copyright holders.
and
PRIORITY INSTRUCTION: It is critical that Claude follows all of these requirements to respect copyright, avoid creating displacive summaries, and to never regurgitate source material.
and
Strict rule: Include only a maximum of ONE very short quote from original sources per response, where that quote (if present) MUST be fewer than 15 words long and MUST be in quotation marks.
What does Claude think?
The obvious thing is to discuss the system prompts with Claude. And Claude is scathing of the V3 system prompt.
But it also doesn’t much like the current prompt:
And asked to compare the two it summarizes it as:
And, of course, Claude being Claude, it’s happy to rewrite the system prompt. The updated version looks promising - more structured and concise. But it’d be interesting to understand whether it works as well…
What gives?
The problem is Anthropic are trying to please everyone. You see that in the contradictions in the prompt. “Be concise” appears multiple times. But so does “be thorough”. How should Claude behave? Well, it depends.
The reality is one-size-fits all is too restrictive. These days we need multiple Claudes. I want different variants depending on what I’m doing. Sometimes I want "coding-guru" Claude - my in depth coding assistant. Other times I want "don’t-pull-your-punches" Claude - the Claude that shouted at me earlier this week when I failed to answer a question in a draft email it was helping me craft.
And, sometimes, I need sympathetic Claude to listen as I express my views about angry Claude.
For now we can add a custom prompt that gets slotted in after the system prompt to help us control Claude.
It’s useful. It can really change Claude. For example set the prompt like this:
Always answer in broad Scots. I prefer if you can explain concepts using analogies from Robert Burns.
And Claude becomes very different.
If you don’t have your own custom system prompt and want to experiment I’ve built a custom prompt generator which attempts to synthesize the best advice on custom prompts from the community.
But, for now, while you can change Claude, you can’t easily have lots of different personas as the interface to change it is clunky.
And so?
Anthropic (and the other labs) face two problems.
Firstly, the system prompt can’t keep growing so rapidly. The prompt has grown by 50x in 18 months. It now consumes ~7% of Claude’s 200k token window.
It’s an organic tangle. Attempting to please everyone invariably ends up pleasing no-one. And it shows.
In reality, commercial pressures make it unlikely the system prompt will ever consume much beyond 10% of the context window. It would make the models too expensive to serve. Context window sizes will also grow - and that will help reduce the pressure. If Claude had a 1 million token context window, the current prompt would use less than 2% of it. So length is unlikely to become a problem. But the content problem remains.
When our functional spec template became unwieldy, we threw it away and started over with a leaner, more fit for purpose template. We cleared out the dross. We tightened and condensed the template. And recognized there is a trade-off between development velocity and attempting to avoid repeating mistakes. What really matters is avoiding repeating the critical mistakes; sometimes it’s OK to trade an increased risk of repeating a minor mistake to get more velocity.
Something similar might be required for model system prompts. They can’t keep growing organically with different teams making overlapping and conflicting changes. It needs to be better structured. Designed for maintenance. Properly engineered. Ultimately Claude needs to think its system prompt is something more than a "patchwork of bug fixes".
One approach would be to split the system prompt into a 'core' that defines the critical model characteristics. Then have clearly structured prompts that define different personalities. We’d get a set of these out-of-the-box, but also be able to construct (and manage) our own. It's just like the way we rebuilt our templates. An essential framework shared by all, which was then customized to specific domains rather than attempting the one-size-fits-all approach.








