Fixed. The pane looked frozen for a second or more after a prompt. Measured on the running interface, it was not: the instruction reaches the screen 23 ms after the click, the server accepts it in 2 ms, and the page runs no long tasks at all. What happened was that nothing was shown between the instruction landing and the model finishing its first read of the transcript, a gap of 4 to 7 seconds that on a long conversation reached ten. A running clock now sits where that silence was, in the same row shape a step uses. A clock and not a spinner, because the number is the honest part: it says the machine is alive and how long this is taking.
Added. A New button, and a /chat/fresh route behind it. The wait grows on its own, because every turn resends the whole transcript: a first instruction on a fresh process carries 3,106 prompt tokens and the agent moves 4.1 s after the click, while by the third instruction of the same session the first turn already carries 38,207 and takes 6.7 s. Nothing trimmed it and there was no way to reach it short of killing the process. Ending a conversation drops the transcript (measured after a reset: 3,091 again), tells every listener so a second tab does not keep showing what the server has forgotten, and deliberately leaves the browser where it is, because somebody who logged in somewhere should not lose that by ending a conversation. Refused while a run is in flight rather than racing it.
Also. Escape stops a run from anywhere on the page, unless the composer holds a draft. A conversation that has scrolled out of sight stops costing layout, while staying findable with Ctrl+F, which hiding or dropping it would not. The window aspect ratio is written to CSS only when it changes instead of ten times a second to say the same number, and the reading column is capped in characters rather than at a pixel width, which on a wide window had grown to about 92 characters against the 80 the guidelines ask for.