nexu-io/open-design · error · Error

--schedule is required. Forms: hourly:<minute> | daily:HH:MM

Error message

--schedule is required. Forms: hourly:<minute> | daily:HH:MM[:TZ] | weekdays:HH:MM[:TZ] | weekly:DAY:HH:MM[:TZ]

What it means

Thrown by parseScheduleFlag when the --schedule value is missing (null/undefined), empty, or not a string. parseScheduleFlag backs `od automation create` and `od automation update` for the --schedule flag, which is required for scheduled automations. The message lists every accepted form.

Source

Thrown at apps/daemon/src/cli.ts:10492

  console.log(`verifyEnabled         ${formatMemoryConfigSwitch(data.verifyEnabled)}`);
  return;
}

// ---------------------------------------------------------------------------
// Subcommand: od automation …
//
// Headless surface for the Automations tab. This is the dual-track contract:
// every capability the Automations UI exposes is reachable here so an
// external agent (hermes-agent, openclaw, custom Slackbot, etc.) can run
// the full lifecycle — list, create, fire, harvest, retire — without
// rendering a page. Storage is /api/routines on the local daemon; the
// "routine" name is the implementation detail, "automation" is the user-
// facing surface.
// ---------------------------------------------------------------------------

function parseScheduleFlag(raw) {
  if (!raw || typeof raw !== 'string') {
    throw new Error(
      '--schedule is required. Forms: hourly:<minute> | daily:HH:MM[:TZ] | weekdays:HH:MM[:TZ] | weekly:DAY:HH:MM[:TZ]',
    );
  }
  const parts = raw.split(':');
  const kind = parts[0];
  if (kind === 'hourly') {
    const minute = Number(parts[1]);
    if (!Number.isInteger(minute) || minute < 0 || minute > 59) {
      throw new Error('--schedule hourly requires :<minute>, 0-59');
    }
    return { kind: 'hourly', minute };
  }
  if (kind === 'daily' || kind === 'weekdays') {
    if (parts.length < 3) {
      throw new Error(`--schedule ${kind} requires :HH:MM[:TZ]`);
    }
    const hh = parts[1];
    const mm = parts[2];

View on GitHub (pinned to 5be4028344)

Solutions

  1. Provide --schedule with one of the documented forms: hourly:<minute>, daily:HH:MM[:TZ], weekdays:HH:MM[:TZ], weekly:DAY:HH:MM[:TZ].
  2. If you want a non-scheduled (trigger-only) automation, omit --schedule entirely rather than passing an empty value.
  3. Validate the schedule string in your wrapper script before invoking od.
  4. Use `od automation create --help` to see the schedule grammar examples.

Example fix

# before
od automation create --name daily --prompt-file p.txt --schedule
# after
od automation create --name daily --prompt-file p.txt --schedule daily:09:00:America/New_York
Defensive patterns

Strategy: validation

Validate before calling

const SCHEDULE_RE = /^(hourly:\d{1,2}|daily:\d{1,2}:\d{2}(:[^:]+)?|weekdays:\d{1,2}:\d{2}(:[^:]+)?|weekly:[0-6a-z]{3}:\d{1,2}:\d{2}(:[^:]+)?)$/;
if (!SCHEDULE_RE.test(String(rawSchedule))) {
  throw new Error('--schedule is required. Forms: hourly:<minute> | daily:HH:MM[:TZ] | weekdays:HH:MM[:TZ] | weekly:DAY:HH:MM[:TZ]');
}

Type guard

const isScheduleString = (v: unknown): v is string =>
  typeof v === 'string' &&
  /^(hourly:|daily:|weekdays:|weekly:)/.test(v);

Prevention

When it happens

Trigger: Creating or updating an automation with `--schedule` omitted, set to empty (`--schedule=`), or with no value at all when --schedule is a string flag. Also when the caller passes `--schedule` expecting a default.

Common situations: Building a scheduled automation but forgetting --schedule; copy-pasting a command that previously used a trigger-only automation; a wrapper script that conditionally passes --schedule and the condition evaluated false.

Related errors


AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12). Data as JSON: /api/errors/ed3b81574300e93f. Report an issue: GitHub.