On screen is not the same as read

Featurekamo-internal
Shipped
August 14, 2026 at 1:12 AM UTC
Author
kamo
Commit
b24c922

A support conversation was marked read the instant its window loaded, so the one kind of window that must NOT count as read — the kind that raises itself, from an assignment, a reassignment, or an arriving reply — cleared the badge before the member had looked at anything. isFocused cannot tell those apart: it is derived from z-order, and a window that just opened is topmost by construction. The shell's mousedown and touchstart are the only signals in the system that mean a person did something, so the provider now announces them as tool:userFocus from the one place both land. From that, the rule the member described: opened deliberately read as soon as it loads raised by itself unread until touched touched read, both stamps reassigned to you unread again, no new message required Two stamps, because there are two ways to be unread and each has to be cleared: markAsRead advances the read pointer past the requestor's messages, and assignment-opened retires the handover. AssignedTicketOpener no longer stamps the handover when it raises a window — that was the bug in miniature, an acknowledgement that the agent had seen something they had not seen. Its per-tab guard carries the weight instead. TicketChat obeys the window rather than deciding for itself, including for messages that arrive while it is open: a reply landing in a conversation the member is reading is read, one landing behind them is not.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing