• v0.10.0 4364a132c1

    joeyr released this 2026-08-11 14:27:15 -05:00 | 76 commits to main since this release

    Adding guests to an event and reporting who accepted, behind INVITES_ENABLED.

    The first feature here that can do something the user cannot undo. Apple mails every
    address the moment the event is written, and an invitation cannot be recalled the way a
    wrong event can be deleted. The gate is separate from WRITABLE_CALENDARS rather than
    folded into it, and the tools are registered only when both are set — with either unset
    the served tool surface is identical to 0.9.4.

    Cleared by a probe first

    Free-busy sat on the roadmap for weeks before a ten-minute check found iCloud refuses it
    outright, so attendees were probed live on 2026-08-11 before any of this was designed.
    The implementation follows what that probe found rather than what RFC 6638 says should
    happen, because the two disagree:

    • SCHEDULE-AGENT=CLIENT does not suppress delivery. There is no quiet mode, so
      INVITES_ENABLED is the entire boundary and no live test of this path can avoid mailing
      a disposable alias.
    • The ORGANIZER round trip is not stable — written, stored and mailed are three
      different values. An organiser iCloud has already canonicalised is left alone.
    • Delivery outcome lives in SCHEDULE-STATUS, not in the HTTP status. A 201 means
      stored, not sent.
    • The organiser address is resolved from the account, never from config. An
      ORGANIZER iCloud does not recognise is worse than an error: it keeps the ATTENDEE
      lines as inert text and mails nobody, which reads as success from every response.

    Reply status and delivery status are separate

    An attendee can be silent because they are thinking about it or because the invitation
    never left the building. NEEDS-ACTION renders as "no reply yet" rather than passing
    through, because a model summarising the raw token files it next to DECLINED as though
    both were answers.

    Refused rather than guessed at

    Repeating events, a line break in an address (iCalendar is line-based, so that appends a
    property of the caller's choosing to an event about to be mailed), and re-adding somebody
    already invited. SEQUENCE is not bumped when a guest is added, so the people already
    coming are not told the meeting changed when it did not.

    Verification

    533 tests green, up from 477. The new ones run against the exact bytes iCloud returned
    during the probe rather than a hand-written fixture, which is what pins the href-organiser
    and the server-set SCHEDULE-STATUS.

    Not yet exercised through the tool layer against the live account. What the probe
    verified is iCloud's behaviour, not this code's use of it. The procedure and what it costs
    are in docs/operations.md.

    Downloads