Bug #21830
Updated by fxn (Xavier Noria) 1 day ago
If you enable `Ruby::Box`, decorations to `Kernel#require` do not work. For example, given _foo.rb_: `foo.rb`: ```ruby # foo.rb % cat foo.rb module M def require(_path) puts 'decorated' "decorated" super end end Kernel.prepend(M) p require 'tsort' ``` the decoration works normally: ``` % ruby -v foo.rb ruby 4.0.0 (2025-12-25 revision 553f1675f3) +YJIT +PRISM [arm64-darwin25] decorated true ``` but it and the same code does not work with the feature enabled: ``` % RUBY_BOX=1 ruby -v foo.rb ruby 4.0.0 (2025-12-25 revision 553f1675f3) +YJIT +PRISM [arm64-darwin25] ruby: warning: Ruby::Box is experimental, and the behavior may change in the future! See https://docs.ruby-lang.org/en/4.0/Ruby/Box.html for known issues, etc. true ``` With this, Zeitwerk cannot work because it totally depends on a `Kernel#require` decoration of `Kernel#require` (done [here](https://github.com/fxn/zeitwerk/blob/main/lib/zeitwerk/core_ext/kernel.rb)). Bootsnap also depends on the ability of decorating `Kernel#require` (done [here](https://github.com/rails/bootsnap/blob/main/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb)). On one hand, these gems are walking a fine line in the border of the public interface of Ruby. On the other hand, it is a goal of boxes to be transparent to the code being loaded under them. @tagomoris (Satoshi Tagomori) what should be the way to go in your opinion? /cc @byroot (Jean Boussier)