{"record":{"id":"b500497ec59e9ff0","repo":"hashicorp/nomad","slug":"evaluation-id-or-filter-flag-required","errorCode":null,"errorMessage":"evaluation ID or filter flag required","messagePattern":"evaluation ID or filter flag required","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"command/eval_delete.go","lineNumber":184,"sourceCode":"\tif e.numDeleted > 0 {\n\t\te.Ui.Output(fmt.Sprintf(\"Successfully deleted %v %s\",\n\t\t\te.numDeleted, correctGrammar(\"evaluation\", e.numDeleted)))\n\t} else if err == nil {\n\t\te.Ui.Output(\"No evaluations were deleted\")\n\t}\n\n\treturn exitCode\n}\n\n// verifyArgsAndFlags ensures the passed arguments and flags are valid for what\n// this command accepts and can take action on.\nfunc (e *EvalDeleteCommand) verifyArgsAndFlags(args []string) error {\n\n\tnumArgs := len(args)\n\n\t// The command takes either an argument or filter, but not both.\n\tif (e.filter == \"\" && numArgs < 1) || (e.filter != \"\" && numArgs > 0) {\n\t\treturn errors.New(\"evaluation ID or filter flag required\")\n\t}\n\n\t// If an argument is supplied, we only accept a single eval ID.\n\tif numArgs > 1 {\n\t\treturn fmt.Errorf(\"expected 1 argument, got %v\", numArgs)\n\t}\n\n\treturn nil\n}\n\n// handleEvalArgDelete handles deletion and evaluation which was passed via\n// it's ID as a command argument. This is the simplest route to take and\n// doesn't require filtering or batching.\nfunc (e *EvalDeleteCommand) handleEvalArgDelete(evalID string) (int, error) {\n\tevalInfo, _, err := e.client.Evaluations().Info(evalID, nil)\n\tif err != nil {\n\t\treturn 1, err\n\t}","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/command/eval_delete.go#L166-L202","documentation":"`nomad eval delete` requires exactly one selector: either an evaluation ID argument or the -filter flag, never both and never neither. verifyArgsAndFlags returns this error when both are absent (nothing to delete) or when an ID plus -filter are both supplied.","triggerScenarios":"Running `nomad eval delete` with no arguments and no -filter, or with an eval ID argument AND -filter at the same time.","commonSituations":"Scripts that append -filter unconditionally while also passing an ID; users unsure of the delete-by-filter feature; copy-paste of combined examples.","solutions":["Pass exactly one: `nomad eval delete <eval-id>` or `nomad eval delete -filter 'JobID == \"web\"'`.","In scripts, branch on whether the ID is known: supply the ID alone, or the -filter alone.","Check `nomad eval list` to obtain eval IDs if you meant to delete by ID."],"exampleFix":"// before\n$ nomad eval delete abc123 -filter 'JobID == \"web\"'\n// after\n$ nomad eval delete abc123        # OR\n$ nomad eval delete -filter 'JobID == \"web\"'","handlingStrategy":"validation","validationCode":"if (evalID == \"\" && filter == \"\") || (evalID != \"\" && filter != \"\") {\n    return errors.New(\"supply exactly one of eval ID or -filter\")\n}","typeGuard":null,"tryCatchPattern":"if err := evalDelete(); err != nil && strings.Contains(err.Error(), \"evaluation ID or filter flag required\") {\n    fmt.Fprintln(os.Stderr, \"pass either an eval ID or -filter, not both/neither\")\n    os.Exit(1)\n}","preventionTips":["Branch in scripts: delete by ID when known, else by -filter.","Never append -filter unconditionally alongside positional args.","Document the either-or contract in wrapper tooling."],"tags":["cli","flags","evals","argument-validation"],"backgroundTag":"mutually-exclusive-flags","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"}