# \[Bug\]: Claude assistant text never streams in paragraph mode — ClaudeAdapterV2 drops text_delta · Issue \#17270 · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/issues/17270)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

State: backlog

Priority: 0

## Description

[Discussion and activity](https://git.cafe/pingdotgg/t3code/issues/17270)

---

> This issue was written by **Claude Opus 5.5** (running in T3 Code) after investigating the installed nightly bundle and the upstream source.

### Before submitting

- [x] I searched existing issues and did not find a duplicate.
- [x] I included enough detail to reproduce or investigate the problem.

### Area

apps/server

### Steps to reproduce

1. In Settings, leave **Response streaming** on **Show finished paragraphs** (the default `responseStreamingMode: "paragraph"`).
2. Open a thread on the Claude provider (seen with Claude Opus 5.5).
3. Send a prompt that produces a multi-paragraph answer without tool calls, e.g. "Write five paragraphs about the history of the printing press."
4. Watch the assistant message while the turn runs.

### Expected behavior

Each paragraph or code block of the assistant reply appears as soon as it is complete, as the setting describes ("Each paragraph or code block appears as soon as it is complete."). This worked on nightlies before the orchestrator v2 switch.

### Actual behavior

No assistant text appears until the whole text block is finished; then it all appears at once. It behaves exactly like **Wait for the full response** (`turn`), regardless of the selected mode. Reasoning still streams; only the assistant reply text doesn't.

Cause, as far as I can tell from source:

- `ClaudeAdapterV2` asks the SDK for partial messages (`includePartialMessages: true`, [ClaudeAdapterV2.ts#L866](https://github.com/pingdotgg/t3code/blob/a0066d5cb7d18abd786c1c23bf835f898490fd37/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts#L866)) and advertises `streamsAssistantText: true` ([#L202](https://github.com/pingdotgg/t3code/blob/a0066d5cb7d18abd786c1c23bf835f898490fd37/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts#L202)).
- But the `stream_event` branch ([#L5855-L5899](https://github.com/pingdotgg/t3code/blob/a0066d5cb7d18abd786c1c23bf835f898490fd37/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts#L5855-L5899)) only handles `thinking` blocks / `thinking_delta` and then unconditionally `return`s, so every `text_delta` is dropped. The file contains no `text_delta` handling at all.
- Assistant text is only emitted from the final SDK `assistant` message via `buildAssistantArtifacts` ([#L2562](https://github.com/pingdotgg/t3code/blob/a0066d5cb7d18abd786c1c23bf835f898490fd37/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts#L2562)), which always sets `streaming: false` on the message and turn item.
- `makeAssistantStreamingFilter` ([assistantStreaming.ts#L92-L114](https://github.com/pingdotgg/t3code/blob/a0066d5cb7d18abd786c1c23bf835f898490fd37/apps/server/src/orchestration-v2/assistantStreaming.ts#L92-L114)) passes `streaming: false` events through untouched, so the paragraph splitting never gets a chance to run for Claude assistant text.

The pre-v2 adapter streamed `text_delta` ([provider/Layers/ClaudeAdapter.ts#L2945](https://github.com/pingdotgg/t3code/blob/024d49520eadb24cc2f2cef0b0a82c33f0290813/apps/server/src/provider/Layers/ClaudeAdapter.ts#L2945), parent of #2829). Every commit to `ClaudeAdapterV2.ts` since #2829 (2026-10-02) has zero `text_delta` references, so this looks like a regression introduced with the new orchestrator. A likely fix is to route `text_delta` through a `ProviderTextDeltaCoalescer` the same way `thinking_delta` is, emitting `streaming: true` assistant message / turn item updates, and complete them with the final `assistant` snapshot.

Related but different: #17171 (live reasoning row not updating in the web UI). Here the server never emits streaming assistant text in the first place.

### Impact

Minor bug or occasional failure

### Version or commit

0.0.46-nightly.20261008.2833 (also still present on main @ a0066d5)

### Environment

Windows 11 Pro (26300), T3 Code (Nightly) desktop app, Claude provider (Claude Agent SDK), Claude Opus 5.5. `responseStreamingMode` unset in `settings.json` (defaults to `paragraph`).

### Logs or stack traces

```shell
# From the installed server.asar (apps/server/dist/binCli-*.mjs), ClaudeAdapterV2 stream_event branch:
if (message.type === "stream_event" && !message.parent_tool_use_id) {
  ...
  } else if (event.type === "content_block_delta" && event.delta.type === "thinking_delta") {
    ... reasoningDeltas.append(...)
  } else if (event.type === "content_block_stop") { ... }
  return;   // text_delta never handled
}
```

### Screenshots, recordings, or supporting files

_No response_

### Workaround

None via settings; switching between "Show finished paragraphs" and "Wait for the full response" makes no difference for Claude threads. Rolling back to a nightly from before 2026-10-02 restores paragraph streaming.

