Skip to content

Only write a note for an RSVP that says something new - #358

Merged
KrisBraun merged 5 commits into
mainfrom
fix/rsvp-acceptance-unread
Aug 2, 2026
Merged

Only write a note for an RSVP that says something new#358
KrisBraun merged 5 commits into
mainfrom
fix/rsvp-acceptance-unread

Conversation

@KrisBraun

Copy link
Copy Markdown
Contributor

When an attendee responds to a calendar invitation, the Gmail connector folds that
response onto the event's thread as a note. A plain acceptance carries nothing the
event's guest list does not already show — but attaching any note surfaces the
thread as unread for every recipient except the note's author. Accepting an
invitation therefore made the organiser's own event thread unread.

The unread field could not prevent this. Omitting it does not mean "leave read
state alone" — the thread has already been surfaced by the time that field is
read — so the connector's acceptance guard, and its initial-backfill guard, both
had no effect in practice.

What changes

A response becomes a note only when it says something new:

ResponseNote
Declined / tentativeyes
Accepted, with a personal commentyes
Accepted, reversing an earlier decline or tentativeyes
Accepted, nothing elseno

A plain acceptance produces no note, and its notification email is dropped rather
than becoming a thread of its own — so a conversation consisting only of such
acceptances no longer creates a thread at all. The event's guest list continues to
show who accepted.

Every emitted note now carries an explicit unread value, on both the live sync
and the deferred-retry path that handles responses arriving before their event has
synced. During the initial backfill that value is false, so folding a history of
past responses no longer resurfaces old events.

Reversals are tracked per attendee per occurrence: declining one occurrence of
a recurring meeting does not change how a later acceptance on a different
occurrence is treated.

Notes

  • During the initial backfill the explicit read state applies to the connection
    owner. On a thread with several participants, other recipients may still be
    surfaced by later processing.
  • composeRsvpNote is unchanged — note wording is the same as before.

A bare "accepted" response repeats what the event's guest list already
shows, so folding it onto the event thread as a note was pure noise —
and worse, any note on the thread flips it unread for the organiser
even when the connector didn't ask for that. The fix is to write no
note at all for a bare acceptance: nothing new is being said.
An acceptance still gets a note when it carries a personal comment, or
when it reverses an attendee's earlier decline/tentative — both are
real information. A suppressed bare acceptance is still folded away so
a responses-only conversation doesn't surface as its own email thread.
Replies to a single occurrence of a recurring event share the same
calendar UID as every other occurrence in the series, distinguished
only by RECURRENCE-ID. The bare-acceptance suppression rule tracked
outstanding declines/tentatives per UID + attendee only, so a decline
on one occurrence could suppress the note for a bare acceptance on an
unrelated occurrence of the same series (and vice versa, losing a
genuine reversal). The lookup key now includes the occurrence.
Also makes the prior-state lookup lazy: it's only ever consulted for
a bare acceptance, so declines and tentatives no longer pay a wasted
storage round-trip.
The comment explained the behaviour in terms of internal storage mechanics
rather than what a connector author can observe and rely on.
@KrisBraun
KrisBraun merged commit 5e249e6 into mainAug 2, 2026
1 check passed
@KrisBraun
KrisBraun deleted the fix/rsvp-acceptance-unread branch August 2, 2026 13:30
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@KrisBraun