{"record":{"id":"b0ee01f7b5653541","repo":"puppetlabs/puppet","slug":"could-not-action-module-name-no-releases-b0ee01","errorCode":null,"errorMessage":"Could not %{action} '%{module_name}'; no releases matching '%{version}' are available from %{source}","messagePattern":"Could not %(.+?) '%(.+?)'; no releases matching '%(.+?)' are available from %(.+?)","errorType":"exception","errorClass":"Puppet::ModuleTool::Errors::NoCandidateReleasesError","httpStatus":null,"severity":"error","filePath":"lib/puppet/module_tool/applications/upgrader.rb","lineNumber":103,"sourceCode":"              raise LocalChangesError,\n                    :action => :upgrade,\n                    :module_name => name,\n                    :requested_version => results[:requested_version],\n                    :installed_version => mod.version\n            end\n          end\n\n          Puppet::Forge::Cache.clean\n\n          # Ensure that there is at least one candidate release available\n          # for the target package.\n          available_versions = module_repository.fetch(name)\n          if available_versions.empty?\n            raise NoCandidateReleasesError, results.merge(:module_name => name, :source => module_repository.host)\n          elsif results[:requested_version] != :latest\n            requested = Puppet::Module.parse_range(results[:requested_version])\n            unless available_versions.any? { |m| requested.include? m.version }\n              raise NoCandidateReleasesError, results.merge(:module_name => name, :source => module_repository.host)\n            end\n          end\n\n          Puppet.notice _(\"Downloading from %{host} ...\") % { host: module_repository.host }\n          if @ignore_dependencies\n            graph = build_single_module_graph(name, version)\n          else\n            graph = build_dependency_graph(name, version)\n          end\n\n          unless forced?\n            add_module_name_constraints_to_graph(graph)\n          end\n\n          installed_modules.each do |installed_module, release|\n            installed_module = installed_module.tr('/', '-')\n            next if installed_module == name\n","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/module_tool/applications/upgrader.rb#L85-L121","documentation":"The version-filtered variant of NoCandidateReleasesError: releases for the module exist on the source, but none satisfies the requested version string. Puppet::Module.parse_range turns --version into a SemanticPuppet range and requires at least one fetched release to fall inside it; otherwise the same Puppet::ModuleTool::Errors::NoCandidateReleasesError is raised with the requested version interpolated.","triggerScenarios":"Running `puppet module upgrade <name> --version 1.2.3` when 1.2.3 was never published, or a range like '>= 9.0.0' when all published versions are older, or a range excluding every available release (e.g. '4.x' when the module moved to 5.x only).","commonSituations":"Assuming a version exists without checking the Forge release list; pulling an old pin from documentation; a mirror lagging behind the Forge; requesting a yanked release.","solutions":["List the actual releases (Forge module page or `curl https://forgeapi.puppetlabs.com/v3/releases?module=<slug>`) and pick one that exists","Omit --version entirely to take the latest release","Widen the range, e.g. `--version '>= 5.0.0 < 7.0.0'` instead of an exact pin","If your mirror lacks the version, sync the mirror or point module_repository at the public Forge"],"exampleFix":"# before\n$ puppet module upgrade puppetlabs-stdlib --version 9.9.9\n# Error: ... no releases matching '9.9.9' are available from https://forgeapi.puppetlabs.com\n\n# after\n$ puppet module upgrade puppetlabs-stdlib --version '>= 9.0.0 < 10.0.0'","handlingStrategy":"try-catch","validationCode":"releases = Puppet::Forge.new(Puppet[:module_repository]).fetch(name)\nrange = Puppet::Module.parse_range(requested_version)\nabort \"no release of #{name} matches #{requested_version}\" unless releases.any? { |r| range.include?(r.version) }","typeGuard":null,"tryCatchPattern":"begin\n  Puppet::ModuleTool::Applications::Upgrader.new(name, options.merge(version: pin)).run\nrescue Puppet::ModuleTool::Errors::NoCandidateReleasesError\n  Puppet::ModuleTool::Applications::Upgrader.new(name, options.reject { |k,_| k == :version }).run  # take latest\nend","preventionTips":["Check the Forge release list before pinning exact versions in scripts","Prefer ranges ('>= X < Y') over exact pins for routine upgrades","Treat a version pin that never resolves as a build failure, not a retry candidate"],"tags":["puppet","module-tool","upgrade","version-constraint","semver","forge"],"backgroundTag":"version-constraint-unsatisfied","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}