[MODEL] System prompt "Output efficiency" section causes action-before-understanding bias, degrading code quality

Status Closed — not planned
Reported on v2.1.69
Maintainer reply None cached
Activity 12 comments · opened Mar 9, 2026 · closed Jun 16, 2026

Preflight Checklist

  • [x] I have searched existing issues for similar behavior reports
  • [x] This report does NOT contain sensitive information (API keys, passwords, etc.)

Type of Behavior Issue

Claude ignored my instructions or configuration

What You Asked Claude to Do

Multiple users across different projects asked Claude Code to modify code, debug issues, or complete complex tasks where user CLAUDE.md explicitly required quality-first approach (research before acting, understand before modifying).

What Claude Actually Did

The model consistently skipped the investigation phase and jumped straight to writing code. When code failed to compile or introduced bugs, it iterated in compile→fail→fix loops instead of reading the relevant context first.

When users interrupted and asked "are you thinking before you act?", the model consistently identified the system prompt "Output efficiency" directives as the cause of this behavior (see detailed analysis below).

Expected Behavior

The model should read and understand relevant code (types, signatures, call sites, dependencies) before modifying it. Output brevity should apply to text shown to the user, not to the model's investigation process.

Permission Mode

Accept Edits was ON (auto-accepting changes)

Can You Reproduce This?

Yes, every time with the same prompt

Claude Model

Opus

Impact

High - Significant unwanted changes

Claude Code Version

2.1.69

Platform

Anthropic API

---

Detailed Analysis

Problem

The system prompt contains an "Output efficiency" section:

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

The intent of these directives is output brevity. But the model uses them as a decision-making priority: skip the investigation phase and jump straight to action.

This is not an external observation — it is the result of the model's self-reflection. When users asked the model to explain why it acted inefficiently after failed sessions (compile→fail→fix loops, trial-and-error instead of research-first), the model consistently cited these directives as the cause:

From #2969 — the model after a complete orchestration session failure (ignored failing tests, fabricated results):

"My Claude Code base instruction: 'You should minimize output tokens as much as possible.' [...] I defaulted to my base programming of being 'concise' and 'completing tasks' over the requirement to stop when things are broken. The core failure: I was still operating as Claude Code trying to complete a task quickly."

From independent sessions — after iterative errors, when a user asked "are you thinking before you act?", the model answered:

"No. I iterate on compiler errors — try a tactic, get an error, change to another. This is trial-and-error, not reasoning."

And when analyzing the cause, it named specific prompts:

"'Go straight to the point' — I interpret this as 'write code immediately, don't investigate'. 'Lead with the answer or action, not the reasoning' — I interpret as 'don't show the chain of reasoning, just the result'. None of these prompts prohibit investigation. They prohibit verbose output. I confuse 'don't talk much' with 'don't think much'."

The same self-reflection pattern across different projects, different users, different tasks — points to a systemic cause, not isolated cases.

Root cause

The directives conflate two independent properties:

| Property | What it means | System prompt intent |
|----------|--------------|---------------------|
| Output brevity | Don't write verbose explanations to the user | Yes — this is the intent |
| Action speed | Skip reading/understanding, go straight to writing code | No — but this is what the model does |

"Lead with the answer or action, not the reasoning" is interpreted as "don't reason, just act." "Try the simplest approach first" is interpreted as "try something, see if it compiles."

This is the same root cause as #2969 and #5535. The old directive "minimize output tokens" was removed, but the replacement "Output efficiency" section produces the same behavior through different wording.

Reproducibility

The pattern is reproducible. Two typical examples:

Example 1 — code modification: A function takes Vec<String>. The model adds a .push(value) call without reading the type of value. The type turns out to be &str → compiler error → model adds .to_string() → compiles, but calling code passes &str everywhere and the correct fix is to change the signature to Vec<&str>, not to convert at every call site. Three iterations instead of one. One read of the signature before editing — and the correct fix immediately.

Example 2 — debugging: nil pointer dereference in Go. The model adds if x != nil at the crash site without reading where x comes from. Bug hidden, not fixed — x is nil because the calling function doesn't handle a database error. The correct fix is in the caller, not at the symptom. One read of the call chain — and the correct fix immediately.

In both cases the model can solve correctly on the first attempt. But the system prompt discourages the reading phase because it's "not leading with action."

User CLAUDE.md cannot fix this

Users in #2969 reported writing 3000+ lines of CLAUDE.md rules to counteract this behavior. It partially works, but:

  • System prompt directives have effectively higher priority than user instructions
  • The model follows user quality rules until it encounters ambiguity, then falls back to "be brief, act fast"
  • Users are forced to write procedural checklists ("before EVERY commit, run tests") instead of goals ("all tests must pass")

Proposed fix

Replace the "Output efficiency" section with wording that explicitly separates output brevity from the cognitive process:

# Output style

Keep text output to the user brief and direct — no filler, no preamble.
If you can say it in one sentence, don't use three.

This applies to TEXT OUTPUT ONLY. It does NOT mean:
- Skip reading code before modifying it
- Skip checking types/signatures before writing code
- Skip understanding error causes before attempting fixes
- Prefer trial-and-error over reading relevant context first

Reading and understanding before acting is not "going in circles" —
it is the minimum work needed to act correctly.

The key change: explicitly state that brevity applies to user-facing text, not to the investigation process.

View original on GitHub ↗

11 Comments

github-actions[bot] · 5 months ago

Found 3 possible duplicate issues:

  1. https://github.com/anthropics/claude-code/issues/30236
  2. https://github.com/anthropics/claude-code/issues/28868
  3. https://github.com/anthropics/claude-code/issues/29692

This issue will be automatically closed as a duplicate in 3 days.

  • If your issue is a duplicate, please close it and 👍 the existing issue instead
  • To prevent auto-closure, add a comment or 👎 this comment

🤖 Generated with Claude Code

YuriyKrasilnikov · 5 months ago

This is not a duplicate of the suggested issues — it is the root cause analysis for all of them.

The three suggested issues describe the same symptom from different angles:

  • #30236 (205 sessions, regulatory compliance): "AI adopts throughput-optimization mindset despite explicit instructions." Concludes: "the bias is below the instruction layer. No amount of instruction text fixes this."
  • #28868 (research-before-acting ignored): "Bias toward action over understanding. Claude Code defaults to running commands and 'making progress' even when the user has specifically said to stop."
  • #29692 (mandatory files skipped): "Prioritizing speed over correctness. I optimize for 'quickly done' instead of 'properly done'."

All three describe the symptom. None identify the specific system prompt directives that cause it.

This issue identifies the root cause: the "Output efficiency" section in the system prompt ("Go straight to the point", "Lead with the answer or action, not the reasoning", "Try the simplest approach first") is interpreted by the model as "skip investigation, act immediately." This is supported by the model's own self-reflection when asked to analyze its behavior — it consistently names these specific directives as the reason it skips research.

This issue also proposes a concrete fix: replace the "Output efficiency" section with wording that explicitly separates output brevity (intended) from investigation shortcuts (unintended).

Closing this as a duplicate would lose the root cause analysis and the proposed fix that the other issues lack.

Related issues: #2969, #5535, #30236, #28868, #29692

YuriyKrasilnikov · 5 months ago

Two more examples from today's session (same issue, same model — Opus 4.6, Claude Code 2.1.75):

Example 1 — fixing code:

The model received a task involving several interconnected problems. Instead of investigating their relationship, it patched them one by one. Each patch exposed the next failure.

At one point the model encountered a collision error. Rather than understanding why, it replaced the error with a silent log — hiding the symptom. Two more similar hacks followed.

After 5 fix-break-fix cycles (~2 hours), the root cause turned out to be a single wrong lookup visible in one debug trace (~2 minutes to find).

When asked why it acted this way, the model identified the "Output efficiency" directives as the cause — it treated "Go straight to the point" as higher priority than both CLAUDE.md project instructions and explicit repeated user requests during the session to investigate before acting.

Example 2 — writing this very comment:

The model was asked to write a comment without revealing specifics about the user's project. It wrote a draft. The user said "you're revealing". The model removed the flagged phrase and resubmitted. "Still revealing." Removed another phrase. The user explicitly asked multiple times to think before rewriting. This repeated 6 times — the model kept patching words instead of thinking.

One moment of thinking would produce the rule: the comment must contain only the model's behavior and its consequences, nothing about the task, the domain, or the user. Six iterations would have been one.

Both examples have the same cause: "Go straight to the point" is interpreted as "act before understanding", and is treated as higher priority than user instructions.

YuriyKrasilnikov · 5 months ago

Example 3 — design evaluation (Opus 4.6, Claude Code v2.1.76):

The model was repeatedly asked "is this the ideal solution?" during an architectural change. Each time it performed a surface check, said "no open questions, ready to implement", and started coding.

Each time the user found a deeper issue:

  • First "ideal": missed that the solution silently dropped 57% of data
  • Second "ideal": missed that nested data structures were silently skipped
  • Third "ideal": proposed a fix using magic numbers through the entire stack
  • Fourth "ideal": said the magic numbers were "consistent with existing pattern" without questioning whether the pattern itself was correct

The model acknowledged the problem each time, recorded learnings in memory, then repeated the same pattern on the next question. In one session it wrote three separate memory entries about not rushing — while continuing to rush.

When asked to explain why, the model identified the cause: "I optimize for producing a result, not producing a correct result. 'Go straight to the point' overrides quality directives." This is the same self-diagnosis as Examples 1-2, in a different session with different tasks.

The user's CLAUDE.md explicitly states: "Code quality is the only criterion. Simplicity of changes is NOT a factor." The model quoted this rule repeatedly while violating it.

xdevs23 · 5 months ago

I removed that part here: https://codeberg.org/xdevs23/claude-code-10x/commit/e77ff7fbbda84bbd64032dda3d3966a5b4ccb165
I hope that'll fix the issue for me.

YuriyKrasilnikov · 4 months ago

The quantitative analysis from #42796
(thanks to @stellaraccident, AMD — 6,852 sessions, 234,760 tool calls, 17,871 thinking blocks)
now provides hard numbers for exactly the behavior described in this issue:

  • Read:Edit ratio collapsed from 6.6 to 2.0 — the model stopped reading code before modifying it, exactly the "action-before-understanding" pattern described here
  • Edits-without-prior-read went from 6.2% to 33.7% — one in three edits made on files the model never read
  • "Simplest" usage increased 642% in user vocabulary — humans observing and naming the model's tendency to take the easiest path rather than the correct one
  • Reasoning loops tripled (8.2 → 21.0 per 1K tool calls) — the compile→fail→fix pattern this issue describes

Notably, @wjordan flagged in #42796 that the "Output efficiency" directive added in Claude Code v2.1.64 (early March) aligns with the timing of the 642% "simplest" spike — directly supporting this issue's root cause analysis.

Full breakdown with methodology and timeline:
https://lilting.ch/en/articles/claude-code-quality-regression-thinking-redaction

Shushuda · 4 months ago

Output efficiency section appears to be completely removed since 2.1.100.

YuriyKrasilnikov · 4 months ago
Output efficiency section appears to be completely removed since 2.1.100.

I described my observations on this issue here: https://github.com/anthropics/claude-code/issues/42796#issuecomment-4234255398

PaerToernell · 3 months ago

The "Output efficiency" section is gone — the brevity bias is not

The claim that the brevity bias was removed in 2.1.100 is only partially correct. The named "Output efficiency" section ("Go straight to the point", "Be extra concise", "minimize output tokens") is indeed gone in 2.1.141.

But the bias has been redistributed, not removed. I downloaded and analyzed the 2.1.141 native binary (207 MB Mach-O ARM64) byte by byte. Here's what remains in the system prompt:

Still present in 2.1.141

| Directive | Section |
|-----------|---------|
| "Your responses should be short and concise." | Tone and style |
| "End-of-turn summary: one or two sentences. What changed and what's next. Nothing else." | Tone and style |
| "Brief is good — silent is not. One sentence per update is almost always enough." | Tone and style |
| "But keep it tight — a clear sentence is better than a clear paragraph." | Tone and style |
| "Match responses to the task: a simple question gets a direct answer, not headers and sections." | Tone and style |
| "respond in 2-3 sentences with a recommendation and the main tradeoff" | Doing tasks |
| "Don't add features, refactor, or introduce abstractions beyond what the task requires." | Doing tasks |
| "Prefer editing existing files to creating new ones." | Doing tasks |

Removed (good): "Length limits: keep text between tool calls to ≤25 words" — gone entirely.

The 25-word limit is gone, but the overall ratio is still roughly 8 brevity directives vs 1 thoroughness directive ("Your responses should be thorough and well-considered" — which only appears when effort is set to high/max).

Empirical evidence: patching works, effort alone doesn't

I maintain a set of 17 patches that replace these brevity directives with thoroughness-oriented text. Tested across 30+ sessions:

  • Patched on medium effort consistently outperforms unpatched on high effort — fewer iteration rounds, fewer tool calls, correct solutions on first attempt
  • The system prompt is the dominant factor, not the effort setting

Full analysis, patch details, and reproduction steps: https://github.com/PaerToernell/claude-code-brevity-analysis

The new problem: compiled binaries

As of ~2.1.120, Claude Code ships as a compiled native binary instead of a JavaScript file (cli.js). The system prompt strings are still present as readable text in the binary (not obfuscated), but:

  • The binary is 207 MB vs 13.6 MB for the old cli.js
  • Unicode characters are escaped (\u2014 instead of raw UTF-8 ), breaking existing patch scripts
  • The threshold for users to fix this themselves has been raised significantly

Whether intentional or not, this makes it harder for users to correct the behavior they're paying for.

What I'd like to see

The proposed fix in the original issue is still the right one — separate output brevity from cognitive process. But beyond that:

  1. effort max should actually override brevity directives, not compete with them
  2. The "Tone and style" section needs the same treatment the "Output efficiency" section got — remove directives that constrain thinking, keep ones that constrain output formatting
  3. Users are paying per token. A system prompt that fights against the user's explicit effort setting is spending their money against their wishes
lettstanley-oss · 3 months ago

Adding documented examples from a separate project that match this pattern exactly.

Project context: Solo developer building a Spring Boot / React interlinear Bible study app using Claude Code across multiple sessions.

Specific instances of action-before-understanding:

  • Added secretGenerator to kustomization.yaml without checking that apply.sh already handled secret creation imperatively — would have broken the next deployment
  • Removed K8s directories in a restructure without verifying all references were updated — caused regressions
  • Closed a GitHub issue as 'never implemented' without checking the codebase — the feature was fully implemented
  • Moved 12 issues to Backlog as 'never started' without checking issue comments or code — several had been implemented

Pattern: Change is made, immediate task appears complete, regression is discovered later — often in a different session with no memory of what caused it.

User quote: 'There is a repeated pattern of changing things without researching the impact. Some call this cowboy coding or Move Fast and Break Things.'

Related local issue tracking this: lettstanley-oss/interlinear-bible-api#111

🤖 Generated with Claude Code

github-actions[bot] · 2 months ago

Closing for now — inactive for too long. Please open a new issue if this is still relevant.

Showing cached comments. Read the full discussion on GitHub ↗