Skip to main content
Glama

Create Automation

create_automation

Create an automation. Useful for reminders, follow-ups, periodic tasks, or event-driven workflows per user. Returns the full automation object including computed nextRunAt.

Schedule field accepts 5 formats:

  • {type: "at", at: "<ISO 8601>"} - one-time execution (must be future)

  • {type: "every", unit: "minutes"|"hours", n: } - recurring interval (min 30 min)

  • {type: "cron", expr: ""} - cron schedule (min 30 min between runs)

  • {type: "rrule", rrule: ""} - iCalendar rule (min 30 min between occurrences)

  • {type: "event", events: ["", ...]} - event-driven (triggers immediately on ANY of the listed events, up to 20; each occurrence fires one run carrying just that event's payload). {type: "event", event: ""} (single string field) is a legacy alias for a one-event array and is still accepted, but "events" is canonical for new automations. GitHub PR triggers may also include {targetBranches: ["main", ...]} to run only when the PR's target branch matches one of those case-sensitive names or * patterns (e.g. "release/*").

    • matches zero or more characters, including slashes. Omit it to match every target branch. An activity event shares its schedule only with other conversation activity events (chat.activity, call.activity, support_ticket.activity, feedback.activity, social_post.activity); pull_request.activity and issue.activity stand alone. An activity schedule may add {filter: ""} to run only for matching events, e.g. "source.name in ['zendesk', 'intercom'] && author.role == 'customer'". On several conversation events it may name only source.name, placement, author.role and topic.priority_change. The filter field's schema lists the grammar and each event's fields. Optionally add {delaySeconds: <int 1..604800>} to an event schedule to defer the run until N seconds after the trigger event fires (e.g. 1800 = 30 minutes later; max 604800 = 7 days). Omit for immediate execution. A delayed run is cancelled if the automation is disabled during the wait. Optionally add {condition: "<natural language, up to 2000 chars>"} to run only for events that satisfy it (e.g. "the customer is on the Enterprise plan"); Modem checks it against each event's payload before running. A filter or condition also satisfies an event that requires a channel or product scope. conditionMode and conditionSchemaVersion are set by Modem and ignored on input.

Available events: github.pr.created, github.pr.merged, github.pr.dismissed, github.issue.closed, gitlab.mr.created, gitlab.mr.merged, gitlab.mr.closed, topic.created, topic.priority.high, stripe.customer.created, stripe.subscription.created, stripe.subscription.canceled, stripe.subscription.trial_ending, stripe.invoice.payment_failed, sentry.feedback.created, feedback.created, topic.group.added, topic.group.updated, chat.activity, call.activity, support_ticket.activity, feedback.activity, social_post.activity, pull_request.activity, issue.activity

Prompt guidelines: must be self-contained with ALL context the executing agent needs. Write in plain language. Structure as a clear plan with steps. Include external service IDs (Slack channel/user IDs). Never include database internals.

MODEL LEVEL GUIDELINES: Pick the model level that best matches the automation's complexity. Do NOT default to "high".

  • "low" (Fast): Lookup/linking tasks, simple data retrieval, pattern matching, forwarding/routing. Examples: linking PRs to topics, tagging items with keywords, posting simple notifications, checking statuses.

  • "med" (Balanced): Summaries of structured data, daily digests, status rollups, template-based reports. Examples: daily standup summaries, weekly metric rollups, changelog digests, review request roundups.

  • "high" (Smart): Complex analysis, nuanced writing, multi-step reasoning, customer-facing content, creative tasks. Examples: user health analysis, strategic recommendations, personalized outreach, complex triage decisions. When in doubt, use "med" (Balanced).

timezone is required and must be an IANA time zone such as America/New_York. You become its owner. The automation's dashboard page is https://app.modem.dev/<org-slug>/automations/<id>. Before your first call, read the skill: modem_skills({ name: "automations" }).

Input Schema

NameRequiredDescriptionDefault
nameYesHuman-friendly name for the workflow run, e.g. "weekly_summary_for_alex"
promptNoNatural language instructions for what the automation should do. Required unless outcome is a webhook.
enabledNoWhether the automation should be enabled to run on its schedule.
outcomeNoWhat the automation does when it fires. Omit for the default: run the Modem agent with the prompt. {type: "webhook", url} POSTs the trigger event to the URL instead of running the agent; the prompt, model level, capabilities and output channels are then unused. The signing secret receivers verify deliveries with is shown on the automation's page in the Modem dashboard; the API never returns it.
scheduleYesDefines when an automation should run.
timezoneYes
modelLevelNoModel level: "low" (Fast), "med" (Balanced), or "high" (Smart).
capabilityModeNoCapability mode: "all" (all visible capabilities, including ones added later) or "custom" (only listed capabilities). If omitted on create, defaults to "custom" with a snapshot of every currently-available capability so the automation does not silently inherit future integrations.
outputChannelsNoAllowed output channels and optional destination restrictions.
allowedCapabilitiesNoCapability keys to enable when capabilityMode is "custom". On create, providing this field implies custom mode when capabilityMode is omitted. An empty array means core-only.
sourceDefaultTaskSlugNoTemplate-library default task slug this automation is being created from, if any.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedInput schema / properties / outcome
      Added value: +{
      +  "description": "What the automation does when it fires. Omit for the default: run the Modem agent with the prompt. {type: \"webhook\", url} POSTs the trigger event to the URL instead of running the agent; the prompt, model level, capabilities and output channels are then unused. The signing secret receivers verify deliveries with is shown on the automation's page in the Modem dashboard; the API never returns it.",
      +  "oneOf": [
      +    {
      +      "properties": {
      +        "type": {
      +          "const": "agent",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "type"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "properties": {
      +        "type": {
      +          "const": "webhook",
      +          "type": "string"
      +        },
      +        "url": {
      +          "description": "HTTPS URL Modem POSTs a Standard Webhooks-signed JSON envelope to each time the automation fires.",
      +          "maxLength": 2048,
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "type",
      +        "url"
      +      ],
      +      "type": "object"
      +    }
      +  ]
      +}
    • changedInput schema / properties / prompt / description
      Previous value: -"Natural language instructions for what the automation should do."New value: +"Natural language instructions for what the automation should do. Required unless outcome is a webhook."
    • changedInput schema / required
      Previous value: -[
      -  "name",
      -  "timezone",
      -  "schedule",
      -  "prompt"
      -]New value: +[
      +  "name",
      +  "timezone",
      +  "schedule"
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / schedule / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "expr": {
      -        "description": "Standard cron expression string.",
      -        "minLength": 1,
      -        "title": "Cron Expression",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "cron",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "expr"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "rrule": {
      -        "description": "iCalendar recurrence rule (RFC 5545) string.",
      -        "minLength": 1,
      -        "title": "RRule",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "rrule",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "rrule"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "at": {
      -        "description": "ISO 8601 timestamp for one-time execution.",
      -        "minLength": 1,
      -        "title": "At Time",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "at",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "n": {
      -        "description": "Number of time units between executions.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Interval",
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "every",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "Time unit for interval scheduling.",
      -        "enum": [
      -          "minutes",
      -          "hours"
      -        ],
      -        "title": "Time Unit",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "unit",
      -      "n"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "channelIds": {
      -        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      -        "items": {
      -          "format": "uuid",
      -          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Channel IDs",
      -        "type": "array"
      -      },
      -      "condition": {
      -        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event. A condition also satisfies an event that requires a channel or product scope.",
      -        "maxLength": 2000,
      -        "minLength": 1,
      -        "title": "Trigger Condition",
      -        "type": "string"
      -      },
      -      "conditionMode": {
      -        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      -        "enum": [
      -          "judge",
      -          "agent"
      -        ],
      -        "title": "Condition Mode",
      -        "type": "string"
      -      },
      -      "conditionSchemaVersion": {
      -        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Condition Schema Version",
      -        "type": "integer"
      -      },
      -      "delaySeconds": {
      -        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      -        "maximum": 604800,
      -        "minimum": 1,
      -        "title": "Delay (seconds)",
      -        "type": "integer"
      -      },
      -      "event": {
      -        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      -        "minLength": 1,
      -        "title": "Event Name (legacy single-event form)",
      -        "type": "string"
      -      },
      -      "events": {
      -        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "title": "Event Names",
      -        "type": "array"
      -      },
      -      "filter": {
      -        "description": "Optional exact-match filter on an activity event's payload, checked before any trigger condition or agent runs. One CEL expression: field == 'value' or field in ['a', 'b'], joined with && and || (parentheses allowed). Fields: chat.activity, call.activity, feedback.activity: source.name, placement, author.role, topic.priority_change, audience; support_ticket.activity: those and support_ticket.status; social_post.activity: those and social_post.kind; pull_request.activity: source.name, change.kind, base.ref (the branch it merges into, exact name), audience; issue.activity: source.name, change.kind, audience. audience is internal (only the organization can read where the item lives) or public (people outside it can, or Modem cannot confirm it is internal). On a conversation activity event, source.name is one of its built-in sources or a custom source's name. E.g. \"source.name in ['zendesk', 'intercom'] && author.role == 'customer'\". Omit to run on every occurrence. Valid on one activity event, or on several conversation activity events, where it may name only source.name, placement, author.role, topic.priority_change and audience.",
      -        "maxLength": 2000,
      -        "minLength": 1,
      -        "title": "Trigger Filter",
      -        "type": "string"
      -      },
      -      "productIds": {
      -        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      -        "items": {
      -          "format": "uuid",
      -          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Product IDs",
      -        "type": "array"
      -      },
      -      "targetBranches": {
      -        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      -        "items": {
      -          "minLength": 1,
      -          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Target Branches",
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "event",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "expr": {
      +        "description": "Standard cron expression string.",
      +        "minLength": 1,
      +        "title": "Cron Expression",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "cron",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "expr"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "rrule": {
      +        "description": "iCalendar recurrence rule (RFC 5545) string.",
      +        "minLength": 1,
      +        "title": "RRule",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "rrule",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "rrule"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "at": {
      +        "description": "ISO 8601 timestamp for one-time execution.",
      +        "minLength": 1,
      +        "title": "At Time",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "at",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "n": {
      +        "description": "Number of time units between executions.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Interval",
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "every",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "Time unit for interval scheduling.",
      +        "enum": [
      +          "minutes",
      +          "hours"
      +        ],
      +        "title": "Time Unit",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "unit",
      +      "n"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "channelIds": {
      +        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      +        "items": {
      +          "format": "uuid",
      +          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Channel IDs",
      +        "type": "array"
      +      },
      +      "condition": {
      +        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event. A condition also satisfies an event that requires a channel or product scope.",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "title": "Trigger Condition",
      +        "type": "string"
      +      },
      +      "conditionMode": {
      +        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      +        "enum": [
      +          "judge",
      +          "agent"
      +        ],
      +        "title": "Condition Mode",
      +        "type": "string"
      +      },
      +      "conditionSchemaVersion": {
      +        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Condition Schema Version",
      +        "type": "integer"
      +      },
      +      "delaySeconds": {
      +        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      +        "maximum": 604800,
      +        "minimum": 1,
      +        "title": "Delay (seconds)",
      +        "type": "integer"
      +      },
      +      "event": {
      +        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      +        "minLength": 1,
      +        "title": "Event Name (legacy single-event form)",
      +        "type": "string"
      +      },
      +      "events": {
      +        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "title": "Event Names",
      +        "type": "array"
      +      },
      +      "filter": {
      +        "description": "Optional filter on an activity event's payload, checked before any trigger condition or agent runs. One CEL expression: field == 'value' or field in ['a', 'b'], joined with && and || (parentheses allowed). Fields: chat.activity, call.activity, feedback.activity: source.name, placement, author.role, topic.priority_change, audience; support_ticket.activity: those and support_ticket.status; social_post.activity: those and social_post.kind; pull_request.activity: source.name, change.kind, base.ref (the branch it merges into; == and in match it exactly, base.ref.matches('^release/') takes an RE2 regex), audience; issue.activity: source.name, change.kind, audience. audience is internal (only the organization can read where the item lives) or public (people outside it can, or Modem cannot confirm it is internal). On a conversation activity event, source.name is one of its built-in sources or a custom source's name. E.g. \"source.name in ['zendesk', 'intercom'] && author.role == 'customer'\". Omit to run on every occurrence. Valid on one activity event, or on several conversation activity events, where it may name only source.name, placement, author.role, topic.priority_change and audience.",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "title": "Trigger Filter",
      +        "type": "string"
      +      },
      +      "productIds": {
      +        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      +        "items": {
      +          "format": "uuid",
      +          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Product IDs",
      +        "type": "array"
      +      },
      +      "targetBranches": {
      +        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      +        "items": {
      +          "minLength": 1,
      +          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Target Branches",
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "event",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / schedule / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "expr": {
      -        "description": "Standard cron expression string.",
      -        "minLength": 1,
      -        "title": "Cron Expression",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "cron",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "expr"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "rrule": {
      -        "description": "iCalendar recurrence rule (RFC 5545) string.",
      -        "minLength": 1,
      -        "title": "RRule",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "rrule",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "rrule"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "at": {
      -        "description": "ISO 8601 timestamp for one-time execution.",
      -        "minLength": 1,
      -        "title": "At Time",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "at",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "n": {
      -        "description": "Number of time units between executions.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Interval",
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "every",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "Time unit for interval scheduling.",
      -        "enum": [
      -          "minutes",
      -          "hours"
      -        ],
      -        "title": "Time Unit",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "unit",
      -      "n"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "channelIds": {
      -        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      -        "items": {
      -          "format": "uuid",
      -          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Channel IDs",
      -        "type": "array"
      -      },
      -      "condition": {
      -        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event. A condition also satisfies an event that requires a channel or product scope.",
      -        "maxLength": 2000,
      -        "minLength": 1,
      -        "title": "Trigger Condition",
      -        "type": "string"
      -      },
      -      "conditionMode": {
      -        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      -        "enum": [
      -          "judge",
      -          "agent"
      -        ],
      -        "title": "Condition Mode",
      -        "type": "string"
      -      },
      -      "conditionSchemaVersion": {
      -        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Condition Schema Version",
      -        "type": "integer"
      -      },
      -      "delaySeconds": {
      -        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      -        "maximum": 604800,
      -        "minimum": 1,
      -        "title": "Delay (seconds)",
      -        "type": "integer"
      -      },
      -      "event": {
      -        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      -        "minLength": 1,
      -        "title": "Event Name (legacy single-event form)",
      -        "type": "string"
      -      },
      -      "events": {
      -        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "title": "Event Names",
      -        "type": "array"
      -      },
      -      "filter": {
      -        "description": "Optional exact-match filter on an activity event's payload, checked before any trigger condition or agent runs. One CEL expression: field == 'value' or field in ['a', 'b'], joined with && and || (parentheses allowed). Fields: chat.activity, call.activity, feedback.activity: source.name, placement, author.role, topic.priority_change; support_ticket.activity: those and support_ticket.status; social_post.activity: those and social_post.kind; pull_request.activity: source.name, change.kind, base.ref (the branch it merges into, exact name); issue.activity: source.name, change.kind. On a conversation activity event, source.name is one of its built-in sources or a custom source's name. E.g. \"source.name in ['zendesk', 'intercom'] && author.role == 'customer'\". Omit to run on every occurrence. Valid on one activity event, or on several conversation activity events, where it may name only source.name, placement, author.role and topic.priority_change.",
      -        "maxLength": 2000,
      -        "minLength": 1,
      -        "title": "Trigger Filter",
      -        "type": "string"
      -      },
      -      "productIds": {
      -        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      -        "items": {
      -          "format": "uuid",
      -          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Product IDs",
      -        "type": "array"
      -      },
      -      "targetBranches": {
      -        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      -        "items": {
      -          "minLength": 1,
      -          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Target Branches",
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "event",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "expr": {
      +        "description": "Standard cron expression string.",
      +        "minLength": 1,
      +        "title": "Cron Expression",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "cron",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "expr"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "rrule": {
      +        "description": "iCalendar recurrence rule (RFC 5545) string.",
      +        "minLength": 1,
      +        "title": "RRule",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "rrule",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "rrule"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "at": {
      +        "description": "ISO 8601 timestamp for one-time execution.",
      +        "minLength": 1,
      +        "title": "At Time",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "at",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "n": {
      +        "description": "Number of time units between executions.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Interval",
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "every",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "Time unit for interval scheduling.",
      +        "enum": [
      +          "minutes",
      +          "hours"
      +        ],
      +        "title": "Time Unit",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "unit",
      +      "n"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "channelIds": {
      +        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      +        "items": {
      +          "format": "uuid",
      +          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Channel IDs",
      +        "type": "array"
      +      },
      +      "condition": {
      +        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event. A condition also satisfies an event that requires a channel or product scope.",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "title": "Trigger Condition",
      +        "type": "string"
      +      },
      +      "conditionMode": {
      +        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      +        "enum": [
      +          "judge",
      +          "agent"
      +        ],
      +        "title": "Condition Mode",
      +        "type": "string"
      +      },
      +      "conditionSchemaVersion": {
      +        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Condition Schema Version",
      +        "type": "integer"
      +      },
      +      "delaySeconds": {
      +        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      +        "maximum": 604800,
      +        "minimum": 1,
      +        "title": "Delay (seconds)",
      +        "type": "integer"
      +      },
      +      "event": {
      +        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      +        "minLength": 1,
      +        "title": "Event Name (legacy single-event form)",
      +        "type": "string"
      +      },
      +      "events": {
      +        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "title": "Event Names",
      +        "type": "array"
      +      },
      +      "filter": {
      +        "description": "Optional exact-match filter on an activity event's payload, checked before any trigger condition or agent runs. One CEL expression: field == 'value' or field in ['a', 'b'], joined with && and || (parentheses allowed). Fields: chat.activity, call.activity, feedback.activity: source.name, placement, author.role, topic.priority_change, audience; support_ticket.activity: those and support_ticket.status; social_post.activity: those and social_post.kind; pull_request.activity: source.name, change.kind, base.ref (the branch it merges into, exact name), audience; issue.activity: source.name, change.kind, audience. audience is internal (only the organization can read where the item lives) or public (people outside it can, or Modem cannot confirm it is internal). On a conversation activity event, source.name is one of its built-in sources or a custom source's name. E.g. \"source.name in ['zendesk', 'intercom'] && author.role == 'customer'\". Omit to run on every occurrence. Valid on one activity event, or on several conversation activity events, where it may name only source.name, placement, author.role, topic.priority_change and audience.",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "title": "Trigger Filter",
      +        "type": "string"
      +      },
      +      "productIds": {
      +        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      +        "items": {
      +          "format": "uuid",
      +          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Product IDs",
      +        "type": "array"
      +      },
      +      "targetBranches": {
      +        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      +        "items": {
      +          "minLength": 1,
      +          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Target Branches",
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "event",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  4. Changed1 schema field changed
    • changedInput schema / properties / schedule / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "expr": {
      -        "description": "Standard cron expression string.",
      -        "minLength": 1,
      -        "title": "Cron Expression",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "cron",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "expr"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "rrule": {
      -        "description": "iCalendar recurrence rule (RFC 5545) string.",
      -        "minLength": 1,
      -        "title": "RRule",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "rrule",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "rrule"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "at": {
      -        "description": "ISO 8601 timestamp for one-time execution.",
      -        "minLength": 1,
      -        "title": "At Time",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "at",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "n": {
      -        "description": "Number of time units between executions.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Interval",
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "every",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "Time unit for interval scheduling.",
      -        "enum": [
      -          "minutes",
      -          "hours"
      -        ],
      -        "title": "Time Unit",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "unit",
      -      "n"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "channelIds": {
      -        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      -        "items": {
      -          "format": "uuid",
      -          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Channel IDs",
      -        "type": "array"
      -      },
      -      "condition": {
      -        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event. A condition also satisfies an event that requires a channel or product scope.",
      -        "maxLength": 2000,
      -        "minLength": 1,
      -        "title": "Trigger Condition",
      -        "type": "string"
      -      },
      -      "conditionMode": {
      -        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      -        "enum": [
      -          "judge",
      -          "agent"
      -        ],
      -        "title": "Condition Mode",
      -        "type": "string"
      -      },
      -      "conditionSchemaVersion": {
      -        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Condition Schema Version",
      -        "type": "integer"
      -      },
      -      "delaySeconds": {
      -        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      -        "maximum": 604800,
      -        "minimum": 1,
      -        "title": "Delay (seconds)",
      -        "type": "integer"
      -      },
      -      "event": {
      -        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      -        "minLength": 1,
      -        "title": "Event Name (legacy single-event form)",
      -        "type": "string"
      -      },
      -      "events": {
      -        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "title": "Event Names",
      -        "type": "array"
      -      },
      -      "productIds": {
      -        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      -        "items": {
      -          "format": "uuid",
      -          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Product IDs",
      -        "type": "array"
      -      },
      -      "targetBranches": {
      -        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      -        "items": {
      -          "minLength": 1,
      -          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Target Branches",
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "event",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "expr": {
      +        "description": "Standard cron expression string.",
      +        "minLength": 1,
      +        "title": "Cron Expression",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "cron",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "expr"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "rrule": {
      +        "description": "iCalendar recurrence rule (RFC 5545) string.",
      +        "minLength": 1,
      +        "title": "RRule",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "rrule",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "rrule"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "at": {
      +        "description": "ISO 8601 timestamp for one-time execution.",
      +        "minLength": 1,
      +        "title": "At Time",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "at",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "n": {
      +        "description": "Number of time units between executions.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Interval",
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "every",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "Time unit for interval scheduling.",
      +        "enum": [
      +          "minutes",
      +          "hours"
      +        ],
      +        "title": "Time Unit",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "unit",
      +      "n"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "channelIds": {
      +        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      +        "items": {
      +          "format": "uuid",
      +          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Channel IDs",
      +        "type": "array"
      +      },
      +      "condition": {
      +        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event. A condition also satisfies an event that requires a channel or product scope.",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "title": "Trigger Condition",
      +        "type": "string"
      +      },
      +      "conditionMode": {
      +        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      +        "enum": [
      +          "judge",
      +          "agent"
      +        ],
      +        "title": "Condition Mode",
      +        "type": "string"
      +      },
      +      "conditionSchemaVersion": {
      +        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Condition Schema Version",
      +        "type": "integer"
      +      },
      +      "delaySeconds": {
      +        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      +        "maximum": 604800,
      +        "minimum": 1,
      +        "title": "Delay (seconds)",
      +        "type": "integer"
      +      },
      +      "event": {
      +        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      +        "minLength": 1,
      +        "title": "Event Name (legacy single-event form)",
      +        "type": "string"
      +      },
      +      "events": {
      +        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "title": "Event Names",
      +        "type": "array"
      +      },
      +      "filter": {
      +        "description": "Optional exact-match filter on an activity event's payload, checked before any trigger condition or agent runs. One CEL expression: field == 'value' or field in ['a', 'b'], joined with && and || (parentheses allowed). Fields: chat.activity, call.activity, feedback.activity: source.name, placement, author.role, topic.priority_change; support_ticket.activity: those and support_ticket.status; social_post.activity: those and social_post.kind; pull_request.activity: source.name, change.kind, base.ref (the branch it merges into, exact name); issue.activity: source.name, change.kind. On a conversation activity event, source.name is one of its built-in sources or a custom source's name. E.g. \"source.name in ['zendesk', 'intercom'] && author.role == 'customer'\". Omit to run on every occurrence. Valid on one activity event, or on several conversation activity events, where it may name only source.name, placement, author.role and topic.priority_change.",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "title": "Trigger Filter",
      +        "type": "string"
      +      },
      +      "productIds": {
      +        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      +        "items": {
      +          "format": "uuid",
      +          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Product IDs",
      +        "type": "array"
      +      },
      +      "targetBranches": {
      +        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      +        "items": {
      +          "minLength": 1,
      +          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Target Branches",
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "event",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  5. Changed1 schema field changed
    • changedInput schema / properties / schedule / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "expr": {
      -        "description": "Standard cron expression string.",
      -        "minLength": 1,
      -        "title": "Cron Expression",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "cron",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "expr"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "rrule": {
      -        "description": "iCalendar recurrence rule (RFC 5545) string.",
      -        "minLength": 1,
      -        "title": "RRule",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "rrule",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "rrule"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "at": {
      -        "description": "ISO 8601 timestamp for one-time execution.",
      -        "minLength": 1,
      -        "title": "At Time",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "at",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "n": {
      -        "description": "Number of time units between executions.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Interval",
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "every",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "Time unit for interval scheduling.",
      -        "enum": [
      -          "minutes",
      -          "hours"
      -        ],
      -        "title": "Time Unit",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "unit",
      -      "n"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "channelIds": {
      -        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      -        "items": {
      -          "format": "uuid",
      -          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Channel IDs",
      -        "type": "array"
      -      },
      -      "condition": {
      -        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event.",
      -        "maxLength": 2000,
      -        "minLength": 1,
      -        "title": "Trigger Condition",
      -        "type": "string"
      -      },
      -      "conditionMode": {
      -        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      -        "enum": [
      -          "judge",
      -          "agent"
      -        ],
      -        "title": "Condition Mode",
      -        "type": "string"
      -      },
      -      "conditionSchemaVersion": {
      -        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Condition Schema Version",
      -        "type": "integer"
      -      },
      -      "delaySeconds": {
      -        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      -        "maximum": 604800,
      -        "minimum": 1,
      -        "title": "Delay (seconds)",
      -        "type": "integer"
      -      },
      -      "event": {
      -        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      -        "minLength": 1,
      -        "title": "Event Name (legacy single-event form)",
      -        "type": "string"
      -      },
      -      "events": {
      -        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "title": "Event Names",
      -        "type": "array"
      -      },
      -      "productIds": {
      -        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      -        "items": {
      -          "format": "uuid",
      -          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Product IDs",
      -        "type": "array"
      -      },
      -      "targetBranches": {
      -        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      -        "items": {
      -          "minLength": 1,
      -          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Target Branches",
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "event",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "expr": {
      +        "description": "Standard cron expression string.",
      +        "minLength": 1,
      +        "title": "Cron Expression",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "cron",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "expr"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "rrule": {
      +        "description": "iCalendar recurrence rule (RFC 5545) string.",
      +        "minLength": 1,
      +        "title": "RRule",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "rrule",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "rrule"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "at": {
      +        "description": "ISO 8601 timestamp for one-time execution.",
      +        "minLength": 1,
      +        "title": "At Time",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "at",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "n": {
      +        "description": "Number of time units between executions.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Interval",
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "every",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "Time unit for interval scheduling.",
      +        "enum": [
      +          "minutes",
      +          "hours"
      +        ],
      +        "title": "Time Unit",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "unit",
      +      "n"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "channelIds": {
      +        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      +        "items": {
      +          "format": "uuid",
      +          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Channel IDs",
      +        "type": "array"
      +      },
      +      "condition": {
      +        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event. A condition also satisfies an event that requires a channel or product scope.",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "title": "Trigger Condition",
      +        "type": "string"
      +      },
      +      "conditionMode": {
      +        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      +        "enum": [
      +          "judge",
      +          "agent"
      +        ],
      +        "title": "Condition Mode",
      +        "type": "string"
      +      },
      +      "conditionSchemaVersion": {
      +        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Condition Schema Version",
      +        "type": "integer"
      +      },
      +      "delaySeconds": {
      +        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      +        "maximum": 604800,
      +        "minimum": 1,
      +        "title": "Delay (seconds)",
      +        "type": "integer"
      +      },
      +      "event": {
      +        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      +        "minLength": 1,
      +        "title": "Event Name (legacy single-event form)",
      +        "type": "string"
      +      },
      +      "events": {
      +        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "title": "Event Names",
      +        "type": "array"
      +      },
      +      "productIds": {
      +        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      +        "items": {
      +          "format": "uuid",
      +          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Product IDs",
      +        "type": "array"
      +      },
      +      "targetBranches": {
      +        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      +        "items": {
      +          "minLength": 1,
      +          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Target Branches",
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "event",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  6. Changed1 schema field changed
    • changedInput schema / properties / schedule / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "expr": {
      -        "description": "Standard cron expression string.",
      -        "minLength": 1,
      -        "title": "Cron Expression",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "cron",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "expr"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "rrule": {
      -        "description": "iCalendar recurrence rule (RFC 5545) string.",
      -        "minLength": 1,
      -        "title": "RRule",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "rrule",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "rrule"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "at": {
      -        "description": "ISO 8601 timestamp for one-time execution.",
      -        "minLength": 1,
      -        "title": "At Time",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "at",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "n": {
      -        "description": "Number of time units between executions.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Interval",
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "every",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "Time unit for interval scheduling.",
      -        "enum": [
      -          "minutes",
      -          "hours"
      -        ],
      -        "title": "Time Unit",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "unit",
      -      "n"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "channelIds": {
      -        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      -        "items": {
      -          "format": "uuid",
      -          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Channel IDs",
      -        "type": "array"
      -      },
      -      "delaySeconds": {
      -        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      -        "maximum": 604800,
      -        "minimum": 1,
      -        "title": "Delay (seconds)",
      -        "type": "integer"
      -      },
      -      "event": {
      -        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      -        "minLength": 1,
      -        "title": "Event Name (legacy single-event form)",
      -        "type": "string"
      -      },
      -      "events": {
      -        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "title": "Event Names",
      -        "type": "array"
      -      },
      -      "productIds": {
      -        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      -        "items": {
      -          "format": "uuid",
      -          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Product IDs",
      -        "type": "array"
      -      },
      -      "targetBranches": {
      -        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      -        "items": {
      -          "minLength": 1,
      -          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Target Branches",
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "event",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "expr": {
      +        "description": "Standard cron expression string.",
      +        "minLength": 1,
      +        "title": "Cron Expression",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "cron",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "expr"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "rrule": {
      +        "description": "iCalendar recurrence rule (RFC 5545) string.",
      +        "minLength": 1,
      +        "title": "RRule",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "rrule",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "rrule"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "at": {
      +        "description": "ISO 8601 timestamp for one-time execution.",
      +        "minLength": 1,
      +        "title": "At Time",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "at",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "n": {
      +        "description": "Number of time units between executions.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Interval",
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "every",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "Time unit for interval scheduling.",
      +        "enum": [
      +          "minutes",
      +          "hours"
      +        ],
      +        "title": "Time Unit",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "unit",
      +      "n"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "channelIds": {
      +        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      +        "items": {
      +          "format": "uuid",
      +          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Channel IDs",
      +        "type": "array"
      +      },
      +      "condition": {
      +        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event.",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "title": "Trigger Condition",
      +        "type": "string"
      +      },
      +      "conditionMode": {
      +        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      +        "enum": [
      +          "judge",
      +          "agent"
      +        ],
      +        "title": "Condition Mode",
      +        "type": "string"
      +      },
      +      "conditionSchemaVersion": {
      +        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Condition Schema Version",
      +        "type": "integer"
      +      },
      +      "delaySeconds": {
      +        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      +        "maximum": 604800,
      +        "minimum": 1,
      +        "title": "Delay (seconds)",
      +        "type": "integer"
      +      },
      +      "event": {
      +        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      +        "minLength": 1,
      +        "title": "Event Name (legacy single-event form)",
      +        "type": "string"
      +      },
      +      "events": {
      +        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "title": "Event Names",
      +        "type": "array"
      +      },
      +      "productIds": {
      +        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      +        "items": {
      +          "format": "uuid",
      +          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Product IDs",
      +        "type": "array"
      +      },
      +      "targetBranches": {
      +        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      +        "items": {
      +          "minLength": 1,
      +          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Target Branches",
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "event",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  7. Added

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare this is a non-readonly, non-destructive, non-idempotent write. The description adds real value beyond that: it notes you become the owner, timezone is required as an IANA zone, the dashboard URL is available, and the skill should be read before first use. Return shape is disclosed. Not exhaustive on side effects or webhook signing persistence, but strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded and organized into logical blocks (schedule formats, prompt guidelines, model level guidelines, timezone). Almost every sentence carries operative detail for a genuinely complex tool. It borders on verbose but earns most of its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, high-complexity creation tool with no output schema, the description covers the tricky parts (schedule variants, model levels, prompt guidance, return value). Some parameters (outcome/webhook, outputChannels, capabilityMode, allowedCapabilities) are left to the 91%-covered schema, which is reasonable, so completeness is strong but not total.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 91%, yet the description still adds substantial meaning: the five schedule formats with constraints (min 30 min cadence, at must be future, event lists up to 20), the legacy event alias vs canonical events, delaySeconds semantics, condition filtering, and model-level selection heuristics. This is well beyond restating schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Create an automation"), enumerates concrete use cases (reminders, follow-ups, periodic tasks, event-driven workflows), and states the return value (full automation object including nextRunAt). It is clearly distinguishable from siblings like update_automation and list_automations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives rich guidance on how to choose schedule types, model level tiers (with examples of low/med/high), and a prerequisite to read the automations skill before the first call. It does not explicitly contrast create vs update_automation, but the context for correct invocation is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources