Jobs and triggers
How a job is evaluated, retried, and kept idempotent.
Triggers
time — run every N seconds. block — run every N blocks. balance — run when a token or native balance crosses a threshold. state — run when a view function returns a value matching a comparator. event — run when a log matching a topic is emitted.
Idempotency
Each evaluation window produces a deterministic key: job id + window. Retries append an attempt suffix. The database enforces uniqueness, so a crashed keeper that restarts cannot double-execute the same window.
idempotency_key = `${jobId}:${windowStart}:a${attempt}`Policy limits
Every job carries a budget, a per-execution cap, a daily execution cap, and a gas limit. The keeper checks all four before simulating. Exceeding any of them records a skipped attempt with the reason.