Trigger authoring

A workflow can start only through a declared trigger that the caller is authorized to use. The trigger schema defines six kinds.

Kind Host-owned binding Purpose
api authenticated API permission Immediate API start
schedule reconciled Temporal Schedule Recurring cadence
webhook registered verifier/source Signed webhook start
event registered CloudEvent mapper Cloud/provider event start
broker registered broker subscription Queue/topic start
host registered adapter Application-owned ingress
triggers:
  orders_api:
    kind: api
    workflow: process_order
  orders_webhook:
    kind: webhook
    workflow: process_order
    source: commerce
  object_created:
    kind: event
    workflow: ingest_object
    mapping: s3_object_created

Source, mapping, broker, and adapter names resolve only from trusted host registration. Payloads cannot select a scope or add authority. paused: true blocks new starts for every kind. Engine-owned maintenance, activation, scheduled-start, and dispatch workflows are internal-only: they are not declared tenant targets, are omitted from public workflow lists, and cannot be started through an external trigger.

Recurring schedules

A schedule trigger sets the cadence, timezone, overlap behavior, catch-up limits, optional backfill, input, and an optional fixed definition digest. Cron, calendar, and interval specs are supported; interval schedules use UTC.

triggers:
  daily_reporting:
    kind: schedule
    workflow: scheduled_reporting
    input:
      report_date: "2026-08-10"
    spec:
      kind: cron
      expressions: ["0 9 * * *"]
    timezone: Europe/Zurich
    overlap_policy: buffer_one
    catch_up_window_seconds: 3600
    paused: true
    backfill:
      enabled: true
      max_window_seconds: 604800
      max_actions: 7

Plan before apply. Deployment automation may use --non-interactive; interactive operation uses the freshly computed plan digest. Run-now requires an idempotency key.

justflow triggers --config-dir configs plan
justflow triggers --config-dir configs apply --confirm PLAN_DIGEST
justflow triggers --config-dir configs trigger-now daily_reporting --idempotency-key RUN_IDENTITY

Pause state is preserved as operator state across reconciliation. Deletion requires the current desired identity. Schedule reconciliation never adopts unrelated Temporal schedules.

Migrating schedules.yaml

The 0.1 contract uses triggers.yaml; schedules.yaml and justflow schedules are obsolete. Move each declaration under triggers, add kind: schedule and its workflow, validate, then use justflow triggers plan. The plan reports retained unscoped state and requires an explicit migrate or retain decision before mutation.

One-off scheduled starts

Scheduled starts are API-created future invocations, not YAML and not recurring configuration. They have independent versioned reschedule/cancel semantics and resolve the active definition at fire time. See scheduled-start operations.