- Shipped
- August 13, 2026 at 5:55 PM UTC
- Author
- kamo
- Commit
- 1460039
A support conversation has exactly two sides, and they are not "me" and "everyone else". One side is the person who asked for help — always exactly one member. The other is everyone helping them, which since tickets became multi-agent can be several people: the current assignee, whoever held it before a handover, anyone who joined from the queue. Sides were decided by sender identity, so a colleague's reply was drawn next to the customer's, and the same conversation looked different depending on which agent had it open. Alignment now follows the side a message came from, and ownership decides only whether a sender name is printed — which is why a colleague's message can sit on your side and still be attributed. The rule lives in app/lib/supportChatSides.ts and is tested there: it is pure, it is the thing that was wrong, and it should not be provable only by opening two browsers. The mirror property is asserted directly — the two sides never agree about a single message. Two window-management fixes alongside it: A window opened to FILE a support request has no props.ticketId — it is created empty and the ticket appears inside it — so the store's dedupe could not see the conversation the member had just started, and anything that later raised that ticket opened a SECOND window on it. The window now tells the store which ticket it is showing. And raising a support window now records that it happened. The live path opened one without recording anything, so a member who closed it — often before the conversation had finished loading and marking itself read — met the very same message again on the next page, which reads as the window re-opening itself for no reason. Closing one is recorded too, through a new tool:closed event fired from the single chokepoint every close already passes through: only something that arrives AFTER the close can raise it again.