{# A reply as the sequence it was: thinking, prose, a tool call, more prose. Used by BOTH branches of `_message.html` -- the streaming shell and the finished bubble -- from the same builder, so a reply cannot rearrange itself the moment the stream ends. That was the point of putting the marks on the row rather than only on the running generation. When `live`, the two containers for the step still being written come last, and they are part of *this* fragment rather than of `_message.html`. That is what lets the tail clear itself: the `steps` frame is sent whenever a round closes and re-emits them empty, so the prose and thinking that have just become a closed step above do not also linger below. `reasoning` and `render` keep their "never send an empty one" guard, and `metrics`, `status` and `ask` remain the only frames allowed to blank what is on screen. #} {% for step in steps %} {% include "chat/_step.html" %} {% endfor %} {% if live %} {% include "chat/_steps_tail.html" %} {% endif %}