changedInput schema / properties / ops / items / oneOf
Previous value: -[
- {
- "additionalProperties": false,
- "properties": {
- "activityTypeId": {
- "description": "The activity type id (from the schedule read). null or omitted leaves it unset.",
- "type": [
- "string",
- "null"
- ]
- },
- "areaId": {
- "description": "The area id (from the schedule read). null or omitted leaves it unset.",
- "type": [
- "string",
- "null"
- ]
- },
- "calendarId": {
- "description": "The home calendar: a calendar id (from the calendars list or the schedule's `integrations`). Omit it to use the account's default calendar if one is set, else the event stays on the dial only. null keeps the event on the dial only. A calendar id requires Reassign Pro; whole-series only.",
- "type": [
- "string",
- "null"
- ]
- },
- "checklist": {
- "additionalProperties": false,
- "description": "Starter microtasks written to the new event's checklist.",
- "properties": {
- "items": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "done": {
- "description": "true ticks the item off, false clears it; omit to keep the current state (a new item starts not done).",
- "type": "boolean"
- },
- "id": {
- "description": "Keep an existing item's id; omit for a new item.",
- "minLength": 1,
- "type": "string"
- },
- "text": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "text"
- ],
- "type": "object"
- },
- "maxItems": 100,
- "type": "array"
- }
- },
- "required": [
- "items"
- ],
- "type": "object"
- },
- "end": {
- "description": "Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day.",
- "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
- "type": "string"
- },
- "focusIntervals": {
- "additionalProperties": false,
- "description": "Split a BLOCKING block into a repeating focus/break rhythm (pomodoro), e.g. {focusMin:25,breakMin:5}. The breaks fall BETWEEN the focus intervals and the block always ends on a focus. A non_blocking or reference event rejects it.",
- "properties": {
- "breakMin": {
- "maximum": 60,
- "minimum": 1,
- "type": "integer"
- },
- "focusMin": {
- "maximum": 180,
- "minimum": 5,
- "type": "integer"
- }
- },
- "required": [
- "focusMin",
- "breakMin"
- ],
- "type": "object"
- },
- "id": {
- "description": "Optional client-minted event id, so the caller can read the new event back by a known id. Omit it and the server mints one.",
- "type": "string"
- },
- "kind": {
- "description": "\"blocking\" (default) cannot overlap others; \"non_blocking\" is an overlay (e.g. a fasting band or an away/OOO marker) that may overlap and never conflicts; \"reference\" is something the user wants to SEE but isn't doing (e.g. a kid's training they drop off at) — non-blocking, and don't move, delete, or schedule work into it unless asked.",
- "enum": [
- "blocking",
- "non_blocking",
- "reference"
- ],
- "type": "string"
- },
- "mirrorCalendarIds": {
- "description": "The one-way copy calendars, as calendar ids. It must not contain the home `calendarId`. On update it REPLACES the set; [] clears it. Requires Reassign Pro; whole-series only.",
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "name": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "notes": {
- "maxLength": 2000,
- "type": "string"
- },
- "op": {
- "const": "create",
- "type": "string"
- },
- "recurrence": {
- "description": "How the event repeats, as an RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
- "type": "string"
- },
- "recurrenceEnd": {
- "description": "Inclusive last day of the repeat, \"YYYY-MM-DD\". Needs `recurrence`.",
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
- "type": "string"
- },
- "sourceUrl": {
- "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
- "maxLength": 2048,
- "type": "string"
- },
- "start": {
- "description": "Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day. Its day is the event's day.",
- "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
- "type": "string"
- }
- },
- "required": [
- "op",
- "start",
- "end",
- "name"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "activityTypeId": {
- "description": "The activity type id (from the schedule read). null clears the link; omit to keep it.",
- "type": [
- "string",
- "null"
- ]
- },
- "areaId": {
- "description": "The area id (from the schedule read). null clears the link; omit to keep it.",
- "type": [
- "string",
- "null"
- ]
- },
- "calendarId": {
- "description": "Re-home the event: a calendar id (from the calendars list or the schedule's `integrations`) moves it to that calendar; null unlinks it (keeps the dial block). Omit to keep the current home. Requires Reassign Pro; whole-series only.",
- "type": [
- "string",
- "null"
- ]
- },
- "end": {
- "description": "Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day. A lone end keeps the start.",
- "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
- "type": "string"
- },
- "focusIntervals": {
- "anyOf": [
- {
- "additionalProperties": false,
- "properties": {
- "breakMin": {
- "maximum": 60,
- "minimum": 1,
- "type": "integer"
- },
- "focusMin": {
- "maximum": 180,
- "minimum": 5,
- "type": "integer"
- }
- },
- "required": [
- "focusMin",
- "breakMin"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
- ],
- "description": "Split a BLOCKING block into a repeating focus/break rhythm (pomodoro), e.g. {focusMin:25,breakMin:5}. The breaks fall BETWEEN the focus intervals and the block always ends on a focus. A non_blocking or reference event rejects it. Pass null to remove an existing rhythm."
- },
- "id": {
- "description": "The event id from a read. A bare series id addresses the whole series; `seriesId@YYYY-MM-DD` addresses one occurrence.",
- "minLength": 1,
- "type": "string"
- },
- "kind": {
- "description": "Change the event kind: \"blocking\", \"non_blocking\", or \"reference\" (see-only — non-blocking, don't schedule work into it).",
- "enum": [
- "blocking",
- "non_blocking",
- "reference"
- ],
- "type": "string"
- },
- "mirrorCalendarIds": {
- "description": "The one-way copy calendars, as calendar ids. It must not contain the home `calendarId`. On update it REPLACES the set; [] clears it. Requires Reassign Pro; whole-series only.",
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "name": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "notes": {
- "maxLength": 2000,
- "type": "string"
- },
- "op": {
- "const": "update",
- "type": "string"
- },
- "recurrence": {
- "description": "A new RRULE for the series; null stops the repeat.",
- "type": [
- "string",
- "null"
- ]
- },
- "recurrenceEnd": {
- "description": "Inclusive last day of the repeat, \"YYYY-MM-DD\". Needs `recurrence`.",
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
- "type": "string"
- },
- "scope": {
- "const": "future",
- "description": "Only with a `seriesId@YYYY-MM-DD` id: \"future\" edits that occurrence and every later one. Omit it to edit only that occurrence; a bare series id edits the whole series.",
- "type": "string"
- },
- "sourceUrl": {
- "anyOf": [
- {
- "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
- "maxLength": 2048,
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "description": "Replace where this event was captured from (http(s)); null clears it. Whole-series only."
- },
- "start": {
- "description": "Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day. A new start moves the event, also to another day (on an occurrence id, that occurrence only). A lone start keeps the duration.",
- "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
- "type": "string"
- }
- },
- "required": [
- "op",
- "id"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "byMinutes": {
- "description": "Minutes to shift by; negative is earlier.",
- "maximum": 9007199254740991,
- "minimum": -9007199254740991,
- "type": "integer"
- },
- "id": {
- "description": "The event id from a read. A bare series id addresses the whole series; `seriesId@YYYY-MM-DD` addresses one occurrence.",
- "minLength": 1,
- "type": "string"
- },
- "op": {
- "const": "shift",
- "type": "string"
- },
- "scope": {
- "const": "future",
- "description": "Only with a `seriesId@YYYY-MM-DD` id: \"future\" edits that occurrence and every later one. Omit it to edit only that occurrence; a bare series id edits the whole series.",
- "type": "string"
- }
- },
- "required": [
- "op",
- "id",
- "byMinutes"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "actualEnd": {
- "description": "When it actually ended. Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day. Send it with actualStart, only for \"changed\" or \"added\".",
- "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
- "type": "string"
- },
- "actualStart": {
- "description": "When it actually started. Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day. Send it with actualEnd, only for \"changed\" or \"added\".",
- "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
- "type": "string"
- },
- "id": {
- "description": "The event id, echoed verbatim from a schedule or search read. To mark one occurrence of a recurring event, pass the `seriesId@YYYY-MM-DD` id the read returned for that day — don't fabricate the @date yourself.",
- "type": "string"
- },
- "op": {
- "const": "reflect",
- "type": "string"
- },
- "status": {
- "description": "How a past planned event actually went. \"kept\" = happened as planned; \"skipped\" = didn't happen; \"changed\" = happened but differently (pass actualStart + actualEnd to record the real time); \"added\" = unplanned but happened (its actualStart + actualEnd become the event's time). Marking only records the reflection — it never renames or re-times the plan.",
- "enum": [
- "kept",
- "skipped",
- "changed",
- "added"
- ],
- "type": "string"
- }
- },
- "required": [
- "op",
- "id",
- "status"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "check": {
- "description": "Item ids to mark DONE for the occurrence. On a recurring event this ticks off that occurrence only.",
- "items": {
- "type": "string"
- },
- "maxItems": 100,
- "type": "array"
- },
- "id": {
- "description": "The event id, echoed verbatim from a schedule or search read. A bare series id edits the template of the whole series; the `seriesId@YYYY-MM-DD` id edits or ticks off that one occurrence.",
- "type": "string"
- },
- "items": {
- "description": "REPLACE the whole checklist with these microtasks, in order — add, rename, remove, and reorder are all expressed as the resulting list. Read the current items first, then send the full desired list. Pass [] to clear the checklist. A checkoff on a removed item is dropped automatically.",
- "items": {
- "additionalProperties": false,
- "properties": {
- "done": {
- "description": "true ticks the item off, false clears it; omit to keep the current state (a new item starts not done).",
- "type": "boolean"
- },
- "id": {
- "description": "Keep an existing item's id; omit for a new item.",
- "minLength": 1,
- "type": "string"
- },
- "text": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "text"
- ],
- "type": "object"
- },
- "maxItems": 100,
- "type": "array"
- },
- "op": {
- "const": "checklist",
- "type": "string"
- },
- "uncheck": {
- "description": "Item ids to mark NOT-done for the occurrence.",
- "items": {
- "type": "string"
- },
- "maxItems": 100,
- "type": "array"
- }
- },
- "required": [
- "op",
- "id"
- ],
- "type": "object"
- }
-]New value: +[
+ {
+ "additionalProperties": false,
+ "properties": {
+ "activityTypeId": {
+ "description": "The activity type id (from the schedule read). null or omitted leaves it unset.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "areaId": {
+ "description": "The area id (from the schedule read). null or omitted leaves it unset.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "calendarId": {
+ "description": "The home calendar: a calendar id (from the calendars list or the schedule's `integrations`). Omit it to use the account's default calendar if one is set, else the event stays on the dial only. null keeps the event on the dial only. A calendar id requires Reassign Pro; whole-series only.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "checklist": {
+ "additionalProperties": false,
+ "description": "Starter microtasks written to the new event's checklist.",
+ "properties": {
+ "items": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "done": {
+ "description": "true ticks the item off, false clears it; omit to keep the current state (a new item starts not done).",
+ "type": "boolean"
+ },
+ "id": {
+ "description": "Keep an existing item's id; omit for a new item.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "text": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "text"
+ ],
+ "type": "object"
+ },
+ "maxItems": 100,
+ "type": "array"
+ }
+ },
+ "required": [
+ "items"
+ ],
+ "type": "object"
+ },
+ "end": {
+ "description": "Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day.",
+ "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
+ "type": "string"
+ },
+ "focusIntervals": {
+ "additionalProperties": false,
+ "description": "Split a BLOCKING block into a repeating focus/break rhythm (pomodoro), e.g. {focusMin:25,breakMin:5}. The breaks fall BETWEEN the focus intervals and the block always ends on a focus. A non_blocking or reference event rejects it.",
+ "properties": {
+ "breakMin": {
+ "maximum": 60,
+ "minimum": 1,
+ "type": "integer"
+ },
+ "focusMin": {
+ "maximum": 180,
+ "minimum": 5,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "focusMin",
+ "breakMin"
+ ],
+ "type": "object"
+ },
+ "id": {
+ "description": "Optional client-minted event id, so the caller can read the new event back by a known id. Omit it and the server mints one.",
+ "type": "string"
+ },
+ "kind": {
+ "description": "\"blocking\" (default) cannot overlap others; \"non_blocking\" is an overlay (e.g. a fasting band or an away/OOO marker) that may overlap and never conflicts; \"reference\" is something the user wants to SEE but isn't doing (e.g. a kid's training they drop off at) — non-blocking, and don't move, delete, or schedule work into it unless asked.",
+ "enum": [
+ "blocking",
+ "non_blocking",
+ "reference"
+ ],
+ "type": "string"
+ },
+ "mirrorCalendarIds": {
+ "description": "The one-way copy calendars, as calendar ids. It must not contain the home `calendarId`. On update it REPLACES the set; [] clears it. An id already on the event may stay even if its calendar is read-only now; only an added id is checked. Adding an id requires Reassign Pro; whole-series only.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "name": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "notes": {
+ "maxLength": 2000,
+ "type": "string"
+ },
+ "op": {
+ "const": "create",
+ "type": "string"
+ },
+ "recurrence": {
+ "description": "How the event repeats, as an RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
+ "type": "string"
+ },
+ "recurrenceEnd": {
+ "description": "Inclusive last day of the repeat, \"YYYY-MM-DD\". Needs `recurrence`.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+ },
+ "sourceUrl": {
+ "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
+ "maxLength": 2048,
+ "type": "string"
+ },
+ "start": {
+ "description": "Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day. Its day is the event's day.",
+ "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "start",
+ "end",
+ "name"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "activityTypeId": {
+ "description": "The activity type id (from the schedule read). null clears the link; omit to keep it.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "areaId": {
+ "description": "The area id (from the schedule read). null clears the link; omit to keep it.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "calendarId": {
+ "description": "Re-home the event: a calendar id (from the calendars list or the schedule's `integrations`) moves it to that calendar; null unlinks it and deletes its mirror copies (keeps the dial block). An unlink may carry start, end, name, notes, areaId, activityTypeId and kind, applied first in the same write. Omit to keep the current home. A calendar id requires Reassign Pro; whole-series only.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "end": {
+ "description": "Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day. A lone end keeps the start.",
+ "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
+ "type": "string"
+ },
+ "focusIntervals": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "breakMin": {
+ "maximum": 60,
+ "minimum": 1,
+ "type": "integer"
+ },
+ "focusMin": {
+ "maximum": 180,
+ "minimum": 5,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "focusMin",
+ "breakMin"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Split a BLOCKING block into a repeating focus/break rhythm (pomodoro), e.g. {focusMin:25,breakMin:5}. The breaks fall BETWEEN the focus intervals and the block always ends on a focus. A non_blocking or reference event rejects it. Pass null to remove an existing rhythm."
+ },
+ "id": {
+ "description": "The event id from a read. A bare series id addresses the whole series; `seriesId@YYYY-MM-DD` addresses one occurrence.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "kind": {
+ "description": "Change the event kind: \"blocking\", \"non_blocking\", or \"reference\" (see-only — non-blocking, don't schedule work into it).",
+ "enum": [
+ "blocking",
+ "non_blocking",
+ "reference"
+ ],
+ "type": "string"
+ },
+ "mirrorCalendarIds": {
+ "description": "The one-way copy calendars, as calendar ids. It must not contain the home `calendarId`. On update it REPLACES the set; [] clears it. An id already on the event may stay even if its calendar is read-only now; only an added id is checked. Adding an id requires Reassign Pro; whole-series only.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "name": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "notes": {
+ "maxLength": 2000,
+ "type": "string"
+ },
+ "op": {
+ "const": "update",
+ "type": "string"
+ },
+ "recurrence": {
+ "description": "A new RRULE for the series; null stops the repeat.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "recurrenceEnd": {
+ "description": "Inclusive last day of the repeat, \"YYYY-MM-DD\". Needs `recurrence`.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+ },
+ "scope": {
+ "const": "future",
+ "description": "Only with a `seriesId@YYYY-MM-DD` id: \"future\" edits that occurrence and every later one. Omit it to edit only that occurrence; a bare series id edits the whole series.",
+ "type": "string"
+ },
+ "sourceUrl": {
+ "anyOf": [
+ {
+ "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
+ "maxLength": 2048,
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Replace where this event was captured from (http(s)); null clears it. Whole-series only."
+ },
+ "start": {
+ "description": "Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day. A new start moves the event, also to another day (on an occurrence id, that occurrence only). A lone start keeps the duration.",
+ "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "id"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "byMinutes": {
+ "description": "Minutes to shift by; negative is earlier.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "id": {
+ "description": "The event id from a read. A bare series id addresses the whole series; `seriesId@YYYY-MM-DD` addresses one occurrence.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "op": {
+ "const": "shift",
+ "type": "string"
+ },
+ "scope": {
+ "const": "future",
+ "description": "Only with a `seriesId@YYYY-MM-DD` id: \"future\" edits that occurrence and every later one. Omit it to edit only that occurrence; a bare series id edits the whole series.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "id",
+ "byMinutes"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "actualEnd": {
+ "description": "When it actually ended. Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day. Send it with actualStart, only for \"changed\" or \"added\".",
+ "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
+ "type": "string"
+ },
+ "actualStart": {
+ "description": "When it actually started. Local datetime \"YYYY-MM-DDTHH:MM\" (no seconds, offset or Z). The end must be after the start; an overnight or multi-day event just ends on a later day. Send it with actualEnd, only for \"changed\" or \"added\".",
+ "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
+ "type": "string"
+ },
+ "id": {
+ "description": "The event id, echoed verbatim from a schedule or search read. To mark one occurrence of a recurring event, pass the `seriesId@YYYY-MM-DD` id the read returned for that day — don't fabricate the @date yourself.",
+ "type": "string"
+ },
+ "op": {
+ "const": "reflect",
+ "type": "string"
+ },
+ "status": {
+ "description": "How a past planned event actually went. \"kept\" = happened as planned; \"skipped\" = didn't happen; \"changed\" = happened but differently (pass actualStart + actualEnd to record the real time); \"added\" = unplanned but happened (its actualStart + actualEnd become the event's time). Marking only records the reflection — it never renames or re-times the plan.",
+ "enum": [
+ "kept",
+ "skipped",
+ "changed",
+ "added"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "id",
+ "status"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "check": {
+ "description": "Item ids to mark DONE for the occurrence. On a recurring event this ticks off that occurrence only.",
+ "items": {
+ "type": "string"
+ },
+ "maxItems": 100,
+ "type": "array"
+ },
+ "id": {
+ "description": "The event id, echoed verbatim from a schedule or search read. A bare series id edits the template of the whole series; the `seriesId@YYYY-MM-DD` id edits or ticks off that one occurrence.",
+ "type": "string"
+ },
+ "items": {
+ "description": "REPLACE the whole checklist with these microtasks, in order — add, rename, remove, and reorder are all expressed as the resulting list. Read the current items first, then send the full desired list. Pass [] to clear the checklist. A checkoff on a removed item is dropped automatically.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "done": {
+ "description": "true ticks the item off, false clears it; omit to keep the current state (a new item starts not done).",
+ "type": "boolean"
+ },
+ "id": {
+ "description": "Keep an existing item's id; omit for a new item.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "text": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "text"
+ ],
+ "type": "object"
+ },
+ "maxItems": 100,
+ "type": "array"
+ },
+ "op": {
+ "const": "checklist",
+ "type": "string"
+ },
+ "uncheck": {
+ "description": "Item ids to mark NOT-done for the occurrence.",
+ "items": {
+ "type": "string"
+ },
+ "maxItems": 100,
+ "type": "array"
+ }
+ },
+ "required": [
+ "op",
+ "id"
+ ],
+ "type": "object"
+ }
+]