Build1 distinct publisher3 min readUpdated
One developer traced an hour-long Claude Code stall to 855 KB of streaming events for a single response. The tell was that output arrived late and in order, not missing.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
On the night of August 14, a Claude Code session drafting an eight-day travel itinerary in the VS Code extension against a remote box reported two states at once: a self-written notification hook said the turn had finished and was waiting for plan approval, while the session tab said the turn was still executing [1][2][3]. According to the developer's write-up, both indicators were right and the roughly one hour between them was the bug [4].
The useful part is the triage, which cost nothing. The extension was neither frozen nor empty; every so often it pushed a little more text into view, and the text was already stale by the time it rendered [5]. That single observation separates two failure classes. A lost handshake drops events: the session looks truncated and the missing pieces never arrive [6]. A queue does the opposite, delivering everything in order and late [7]. What the author was looking at was a delivery schedule, not a delivery failure.
The process state agreed. The stalled session was alive but asleep rather than spinning, with negligible CPU, zero network connections and zero child processes [8]. A turn waiting on a model holds a socket open; a turn running a command has children [9]. This one had neither, which points at a local wait, the way a program waits on a pipe [10].
The transcript was more precise. Claude Code journals each session as JSON lines, and the last line that night was a complete assistant message, usage accounted for and stop reason recorded, ending in the tool call that asked for plan approval, with nothing after it [11]. The CLI had finished producing its question and never heard the turn end [12]. The tool-call id was in the third-party provider's format rather than Anthropic's, which identified the road the request took [13].
That road was claude-code-router, self-hosted, pointed that night at a Zhipu GLM coding plan [14]. The router log answered the upstream question directly: the turn's request completed in 1.7 seconds, HTTP 200, no retries, no credential throttling, inside a surrounding hour of 186 requests that all returned 200 [15][16]. Upstream had finished long before anyone started asking, which pinned the stall to the segment after the CLI and before the screen [17].
A three-cell matrix closed it. Terminal plus router: fine. Extension plus the official API: fine. Extension plus router: stuck [18]. Neither component is the variable; the shape of the stream between them is.
The captured response bodies gave that shape two numbers: close to one streaming event per token at roughly 135 bytes each, totalling 855 KB of server-sent events for a single response, of which about 99% were thinking deltas with thinking mode on [19][20]. That works out to somewhere around 6,300 to 6,500 events for one answer [21]. The official Anthropic API merges many tokens into each delta, putting its event rate one to two orders of magnitude lower [22]. Per event, the extension parses JSON, posts a message across the Remote-SSH tunnel into the webview, and re-renders the whole conversation, which is not cheap on a long session [23]. The published excerpt breaks off before naming a fix.
Two caveats worth carrying. The author has since reduced body capture to failures only, so that night's numbers are a record rather than a measurement anyone can rerun [24]. And the arithmetic on the two clocks is stark: 1.7 seconds of model time against roughly an hour of render lag, a factor of about 2,000 [25].
Watch whether SSE event granularity gets treated as a compatibility surface rather than an implementation detail, since a renderer that assumes coarse deltas will queue on a provider that emits fine ones. If you run a router in front of a GUI client, decide now what you log, because the evidence that made this diagnosable is exactly the evidence that gets turned off for disk reasons.
Ranked by verification strength, evidence, and original report placement.
Just past midnight the author's phone buzzed: the turn had finished and Claude was waiting for approval of its plan. The notification came from claude-code-notify, a hook the author wrote so a long turn, or one waiting on input, would not pass unnoticed; before it existed nothing notified at all.
When the author switched to the window, the session tab said the turn was still executing.
Both indicators were right, and the hour between them was the bug.
The stalled session's process was still alive, asleep rather than spinning: no CPU worth mentioning, zero network connections, zero child processes.
A turn waiting on a model has a socket open; a turn running a command has child processes.
Having neither a socket nor children, the process was not waiting on the internet or on a shell; it was waiting on something local, the way a program waits on a pipe.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
2 articles · August 15, 2026
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Detailed first-hand telemetry, single author, non-rerunnable
The account is unusually well instrumented for a personal post-mortem: router status codes and latency, a 186-request hourly window, process-level socket and child-process state, the session JSONL transcript's final line, a provider-specific tool-call id, and a three-cell isolation matrix all point the same way, and the proposed mechanism (per-event parse, tunnel post, full re-render, then stdout backpressure) is consistent with the observed late-but-ordered delivery. What caps the score is that every datapoint comes from one operator's machine on one night, the captured response bodies have been deleted, the comparative Anthropic-side figures are asserted rather than measured, and the second cluster source is a verbatim republication rather than independent verification.
One disclosed setup, no wider incidence data
The only adoption facts supplied are usage disclosures from a single developer: Claude Code driven through self-hosted claude-code-router against a Zhipu GLM coding plan on a remote box, plus a self-written notification hook wired to Telegram. Volume within that one setup is quantified (186 forwarded requests in an hour), but nothing in the sources speaks to how many other users run this combination, whether the failure mode is reported elsewhere, or whether any maintainer has acknowledged it. Adoption is therefore measurable but essentially at the level of a single operator.
Mildly overstated generality, self-limited numbers
The write-up is notably self-limiting: it flags that the captured bodies are gone, that the table is one night's record, and that the notification and the tab were measuring different things rather than one being wrong. The small positive gap comes from scope rather than tone: a one-pass matrix on one machine with deleted captures is presented as a general account of how the official API streams versus third-party providers, and the comparative 'one to two orders of magnitude' figure has no measured counterpart. The headline framing (a slow queue, not a dropped handshake) is squarely supported by the observed evidence.
Independent developer, mild self-promotion and duplicate distribution
No sponsorship, vendor affiliation, or commercial pitch appears in the sources; the piece is a personal debugging narrative on a developer blogging platform. Mild incentives are still visible: the author showcases their own tooling (the claude-code-notify hook they wrote) as the component that behaved correctly, and the identical article was posted twice on the same publisher under different member accounts within about twenty-three minutes, which amplifies reach for one account of events. Neither the router project nor the model provider is promoted or attacked, and the provider whose stream shape is implicated is named plainly rather than shielded.
Coherent mechanism, single-source and unverifiable numbers
Confidence is moderate. The causal chain is internally coherent and each link is supported by a distinct artifact class (process state, transcript, router log, matrix, per-event cost), so the qualitative conclusion that this was render-side backpressure rather than a dropped connection is well founded. Confidence is held below high because the cluster contains exactly one voice duplicated across two postings, the quantitative core cannot be rerun, the Anthropic-side comparison is unmeasured, and there is no vendor, maintainer, or third-party corroboration of incidence.
Follow any of these and your For You feed starts watching them — no settings page required.
build
One event per token: the fix went in the proxy, because that was the only box he owned1 distinct publisher
build
A 12MB Go binary bets agent cost control is cache stickiness, not a dashboard1 distinct publisher
build
Claude Code now opens in auto mode: a classifier, not you, approves the shell commands1 distinct publisher
leadership
Slack Code makes the chat window a coding surface, and a platform call for engineering leaders1 distinct publisher