Live resolved-model display

The intended live-swap chain — dead at hop four

1 ✓ worked
SSE stream reaches terminal status complete
2 ✓ worked
Refetch effect
invalidates the messages query
3 ✓ worked
refetch returns the persisted assistant message with modelDisplayName
Guard
if (!stream.runId)
runId is still set at complete, so this is false
4 ✕ never fired
Swap effect
calls loadHistory, swapping the live SSE item for the DB item
The chain worked until its last hop. Steps 1–3 fired at every completion; step 4 sat behind a guard that was never true when the run finished.