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:
custom—scheduleis 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_time—scheduleis 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 onkind.promptTemplate— the body of the spawned Story. Three variables are interpolated:{{ product.repository_url }}{{ product.slug }}{{ now }}(the tick's UTC timestamp){{ run.id }}(thecronjob_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.