twentyhq/twenty · error · Error
Failed to describe cron expression: ${errorMessage}
Error message
Failed to describe cron expression: ${errorMessage} What it means
Top-level catch-all wrapper in describeCronExpression: any error thrown inside the try block (most commonly from parseCronExpression) is re-thrown with the prefix 'Failed to describe cron expression: ' plus the inner error message. This is the error users see for malformed cron input.
Source
Thrown at packages/twenty-front/src/modules/workflow/workflow-trigger/utils/cron-to-human/describeCronExpression.ts:114
}
const monthsDesc = getMonthsDescription(
parts.month,
mergedOptions,
localeCatalog,
);
if (isDefined(monthsDesc) && monthsDesc !== '') {
descriptions.push(monthsDesc);
}
if (descriptions.length === 0) {
return t`every minute`;
}
// Simple joining - just use spaces, no commas for cleaner descriptions
return descriptions.join(' ');
} catch (error) {
const errorMessage =
error instanceof Error ? error.message : 'Unknown error';
throw new Error(`Failed to describe cron expression: ${errorMessage}`);
}
};
View on GitHub (pinned to 1f5dd2bbd2)
Solutions
- Read the suffixed inner message to identify which validation failed (field count vs cron-parser range error).
- Correct the cron expression to valid 5-field syntax with in-range values.
- If surfacing to users, strip the 'Failed to describe cron expression: ' prefix and show only the inner reason.
Example fix
// before: cron '99 99 * * *' -> 'Failed to describe cron expression: Invalid cron expression: ...' // after: cron '0 9 * * *' -> 'at 09:00'
Defensive patterns
Strategy: try-catch
Validate before calling
const tryDescribeCron = (expr: string): string => {
try { return describeCronExpression(expr); }
catch (e) { return ''; }
}; Type guard
const isValidCron = (expr: string): boolean => {
try { parseCronExpression(expr); return true; } catch { return false; }
}; Try / catch
try {
const human = describeCronExpression(expr);
} catch (e) {
// strip the wrapper prefix to show only the inner reason
const inner = (e as Error).message.replace(/^Failed to describe cron expression: /, '');
setScheduleError(inner);
} Prevention
- Validate cron before letting the user save the schedule.
- Provide a cron-picker UI that only emits valid 5-field expressions.
- Surface the inner error message to users rather than the wrapper.
When it happens
Trigger: parseCronExpression throws (invalid field count, cron-parser rejects out-of-range values like minute 99). A descriptor helper throws on unsupported syntax. Any non-Error throw produces 'Unknown error'.
Common situations: User types an invalid cron expression in the workflow schedule editor (e.g., '99 99 * * *', '*/5 / / * *', too many fields). Out-of-range or non-numeric field values.
Related errors
- Cron expression is required
- Cron expression is required
- Invalid cron expression. Expected 4-6 fields, got ${parts.le
- Malformed workflow version: missing steps information; be su
- Invalid cron expression: ${errorMessage}
AI-assisted analysis of twentyhq/twenty@1f5dd2bbd2 (2026-08-12).
Data as JSON: /api/errors/e0ddee75b98ae60a.
Report an issue: GitHub.