Opus 5.5 ignores output-style language rule after tool chains (0.4% -> 4.2% English)
Status Open
Reported on v2.1.278
Maintainer reply None cached
Activity 3 comments · opened Sep 24, 2026
Summary
After switching the model from claude-opus-5 to claude-opus-5-5, responses frequently ignore the output-style language rule ("reply in Traditional Chinese") and come back in English, usually after a chain of tool calls whose outputs are English (CI logs, JSON, YAML).
Evidence
Counted assistant text blocks (code stripped, >= 30 letters) across 147 local session transcripts of one project:
model blocks english ratio
claude-opus-5 2445 9 0.4%
claude-opus-5-5 143 6 4.2%
In a single session today the final report drifted to English four times, each time after being corrected in the previous turn.
Environment
- Claude Code 2.1.278 (last day on Opus 5) -> 2.1.280 / 2.1.281 (Opus 5.5); both changed on the same day, so the CLI version is not ruled out
- Language rule lives in a custom output style and in
~/.claude/CLAUDE.md - macOS
Expected
The output-style language rule holds after long tool chains, as it did on Opus 5.
Question
Did the way output styles are injected change between 2.1.278 and 2.1.280, or is this a model-side regression?
3 Comments
Same thing here on macOS, Claude Code 2.1.282, with
"language": "Italian"in settings.json and a project CLAUDE.md that says to always reply in Italian. Output style is Concise, effort high.I ran a similar count on my transcripts from the last 30 days. Main thread only, assistant text blocks of 6+ words with code stripped, English detected with a simple stopword ratio, so treat it as a rough number:
| Model | Text blocks | English | Ratio |
|---|---|---|---|
| claude-opus-5 | 8364 | 27 | 0.3% |
| claude-opus-5-5 | 1205 | 184 | 15.3% |
The Opus 5.5 ones come from 5 different sessions. Most of the ones I looked at are short progress notes between tool calls, during browser automation with the Chrome extension or right after a subagent report in English. For example: "The group address was taken, and so was the feedback email. I'm saving." Asking it to switch back to Italian works for a sentence or two, then it drifts again.
Split by CLI version, same method:
| Model | CLI | Text blocks | English |
|---|---|---|---|
| claude-opus-5 | 2.1.211 to 2.1.276 | 8041 | 14 (0.2%) |
| claude-opus-5 | 2.1.278 | 238 | 13 (5.5%) |
| claude-opus-5 | 2.1.281 | 82 | 0 |
| claude-opus-5-5 | 2.1.280 | 424 | 82 (19.3%) |
| claude-opus-5-5 | 2.1.281 | 521 | 20 (3.8%) |
| claude-opus-5-5 | 2.1.282 | 267 | 84 (31.5%) |
Opus 5 on 2.1.281 stayed clean, while Opus 5.5 drifted on every CLI version I have. So on my side it looks more like the model than the CLI. The per-version numbers jump around a lot, though, probably because of what each session happened to be doing.
Adding data from a different setup, in case it helps narrow this down: Windows 11, Claude desktop app (Code tab), bundled Claude Code 2.1.280 / 2.1.281. My rule is also "reply in Traditional Chinese (Taiwan)", but at the time it lived only in
~/.claude/CLAUDE.md: no custom output style, nolanguagesetting. So at least here it doesn't depend on output-style injection, or on macOS.I measured the language of the final reply of each user turn (last assistant text before the next user prompt; code, URLs and paths stripped; CJK-vs-Latin letter ratio), main thread only, mid-June to Sept 25:
| Model | Turns | English final replies |
|---|---|---|
| claude-opus-5 (CLI 2.1.219–2.1.275) | 175 | 0 |
| Other models (Opus 4.7/4.8, Sonnet 4.6/5, Fable 5, Haiku 4.5) | 185 | 1 |
| claude-opus-5-5 (2.1.280 / 2.1.281) | 21 | 10 (48%) |
Small sample, but a few patterns were consistent:
Async agent launched successfully…notices; no subagent had reported yet.I have no Opus 5 turns on 2.1.280+, so I can't add a same-version comparison; the table in the comment above covers that and points at the model rather than the CLI.
What I've applied since: the
languagesetting (which, per the comment above, doesn't stop this on its own), plus aUserPromptSubmithook that re-injects the language rule throughhookSpecificOutput.additionalContexton every prompt, so the instruction sits next to each turn instead of only at session start. Too early for numbers.Consider upvoting this similar issue https://github.com/anthropics/claude-code/issues/96326.
Your issue will be auto-closed if it does not collect at least 10 thumbs up, or without adding a comment every time before the 14 days stale bot interval expires. See more details in https://github.com/anthropics/claude-code/issues/87647, and consider upvoting that for visibility too.