TL;DR: Find the createStreamableUI call. Symptom: a generative UI built with createStreamableUI updates sluggishly or the final state never arrives. The stream seems stuck.

## Fix
1. Find the createStreamableUI call.
   Expected: you have the value in hand.
2. Trace every code path (including early returns and catch blocks) and check whether .done() is reached on all of them.
   Expected: this specific failure stops.
3. Exceptions thrown between update() and done() are the classic.
   Expected: this specific failure stops.
4. Fix: import { createStreamableUI } from '@ai-sdk/rsc'; const stream = createStreamableUI('initial'); try { stream.update('working...'); // ... do work ... stream.done('final'); } catch (e) { stream.done('failed'); } return stream.value; Rules: 1.
   Expected: this specific failure stops.
5. done() takes the final value. .update() and .append() are for intermediate states.
   Expected: this specific failure stops.
6. If updates are slow but do finish, check that you are not awaiting the full model response before the first update.
   Expected: this specific failure stops.

## Details
Symptom: a generative UI built with createStreamableUI updates sluggishly or the final state never arrives. The stream seems stuck. Cause: the streamable was never closed. Confirmation: 1. 2. If any path returns stream.value without calling stream.done() first, that is the bug. Always close with .done(), even on error paths. try/finally is the safest shape. 3. This applies to the @ai-sdk/rsc streamable UI path. The newer tool-part generative UI pattern (tools returning data rendered by React components) does not have this failure mode; prefer it for new code. 4. Stream early, stream often. Verification: exercise the error path deliberately and confirm the UI reaches its final state instead of hanging.

## When to use
You hit exactly this: Diagnose slow or stuck createStreamableUI updates in Diagnose.

## When not to use
A different error, or the same symptom in a different tool. This page only covers the failure above.

## Compatibility
Diagnose.

## Root cause
The client keeps waiting for more parts because the stream is still open server-side.