diff --git a/TODO.md b/TODO.md index 7e7ca056..baff0324 100644 --- a/TODO.md +++ b/TODO.md @@ -22,43 +22,44 @@ 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 | -| [Chat interface](todo/chat/) | 1 | 0 | -| [Code editor](todo/code-editor/) | 1 | 0 | -| [Components — the shared UI layer](todo/components/) | 1 | 0 | -| [Documentation conventions — AGENTS.md vs CLAUDE.md](todo/docs-conventions/) | 2 | 0 | -| [File watchers](todo/file-watchers/) | 1 | 0 | -| [Fleet — one command across every server](todo/fleet/) | 6 | 2 | -| [Headscale](todo/headscale/) | 0 | 5 | -| [Infra (alpha)](todo/infra/) | 7 | 0 | -| [Known bugs](todo/known-bugs/) | 6 | 4 | -| [Memory — one store instead of per-harness files](todo/memory/) | 1 | 0 | -| [Mobile apps](todo/mobile-apps/) | 5 | 0 | -| [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 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 | -| [SendOff](todo/sendoff/) | 1 | 0 | -| [Settings — portable, and readable by an agent](todo/settings/) | 2 | 0 | -| [Shell — spotlight and the dock](todo/shell/) | 4 | 1 | -| [Sub-agents — agents spawning agents](todo/sub-agents/) | 0 | 2 | -| [Sudo terminal modal](todo/sudo-terminal-modal/) | 1 | 0 | -| [Tooling — the list about the list](todo/tooling/) | 0 | 1 | -| [Transmission](todo/transmission/) | 6 | 0 | -| [URL state — routing, query strings and selection](todo/url-state/) | 4 | 0 | -| [Waiting on the owner to run it](todo/waiting-on-owner/) | 3 | 0 | -| [Workspaces & Panels](todo/workspaces-panels/) | 2 | 0 | +| 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 | +| [Documentation conventions — AGENTS.md vs CLAUDE.md](todo/docs-conventions/) | 2 | 0 | +| [File watchers](todo/file-watchers/) | 1 | 0 | +| [Fleet — one command across every server](todo/fleet/) | 6 | 2 | +| [Headscale](todo/headscale/) | 0 | 5 | +| [Infra (alpha)](todo/infra/) | 7 | 0 | +| [Known bugs](todo/known-bugs/) | 6 | 4 | +| [Memory — one store instead of per-harness files](todo/memory/) | 1 | 0 | +| [Mobile apps](todo/mobile-apps/) | 5 | 0 | +| [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/) | 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 | +| [SendOff](todo/sendoff/) | 1 | 0 | +| [Settings — portable, and readable by an agent](todo/settings/) | 2 | 0 | +| [Shell — spotlight and the dock](todo/shell/) | 4 | 1 | +| [Sub-agents — agents spawning agents](todo/sub-agents/) | 0 | 2 | +| [Sudo terminal modal](todo/sudo-terminal-modal/) | 1 | 0 | +| [Tooling — the list about the list](todo/tooling/) | 0 | 1 | +| [Transmission](todo/transmission/) | 6 | 0 | +| [URL state — routing, query strings and selection](todo/url-state/) | 4 | 0 | +| [Waiting on the owner to run it](todo/waiting-on-owner/) | 3 | 0 | +| [Workspaces & Panels](todo/workspaces-panels/) | 2 | 0 | ## Records — no items, kept for the reasoning @@ -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) diff --git a/todo/calendar/_index.md b/todo/calendar/_index.md new file mode 100644 index 00000000..e339c224 --- /dev/null +++ b/todo/calendar/_index.md @@ -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. diff --git a/todo/calendar/the-json-api-cannot-express-recurrence-alarms.md b/todo/calendar/the-json-api-cannot-express-recurrence-alarms.md new file mode 100644 index 00000000..836c1286 --- /dev/null +++ b/todo/calendar/the-json-api-cannot-express-recurrence-alarms.md @@ -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.