{"record":{"id":"954ae7645c615e9f","repo":"hashicorp/nomad","slug":"w-s-954ae7","errorCode":null,"errorMessage":"%w: %s","messagePattern":"%w: %s","errorType":"validation","errorClass":"errInvalidReconcile","httpStatus":null,"severity":"error","filePath":"nomad/structs/group.go","lineNumber":95,"sourceCode":"\n\t\tif job.Type != JobTypeService && job.Type != JobTypeBatch {\n\t\t\tmErr = multierror.Append(mErr, errStopAfterNonService)\n\t\t}\n\t}\n\n\tif ds.LostAfter < 0 {\n\t\tmErr = multierror.Append(mErr, errNegativeLostAfter)\n\t}\n\n\tif ds.StopOnClientAfter != nil && ds.LostAfter != 0 {\n\t\tmErr = multierror.Append(mErr, errStopAndLost)\n\t}\n\n\tswitch ds.Reconcile {\n\tcase \"\", ReconcileOptionBestScore, ReconcileOptionLongestRunning,\n\t\tReconcileOptionKeepOriginal, ReconcileOptionKeepReplacement:\n\tdefault:\n\t\tmErr = multierror.Append(mErr, fmt.Errorf(\"%w: %s\", errInvalidReconcile, ds.Reconcile))\n\t}\n\n\treturn mErr.ErrorOrNil()\n}\n\nfunc (ds *DisconnectStrategy) Copy() *DisconnectStrategy {\n\tif ds == nil {\n\t\treturn nil\n\t}\n\n\tnds := new(DisconnectStrategy)\n\t*nds = *ds\n\n\tif ds.StopOnClientAfter != nil {\n\t\tnds.StopOnClientAfter = new(*ds.StopOnClientAfter)\n\t}\n\n\tif ds.Replace != nil {","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/structs/group.go#L77-L113","documentation":"The task group's disconnect strategy accepts only the enumerated reconcile values (\"\", best_score, longest_running, keep_original, keep_replacement). Any other string fails Validate and is wrapped with errInvalidReconcile.","triggerScenarios":"Setting group.disconnect.reconcile in a Nomad job spec to an unrecognized value, e.g. reconcile = \"best-effort\", then running nomad job validate/plan/run.","commonSituations":"Typo or misspelling of a reconcile option, copying config from an older/newer Nomad version where the option set differs, or case mismatches.","solutions":["Use one of: best_score, longest_running, keep_original, keep_replacement","Remove the reconcile field to accept the default","Check nomad version docs for the supported reconcile options"],"exampleFix":"// before\ndisconnect { reconcile = \"best-effort\" }\n// after\ndisconnect { reconcile = \"best_score\" }","handlingStrategy":"validation","validationCode":"var validReconcile = map[string]bool{\"\": true, \"best_score\": true, \"longest_running\": true, \"keep_original\": true, \"keep_replacement\": true}\nif !validReconcile[ds.Reconcile] {\n  return fmt.Errorf(\"invalid reconcile %q\", ds.Reconcile)\n}","typeGuard":null,"tryCatchPattern":"if err := tg.Disconnect.Validate(); err != nil {\n  return fmt.Errorf(\"fix disconnect.reconcile in job spec: %w\", err)\n}","preventionTips":["Only use documented reconcile option strings","Run nomad job validate before submit","Check option availability against your Nomad version"],"tags":["nomad","validation","disconnect-strategy","job-spec"],"backgroundTag":"invalid-enum-value","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}