Skip to content

False ambiguous specs warning for default Psych when activating RDoc #9600

@dorianmariecom

Description

@dorianmariecom

Describe the problem as clearly as you can

RubyGems emits an Unresolved or ambiguous specs during Gem::Specification.reset warning for psych (>= 4.0.0) after activating rdoc when both Ruby's default Psych gem and a newer installed Psych gem are visible.

The warning suggests gem cleanup <gem>, but that does not fully help when one matching Psych spec is the default gem that ships with Ruby. The same warning showed up for me during bundle update --all in a Rails app after Bundler updated psych from 5.3.1 to 5.4.0 while Ruby 3.4.5 still provides default psych 5.2.2.

I did not find an existing issue with the warning text plus the Psych/RDoc combination.

Did you try upgrading rubygems & bundler?

Yes. The warning happened with RubyGems 3.6.9 and Bundler 4.0.3. I also reproduced it during bundle _4.0.13_ update --all before reducing it to RubyGems/RDoc/Psych.

Post steps to reproduce the problem

On Ruby 3.4.5, with default Psych still present, install a newer Psych and activate RDoc:

tmp_gem_home=$(mktemp -d)
export GEM_HOME="$tmp_gem_home"
export GEM_PATH="$tmp_gem_home:$(ruby -rrubygems -e 'print Gem.default_dir')"

gem install psych -v 5.4.0 --no-document

ruby -rrubygems -e 'puts RUBY_DESCRIPTION; puts "RubyGems #{Gem::VERSION}"; puts Gem::Specification.find_all_by_name("psych").map { |s| "psych #{s.version} default=#{s.default_gem?}" }; gem "rdoc"; p Gem::Specification.unresolved_deps; Gem::Specification.reset'

In my app, the original command that surfaced it was simply:

bundle update --all

Which command did you run?

Minimal repro:

ruby -rrubygems -e 'gem "rdoc"; Gem::Specification.reset'

Original command:

bundle update --all

What were you expecting to happen?

I expected Gem::Specification.reset not to warn in this situation, or at least not to suggest gem cleanup when the ambiguity involves a default gem that cannot be cleaned away normally.

RubyGems appears to intentionally suppress this class of warning for latest_version? dependencies when a default gem is present:

next if dep.latest_version? && matching_versions.any?(&:default_gem?)

But RDoc declares psych (>= 4.0.0), so that suppression does not apply even though this seems like the same default-gem ambiguity.

What actually happened?

With Ruby 3.4.5 and RubyGems 3.6.9:

ruby 3.4.5 (2025-07-16 revision 20cda200d3) +PRISM [arm64-darwin24]
RubyGems 3.6.9
psych 5.4.0 default=false
psych 5.2.2 default=true
{"psych" => <Gem::Dependency type=:runtime name="psych" requirements=">= 4.0.0">, "erb" => <Gem::Dependency type=:runtime name="erb" requirements=">= 0">}
WARN: Unresolved or ambiguous specs during Gem::Specification.reset:
      psych (>= 4.0.0)
      Available/installed versions of this gem:
      - 5.4.0
      - 5.2.2
WARN: Clearing out unresolved specs. Try 'gem cleanup <gem>'
Please report a bug if this causes problems.

The original Bundler output was:

Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
WARN: Unresolved or ambiguous specs during Gem::Specification.reset:
      psych (>= 4.0.0)
      Available/installed versions of this gem:
      - 5.4.0
      - 5.2.2
WARN: Clearing out unresolved specs. Try 'gem cleanup <gem>'
Please report a bug if this causes problems.
Bundle updated!

Workarounds found

Both of these avoided the warning locally:

RUBYOPT=-rpsych bundle update --all

or pinning Psych to Ruby 3.4.5's default version and removing the newer installed copy:

gem "psych", "5.2.2"

Environment

ruby 3.4.5 (2025-07-16 revision 20cda200d3) +PRISM [arm64-darwin24]
RubyGems 3.6.9
Bundler 4.0.3; also observed with Bundler 4.0.13
macOS arm64-darwin24

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions