The mark, carrying state

All of it is the decorative emblem — same geometry, same counter-drift, same breathing segment counts. A state is a shape the same being moves into, and the segment count is what carries the meaning.
successThe old mark expands outward and fades until it is past the frame and gone, then a beat of nothing, then a replacement grows from the centre out of invisibility and overshoots into the rest shape. Success is the end of something, so the thing that was working actually leaves.
warningCollapses to a concentric triangle in three stutters, and the drift all but stops. Both rings land on three. The colour breathes across a narrow hue swing so it stays present without moving.
errorA blunt square around a six-sided cutout, slammed in and buzzing, then dead still. Four outside, six inside. Once frozen, a narrow hue pulse is the only thing left alive in it.
Driven by the systemThe same mark taking its state from the agent's turn lifecycle rather than from a name. One reading worth arguing with: a user-initiated stop is a warning and not an error, since the system did what somebody asked it to. A turn waiting on sub-agents still maps to thinking rather than working — true of the run, though it no longer shows, now that both in-progress states draw the same shape.
no turnnothing has been asked yet
streamingtokens arriving
running, no streamstatus says working, nothing on the wire
awaiting_subagentsparent turn over, children still working
completeplays success, then hands back to idle on its own
failed · cancelledthe user pressed stop, so this is not an alarm
failed · AbortErrorwall-clock timeout
Continuous states
idleThe decorative parent. Drifts, breathes, nothing more.
workingRises out of idle, runs, and settles back into it. Eight sides outside and four inside, turning against each other at speed while the band opens and closes.
thinkingThe same shape as working, and identical on purpose. It used to be two near-circles, which was the clearest shape in the set until it met the place it ships: the chat list draws a resting row as a small ring, so a circle at 12px read as a row doing nothing. The two in-progress states now share the polygon, which is the one no resting row can be mistaken for.