/schedules, /schedules/new,
/schedules/:scheduleId, /schedules/:scheduleId/edit). The admin app’s
/scheduler page is a different thing: it shows the platform’s internal system jobs.
What it does
Two cadence types.schedule_type is interval (seconds, minimum 3600) or cron
(a cron expression evaluated in the schedule’s timezone, default UTC). Presets
(preset_key: hourly, daily, weekly, monthly) are stored for the UI; intervals
of a day or longer snap to 02:00 UTC so daily work lands at a quiet hour.
Five targets (target_system).
Overlap handling. With
overlap_policy skip (default) a firing is skipped while a
previous run is still active (a non-terminal task, or for workflow targets a running
or suspended execution). With queue_one at most one follow-up task is queued behind
the active run.
Lifecycle. status is active, paused or retired. A schedule can be paused and
resumed, retired for good (retired schedules cannot be edited or triggered), capped at
max_runs, and it pauses itself after auto_pause_after_failures consecutive run
failures. Launch failures (a missing workflow, a guardrail block, a dispatch error)
count separately as trigger failures and auto-pause after three.
Run history and stats. taskScheduleRuns lists the tasks a schedule produced,
taskScheduleWorkflowRuns the workflow executions, and taskScheduleStats gives
total, completed, failed and cancelled runs, success rate, average duration and cost.
Run now. triggerTaskScheduleNow fires a schedule immediately, subject to the same
overlap and max_runs checks.
Who can use it
- Every schedule query and mutation is open to any company member (membership only); there is no separate editor or admin gate. That includes filing a schedule in a folder; managing the folders themselves needs Editor (see Folders).
- The
githubandjiratargets additionally need an active connection from Integrations. - No plan or tier gate exists for schedules.
How to configure it
- Open Tasks -> Schedules -> New and fill the cadence:
createTaskSchedule(input)withschedule_type, and eitherinterval_seconds(at least 3600) orcron_expression(validated with croniter) plustimezone(validated as an IANA zone). - Pick the target. For
olyros, choose an agent (required) and optionally an OHO instance, executor, runtime, working directory, priority and repositories. Forworkflow, pick the workflow and enter the parameter values itsapi_triggernode declares. Forgithuborjira, pick the connection and the repository or project and issue type; the agent is required because the issue carries its trigger. Validation rejects input before anything is written: every repository must belong to one of the company’s GitHub connections and still be granted to the GitHub App installation;target_connection_idis accepted only forgithubandjira; awork_itemtarget’sexecutor_affinitymust be one of the company’s OHO instances or an execution backend visible to the company, and agithub_content_syncwork item needs a company repository. Ids from another company answer “not found” like unknown ids. - Set
overlap_policy,max_runsandauto_pause_after_failures(default 3). - Manage it from the detail page:
updateTaskSchedule(the target system cannot be changed after creation),pauseTaskSchedule,resumeTaskSchedule,retireTaskSchedule,triggerTaskScheduleNow.
Folders
A folder is a named group a company uses to organise its schedules. Folders belong to the company, not to a user. Each folder belongs to one area: the folders created under Schedules hold schedules only and never appear under Workflows, which has its own folders (see Workflows). A schedule is in at most one folder; a schedule in no folder is Unfiled. Filing a schedule changes nothing about what it runs or when.- Who manages folders. Creating, editing (name, description, colour) and deleting a
folder needs the Editor role or higher (ability
folder.manage). Any member can see the folder list. - Order. Folders are listed alphabetically, ignoring case. There is no manual order.
- Who files a schedule. Any company member, the same as every other schedule edit
today:
folderIdoncreateTaskScheduleandupdateTaskSchedule, ormoveTaskSchedulesToFolder(scheduleIds, folderId)for one or many schedules at once (all or nothing;folderIdnull means Unfiled). Retired schedules can be moved. - Deleting a folder never deletes schedules:
deleteFoldermoves them to Unfiled and deletes the folder in one step. A move into the folder that races the delete fails with “Folder not found”. - Names are trimmed and must be 1 to 100 characters. They are unique per area ignoring
case (
Reportsandreportscollide under Schedules), so the same name may also exist under Workflows, and/is allowed. Invisible characters are refused, except the joiners inside emoji. Colours are free strings up to 20 characters. - Descriptions are optional and may span several lines. Windows and old Mac line breaks are stored as plain line breaks. The text is trimmed and at most 500 characters. Tabs and other invisible characters are refused, as in names.
- Listing.
folders(context: SCHEDULES)lists the Schedules folders, andcreateFolder(context: SCHEDULES, ...)creates one.taskSchedulesPagefilters byfolderIdor byunfiledOnly(not both), andtaskScheduleFolderCounts(statuses)returns the total, the Unfiled count and a count per folder for the same status filter. - A Workflows folder, or a folder from another company, answers “Folder not found” when used to file, move or filter schedules, like an unknown id. The database also refuses filing a schedule in another company’s folder.
Limits and defaults
What it emits
- Cloud tasks or workflow executions tagged with the schedule id and run number, so usage and cost roll up per schedule.
- GitHub or Jira issues for those targets, which the integration then turns into tasks (GitHub) or leaves for a workflow to pick up (Jira).
- Work items for OHO pull loops.
- Failure counters and
last_trigger_erroron the schedule itself, plus automatic pausing.
Known gaps
- Schedules reference executors and runtimes by name (
executor_name,runtime_name), not by id; aworkflowtarget avoids this because itscreate_tasknode carries the ids. - The
jiratarget creates the issue but does not create a task: there is no per-connection Jira trigger setting, so a task starts only if a workflow with ajira_eventtrigger on that connection picks the issue up. Use theworkflowtarget for scheduled work that needs no Jira issue. - A repository removed from the GitHub App installation after a schedule was saved
stays on the schedule; each
olyrosrun that mounts it fails with a “no longer granted” error until the repository is granted again or edited out. queue_oneis defined in terms of cloud tasks (one task waits increatedstate behind the active run); the overlap check forworkflowtargets looks at executions, and no equivalent queue exists for them.- There is no per-schedule notification; failures surface on the detail page and, for
the
olyrostarget, on the task. - Fields
duplicate_tracking_methodandduplicate_tracking_fieldexist on the model and are not exposed or used.