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
- Match reported parameter names to the template's outputs.parameters exactly (case-sensitive).
- Re-run the step under the current template so the pod and node status agree.
- 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
- Keep executor template and node status in sync — don't rename/remove outputs on running workflows.
- Use argo lint to confirm reported outputs match declared parameters.
- Resubmit workflows after controller/executor upgrades instead of resuming old pods.
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
- raw output parameter '%s' has not been set and does not have
- cannot set output parameters because node is not expecting a
- cannot set output parameter '%s' because it does not use val
- failed to open %s: %w
- failed to create %s: %w
AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03).
Data as JSON: /api/errors/386a53c80b0da31d.
Report an issue: GitHub.