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

  1. Use an exact supported result: .Succeeded, .Failed, .Skipped, .Omitted, .Errored, .Daemoned, .AnySucceeded, or .AllFailed
  2. Fix capitalization (results are CamelCase, e.g. .Succeeded not .succeeded)
  3. Replace intended-and-unsupported suffixes like .Successful or .Complete with the correct keyword
  4. 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

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


AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03). Data as JSON: /api/errors/519b314feff9697f. Report an issue: GitHub.