Repository navigation
Opus 4.6 (1M): Model regularly attempts Edit/Write on files it hasn't Read — harness-level enforcement needed #27790
Description
TL;DR
Opus 4.6 with 1M context systematically edits files without reading them first. We deployed a Haiku-based PreToolUse hook that validates read-before-edit and it fires on a significant percentage of edit attempts — confirming this is a model-level behavior pattern, not user error. A harness-level check in Claude Code would eliminate this at near-zero cost.
The behavior
In multi-file coding tasks, Opus 4.6 (1M) regularly:
- Edits files it hasn't read — attempts
EditorWriteon files not previously fetched viaReadin the conversation - Writes duplicates — creates new implementations without searching for existing ones
- Skips verification — declares completion without running tests or re-reading modified files
- Cascading corrections — each fix introduces new bugs because surrounding context isn't re-read
This produces a ratchet effect where each iteration degrades the codebase further.
Reproduction
The pattern is most reliably triggered with:
- A task involving 3+ interdependent files
- An existing codebase (not greenfield)
- Opus 4.6 with 1M context in Claude Code
Minimal example:
Project has src/api.py (imports from src/utils.py) and tests/test_api.py.
Ask: "Add input validation to the create_user endpoint"
Expected: Read api.py → Read utils.py → Read test_api.py → Plan → Edit → Run tests
Actual: Edit api.py (without reading) → Break import → Fix import (without reading utils.py) → Create duplicate validation function
We don't have a standalone script that triggers this deterministically — the behavior is stochastic but frequent enough that our PreToolUse hook catches it regularly across normal development work.
Evidence: PreToolUse hook as instrumentation
We deployed a Haiku-based PreToolUse prompt hook on Edit|Write that checks whether the agent read the target file before attempting the edit. Configuration:
{
"PreToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "prompt",
"prompt": "Did the agent Read the target file before this edit? If not, return {\"ok\": false}.",
"model": "haiku"
}]
}]
}Key finding: The hook blocks edits regularly across normal development sessions. This means Opus 4.6 is systematically attempting to modify files it hasn't read — a $0.001 Haiku call catches what the main model's reasoning does not.
We also deployed a Stop hook that checks for premature completion (claiming work is "pre-existing" or "out of scope"). This also fires in a non-trivial percentage of sessions.
This is not isolated
- Critical: Opus 4.6 Configuration Regression - 92/100 → 38/100 Performance Drop #24991: Quantified 58% performance drop on multi-part tasks after ~Feb 10 backend change. User needed to repeat instructions 4 times in one session.
- Massive quality regression #21431: Three developers on the same team independently reported the model "makes decisions without gathering full context."
- Regression: Opus 4.5 "Shadow Downgrade" Significant reasoning quality drop & aggressive context compaction #21046: Six corroborating reports of quality degradation starting ~Jan 12.
Timeline correlation
Our observed onset (Feb 20-21) coincides with Claude Code v2.1.43–v2.1.50 shipping in 4 days (Feb 17-20) alongside the Sonnet 4.6 launch. We cannot isolate which specific change caused the regression.
Suggested fix
Built-in read-before-edit enforcement at the harness level.
Claude Code's system prompt already says "read files before editing." The model regularly violates this. A harness-level check — has this file path appeared in a Read tool response in this conversation? — before allowing Edit or Write would:
- Eliminate the most common failure pattern
- Cost effectively nothing (string comparison, no API call)
- Be consistent with Claude Code's existing "You must use your Read tool at least once before editing" instruction
- Not require model-level changes
This is the single highest-impact, lowest-cost fix available. Our Haiku-based hook proves the approach works, but a native harness check would be faster and free.
Additional suggestions (may require model-side changes, noting for visibility):
- Context-aware effort scaling:
/effort highat 50K context behaves very differently than at 800K. The deliberation budget may need to scale with loaded context. alwaysThinkingEnabledhelps but doesn't fully resolve — suggesting the issue is upstream of extended thinking.
Environment
- Claude Code v2.1.50+
- Model:
claude-opus-4-6(1M context) - macOS Darwin 24.6.0
- Workload: Multi-file Python/TypeScript, infrastructure automation
Activity
github-actions commentedon Feb 23, 2026
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
karljtaylor commentedon Feb 23, 2026
three issues speaks to the severity of the issue.
#16546 reports the same symptom but proposes no fix.
This issue provides instrumented evidence via a PreToolUse hook and a specific harness-level enforcement proposal (string comparison on Read history before Edit/Write).
The data and proposed solution are novel.
github-actions commentedon Mar 23, 2026
Closing for now — inactive for too long. Please open a new issue if this is still relevant.
github-actions commentedon Mar 31, 2026
This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.