{"record":{"id":"ab76d0f3bcf5e0af","repo":"argoproj/argo-workflows","slug":"raw-output-parameter-s-has-not-been-set-and-doe","errorCode":null,"errorMessage":"raw output parameter '%s' has not been set and does not have a default value","messagePattern":"raw output parameter '(.+?)' has not been set and does not have a default value","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"workflow/util/util.go","lineNumber":510,"sourceCode":"\t\t\t_, err := wfIf.Update(ctx, wf, metav1.UpdateOptions{})\n\t\t\tif apierr.IsConflict(err) {\n\t\t\t\treturn false, nil\n\t\t\t}\n\t\t\treturn !errorsutil.IsTransientErr(ctx, err), err\n\t\t}\n\t\treturn true, nil\n\t})\n\treturn err\n}\n\nfunc OverrideOutputParametersWithDefault(outputs *wfv1.Outputs) error {\n\tif outputs == nil {\n\t\treturn nil\n\t}\n\tfor i, param := range outputs.Parameters {\n\t\tif param.ValueFrom != nil && param.ValueFrom.Supplied != nil {\n\t\t\tif param.ValueFrom.Default == nil {\n\t\t\t\treturn fmt.Errorf(\"raw output parameter '%s' has not been set and does not have a default value\", param.Name)\n\t\t\t}\n\t\t\toutputs.Parameters[i].Value = param.ValueFrom.Default\n\t\t\toutputs.Parameters[i].ValueFrom = nil\n\t\t}\n\t}\n\treturn nil\n}\n\n// ResumeWorkflow resumes a workflow by setting spec.suspend to nil and any suspended nodes to Successful.\n// Retries conflict errors\nfunc ResumeWorkflow(ctx context.Context, wfIf v1alpha1.WorkflowInterface, hydrator hydrator.Interface, workflowName string, nodeFieldSelector string) error {\n\tuiMsg := \"\"\n\tuim := creator.UserInfoMap(ctx)\n\tif uim != nil {\n\t\tuiMsg = fmt.Sprintf(\"Resumed by: %v\", uim)\n\t}\n\tif len(nodeFieldSelector) > 0 {\n\t\treturn updateSuspendedNode(ctx, wfIf, hydrator, workflowName, nodeFieldSelector, SetOperationValues{Phase: wfv1.NodeSucceeded, Message: uiMsg}, creator.ActionResume)","sourceCodeStart":492,"sourceCodeEnd":528,"githubUrl":"https://github.com/argoproj/argo-workflows/blob/35bff19146f5a6ada77468c431f2624bd577e373/workflow/util/util.go#L492-L528","documentation":"OverrideOutputParametersWithDefault finalizes a node's output parameters: for parameters declared with valueFrom.supplied, it substitutes the declared default. If a supplied parameter has no valueFrom.default and hasn't been set, the function errors because the raw parameter would otherwise have no value. This guards invariants when a producer node exits without emitting its raw output.","triggerScenarios":"A step/suspend node declares outputs.parameters with valueFrom.supplied but no default, the executor never sets the value (step failed to produce output or container exited before capture), and the output-override path is then applied.","commonSituations":"Suspend nodes whose value is never set via argo resume/set, script steps that crash before writing the output file, or templates where outputs were declared but the producing logic was removed.","solutions":["Add a valueFrom.default to every valueFrom.supplied output parameter so unset values fall back cleanly.","Ensure the producing step actually emits the parameter (script writes stdout, suspend gets argo resume/resubmit with values).","Inspect the workflow nodes to find which step failed to produce the raw output before the override ran."],"exampleFix":"// before\noutputs:\n  parameters:\n    - name: out\n      valueFrom:\n        supplied: {}\n// after\noutputs:\n  parameters:\n    - name: out\n      valueFrom:\n        default: \"fallback\"\n        supplied: {}","handlingStrategy":"validation","validationCode":"for _, p := range outputs.Parameters {\n\tif p.ValueFrom != nil && p.ValueFrom.Supplied != nil && p.ValueFrom.Default == nil {\n\t\treturn fmt.Errorf(\"raw output parameter %q lacks a default\", p.Name)\n\t}\n}","typeGuard":"func hasDefault(p wfv1.Parameter) bool {\n\treturn p.ValueFrom == nil || p.ValueFrom.Supplied == nil || p.ValueFrom.Default != nil\n}","tryCatchPattern":"if err := util.OverrideOutputParametersWithDefault(wf.Status.Nodes[nodeID].Outputs); err != nil {\n\tlogger.Warn(ctx, \"unset raw output parameter: \"+err.Error())\n\treturn err\n}","preventionTips":["Always declare valueFrom.default alongside valueFrom.supplied.","Ensure producing steps write their outputs before exiting.","Use argo lint to catch supplied outputs without defaults."],"tags":["outputs","parameters","default-value"],"backgroundTag":"missing-output-parameter-value","analyzedSha":"35bff19146f5a6ada77468c431f2624bd577e373","analyzedAt":"2026-09-03T19:34:35.908Z","contentChangedAt":"2026-09-03T19:34:35.908Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}