{"record":{"id":"6f52da23946d7010","repo":"temporalio/temporal","slug":"errs","errorCode":null,"errorMessage":"${errs}","messagePattern":"\\$\\{errs\\}","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"service/worker/scheduler/calendar.go","lineNumber":236,"sourceCode":"\tmakeRangeOrNil := func(s, field, def string, minVal, maxVal int, parseMode parseMode) []*schedulepb.Range {\n\t\tr, err := makeRange(s, field, def, minVal, maxVal, parseMode)\n\t\tif err != nil {\n\t\t\terrs = append(errs, err.Error())\n\t\t}\n\t\treturn r\n\t}\n\tss := &schedulepb.StructuredCalendarSpec{\n\t\tSecond:     makeRangeOrNil(cal.Second, \"Second\", \"0\", 0, 59, parseModeInt),\n\t\tMinute:     makeRangeOrNil(cal.Minute, \"Minute\", \"0\", 0, 59, parseModeInt),\n\t\tHour:       makeRangeOrNil(cal.Hour, \"Hour\", \"0\", 0, 23, parseModeInt),\n\t\tDayOfWeek:  makeRangeOrNil(cal.DayOfWeek, \"DayOfWeek\", \"*\", 0, 7, parseModeDow),\n\t\tDayOfMonth: makeRangeOrNil(cal.DayOfMonth, \"DayOfMonth\", \"*\", 1, 31, parseModeInt),\n\t\tMonth:      makeRangeOrNil(cal.Month, \"Month\", \"*\", 1, 12, parseModeMonth),\n\t\tYear:       makeRangeOrNil(cal.Year, \"Year\", \"*\", minCalendarYear, maxCalendarYear, parseModeYear),\n\t\tComment:    cal.Comment,\n\t}\n\tif len(errs) > 0 {\n\t\treturn nil, errors.New(strings.Join(errs, \", \"))\n\t}\n\treturn ss, nil\n}\n\nfunc parseCronString(c string) (*schedulepb.StructuredCalendarSpec, *schedulepb.IntervalSpec, string, error) {\n\tvar tzName string\n\tvar comment string\n\n\tc = strings.TrimSpace(c)\n\n\t// split out timezone\n\tif strings.HasPrefix(c, \"TZ=\") || strings.HasPrefix(c, \"CRON_TZ=\") {\n\t\ttz, rest, found := strings.Cut(c, \" \")\n\t\tif !found {\n\t\t\treturn nil, nil, \"\", errors.New(\"CronString has time zone but missing fields\")\n\t\t}\n\t\tc = rest\n\t\t_, tzName, _ = strings.Cut(tz, \"=\")","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/temporalio/temporal/blob/bde624efd13fbd3843654058db6d9c716166318b/service/worker/scheduler/calendar.go#L218-L254","documentation":"parseCalendarToStructured converts a CalendarSpec into a StructuredCalendarSpec by parsing each field independently; errors from every field are collected and joined with commas into a single error listing all offending fields (e.g. \"DayOfMonth: ... out of range, Month: ...\"). It fires when any of Second/Minute/Hour/DayOfWeek/DayOfMonth/Month/Year is malformed or out of range.","triggerScenarios":"Creating a schedule with a CalendarSpec whose fields include invalid values or unparsable expressions (bad ranges, unknown month/day names, values outside each field's bounds).","commonSituations":"Constructing CalendarSpec protobufs programmatically with uninitialized or wrong-range fields; validating user-supplied cron strings via the scheduler; copies of legacy specs after schema/version changes to field formats.","solutions":["Parse the joined message: each comma-separated segment names the failing field; fix each one's value/expression.","Validate ranges before constructing the spec (Second 0-59, Minute 0-59, Hour 0-23, DayOfMonth 1-31, Month 1-12, DayOfWeek 0-7, Year in supported range).","Use '*' for fields you don't intend to constrain instead of numeric guesses.","Test the spec locally with parseCalendarToStructured/mustCompileCalendarSpec or a unit test before applying to production schedules."],"exampleFix":"// before\ncal.Month = \"13\"\ncal.DayOfWeek = \"8\"\n// after\ncal.Month = \"1-12\"\ncal.DayOfWeek = \"0-6\"","handlingStrategy":"validation","validationCode":"var fieldBounds = map[string][2]int{\n\t\"Second\": {0, 59}, \"Minute\": {0, 59}, \"Hour\": {0, 23},\n\t\"DayOfMonth\": {1, 31}, \"Month\": {1, 12}, \"DayOfWeek\": {0, 7},\n}","typeGuard":null,"tryCatchPattern":"ss, err := parseCalendarToStructured(cal)\nif err != nil {\n\tfor _, part := range strings.Split(err.Error(), \", \") {\n\t\t// each part names one invalid field; fix and retry\n\t}\n}","preventionTips":["Fix each comma-separated field name reported in the error message.","Use '*' for unconstrained fields instead of guessed numbers.","Add unit tests compiling calendar specs before production schedule updates."],"tags":["scheduler","calendar-spec","validation","go"],"backgroundTag":"schedule-spec-validation-failed","analyzedSha":"bde624efd13fbd3843654058db6d9c716166318b","analyzedAt":"2026-09-01T07:18:39.080Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}