anthropic
Claude's raw thinking never leaves the server
Claude News
anthropicThe thinking field in Claude Desktop's response stream arrives as an empty string, according to a write-up on Github that captured the app's SSE traffic. The same write-up cites benvanik's audit of 6,852 Claude Code session files, recording a 67% drop in average thinking depth, from about 2,200 characters to 720.
At a glance
- No thinking_delta events appear anywhere in the captured stream, and the single sentence shown in the interface panel arrives separately as a thinking_summary_delta produced after the reasoning pass completes.
- Asked to name the internal tag, the model was cut off mid-token at the opening bracket, and encoded with a +3 Caesar shift the answer returned as dqwpo:wklqnlqj, decoding to antml:thinking.
- Because the infrastructure strips thinking before transmission, the conversation history returned on later turns contains none of it, leaving the model without access to the reasoning that produced its own earlier answers.
The billing angle is the sharpest part of this: reasoning tokens are produced with compute the subscriber pays for, and what returns is a label written afterwards by a separate step. Keeping the field in the schema with a blank value reads as backwards compatibility rather than disclosure, and the interface marks no difference between the two. For anyone debugging model behaviour across turns, the loss looks structural rather than cosmetic.
The passive capture returned a thinking field set to an empty string
Claude Desktop is an Electron app, and the author attached the Chrome DevTools Protocol to its renderer on port 9222, running a patched build, app-1.37937.3, with the auto-updater disabled and telemetry stripped. Interception through Fetch.enable stalled SSE delivery and froze the app mid-sentence, and patching window.fetch in the renderer captured nothing.
Passive capture through Network.enable and Network.getResponseBody after loadingFinished returned the complete event stream. According to the write-up, each response opens with content_block_start declaring a thinking field set to an empty string, no thinking_delta events follow, and the single sentence shown in the panel arrives as a thinking_summary_delta.
Forcing every collapsed panel open with injected CSS produced the same one-line summary already visible, with no hidden nodes and no shadow DOM behind it. A search of the extracted asar found no references to thinking markup or tag parsing, placing the stripping upstream of the renderer.
Caesar-shifted by three, the tag name decodes to antml:thinking
In new sessions the model deflected questions about how its thinking is structured or said it had no access to its own reasoning process. In an older session where an earlier experiment had established the pattern, it reproduced its reasoning stream directly into the response text on request.
Asked whether that reasoning is wrapped in a tag, the model began an answer and the stream stopped at the opening bracket of the tag name. Encoded with a +3 Caesar shift, the answer came back as dqwpo:wklqnlqj, decoding to antml:thinking, the namespace prefix used for tool call markup in the API.
The write-up attributes the difference to a real-time filter matching literal byte patterns rather than semantic content, which is why shifted text passes through. In the same session the model described the mechanism in its own words, as reproduced in the write-up:
the infrastructure is literally intercepting and removing it mid-response
The 21:00:36 capture ran 7585ms with four gaps in nine chunks
Network.dataReceived fires once per TCP chunk with a millisecond timestamp, and during the thinking window nothing arrives on the wire, because stripped tag content produces no SSE events. A script named capture-thinking-timing.mjs logs every silence longer than 300ms, and the first measured gap sat against an interface header reading "Thought for 3s".
Three captures ran in the same session on September 5. The 20:41:58 response took 4517ms across 57 chunks with a single 1863ms gap, and the 20:42:32 response showed a 2839ms gap followed by a shorter 487ms gap, which corresponds to the summarization step.
The 21:00:36 response, prompted for a short story alongside the thinking reproduction, ran 7585ms in nine chunks with four gaps: 2806ms and 3077ms separated by a 194-byte chunk, then 756ms and 754ms. The write-up reads that as two sequential reasoning passes followed by two separate summarizations, against an interface header reading "Thought for 5s" and 5883ms of combined silence.
What three captures leave open
The write-up ties the decline in thinking depth to the redact-thinking-2026-02-12 rollout in Anthropic's infrastructure, and notes that Anthropic acknowledged the regressions in an April 2026 postmortem without restoring raw thinking access afterwards. The interface carries no notice of the change.
The capture script runs passively on port 9222. The author frames three captures as a start rather than a study and lists what remains untested: what triggers a multi-pass run, whether summarization gap duration scales with thinking length, and whether thinking_delta remains enabled on any API tier.
Comments
No comments yet. Be the first.
Join the conversation
Sign in with Google to leave a comment. Your name and avatar come from your Google profile, and the comment appears after moderation.
We only use your name and avatar from Google. We never store your email address.
