{"record":{"id":"b51f2fed9bbcb1a0","repo":"hashicorp/nomad","slug":"tag-q-not-found-on-job-q","errorCode":null,"errorMessage":"tag %q not found on job %q","messagePattern":"tag %q not found on job %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"nomad/state/state_store.go","lineNumber":4969,"sourceCode":"\tif err != nil {\n\t\treturn err\n\t}\n\tif versionCopy.Version == latestJob.Version {\n\t\tif err := txn.Insert(\"jobs\", versionCopy); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn s.upsertJobVersion(index, versionCopy, txn)\n}\n\nfunc (s *StateStore) unsetJobVersionTagImpl(index uint64, namespace, jobID string, name string, txn *txn) error {\n\tjob, err := s.JobVersionByTagName(nil, namespace, jobID, name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif job == nil {\n\t\treturn fmt.Errorf(\"tag %q not found on job %q\", name, jobID)\n\t}\n\n\tversionCopy := job.Copy()\n\tversionCopy.VersionTag = nil\n\tversionCopy.ModifyIndex = index\n\tlatestJob, err := s.JobByID(nil, namespace, jobID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif versionCopy.Version == latestJob.Version {\n\t\tif err := txn.Insert(\"jobs\", versionCopy); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn s.upsertJobVersion(index, versionCopy, txn)\n}\n","sourceCodeStart":4951,"sourceCodeEnd":4987,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/state/state_store.go#L4951-L4987","documentation":"Unsetting a job version tag requires that the tag actually exists on some version of the job. The state store looks the tag up via JobVersionByTagName and, when nothing is bound, rejects the unset request with this error instead of silently succeeding.","triggerScenarios":"Calling the unset tag endpoint (DELETE /v1/job/:jobId/versions/tag?tag=NAME / JobRevert-related unset RPC) with a tag name that no version carries, or that was already unset.","commonSituations":"Idempotent cleanup scripts running twice; typos in tag names; tags already removed by another operator or automation between listing and deletion.","solutions":["Check current tags via GET /v1/job/:jobId/versions before unsetting","Treat this error as success in idempotent delete/cleanup flows","Correct the tag name (case-sensitive) and retry"],"exampleFix":"// before: blindly DELETE tag=prod on every deploy\n// after\nif tags := versionsWithTags(jobVersions); tags.contains(\"prod\") {\n  unsetTag(\"prod\")\n} // else skip, already unset","handlingStrategy":"validation","validationCode":"versions, _, _ := client.Jobs().Versions(jobID, false, nil)\ntagged := false\nfor _, v := range versions {\n  if v.VersionTag != nil && v.VersionTag.Name == name { tagged = true }\n}\nif !tagged { return nil } // nothing to unset","typeGuard":null,"tryCatchPattern":"err := unsetTag(jobID, name)\nif err != nil && strings.Contains(err.Error(), \"not found\") {\n  return nil // already unset; idempotent success\n}","preventionTips":["Verify the tag exists before unsetting","Write idempotent cleanup scripts that treat not-found as success","Check tag name spelling and case"],"tags":["nomad","state-store","job-versions","not-found"],"backgroundTag":"resource-not-found","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"}