todo: what the calendar API deliberately cannot write

recurrence, alarms, attendees and EXDATE. all four read correctly and none can
be authored — which is what the agent skill still drops to raw DAV for. filed
with an order to do them in (EXDATE first: "cancel next Tuesday" is a thing the
owner will say and the honest answer today is a refusal) and the reason the API
stops where it does.

new theme, because burying a calendar gap under plugin-repos is where it goes to
be lost.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-27 10:56:51 +00:00
co-authored by Claude Opus 5
parent 3fac1460cd
commit 0918dd7443
3 changed files with 86 additions and 37 deletions
+5 -4
View File
@@ -22,15 +22,16 @@ the owner's OS user and can never be granted. Indirection there really is accide
## Themes
**107 open, 31 closed**, across 33 themes.
**107 open, 32 closed**, across 34 themes.
| Theme | Open | Closed |
| ------------------------------------------------------------------------------------------ | ---- | ------ |
| --- | --- | --- |
| [Affordances](todo/affordances/) | 2 | 0 |
| [Agents coordinating agents](todo/agent-coordination/) | 5 | 0 |
| [Speaking into a session from the backend](todo/agent-delivery/) | 1 | 1 |
| [Backburner](todo/backburner/) | 3 | 0 |
| [Background jobs](todo/background-jobs/) | 2 | 1 |
| [Calendar and contacts](todo/calendar/) | 1 | 0 |
| [Chat interface](todo/chat/) | 1 | 0 |
| [Code editor](todo/code-editor/) | 1 | 0 |
| [Components — the shared UI layer](todo/components/) | 1 | 0 |
@@ -45,7 +46,7 @@ the owner's OS user and can never be granted. Indirection there really is accide
| [Multi-user](todo/multi-user/) | 17 | 5 |
| [Notifications](todo/notifications/) | 1 | 0 |
| [Plugin ecosystem — before it opens to third parties (2026-08-18)](todo/plugin-ecosystem/) | 5 | 0 |
| [Plugin infrastructure](todo/plugin-infrastructure/) | 3 | 0 |
| [Plugin infrastructure](todo/plugin-infrastructure/) | 2 | 1 |
| [Plugin repos — what writing their READMEs turned up](todo/plugin-repos/) | 10 | 9 |
| [Plugin system — gaps the email extraction found (2026-08-18)](todo/plugin-system/) | 3 | 0 |
| [Prompt library](todo/prompt-library/) | 1 | 0 |
@@ -70,11 +71,11 @@ the owner's OS user and can never be granted. Indirection there really is accide
## Newest ten
- `2026-08-27` **Turn an ordinary chat into a commander or a bot, carrying its context along** — [agent-coordination/turn-a-chat-into-a-commander-or-a-bot](todo/agent-coordination/turn-a-chat-into-a-commander-or-a-bot.md)
- `2026-08-27` **The calendar API cannot express repeating events, reminders, invitees or a cancelled occurrence** — [calendar/the-json-api-cannot-express-recurrence-alarms](todo/calendar/the-json-api-cannot-express-recurrence-alarms.md)
- `2026-08-27` **AGENTS.md sweep — what is left after the static docs landed** — [docs-conventions/agents-md-remaining](todo/docs-conventions/agents-md-remaining.md)
- `2026-08-27` **The calendar/contacts skill has never been exercised by an actual agent** — [known-bugs/calendar-skill-never-used-by-an-agent](todo/known-bugs/calendar-skill-never-used-by-an-agent.md)
- `2026-08-27` **Setting up a phone for calendar and contacts should be one link inside Officer, not a manual account form** — [mobile-apps/setting-up-a-phone-should-be-a-link-in-the-app](todo/mobile-apps/setting-up-a-phone-should-be-a-link-in-the-app.md)
- `2026-08-27` **Marketplace: browse by tag — filter list, card grid, detail with a back button** — [plugin-ecosystem/marketplace-browse-by-tag](todo/plugin-ecosystem/marketplace-browse-by-tag.md)
- `2026-08-27` **A plugin that has a sidecar proxy loses the request body on its OWN routes** — [plugin-infrastructure/a-plugin-s-own-routes-lose-their-request-body](todo/plugin-infrastructure/a-plugin-s-own-routes-lose-their-request-body.md)
- `2026-08-25` **An affordance: a scoped agent warns when a request lands outside its scope** — [affordances/an-affordance-a-scoped-agent-warns-on-the](todo/affordances/an-affordance-a-scoped-agent-warns-on-the.md)
- `2026-08-25` **Commit signing is inconsistent across harnesses — Claude names itself, opencode names nothing** — [agent-coordination/commit-signing-is-inconsistent-across-harnesses](todo/agent-coordination/commit-signing-is-inconsistent-across-harnesses.md)
- `2026-08-25` **A commander's watcher does not survive a reboot, and nothing says so** — [agent-coordination/a-commander-s-watcher-does-not-survive-a-reboot](todo/agent-coordination/a-commander-s-watcher-does-not-survive-a-reboot.md)
+8
View File
@@ -0,0 +1,8 @@
---
theme: calendar
heading: "Calendar and contacts"
kind: theme
---
The caldav plugin: Radicale, the DAV door phones sync against, the `/calendar` and `/contacts` screens,
and the JSON API both those screens and the agent skill are built on.
@@ -0,0 +1,40 @@
---
id: calendar/the-json-api-cannot-express-recurrence-alarms
title: "The calendar API cannot express repeating events, reminders, invitees or a cancelled occurrence"
theme: calendar
status: open
created: 2026-08-27
date_source: stated
order: 1
---
**The calendar API cannot express repeating events, reminders, invitees or a cancelled occurrence.**
It reads all four correctly and can neither create nor change them. Raised 2026-08-27, when the agent
skill was rewritten onto the JSON routes and this became the list of things it still has to drop to
raw DAV for.
Plainly, what the four are:
- **Recurrence (`RRULE`)** — "every Tuesday", "the last Friday of the month". One stored event with a
rule attached, not many copies. Both screens already show a *repeats* badge, and the sidecar passes
the rule through unexpanded, so nothing here invents occurrences the server never claimed existed.
- **Alarms (`VALARM`)** — the reminder. "Tell me fifteen minutes before." A block inside the event.
- **Attendees (`ATTENDEE`)** — the other people. Adding one is not a note on an event: it is a meeting
invitation, with replies coming back, which is a different feature wearing the same field.
- **`EXDATE`** — one occurrence of a repeating event removed, the rest left alone. This is what
"cancel just next Tuesday's" actually is. Deleting the event deletes the whole series, so today the
skill is told to say so rather than do it.
**Nothing is broken.** Every one of these survives an edit made from Officer — `patch.ts` replaces only
the lines it owns, and there are tests for exactly that against an event carrying an alarm, an attendee
and a rule. The gap is that Officer can only leave them alone, never author them.
The order to do them in is not the order above. **`EXDATE` first**: "cancel next Tuesday" is a thing the
owner will say, and the honest answer today is a refusal. Then alarms, which are self-contained and
where "remind me an hour before" is worth having. Recurrence is a real UI problem — a rule builder is a
small product on its own — and the read side already handles it, so it can wait for the proper calendar
interface. Attendees should be last and may never be worth it: it drags in iTIP, replies, and mail.
The reason it stops here rather than growing quietly: **a field the screens cannot show is a field an
editor should not invent.** That rule is why a patch is safe. Widening the API means widening what the
UI can display at the same time, or the next edit silently drops what the last one wrote.