argoproj/argo-workflows · error
task result '%s' for task '%s' is invalid
Error message
task result '%s' for task '%s' is invalid
What it means
ValidateTaskResults parses depends expressions like 'taskName.Succeeded' in DAG tasks and rejects any task-result suffix that isn't one of the supported ones (Succeeded, Failed, Skipped, Omitted, Errored, Daemoned, AnySucceeded, AllFailed). Prevents silent typos in depends logic from being treated as always-false conditions.
Source
Thrown at workflow/common/ancestry.go:104
return dependencies, depends
}
func ValidateTaskResults(dagTask *wfv1.DAGTask) error {
// If a user didn't specify a depends expression, there are no task results to validate
if dagTask.Depends == "" {
return nil
}
matches := taskResultRegex.FindAllStringSubmatch(dagTask.Depends, -1)
for _, matchGroup := range matches {
split := strings.Split(matchGroup[1], ".")
taskName, taskResult := split[0], TaskResult(split[1])
switch taskResult {
case TaskResultSucceeded, TaskResultFailed, TaskResultSkipped, TaskResultOmitted, TaskResultErrored, TaskResultDaemoned, TaskResultAnySucceeded, TaskResultAllFailed:
// Do nothing
default:
return fmt.Errorf("task result '%s' for task '%s' is invalid", taskResult, taskName)
}
}
return nil
}
func getTaskDependsLogic(ctx context.Context, dagTask *wfv1.DAGTask, dctx DagContext) string {
if dagTask.Depends != "" {
return dagTask.Depends
}
// For backwards compatibility, "dependencies: [A, B]" is equivalent to "depends: (A.Successful || A.Skipped || A.Daemoned)) && (B.Successful || B.Skipped || B.Daemoned)"
var dependencies []string
for _, dependency := range dagTask.Dependencies {
depTask := dctx.GetTask(ctx, dependency)
dependencies = append(dependencies, expandDependency(dependency, depTask))
}
return strings.Join(dependencies, " && ")
}View on GitHub (pinned to 35bff19146)
Solutions
- Use an exact supported result: .Succeeded, .Failed, .Skipped, .Omitted, .Errored, .Daemoned, .AnySucceeded, or .AllFailed
- Fix capitalization (results are CamelCase, e.g. .Succeeded not .succeeded)
- Replace intended-and-unsupported suffixes like .Successful or .Complete with the correct keyword
- Run argo lint on the workflow before submitting to catch this pre-flight
Example fix
// before depends: "build.Successful && test.Failed" // after depends: "build.Succeeded && test.Failed"
Defensive patterns
Strategy: validation
Validate before calling
var validResults = map[string]bool{"Succeeded":true,"Failed":true,"Skipped":true,"Omitted":true,"Errored":true,"Daemoned":true,"AnySucceeded":true,"AllFailed":true}
func lintDepends(dep string) error {
for _, m := range regexp.MustCompile(`\.([A-Za-z]+)`).FindAllStringSubmatch(dep, -1) {
if !validResults[m[1]] { return fmt.Errorf("bad task result: .%s", m[1]) }
}
return nil
} Prevention
- Run argo lint on every workflow before submit
- Copy depends suffixes only from the documented list; watch capitalization
- Add CI schema validation of DAG tasks
When it happens
Trigger: A DAGTask's depends string references '.<result>' with an unrecognized suffix, e.g. 'A.Success', 'A.complete', 'A.SUCCEED' — the regex matches the dot-suffix but the switch has no case for it.
Common situations: Typos in depends expressions; confusing OnSuccess/continueOn phrasing with task results; copying depends syntax from other workflow engines; case mismatches.
Related errors
- [%d].name '%s' is not unique
- dependency cycle detected: %s->%s
- duplicated nodeName %s
- invalid dependency %s
- cron schedules must consist of 5 values only
AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03).
Data as JSON: /api/errors/519b314feff9697f.
Report an issue: GitHub.