- Shipped
- September 7, 2026 at 12:52 AM UTC
- Author
- Kamo
- Commit
- 1f181d3
Two more tiles under "What you are told about", and the two things behind them. New email is raised off the inbox socket the app already holds open. Unread chat gives a message five seconds to be noticed and raises only what is still unlooked-at when they run out — a card about the message somebody is in the middle of reading is the interruption that teaches people to mute a feature. "Looked at" is asked of the CONVERSATION through the existing sound surfaces, not of the browser tab: the tab answers yes for every conversation a member owns for as long as they are at their desk. Both are told once and not again until the card is dismissed. Reading is not dismissing — someone who glanced at the bell is still looking at it — and without the rule a lunch hour costs one card per message and turns the centre into a worse copy of the inbox it points at. The centre is consulted before asking the server, which already applies the same rule; the server settles races between tabs, the local copy saves forty requests answered "no". Repeat sound, off for everybody until they ask. It changes three things that only make sense together: the front card's tone plays again on an interval, no card retires on a timer, and the deck shows one card at a time — oldest first, so a new arrival cannot swap out the card the member is reaching to dismiss while an alarm sounds over it. Both notifiers are mounted INSIDE NotificationProvider deliberately. useNotifications() answers with an inert empty value outside it rather than throwing, so a copy mounted a little higher reads an empty centre, believes nothing is outstanding, and raises on every message with nothing reporting it. The chat arrival reaches them over a window event because onIncomingNotification holds exactly one callback — a second subscriber does not join the first, it replaces it, and what stops working is the chat window opening itself.