Schedules, intervals, and events

WOML
<schedule id="dailyReport" cron="0 8 * * *" timezone="Europe/Berlin" on-missed="run-once" />
AttributeRequiredMeaning
idYesTrigger identity.
cronYesFive numeric fields: minute, hour, day-of-month, month, day-of-week.
timezoneNoCanonical IANA timezone; defaults to UTC.
on-missedNoskip or run-once; defaults to skip.

WOML Cron v1 supports wildcards, lists, inclusive ranges, and /step. It does not support seconds, names, macros, wrapping ranges, or Quartz-only tokens. Restricted day-of-month and day-of-week use POSIX OR semantics. DST nonexistent times are skipped; repeated wall times map to both UTC instants. Payload: { scheduledAt, triggeredAt } using RFC 3339 UTC timestamps.

<interval>

WOML
<interval id="refreshCache" every="5m" on-missed="skip" />
AttributeRequiredMeaning
idYesTrigger identity.
everyYesFixed interval from 1s through 30d.
on-missedNoskip or run-once; defaults to skip.

Intervals use an anchored fixed-rate grid, so a slow run does not shift future planned instants. Payload: { scheduledAt, triggeredAt }.

<event>

WOML
<event
  id="orderCreated"
  name="order.created"
  secret="{{secrets.EVENT_CONTROL_TOKEN}}"
>
  <schema>{ "type": "object", "required": ["orderId"] }</schema>
</event>
AttributeRequiredMeaning
idYesTrigger identity.
nameYesNamed event, max 256 characters, with at least two lowercase segments separated by ., _, or -.
secretNoEnables authenticated public HTTP publication when present. Omit for internal-only events.

The optional schema follows the webhook schema rules. With a secret, the runtime exposes POST /_woml/events/{eventName} and requires a bearer token plus an Event-ID. One publication fans out to every exact-name subscriber. Each subscriber validates and admits independently, so the result may be accepted, partial, or rejected. Without a secret, no public route is opened, but services.events.emit() can still publish internally.