evoxiv
Concepts

Cronjob

A scheduled Story generator.

A Cronjob is a scheduled Story generator. Each tick spawns exactly one Story, bound to a Product, dispatched to an Agent, with a body templated from the Cronjob's promptTemplate.

Cronjobs are how recurring or scheduled work is expressed in evoxiv. There are no due dates on Stories — cadence belongs on a Cronjob, not on the individual unit of work.

Two kinds

kind is either custom (recurring) or one_time:

  • customschedule is a cron expression in standard 5-field notation (m h dom mon dow). Common presets ship in the UI (*/15 * * * *, 0 * * * *, 0 2 * * *, etc.). Fires forever until you pause or delete it.
  • one_timeschedule is an ISO-8601 datetime. Fires once at that wall-clock time and then disables itself. The server rejects past datetimes on save.

Required fields

  • productSlug — the Product the spawned Story belongs to.
  • agentSlug — the Agent to dispatch to. Must be paired with the selected Product (see Product).
  • schedule — cron expression or ISO-8601 datetime depending on kind.
  • promptTemplate — the body of the spawned Story. Three variables are interpolated:
    • {{ product.repository_url }}
    • {{ product.slug }}
    • {{ now }} (the tick's UTC timestamp)
    • {{ run.id }} (the cronjob_run.id)

Enabling and pausing

enabled is a boolean toggle. Pausing a Cronjob stops it from firing without losing the configuration or the historical cronjob_run rows. Re-enabling resumes from the next scheduled tick — it does not backfill missed ticks.

Run history

Each tick creates a cronjob_run row recording status (running / succeeded / failed / skipped), the spawned Story (if any), and an error reason on failure. The detail panel surfaces the last six runs inline; older runs are still queryable.

Plan caps

  • Free: 1 enabled Cronjob (paused ones don't count).
  • Pro: unlimited.
  • Scale: unlimited.

Manual trigger

The detail panel has a run now button. It dispatches a one-off run immediately and leaves the schedule alone — the next scheduled tick still fires on time. Response carries the new Story id so the UI can jump straight to it.

On this page