- Shipped
- September 2, 2026 at 7:30 AM UTC
- Author
- Kamo
- Commit
- 0de4204
Adding somebody to an event's guest list did not tell them. Only a reminder ever wrote to a guest, and a reminder reaches a member in-app and an outside address never — so a client invited to a meeting was never contacted at all, and a colleague first heard about it fifteen minutes before it started. EventInviteService runs after the save commits, on an async thread. After the commit because an invitation for a meeting whose save then rolled back cannot be recalled; off the thread because afterCommit still runs before the response is written, and fifty SMTP conversations there is fifty seconds of spinner on a save that already succeeded. Two routes, and the difference between them is why it is two controls. Email is the only thing that can reach an address belonging to nobody here, and it carries the ics attachment — which is the entire mechanism by which a meeting arranged in Kamo lands on an outside guest's own calendar. Chat reaches a colleague in the thread they already have with the organiser, through the same MediaService pair AlertChatService uses, and skips an external guest by construction: a chat thread is between two members, so there is nobody to address. Who is owed what comes from the guest row rather than from what the save inserted. Never told means an invitation, whenever they were added. Behind on SEQUENCE means an update. Level means silence, so correcting a typo does not mail the room. updateEvent raises SEQUENCE only when the meeting itself moved — the description is deliberately out, because it is where agendas go and mailing every guest per line would train the room to ignore the mail that says the time changed. The record is written after a route succeeds, never before: marking optimistically would turn one transient SMTP failure into a guest permanently believed to have been told, which is the silence this exists to end. Also sets ORGANIZER_EMAIL, from the mailbox actually being sent from. No event made through the calendar has ever carried one, and an ics without it cannot be replied to — the guest's "accept" has no address to go to. Deleting an event that invited people now retracts it from the guests who were told, and only those.