Skip to main content

Schedules, renewal, and updates

Acurast jobs have a scheduled start and end. An Application is long-lived; Liskov continues its desired behavior by creating successor deployments and jobs under an explicit lifecycle policy.

Choose a duration​

This example is historical Manifest V4 syntax for stored records. New V4 imports and publications are refused. For a new Application, use the retained V5 execution and lifecycle fields.

{
"deployment": {
"parallelism": 1,
"schedule": { "durationMs": 3600000 },
"lifecycle": {
"renewal": { "mode": "after_scheduled_end" },
"update": {
"timing": "immediate",
"existingJobs": { "mode": "run_until_scheduled_end" }
},
"recovery": {
"launch": { "maxRetries": 5 },
"runtimeFailure": { "mode": "wait_until_scheduled_end" }
}
}
}
}

Manifest V4. The example requests a one-hour job. after_scheduled_end begins successor work after the predecessor's scheduled boundary. A fixed before_scheduled_end lead can request bounded overlap, but it does not guarantee readiness before the old job ends: market assignment and startup are external facts.

For Manifest V4, choose durationMs of at least 60 seconds and maxStartDelayMs of at most one hour. A caller-supplied start must be no more than 24 hours ahead when the job is submitted. The CLI and Console authoring paths refuse these errors before Acurast registration and identify the offending schedule field.

The first public capability supports parallelism 1, fixed lead time or after-end renewal, and an open market. Automatic lead calculation is not enabled.

Run on a fixed interval (release-gated)​

A job schedule and renewal keep one Application running. Some work should instead start a finite occurrence at a fixed cadence, such as once an hour. Manifest V5 describes that as execution with mode: interval, a required every duration, and an optional until bound.

This is release-gated. Liskov does not launch an interval Application yet, so do not use it for work you depend on; Capabilities and limits owns its current boundary. The accepted behavior, including skips, pause, and the absence of catch-up runs, is in the Manifest V5 reference.

When it is released, the Console Coverage card and proof liskov application execution show read the same schedule from Liskov and state one of:

ReadingMeaning
Next run at timeThe next boundary Liskov recorded is still ahead.
Run due at time; a run is still activeThe boundary has passed while the previous occurrence is still running. It does not overlap.
Run due at time; no run has started yetThe boundary has passed and no occurrence is live yet.
No next run while stoppedThe Application is paused, a draft, retiring, or retired.
No next run is scheduledLiskov recorded no further boundary: until was reached, or no boundary has been decided yet. The reading does not say which.
Next run not reportedThis read carried no schedule, so no next run is shown.

Each time is Liskov's recorded boundary, compared with the time of the same read. Neither client calculates a cadence from every or from your clock, and neither shows a job's renewal deadline as the next run.

Updates​

For a continuous Manifest V5 Application, every publish takes effect now. A new policy version, including one that changes only the artifact, starts its successor at the next executor pass. An executor pass is the next time Liskov checks the Application and starts work that is due. From that moment, every job in the deployment starts at once on a fresh renewal grid. A renewal grid is the repeating schedule of windows that an unchanged Application keeps. With evenly_spaced phasing, a later phase's first window ends on its own place in that grid, so the first window can be shorter than the duration you wrote.

update.timing: immediate is the default, and it means now. next_renewal is the explicit choice to wait. The successor then starts one renewal lead before the running job's scheduled end. The renewal lead is how long before that scheduled end Liskov starts the next job when you choose to wait. The scheduled end is the end time registered for the current job's window.

Only update.existingJobs.mode decides what happens to the old job. stop_when_successor_ready, the default, stops the old job once the new runtime is ready. run_until_scheduled_end lets the old job run until its scheduled end. A job that has failed, or that Liskov has lost contact with, is not waited for in either mode.

Overlap is paid. With run_until_scheduled_end, and until the new runtime is ready under stop_when_successor_ready, the old job and its successor are reserved at once. The overlap lasts no longer than the rest of the old job's window. The Service Credit reserve for that shorter time is in proportion to the time reserved, as for any window. Use idempotency and external coordination where duplicate work matters.

Updating does not edit registered Acurast code, schedule, environment, or secrets in place. The timeline records actual overlap and gap evidence. See Update an Application.

Failure behavior​

launch.maxRetries is a bounded budget for launch-stage failure; zero disables those retries. In Manifest V4, the supported runtime-failure mode waits until scheduled end. Automatic fresh registration after runtime contact loss is typed in V4 but not enabled in the first public capability set.

A job that has failed or lost contact is not waited for by a publish. With update.timing: immediate, the successor starts at the next executor pass under either existingJobs mode.

Verify​

Before publication, review duration, update timing, predecessor behavior, and spend caps together. After a renewal or update, compare predecessor and successor policy, deployment, job, scheduled-end, processor, and runtime-ready timestamps. Do not infer continuous service from desired policy alone.

See Replacement custody and time-boxed execution for the control model and Update an Application for the task flow.