feat(ruby): graduate precompiled ruby from experimental (gradual rollout)#8052
feat(ruby): graduate precompiled ruby from experimental (gradual rollout)#8052
Conversation
…out) Precompiled Ruby (downloading pre-built binaries from jdx/ruby instead of compiling from source) is currently gated behind experimental=true. This begins a gradual rollout to make precompiled the default in 2026.8.0. Changes: - ruby.compile=false now enables precompiled without requiring experimental - When ruby.compile is unset and experimental is off, show a warning about the upcoming default change in 2026.8.0 - Remove [experimental] prefix from ruby precompiled settings docs - Add debug_assert to block compilation when 2026.8.0 arrives as a reminder to complete the migration Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Summary of ChangesHello @jdx, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request marks a significant step in graduating precompiled Ruby binaries from an experimental feature to a more integrated part of the system. It simplifies the configuration for users who wish to opt-in to precompiled binaries and introduces a gradual rollout strategy by warning users about the upcoming change to make precompiled the default in a future release. The changes also clean up documentation and ensure internal logic is consistent with the new behavior. Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
Set MISE_RUBY_COMPILE explicitly in ruby e2e tests so they remain correct when precompiled becomes the default in 2026.8.0. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Graduates Ruby precompiled binaries from being strictly “experimental” by allowing explicit opt-in via ruby.compile=false, adds user-facing migration warnings, and updates docs/schema accordingly.
Changes:
- Loosen gating:
ruby.compile=falseenables precompiled Ruby regardless ofexperimental. - Add install-time warning when
ruby.compileis unset andexperimentalis off, noting default flip in 2026.8.0. - Remove
[experimental]labeling from settings documentation/schema and centralize precompiled eligibility logic viashould_try_precompiled().
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| src/plugins/core/ruby.rs | Adjusts precompiled decision logic, adds migration warning, and reuses precompiled eligibility for security features. |
| settings.toml | Updates Ruby settings docs to reflect non-experimental precompiled opt-in and upcoming default change. |
| schema/mise.json | Updates JSON schema descriptions to remove [experimental] branding for Ruby precompiled settings. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
settings.toml
Outdated
| experimental = true | ||
| ruby.compile = true | ||
| ``` | ||
| - If unset: Defaults to compiling from source (will change to precompiled in 2026.8.0) |
There was a problem hiding this comment.
The docs for ruby.compile don’t mention the (still-supported) behavior where ruby.compile is unset but experimental=true causes precompiled to be tried. This conflicts with the stated 'unset defaults to compiling from source' rule. Consider updating the 'unset' bullet to explicitly document the experimental-on behavior (or otherwise clarify precedence between experimental and ruby.compile).
| - If unset: Defaults to compiling from source (will change to precompiled in 2026.8.0) | |
| - If unset: Defaults to compiling from source (will change to precompiled in 2026.8.0). When `experimental = true` and `ruby.compile` is unset, precompiled binaries are tried first; an explicit `ruby.compile` value always takes precedence over `experimental`. |
src/plugins/core/ruby.rs
Outdated
| /// TODO(2026.8.0): make precompiled the default when compile is unset, remove this debug_assert | ||
| fn should_try_precompiled(&self) -> bool { | ||
| debug_assert!( | ||
| *crate::cli::version::V < versions::Versioning::new("2026.8").unwrap(), |
There was a problem hiding this comment.
The TODO and user-facing messaging refer to 2026.8.0, but the assertion compares against \"2026.8\". Align these to the same version format to avoid confusion during the migration (e.g., use \"2026.8.0\" consistently in both the TODO/message and the version check, assuming the version parser supports it).
| *crate::cli::version::V < versions::Versioning::new("2026.8").unwrap(), | |
| *crate::cli::version::V < versions::Versioning::new("2026.8.0").unwrap(), |
| let settings = Settings::get(); | ||
| if settings.ruby.compile.is_none() && !settings.experimental { | ||
| warn!( | ||
| "precompiled ruby will be the default in 2026.8.0. \ | ||
| To use precompiled binaries now, set ruby.compile=false. \ | ||
| To keep compiling from source, set ruby.compile=true. \ | ||
| e.g. mise settings ruby.compile=false" | ||
| ); | ||
| } | ||
|
|
||
| // Try precompiled if compile=false or experimental + not opted out | ||
| if self.should_try_precompiled() |
There was a problem hiding this comment.
This fetches Settings::get() here, and should_try_precompiled() fetches settings again internally. To keep the sources of truth aligned and reduce duplication, consider refactoring so the decision function can accept &Settings (or returning a small enum/struct describing the decision + whether to warn), and reuse the same settings instance for both the warning and the install-path decision.
There was a problem hiding this comment.
Code Review
This pull request graduates the precompiled Ruby feature from experimental, allowing users to enable it with ruby.compile=false without needing experimental=true. It also introduces a warning for users who haven't configured ruby.compile, notifying them that precompiled binaries will become the default in a future version. The documentation has been updated to reflect these changes.
The changes are well-implemented and follow a clear migration plan. I've identified a couple of minor issues in the new warning message and a consistency issue with a version string, for which I've provided suggestions.
src/plugins/core/ruby.rs
Outdated
| warn!( | ||
| "precompiled ruby will be the default in 2026.8.0. \ | ||
| To use precompiled binaries now, set ruby.compile=false. \ | ||
| To keep compiling from source, set ruby.compile=true. \ | ||
| e.g. mise settings ruby.compile=false" | ||
| ); |
There was a problem hiding this comment.
This long warning message will be printed as a single line with extra whitespace from indentation, which is likely not intended and can be hard to read. Additionally, the example command is missing the set subcommand.
Consider splitting the message into multiple warn! calls for better readability in both the code and the terminal output.
warn!("precompiled ruby will be the default in 2026.8.0.");
warn!("To use precompiled binaries now, set ruby.compile=false.");
warn!("To keep compiling from source, set ruby.compile=true.");
warn!("e.g. mise settings set ruby.compile=false");
src/plugins/core/ruby.rs
Outdated
| /// TODO(2026.8.0): make precompiled the default when compile is unset, remove this debug_assert | ||
| fn should_try_precompiled(&self) -> bool { | ||
| debug_assert!( | ||
| *crate::cli::version::V < versions::Versioning::new("2026.8").unwrap(), |
There was a problem hiding this comment.
Hyperfine Performance
|
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.2.7 x -- echo |
22.5 ± 0.3 | 21.9 | 25.8 | 1.00 |
mise x -- echo |
23.0 ± 0.3 | 22.5 | 24.6 | 1.02 ± 0.02 |
mise env
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.2.7 env |
22.0 ± 0.5 | 21.3 | 26.4 | 1.00 |
mise env |
22.1 ± 0.3 | 21.6 | 24.3 | 1.01 ± 0.03 |
mise hook-env
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.2.7 hook-env |
22.7 ± 0.2 | 22.3 | 23.8 | 1.00 |
mise hook-env |
23.0 ± 0.2 | 22.5 | 24.4 | 1.01 ± 0.01 |
mise ls
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.2.7 ls |
20.7 ± 0.2 | 20.2 | 21.7 | 1.00 |
mise ls |
20.8 ± 0.2 | 20.2 | 21.8 | 1.00 ± 0.02 |
xtasks/test/perf
| Command | mise-2026.2.7 | mise | Variance |
|---|---|---|---|
| install (cached) | 126ms | 125ms | +0% |
| ls (cached) | 75ms | 75ms | +0% |
| bin-paths (cached) | 79ms | 79ms | +0% |
| task-ls (cached) | 558ms | 569ms | -1% |
- Use "2026.8.0" consistently in debug_assert version check - Switch warn! to warn_once! to avoid repeating the message - Fix example command: `mise settings` → `mise settings set` - Document experimental=true behavior in ruby.compile docs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
`mise settings ruby.compile=false` not `mise settings set ruby.compile=false` Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
### 🚀 Features - **(node)** support package.json as idiomatic version file by @jdx in [#8059](#8059) - **(ruby)** graduate precompiled ruby from experimental (gradual rollout) by @jdx in [#8052](#8052) - add --dry-run-code flag to exit non-zero when there is work to do by @jdx in [#8063](#8063) ### 🐛 Bug Fixes - **(core)** respect MISE_ARCH override in bun and erlang plugins by @jdx in [#8062](#8062) - **(hooks)** resolve 12 community-reported hooks issues by @jdx in [#8058](#8058) - accept key=value format in set/add subcommands by @jdx in [#8053](#8053) ### 📚 Documentation - bump action versions in GitHub Actions examples by @muzimuzhi in [#8065](#8065) - add opengraph meta tags by @jdx in [#8066](#8066) ### 📦️ Dependency Updates - upgrade toml to 0.9 and toml_edit to 0.24 (TOML 1.1) by @jdx in [#8057](#8057) ### 📦 Registry - add quicktype (npm:quicktype) by @zdunecki in [#8054](#8054) - use inline table for test definitions by @jdx in [#8056](#8056)
…out) (jdx#8052) ## Summary - Allow `ruby.compile=false` to enable precompiled binaries without requiring `experimental=true` - Show a warning during Ruby install when `ruby.compile` is unset, notifying users that precompiled will become the default in 2026.8.0 - Remove `[experimental]` prefix from Ruby precompiled settings documentation - Add `debug_assert` to block debug compilation when 2026.8.0 arrives as a reminder to complete the migration - Use `self.should_try_precompiled()` in `security_info()` to avoid duplicating logic ### Behavior matrix | `ruby.compile` | `experimental` | Result | |---|---|---| | `true` | any | Compile from source, no warning | | `false` | any | Try precompiled (new: works without experimental) | | unset | `true` | Try precompiled (existing behavior preserved) | | unset | `false` | Compile from source + show warning about 2026.8.0 | ## Test plan - [x] `mise run build` — confirms it compiles - [x] `mise run lint-fix` — confirms lint passes - [x] Existing e2e tests (`test_ruby_precompiled`, `test_ruby_github_attestations`) still pass since they use `MISE_EXPERIMENTAL=1` - [x] With `ruby.compile` unset and `experimental` off: `mise install ruby@3.3.0` should compile from source and show the 2026.8.0 warning - [x] With `ruby.compile=false`: should use precompiled, no warning - [x] With `ruby.compile=true`: should compile from source, no warning 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes Ruby installation path selection (precompiled vs source) and attestation reporting logic, which can affect install behavior across environments; rollout is guarded by explicit `compile=false` or `experimental` + unset. > > **Overview** > **Ruby precompiled binaries are no longer gated behind `experimental`.** Setting `ruby.compile=false` (or `MISE_RUBY_COMPILE=false`) now opts into precompiled Ruby even when `experimental` is off, while `compile` unset continues to compile by default unless `experimental` is enabled. > > Adds a one-time install warning when `ruby.compile` is unset (and `experimental` is off) to announce that precompiled will become the default in `2026.8.0`, centralizes the precompiled decision logic via `should_try_precompiled()` (reused by `security_info()`), and updates schema/settings docs and e2e tests to reflect the new `ruby.compile` behavior and remove the `[experimental]` labeling. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit db46d91. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
### 🚀 Features - **(node)** support package.json as idiomatic version file by @jdx in [jdx#8059](jdx#8059) - **(ruby)** graduate precompiled ruby from experimental (gradual rollout) by @jdx in [jdx#8052](jdx#8052) - add --dry-run-code flag to exit non-zero when there is work to do by @jdx in [jdx#8063](jdx#8063) ### 🐛 Bug Fixes - **(core)** respect MISE_ARCH override in bun and erlang plugins by @jdx in [jdx#8062](jdx#8062) - **(hooks)** resolve 12 community-reported hooks issues by @jdx in [jdx#8058](jdx#8058) - accept key=value format in set/add subcommands by @jdx in [jdx#8053](jdx#8053) ### 📚 Documentation - bump action versions in GitHub Actions examples by @muzimuzhi in [jdx#8065](jdx#8065) - add opengraph meta tags by @jdx in [jdx#8066](jdx#8066) ### 📦️ Dependency Updates - upgrade toml to 0.9 and toml_edit to 0.24 (TOML 1.1) by @jdx in [jdx#8057](jdx#8057) ### 📦 Registry - add quicktype (npm:quicktype) by @zdunecki in [jdx#8054](jdx#8054) - use inline table for test definitions by @jdx in [jdx#8056](jdx#8056)
Summary
ruby.compile=falseto enable precompiled binaries without requiringexperimental=trueruby.compileis unset, notifying users that precompiled will become the default in 2026.8.0[experimental]prefix from Ruby precompiled settings documentationdebug_assertto block debug compilation when 2026.8.0 arrives as a reminder to complete the migrationself.should_try_precompiled()insecurity_info()to avoid duplicating logicBehavior matrix
ruby.compileexperimentaltruefalsetruefalseTest plan
mise run build— confirms it compilesmise run lint-fix— confirms lint passestest_ruby_precompiled,test_ruby_github_attestations) still pass since they useMISE_EXPERIMENTAL=1ruby.compileunset andexperimentaloff:mise install ruby@3.3.0should compile from source and show the 2026.8.0 warningruby.compile=false: should use precompiled, no warningruby.compile=true: should compile from source, no warning🤖 Generated with Claude Code
Note
Medium Risk
Changes Ruby installation path selection (precompiled vs source) and attestation reporting logic, which can affect install behavior across environments; rollout is guarded by explicit
compile=falseorexperimental+ unset.Overview
Ruby precompiled binaries are no longer gated behind
experimental. Settingruby.compile=false(orMISE_RUBY_COMPILE=false) now opts into precompiled Ruby even whenexperimentalis off, whilecompileunset continues to compile by default unlessexperimentalis enabled.Adds a one-time install warning when
ruby.compileis unset (andexperimentalis off) to announce that precompiled will become the default in2026.8.0, centralizes the precompiled decision logic viashould_try_precompiled()(reused bysecurity_info()), and updates schema/settings docs and e2e tests to reflect the newruby.compilebehavior and remove the[experimental]labeling.Written by Cursor Bugbot for commit db46d91. This will update automatically on new commits. Configure here.