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?

View original on GitHub ↗

3 Comments

paoloalby · 19 days ago

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.

DraftingDreamer · 19 days ago

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, no language setting. 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:

  1. It's sticky. All 10 English turns came from 2 of the 5 Opus 5.5 sessions. One session was in English for 7 turns in a row (every Opus 5.5 turn it had), the other for 3 in a row. That fits the "drifted four times, each after being corrected" above.
  2. It starts in the short narration between tool calls, then carries into the final reply. In one session, after five tool results (four of them English), the next line was "Now make the edits.", and that turn and the next two ended in English.
  3. Harness-generated English can trigger it. In the other session Claude launched two background agents, both prompts written in Chinese. The last two tool results before the switch were the harness's own Async agent launched successfully… notices; no subagent had reported yet.
  4. It isn't context length. In another Opus 5.5 session, a single turn with 209 tool calls at ~945k tokens of context still ended in Chinese.

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 language setting (which, per the comment above, doesn't stop this on its own), plus a UserPromptSubmit hook that re-injects the language rule through hookSpecificOutput.additionalContext on every prompt, so the instruction sits next to each turn instead of only at session start. Too early for numbers.

marcindulak · 17 days ago

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.