Resuming an extended-thinking session fails permanently with 400 "thinking blocks cannot be modified" (transcript stores thinking text as empty but keeps signat
## Environment - Claude Code: **2.1.153** - OS: macOS (Darwin 25.3.0) - Auth: subscription, extended thinking enabled ## Summary Resuming/continuing a session that used extended thinking together with tool calls can put the session into a **permanently broken** state. Every subsequent turn returns the same error: ``` API Error: 400 messages.1.content.5: `thinking` or `redacted_thinking` blocks in the latest assistant message cannot be modified. These blocks must remain as they were in the original response. ``` Once it starts, the session can never be continued again — `continue`, any new prompt, even a no-op, all return the identical 400. ## Root cause Claude Code persists extended-thinking blocks to the session transcript (`projects/<slug>/<id>.jsonl`) with the **`thinking` text emptied to `""` but the `signature` field retained**. A thinking content block on disk looks like: ```json { "type": "thinking", "thinking": "", "signature": "<base64 signature, ~600–4000 chars>" } ``` When the session is rebuilt from this transcript (on resume/continue, and apparently on other history-reconstruction paths), Claude Code sends these blocks back to the API as `{ "type": "thinking", "thinking": "", "signature": "<original>" }`. The API validates the signature against the thinking text; since the text is now empty but the signature was computed over the original non-empty text, validation fails → the 400 above. Because the original thinking text is gone from disk, the request can
Posted by jdrolls on May 28, 2026, 2:24 PM
Tags
Related issues
- Many devs love to shit on the guy from the 'I just want the exe.
- Now imagine how poor people stress if their smartphone bricks or gets damaged or lost.
- I'll preface this with a statement that as a European I want European alternatives to succeed, and MS-owned GitHub to shrivel and disappear.
- Yeah, but there’s a world of difference between “not perfect” and “we rounded a few sliders, and now the modal is a nightmare to use”.
- I used to write a lot of native Windows corporate software in the 90's and 2000's and my standard login window was a floating draggable o...
- App broken with Mosquitto broker 7.0.0
Raise real-world problems, find people facing the same issue, and discuss solutions.2,000 issues0 comments
reliability (SaaS)
Many devs love to shit on the guy from the 'I just want the exe.
Now imagine how poor people stress if their smartphone bricks or gets damaged or lost.
Resuming an extended-thinking session fails permanently with 400 "thinking blocks cannot be modified" (transcript stores thinking text as empty but keeps signat
I'll preface this with a statement that as a European I want European alternatives to succeed, and MS-owned GitHub to shrivel and disappear.
Yeah, but there’s a world of difference between “not perfect” and “we rounded a few sliders, and now the modal is a nightmare to use”.
I used to write a lot of native Windows corporate software in the 90's and 2000's and my standard login window was a floating draggable o...
App broken with Mosquitto broker 7.0.0
[BUG] Remote Control: automatic reconnection doesn't work -- connection drops silently with no recovery
Resuming an extended-thinking session fails permanently with 400 "thinking blocks cannot be modified" (transcript stores thinking text as empty but keeps signat
## Environment - Claude Code: **2.1.153** - OS: macOS (Darwin 25.3.0) - Auth: subscription, extended thinking enabled ## Summary Resuming/continuing a session that used extended thinking together with tool calls can put the session into a **permanently broken** state. Every subsequent turn returns the same error: ``` API Error: 400 messages.1.content.5: `thinking` or `redacted_thinking` blocks in the latest assistant message cannot be modified. These blocks must remain as they were in the original response. ``` Once it starts, the session can never be continued again — `continue`, any new prompt, even a no-op, all return the identical 400. ## Root cause Claude Code persists extended-thinking blocks to the session transcript (`projects/<slug>/<id>.jsonl`) with the **`thinking` text emptied to `""` but the `signature` field retained**. A thinking content block on disk looks like: ```json { "type": "thinking", "thinking": "", "signature": "<base64 signature, ~600–4000 chars>" } ``` When the session is rebuilt from this transcript (on resume/continue, and apparently on other history-reconstruction paths), Claude Code sends these blocks back to the API as `{ "type": "thinking", "thinking": "", "signature": "<original>" }`. The API validates the signature against the thinking text; since the text is now empty but the signature was computed over the original non-empty text, validation fails → the 400 above. Because the original thinking text is gone from disk, the request can
Comments (0)
No comments yet. Start the discussion.