AIToday
Large Language ModelsAI Coding AssistantsZenn AI/MLPublished: Oct 15, 2026, 10:00 JST

Claude's thinking-block 400 explained: preserved thinking, not a bug

Claude's thinking-block 400 explained: preserved thinking, not a bug

3 Key Points

  1. What happened

    A test on October 8 with the thinking-binding-controls-2026-08-01 header showed claude-opus-5-5 kept its thinking blocks when history was appended but dropped one as a prefix_binding_mismatch when the first exchange was trimmed.

  2. Why it matters

    The check only fires when previous assistant turns are resent, so code that appends history survives while any trimming of older turns can break every later thinking block, and the break shows up on hard production inputs rather than easy tests.

Not sure about something? Ask the AI

Questions and answers are published on this page.

Summaries like this, in your inbox every morning.

Context & Analysis

The rule behind the error is straightforward once you see the mechanics. Each thinking block carries a signature recording the conversation prefix that produced it — the top-level system prompt, the set of tools, and every message that came before that block. When history is resent, the API checks whether that prefix is unchanged. If it is not, that block and all thinking blocks after it are treated as invalid, which is what surfaces as the opening 400.

The awkward part for builders is that the check is conditional on whether the model actually thought. In the October 8 test, claude-fable-5-1 produced no thinking blocks at all across three easy "effort low" turns, so trimming the first exchange changed nothing. claude-opus-5-5 also did not think on the first two turns, but did on the third — and that was the block that got dropped as messages.3.content.0. The practical consequence is that the same history-editing code can pass an easy test and fail on a hard production input.

Its own audit illustrates where the line falls. Three projects calling the Claude API — a subtitle-formatting pipeline, a reading-map web app, and a daily job that reads securities reports — were all single-request calls with no reassembled history, and all showed zero truncation findings. The daily job also happened to order its context as system, then PDF, then per-analysis instructions, keeping the variable parts at the end — a layout built for caching that matches the append-first remedy.

For a one-time stopgap, the API can be told to drop offending blocks rather than fail, using the thinking-binding-controls-2026-08-01 beta and prefix_mismatch_behavior set to "drop_block"; the dropped items then appear in input_transformations. But since the default differs by surface — error on headerless enforced accounts, drop_block when only the header is sent — setting the behavior explicitly is advised.

FAQ
How can I tell whether my Claude code is affected?
The check only activates when you send back a thinking block that came from an earlier assistant response. If your messages array holds only a single user turn each time, single-turn calls migrate without any effect.
What is the recommended long-term fix instead of trimming history?
Replace edits with appends: fix a session's system prompt at the start, declare all tools up front, and use server-side context editing or compaction instead of deleting old tool results or truncating turns.
Does appending-only history have any cost benefit?
Yes. Append-only history is also the shape that caches best, with Fable 5.1 cache reads at 0.025× ($0.25 / 1M tokens) and Opus 5.5 and Sonnet 5.5 at 0.05× ($0.20 / $0.10).

AI news that matters for your work, delivered every morning.

Pick your industry and the AI tools you use, and get news related to your work every day.

Free · 30 seconds with Google · unsubscribe anytimeWhat is AIToday? →

Ask AI

Ask AI anything about this article. The AI reads this article, earlier AIToday articles, and Wikipedia, and cites its sources. Q&As are published on this page for other readers too.

Questions and answers are published on this page.

Related Articles

Next articleWordCraft, a Rust-built open-source Word alternative, hits v0.6.1