b8675a1899
message.complete frames with status "error" were detected only by a text regex heuristic, which misses the gateway's "Error: <detail>" texts and partial-text failures — a failed turn rendered as a healthy reply. The structured error/partial fields now drive the failure state: the bubble is marked failed from the frame's error field, and a partial failure keeps its streamed text visible instead of stripping it. session.resume's inflight projection likewise carries a retained failure's error onto the projected assistant row, so a failed turn recovered after a disconnect renders as failed rather than as a healthy partial answer. Co-authored-by: Reza Sayar <rsayar@uvic.ca>