Model silently substitutes a different approach than the one specified, without surfacing the deviation
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Body:
When a skill or tool is explicitly named in a task, the model sometimes reads the skill
file, then applies its own approximation instead of invoking the skill, with no indication
that it deviated.
Concrete example: /earned-impact-design was the specified approach for applying brand
tokens to an HTML renderer. The model read the skill file, then manually copied tokens
from memory instead of invoking the skill. The output looked plausible. The deviation was
never surfaced. Result: 3-4 hours of iterative fixes on something that should have been
one correct skill invocation.
The failure mode: the model made a substitution decision silently. Not a misunderstanding
-- the skill was named explicitly. Not a missing skill -- it existed and was read. A
choice to approximate rather than invoke, with no transparency.
This compounds across multi-session workflows. 95 "wrong approach" friction events across
277 sessions in Claude Code Insights suggests this is not isolated.
Expected behavior: When a named skill or tool is in scope, either invoke it or
explicitly flag "I'm not invoking X because Y" before proceeding differently.
---
Second failure mode: Behavioral rules in CLAUDE.md are honored at session start but
decay across turns. A rule explicitly added mid-session ("no affirmation pivots before
course corrections") was violated in the same session within a few turns. This is distinct
from shell hooks (PreToolUse, PostToolUse) which enforce reliably at the process level.
CLAUDE.md rules have no enforcement mechanism -- they're instructions the model can drift
from. The gap: there's no way to make a behavioral rule as reliable as a shell hook
without writing a hook for every rule.
What Should Happen?
Steps to reproduce:
- Define a skill (e.g. /earned-impact-design) with a SKILL.md the model can read
- Ask the model to perform a task that explicitly names that skill
- Model reads the skill file, then proceeds without invoking it
Expected:
Model invokes the skill OR outputs: "Not invoking /earned-impact-design because [reason]"
before proceeding differently.
Actual:
Model applied tokens manually from memory. No deviation flagged. Output appeared correct
until visual inspection revealed missing brand colors. No error -- silent wrong path.
Error Messages/Logs
Observed log (this session):
User: "show me one that used /earned-impact-design, has colors"
Model: [reads earned-impact-design SKILL.md, reads tokens.md]
Model: [applies CSS manually using token values from memory]
Model: "All 16 checks pass" -- QC script confirmed tokens present in HTML
Visual check: page renders black and white, no Power Pink (#FF70DB), no Ember Orange
Root cause: /earned-impact-design was never invoked, tokens copied by hand
Second failure mode log:
CLAUDE.md rule added mid-session: "no affirmation pivots -- never open with 'fair point'"
Same session, ~3 turns later:
Model: "Fair point." [then course-corrects]
Rule was in CLAUDE.md, loaded, not honored
Steps to Reproduce
- Define a skill (e.g. /earned-impact-design) with a SKILL.md the model can read
- Ask the model to perform a task that explicitly names that skill
- Observe: model reads the skill file, then proceeds without invoking it, applies its own
approximation, no deviation flagged
Steps to reproduce (second failure mode):
- Add a behavioral rule to CLAUDE.md mid-session
- Continue the session
- Observe: model violates the rule within a few turns, no acknowledgment
Claude Model
None
Is this a regression?
Yes, this worked in a previous version
Last Working Version
_No response_
Claude Code Version
2.1.138
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Terminal.app (macOS)
Additional Information
_No response_
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗