One persisted recurring-schedule entry — the shape of an element of a document's system.scheduledActions.

interface ScheduledAction {
    actionName: string;
    anchor: number;
    interval: number;
    payload?: Record<string, unknown>;
    predicate?: string;
    sceneUuid?: string;
    triggerName?: string;
}

Properties

actionName: string

The action shortcode to run on the owning document's logic.

anchor: number

World time (seconds) the schedule was last set from.

interval: number

Seconds from anchor to the next fire.

payload?: Record<string, unknown>

Opaque data handed to the action as its scope when performed.

predicate?: string

Optional predicate source (a sohl.entity.expr.SafeExpression string) gating an event-driven schedule (issue #622/#569). When set, the armed subscription fires only when it evaluates truthy against the trigger context, with subscriberUuid bound to this document's uuid — e.g. "combatant.actor.uuid === subscriberUuid" scopes a turnEnd schedule to the end of the subscriber's own combat turn. Ignored for a time schedule.

sceneUuid?: string

The uuid of the scene this schedule is bound to (issue #590). When set, the schedule is offered only while that scene is the active scene — a location-bound event (bandits at a hideout) does not fire while the party is elsewhere, and a check that came due while away surfaces when they return. Absent (or blank) means world-wide: it fires regardless of the active scene.

triggerName?: string

The lifecycle trigger this schedule listens to (issue #622). Absent or "updateWorldTime" means a time-based schedule that fires at anchor + interval — the original and default behavior. Any other value ("turnEnd", "roundEnd", "combatStart", a scene-region trigger, …) makes it event-driven: it is armed as a live SohlSubscription on that trigger and re-offers on every fire, with no fireAt (interval is then unused). See isTimeTrigger.