302ee80b6f
Priority between the overlapping signals — a session can be working and unread and running a background job at once — was resolved at the call site from five separate membership lookups, which is how surfaces drift apart. `$sessionDotStateById` does it once and hands each surface a single answer. The dot's visual language collapses to three colors on one fill/hollow axis with nothing moving. Motion on a six-pixel circle can only say "something is happening", which the row's arc already says better, and it cost a repaint per frame on every row at once; filled now means producing and hollow means open but quiet. Working and stalled had differed by 30% opacity and were in practice the same dot. A settled session paints its project color or nothing, rather than a grey mark of the same weight as a real status next to every resting row. The switcher had grown its own dot with its own three states, so it disagreed with the sidebar on the same session. It renders the shared one now.