User messages were rendered through Streamdown (markdown), which collapses single newlines per markdown rules. Now user text content renders as plain text with whitespace-pre-wrap so newlines are preserved as typed.