{"record":{"id":"89725e20d564acb3","repo":"puppetlabs/puppet","slug":"could-not-action-module-name-version-89725e","errorCode":null,"errorMessage":"Could not %{action} '%{module_name}' (%{version}); no version satisfies all dependencies","messagePattern":"Could not %(.+?) '%(.+?)' \\(%(.+?)\\); no version satisfies all dependencies","errorType":"exception","errorClass":"Puppet::ModuleTool::Errors::NoVersionsSatisfyError","httpStatus":null,"severity":"error","filePath":"lib/puppet/module_tool/shared_behaviors.rb","lineNumber":132,"sourceCode":"\n        action = :upgrade\n      elsif @installed[mod].empty?\n        action = :install\n      end\n\n      if action == :upgrade\n        @conditions.each { |_, conds| conds.delete_if { |c| c[:module] == mod } }\n      end\n\n      versions = @versions[mod.to_s].select { |h| range === h[:semver] }\n      valid_versions = versions.select { |x| x[:semver].special == '' }\n      valid_versions = versions if valid_versions.empty?\n\n      version = valid_versions.last\n      unless version\n        req_module   = @module_name\n        req_versions = @versions[@module_name.to_s].map { |v| v[:semver] }\n        raise NoVersionsSatisfyError,\n              :requested_name => req_module,\n              :requested_version => @version || annotated_version(req_module, req_versions),\n              :installed_version => @installed[@module_name].empty? ? nil : @installed[@module_name].first.version,\n              :dependency_name => mod,\n              :conditions => @conditions[mod],\n              :action => @action\n      end\n\n      seen[mod] = version\n\n      {\n        :module => mod,\n        :version => version,\n        :action => action,\n        :previous_version => @installed[mod].empty? ? nil : @installed[mod].first.version,\n        :file => @urls[\"#{mod}@#{version[:vstring]}\"],\n        :path => if action == :install\n                   @options[:target_dir]","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/module_tool/shared_behaviors.rb#L114-L150","documentation":"After the resolver intersects every version range imposed on a dependency and selects candidate releases from the Forge, it prefers final releases over prereleases (semver.special == '') and falls back to prereleases only when no final release matches. If the filtering still yields zero releases (valid_versions.last is nil), NoVersionsSatisfyError aborts the operation: no published release of that dependency satisfies the combined constraints.","triggerScenarios":"'puppet module install' or 'puppet module upgrade' where @versions[mod].select { |h| range === h[:semver] } is empty: constraints intersect to something like '>= 3.2.0 < 3.2.0', or the only needed release was never published or was deleted from the Forge.","commonSituations":"Over-tight metadata.json ranges (typos like '>= 1.2.3 < 1.2.3'); two modules pinning disjoint ranges of a shared dependency (stdlib >= 9 vs < 9); depending on a yanked release; dependency renamed so its old name has no matching releases.","solutions":["Read dependency_name and the conditions in the error message, then widen that version_requirement in your metadata.json to include at least one published release.","Install another release of the module you are requesting whose dependency set matches reality: puppet module install author/mod --version X.Y.Z.","Upgrade or remove the other module imposing the conflicting half of the range (it shows up in the conditions list).","Confirm on the Forge (forge.puppet.com / forgeapi.puppet.com) which releases of the dependency actually exist before tightening any range."],"exampleFix":"# before (metadata.json) — intersection with the other dependent's 'stdlib < 9.0.0' is empty\n{\"dependencies\": [{\"name\": \"puppetlabs/stdlib\", \"version_requirement\": \">= 9.5.0\"}]}\n\n# after — a range both dependents accept\n{\"dependencies\": [{\"name\": \"puppetlabs/stdlib\", \"version_requirement\": \">= 8.0.0 < 10.0.0\"}]}","handlingStrategy":"try-catch","validationCode":"require 'semantic_puppet'\nreleases = forge_releases_for(dep_name) # e.g. ['1.0.0', '8.6.0', '9.4.0']\nranges = constraints_on(dep_name).map { |r| SemanticPuppet::VersionRange.parse(r) }\nshared = ranges.inject(&:&)\nok = shared && releases.any? { |v| shared === SemanticPuppet::Version.parse(v) }\nabort \"no release of #{dep_name} satisfies #{ranges.map(&:to_s).join(' & ')}\" unless ok","typeGuard":null,"tryCatchPattern":"begin\n  # puppet module install author/mod\nrescue Puppet::ModuleTool::Errors::NoVersionsSatisfyError => e\n  # e.message names the dependency and the unsatisfiable conditions\n  warn e.message\n  exit 1\nend","preventionTips":["Write ranges as intervals ('>= x.y.z < X.0.0') that include real published releases.","Check the Forge release list before adding or tightening a dependency pin.","Resolve dependencies in CI (r10k puppetfile install or a module install dry-run) before merging.","Avoid depending on prereleases unless the range explicitly allows them."],"tags":["puppet","ruby","module-tool","version-resolution","metadata"],"backgroundTag":"version-constraint-unsatisfiable","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}