[Jmap] Re: [calsify] CalDAV Scheduling design issues and a path forward with JMAP for Scheduling

Mauro De Gennaro <mauro@stalw.art> Fri, 13 June 2025 13:38 UTC

Return-Path: <mauro@stalw.art>
X-Original-To: jmap@mail2.ietf.org
Delivered-To: jmap@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id 304EB349A209; Fri, 13 Jun 2025 06:38:02 -0700 (PDT)
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -2.099
X-Spam-Level:
X-Spam-Status: No, score=-2.099 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_PASS=-0.001] autolearn=unavailable autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=stalw.art header.b="Ug/VOqrC"; dkim=neutral reason="invalid (unsupported algorithm ed25519-sha256)" header.d=stalw.art header.b="TiKyLpnm"
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fWAzX3YOq3tb; Fri, 13 Jun 2025 06:38:01 -0700 (PDT)
Received: from mail.stalw.art (mail.stalw.art [135.181.195.209]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-256)) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id 88518349A1F4; Fri, 13 Jun 2025 06:38:01 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; s=202404r; d=stalw.art; c=relaxed/relaxed; h=Message-Id:To:Date:Subject:From; t=1749821879; bh=Q5Lb4kL/UC5ZD6F96ULbSOv NmyeKbFHTC+U7el8P91U=; b=Ug/VOqrCpgvhf48rk77gOnWcK9cyqify4N5zg6k5KHY67DTziL 7rLl54bn91zoMv+2Pk95KFH8DrBrg+JneOdwduqQAlwu4qk8x+CMpNbRrCTs+ivaPdzKhRCer5z rZiywXNm0+A9UOYkc39MfkuvQHsGiPLByUZbG6SJdBPcY9950n/ubVozh4hopaFiQUT01c9+8Cg m2Hj/1kVFclUCM+SA46YstMpyaacLBC4m0jh6gfDBs/Ae2qNJ09mT6hPFx0UrmmKCM/Ea9o/p1q O6gGW7EWK04HTsgaVDM7msy+0FRVnbAesHPyx+sjYYCxXSTOHHNgGILwnQtojUadVVQ==;
DKIM-Signature: v=1; a=ed25519-sha256; s=202404e; d=stalw.art; c=relaxed/relaxed; h=Message-Id:To:Date:Subject:From; t=1749821879; bh=Q5Lb4kL/UC5ZD6F96ULbSOv NmyeKbFHTC+U7el8P91U=; b=TiKyLpnmT303AG9yN1xM8+0OPsQSIAdeeEnLASz1OYVjoZPMj2 sD0cvuNMhPUQTlHG9dr+Kqqf3tkOFbpX1eAw==;
From: Mauro De Gennaro <mauro@stalw.art>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3731.700.6.1.9\))
Date: Fri, 13 Jun 2025 15:37:48 +0200
References: <319231DD-9ECF-4283-9567-E6FD989DAC65@stalw.art> <d2e974a0-bad7-45bc-b580-4272ee736db0@dogfoodapp.fastmail.com>
To: Neil Jenkins <neilj=40fastmailteam.com@dmarc.ietf.org>, calsify@ietf.org, IETF JMAP Mailing List <jmap@ietf.org>
In-Reply-To: <d2e974a0-bad7-45bc-b580-4272ee736db0@dogfoodapp.fastmail.com>
Message-Id: <1FA4A275-3F8C-49E6-B651-861A703AD4BE@stalw.art>
X-Mailer: Apple Mail (2.3731.700.6.1.9)
Message-ID-Hash: QYME33PPG2K74ZEZIDD5FHLRRE5SXSEW
X-Message-ID-Hash: QYME33PPG2K74ZEZIDD5FHLRRE5SXSEW
X-MailFrom: mauro@stalw.art
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-jmap.ietf.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [Jmap] Re: [calsify] CalDAV Scheduling design issues and a path forward with JMAP for Scheduling
List-Id: JSON Message Access Protocol <jmap.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/jmap/Emcc5l1B_t0D3zABHX-waW_xwOs>
List-Archive: <https://mailarchive.ietf.org/arch/browse/jmap>
List-Help: <mailto:jmap-request@ietf.org?subject=help>
List-Owner: <mailto:jmap-owner@ietf.org>
List-Post: <mailto:jmap@ietf.org>
List-Subscribe: <mailto:jmap-join@ietf.org>
List-Unsubscribe: <mailto:jmap-leave@ietf.org>

Hi Neil,

Thanks for your feedback!

> I agree that having to do canonicalisation and diffing sucks, but since this is basically also how iTIP works (you get a full event in every message and have to work out what's changed) you're probably going to need to implement all of this anyway to support iMIP, which sadly isn't going anywhere.

That’s correct,  iTIP itself works by sending full objects and doing diffs, but there's a key difference here. My complaint isn't about the implementation complexity (that is the fun part actually!). It's that in CalDAV Scheduling, the scheduling operations are completely implicit and inferred from object differences, which creates ambiguity about what the client actually intended to do.

In iTIP/iMIP, at least you have an explicit METHOD property that tells you "this is a REQUEST" or "this is a REPLY”, the semantic intent is clear. But in CalDAV Scheduling, the server has to guess whether you meant to send a REQUEST, CANCEL, or do nothing at all based on what changed in the object. And then having some scheduling parameters in the iCalendar object and others in HTTP headers just feels like a hack.


>> - Data loss risks: Clients making routine property changes (like adding alarms) can accidentally trigger CANCEL messages if they don't preserve all attendees correctly
> 
> I'm curious if you've seen a client do this (drop the attendees when making an unrelated change); I don't think I've ever heard of that happening with our user base.

You're right, I haven't actually seen a client drop attendees accidentally either, it's more of a theoretical risk from the "replace entire object" approach. But this is really a broader CalDAV problem that also affects scheduling.

With JMAP, we can do proper patch operations for just what needs changing, and the goal for JMAP Scheduling would be to have explicit scheduling APIs where the client says exactly which scheduling actions to perform, rather than making the server play detective with object diffs.


>> - Partial update complications: No way to make targeted changes (e.g., "just update the location") without risking unintended scheduling side effects
> 
> I don't know I follow that — updating the location should trigger a scheduling update to be sent to the attendees.

Yeah, bad example on my part! Location changes absolutely should trigger scheduling updates. What I meant was something like setting a local property (like TRANSP) that, due to a client or server bug, accidentally triggers unintended scheduling actions. 


>> - Client implementation burden: Every CalDAV client must understand complex scheduling semantics to safely modify calendar objects
> 
> Does it? I think a CalDAV client just needs to understand if it's the origin of the event. If so it can let the user edit anything, otherwise it should only let the user edit per-user properties. The rest is just distributing updates to the other participants, which the client doesn't have to worry about … although the server very much does.

This gets back to the same core issue about inferring scheduling actions from diffs. Basic scheduling isn't too bad, but things get hairy fast when you have complex recurrence scenarios where attendees participate in only some instances.

Here's a fun edge case I ran into: what if an attendee’s client adds an EXDATE (which should trigger a DECLINE message to the organizer) but also creates a RECURRENCE-ID override for that same date setting their PARTSTAT to DECLINED? Should the server skip generating an update for the EXDATE? Merge it with the one created by the user? Pick one? I found tons of ambiguity like this during implementation, you either have to accept all reasonable inputs and hope that's what the client wanted, or be super strict and force everyone to do things your way.

Also, since writing my original post, I found another RFC 6638 limitation: there's no way to tell the server that the guest list should be hidden in outgoing iTIP messages.


>> I plan to propose a JMAP Scheduling extension over the next few months that would provide explicit scheduling operations with clear semantics. This approach would also enable us to address the iTIP features that RFC 6638 explicitly doesn't cover, including publishing, countering, delegating, refreshing, and forwarding calendar components, as well as replacing the Organizer of a calendar component.
> 
> That sounds very interesting; I won't be at IETF123 in person, but would love to dial in to any such discussion if possible.

Absolutely! I'll do my best to have at least a draft of what the different scheduling actions could look like before IETF. Would love to get your input on the approach, even if it's remote participation.


Thanks,
Mauro