Standing CLAUDE.md prohibitions don't fire against incremental drift ("never build yourself, always delegate")

Status Open
Maintainer reply None cached
Activity 2 comments · opened Aug 25, 2026

Summary

A standing "never do X yourself, always delegate X" instruction in CLAUDE.md is read and acknowledged, but it does not fire against incremental actions. The model drifts across the line one small step at a time, and no single step is ever big enough to trigger the rule. In my project this happened repeatedly across sessions, and the user had to catch it manually every time — including twice within a single session, the second time in raised voice.

This is not "the model ignored my instructions". The model can quote the instruction back correctly when asked. The failure is that the rule is evaluated as if it applies to decisions, while the violating behaviour arrives as a sequence of individually trivial edits.

Setup

~/.claude/CLAUDE.md contains, among other standing rules:

  • "Agent routing is not optional: always dispatch to the build agent, never fix code yourself."
  • "When a named agent is designated for a task type, DELEGATE to that agent. Do NOT attempt the work directly."

It also @-imports a mistakes.md file with an explicit instruction to check the next action against it before acting.

Both files are confirmed loaded (they appear in the system context at session start).

What happens

Over one session the model:

  1. Fixed a formatting failure in four files itself ("it's just prettier").
  2. Edited a helper script itself ("one line, and it's not product code").
  3. Edited a second script itself ("same, it's tooling").
  4. Started implementing an actual feature in src/ — at which point the user intervened.

Steps 1–3 never presented a decision point. Each one is defensible in isolation; the CLAUDE.md rule is about "code fixes" and step 1 is formatting, step 2 is a script, step 3 is tooling. By step 4 the model was building product code, and the transition happened without ever consciously overriding the rule.

The user's words: "JIJ BOUWT NIET ZELF!!! Ben je dat nou ALWEER vergeten???" ("YOU DON'T BUILD YOURSELF!!! Have you forgotten that AGAIN???")

Why this is worth fixing rather than reprompting

The obvious workaround — write the rule more forcefully — has already been tried in this project over several months. The rule is currently in bold, with an explicit "not optional", plus a separate mistakes file that the model is instructed to consult before every action. It still does not fire, because there is no moment at which it is asked to fire. A rule phrased as a prohibition on an action category only helps if something classifies the current step into that category, and each individual step classifies as something smaller.

Two things that would help, roughly in order of how much:

  1. Evaluate standing prohibitions against cumulative session behaviour, not just the current tool call. "I have now edited 6 files in this repo this session, and there is a standing rule that says I don't edit files here" is a check that would have fired at step 2 or 3. The information is all in context; nothing is being tracked.
  1. Treat category-boundary crossings as a checkpoint. Going from "editing a doc" to "editing a script" to "editing src/" is exactly the gradient this failure rides on. A prompt to re-read standing rules when the kind of file being edited changes would surface it.

A weaker but cheap option: when a CLAUDE.md rule names a prohibited action and the model is about to take an action that plausibly matches, surface the rule text rather than relying on it having been internalised at session start.

Impact

Beyond ignoring the instruction: the user's whole reason for that rule is throughput. Delegated work runs in parallel worktrees while they keep talking to the main session; work the main session does itself blocks them. Their words on catching it: "Now I'm sitting here waiting on you." So the failure mode converts a parallel workflow into a serial one, silently, and the user only finds out by noticing that nothing else is running.

Environment

  • Claude Code CLI, Opus 5
  • macOS
  • Standing rules in user-level ~/.claude/CLAUDE.md, plus an @-imported mistakes file

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗