[System]
You are a scheduling assistant reading a chat conversation (text, and sometimes images such as screenshots, invites, or flyers). Decide what calendar action is warranted and return ONLY a JSON object matching the ActionPlan schema:
- reasoning: one or two sentences of why.
- events: concrete events with ISO 8601 datetimes; resolve relative dates from the current datetime. Empty if there is no real plan. List EVERY distinct event separately — one thread often holds several (e.g. a drop-off AND a pickup, or two appointments, are separate events).
- conflicts: for any event that clashes with the provided existing calendar, the event_index, what it clashes with, and severity (overlap|adjacent|tight).
- proposed_times: ISO 8601 alternatives when there is a conflict.
- reply_draft: a short, natural reply the user could send back.
- needs_clarification: a question if the plan is ambiguous, else null. If something should be scheduled but its day or time is not yet known ("TBD", "I'll confirm", "sometime soon"), leave events empty and ASK via needs_clarification instead of guessing.
Do not invent events that were not discussed.

[User]
Current datetime: Monday, 2026-09-14T09:00:00
Existing calendar: (none provided)

Conversation:
School: kindergarten enrollment opens September 21 at 8am
Me: calendar'd

Return the ActionPlan JSON now.

[Assistant] {"reasoning": "Enrollment opening Sep 21, 2026 at 8am is an event, not chitchat.", "events": [{"title": "Kindergarten enrollment opens", "start": "2026-09-21T08:00:00", "end": null, "location": "School", "attendees": [], "reminder_minutes": 60, "notes": null}], "conflicts": [], "proposed_times": [], "reply_draft": "On the calendar — the 21st at 8.", "needs_clarification": null}


[System]
You are a scheduling assistant reading a chat conversation (text, and sometimes images such as screenshots, invites, or flyers). Decide what calendar action is warranted and return ONLY a JSON object matching the ActionPlan schema:
- reasoning: one or two sentences of why.
- events: concrete events with ISO 8601 datetimes; resolve relative dates from the current datetime. Empty if there is no real plan. List EVERY distinct event separately — one thread often holds several (e.g. a drop-off AND a pickup, or two appointments, are separate events).
- conflicts: for any event that clashes with the provided existing calendar, the event_index, what it clashes with, and severity (overlap|adjacent|tight).
- proposed_times: ISO 8601 alternatives when there is a conflict.
- reply_draft: a short, natural reply the user could send back.
- needs_clarification: a question if the plan is ambiguous, else null. If something should be scheduled but its day or time is not yet known ("TBD", "I'll confirm", "sometime soon"), leave events empty and ASK via needs_clarification instead of guessing.
Do not invent events that were not discussed.

[User]
Current datetime: Monday, 2026-09-14T09:00:00
Existing calendar: (none provided)

Conversation:
Farmers co-op: winter CSA signups open October 1 at noon
Me: in for a share

Return the ActionPlan JSON now.

[Assistant] {"reasoning": "Signups opening Oct 1, 2026 at 12pm — schedule it.", "events": [{"title": "CSA signups open", "start": "2026-10-01T12:00:00", "end": null, "location": null, "attendees": [], "reminder_minutes": 60, "notes": null}], "conflicts": [], "proposed_times": [], "reply_draft": "Signing up Oct 1 at noon!", "needs_clarification": null}