jdx/mise · error

agent ' ' `start_calendar_interval` must not be empty

Error message

agent '{agent_name}' `start_calendar_interval` must not be empty

What it means

Thrown when `start_calendar_interval` is provided as a list and that list is empty. launchd cannot schedule anything from an empty array of calendar intervals, so the library rejects it during validation. Providing the key at all signals intent to schedule, so an empty list is a configuration error rather than a no-op.

Solutions

  1. Add at least one calendar interval object to the list, each with at least one field (e.g. `[{ minute = 0, hour = 3 }]`).
  2. If scheduling should be disabled, remove the `start_calendar_interval` key entirely.
  3. Check any template/tooling that generates the list to ensure at least one interval is emitted or the key is omitted.

Example fix

# before
[agents.backup.system]
start_calendar_interval = []

# after
[agents.backup.system]
start_calendar_interval = [{ minute = 0, hour = 3 }]
Defensive patterns

Strategy: validation

Validate before calling

function validateIntervals(intervals) {
  if (Array.isArray(intervals) && intervals.length === 0) {
    throw new Error('start_calendar_interval must not be empty');
  }
}

Type guard

function nonEmptyIntervals(v) {
  return Array.isArray(v) && v.length > 0 ? v : null;
}

Prevention

When it happens

Trigger: Declaring `start_calendar_interval = []` (an empty multiple-interval list) in an agent's system configuration; programmatically building the intervals array and leaving it with zero entries.

Common situations: Templated configs where the intervals list is generated from variables that resolved to nothing; users removing all list entries intending to disable scheduling; copy-paste of a multi-entry example with entries deleted.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/194cf48fe9c3fc72. Report an issue: GitHub.

Appendix: source

Thrown at src/system/launchd.rs:191

        {
            bail!("agent '{agent_name}' `start_calendar_interval` must set at least one field");
        }
        validate_range(agent_name, "minute", self.minute, 0, 59)?;
        validate_range(agent_name, "hour", self.hour, 0, 23)?;
        validate_range(agent_name, "day", self.day, 1, 31)?;
        validate_range(agent_name, "weekday", self.weekday, 0, 7)?;
        validate_range(agent_name, "month", self.month, 1, 12)?;
        Ok(())
    }
}

impl LaunchdCalendarIntervals {
    fn validate(&self, agent_name: &str) -> Result<()> {
        match self {
            Self::Single(interval) => interval.validate(agent_name),
            Self::Multiple(intervals) => {
                if intervals.is_empty() {
                    bail!("agent '{agent_name}' `start_calendar_interval` must not be empty");
                }
                for interval in intervals {
                    interval.validate(agent_name)?;
                }
                Ok(())
            }
        }
    }
}

fn validate_range(
    agent_name: &str,
    field: &str,
    value: Option<u8>,
    min: u8,
    max: u8,
) -> Result<()> {
    if let Some(value) = value

View on GitHub (pinned to 533346cc37)