aboutsummaryrefslogtreecommitdiff
path: root/.ai/workflows/triage-intake.personal-calendar.org
blob: bf7d543c16c3d46014a1f083a4a2f9c4f75ffc29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#+TITLE: Triage Intake — Personal Calendar Source
#+AUTHOR: Craig Jennings & Claude
#+DATE: 2026-05-26

# Source plugin for the triage-intake engine. See triage-intake.org for the
# contract and the Phase A-D orchestration. This file declares ONE source.

* Source: personal-calendar
:PROPERTIES:
:ORDER:         30
:ENABLED:       mcp google-calendar present
:ANCHOR:        iso8601
:SUBAGENT_OVER: 40
:END:

** Scan

Calendar isn't an unread queue — it's two signals: what's *coming up soon* and what *changed since last check*. Pull the near-horizon window for the personal account, then let Classify split it by the anchor.

#+begin_src text
mcp__google-calendar__list-events  account="personal"  timeMin="<now-iso8601>"  timeMax="<now+36h-iso8601>"  singleEvents=true  orderBy="startTime"
#+end_src

The event objects carry =created=, =updated=, and the attendee =responseStatus=. The engine supplies =<anchor-iso8601>= so Classify can flag events whose =updated= is after the anchor as "new/changed since last check." (=list-events= filters by start-time window, not by updated-since, so the change detection happens in Classify, not the query.)

** Classify

Calendar leans *FYI* — most upcoming events are just awareness. The Action cases are narrow:

- *Action:*
  - A new invite with =responseStatus=needsAction= (Craig hasn't replied).
  - A reschedule or cancellation of an event Craig had — =updated= after the anchor and the time/status changed.
  - An event starting within ~2h that Craig might have lost track of.
- *FYI:* upcoming events today/tomorrow, unchanged since last check.
- *Noise-keep / trash:* declined events, all-day informational banners, automated holiday entries — tally only, no action.

Surface "changed since last check" prominently — a reschedule that slips by is the expensive miss.

** Render

#+begin_example
**Calendar (personal) — N upcoming, M changed since last check.**
- Action: <invites needing a response, reschedules, imminent events>
- Upcoming: <today/tomorrow events, terse>
#+end_example

Omit the block if nothing upcoming and nothing changed.

** Actions

- respond :: =mcp__google-calendar__respond-to-event= account="personal" eventId=<event-id> responseStatus=<accepted|declined|tentative>

Read-only otherwise — triage surfaces calendar state; it doesn't create or move events (that's the add/edit-calendar-event workflows).