argoproj/argo-workflows · error

node is not expecting output parameter '%s'

Error message

node is not expecting output parameter '%s'

What it means

When merging reported output parameters into a node, every reported name must match a parameter declared in node.Outputs.Parameters. If a reported name finds no matching declared parameter (hit == false), this error is returned. It enforces that executors only report parameters the template actually declared.

Source

Thrown at workflow/util/util.go:700

							return true, fmt.Errorf("cannot set output parameters because node is not expecting any raw parameters")
						}
						for name, val := range values.OutputParameters {
							hit := false
							for i, param := range node.Outputs.Parameters {
								if param.Name == name {
									if param.ValueFrom == nil || param.ValueFrom.Supplied == nil {
										return true, fmt.Errorf("cannot set output parameter '%s' because it does not use valueFrom.raw or it was already set", param.Name)
									}
									node.Outputs.Parameters[i].Value = wfv1.AnyStringPtr(val)
									node.Outputs.Parameters[i].ValueFrom = nil
									nodeUpdated = true
									hit = true
									AddParamToGlobalScope(ctx, wf, node.Outputs.Parameters[i])
									break
								}
							}
							if !hit {
								return true, fmt.Errorf("node is not expecting output parameter '%s'", name)
							}
						}
					}
					wf.Status.Nodes.Set(ctx, nodeID, node)
				}
			}
		}

		if !nodeUpdated {
			return true, fmt.Errorf("currently, set only targets suspend nodes: no suspend nodes matching nodeFieldSelector: %s", nodeFieldSelector)
		}

		err = hydrator.Dehydrate(ctx, wf)
		if err != nil {
			return true, fmt.Errorf("unable to compress or offload workflow nodes: %w", err)
		}
		creator.LabelActor(ctx, wf, action)
		_, err = wfIf.Update(ctx, wf, metav1.UpdateOptions{})

View on GitHub (pinned to 35bff19146)

Solutions

  1. Match reported parameter names to the template's outputs.parameters exactly (case-sensitive).
  2. Re-run the step under the current template so the pod and node status agree.
  3. After upgrading Argo, delete/resubmit workflows whose pods still carry old template definitions rather than resuming them.

Example fix

// before (template declares 'out' but step reports 'output')
outputs:
  parameters:
    - name: out
      valueFrom:
        supplied: {}
// after
outputs:
  parameters:
    - name: output
      valueFrom:
        supplied: {}
Defensive patterns

Strategy: validation

Validate before calling

declared := map[string]bool{}
for _, p := range node.Outputs.Parameters {
	declared[p.Name] = true
}
for name := range values.OutputParameters {
	if !declared[name] {
		return fmt.Errorf("%q not declared on node %s", name, nodeID)
	}
}

Type guard

func declaresParam(n wfv1.NodeStatus, name string) bool {
	if n.Outputs == nil {
		return false
	}
	for _, p := range n.Outputs.Parameters {
		if p.Name == name {
			return true
		}
	}
	return false
}

Try / catch

if err := setOutputs(...); err != nil {
	if strings.Contains(err.Error(), "is not expecting output parameter") {
		// template/pod version skew: requeue and rerun the node
		return requeue
	}
	return err
}

Prevention

When it happens

Trigger: WorkflowTaskResult.OutputParameters contains a name absent from the node's declared outputs — e.g. the executor's cached template is older/newer than the node's template, or the producing step emits a parameter that was renamed or removed.

Common situations: Template edited (parameter renamed/removed) while a pod from the old definition reports outputs; version skew between argoexec and the controller after an upgrade mid-workflow.

Related errors


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