Skip to content

feat(ruby): graduate precompiled ruby from experimental (gradual rollout)#8052

Merged
jdx merged 4 commits intomainfrom
feat/ruby-precompiled-gradual-rollout
Feb 8, 2026
Merged

feat(ruby): graduate precompiled ruby from experimental (gradual rollout)#8052
jdx merged 4 commits intomainfrom
feat/ruby-precompiled-gradual-rollout

Conversation

@jdx
Copy link
Owner

@jdx jdx commented Feb 8, 2026

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

  • mise run build — confirms it compiles
  • mise run lint-fix — confirms lint passes
  • Existing e2e tests (test_ruby_precompiled, test_ruby_github_attestations) still pass since they use MISE_EXPERIMENTAL=1
  • With ruby.compile unset and experimental off: mise install ruby@3.3.0 should compile from source and show the 2026.8.0 warning
  • With ruby.compile=false: should use precompiled, no warning
  • With ruby.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=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.

Written by Cursor Bugbot for commit db46d91. This will update automatically on new commits. Configure here.

…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>
Copilot AI review requested due to automatic review settings February 8, 2026 13:18
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @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

  • Precompiled Ruby Graduation: The ruby.compile=false setting now enables the use of precompiled Ruby binaries without requiring the experimental=true flag, making precompiled binaries more accessible.
  • Future Default Warning: Users will now see a warning during Ruby installation if ruby.compile is unset and experimental is false. This warning informs them that precompiled Ruby will become the default in version 2026.8.0.
  • Documentation Updates: The [experimental] prefix has been removed from the documentation for all Ruby precompiled settings in both schema/mise.json and settings.toml, reflecting their non-experimental status.
  • Migration Reminder: A debug_assert has been added to the should_try_precompiled function. This assertion will trigger if the application version reaches 2026.8.0 or later, serving as a reminder to finalize the migration to make precompiled Ruby the default behavior.
  • Logic Simplification: The security_info() function now utilizes self.should_try_precompiled() to determine when to enable GitHub Attestations verification, reducing logic duplication.
Changelog
  • schema/mise.json
    • Removed [experimental] prefix from descriptions of ruby.compile, ruby.precompiled_arch, ruby.precompiled_os, ruby.precompiled_url, and ruby.github_attestations settings.
    • Updated the description for ruby.compile to clarify its role in choosing between compiling from source or using precompiled binaries.
  • settings.toml
    • Removed [experimental] prefix from descriptions of ruby.compile, ruby.precompiled_arch, ruby.precompiled_os, ruby.precompiled_url, and ruby.github_attestations settings.
    • Updated the docs for ruby.compile to reflect the new behavior: false tries precompiled, true compiles from source, and unset defaults to compiling with a warning about the future 2026.8.0 change.
    • Removed the Requires experimental = true line from ruby.github_attestations documentation.
  • src/plugins/core/ruby.rs
    • Modified should_try_precompiled function to include a debug_assert for version 2026.8.0 and updated the logic to allow precompiled if ruby.compile is explicitly false, or if experimental is true and ruby.compile is unset.
    • Refactored security_info to use self.should_try_precompiled() for determining when to enable GitHub Attestations verification.
    • Added a warning message in install_version_ when ruby.compile is unset and experimental is false, informing users about the upcoming default change to precompiled binaries in 2026.8.0.
    • Updated the comment for install_version_ to reflect the new conditions for trying precompiled binaries.
Activity
  • No human activity (comments, reviews) has occurred on this pull request yet.
Using Gemini Code Assist

The 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 /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

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 .gemini/ folder in the base of the repository. Detailed instructions can be found here.

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

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

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>
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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=false enables precompiled Ruby regardless of experimental.
  • Add install-time warning when ruby.compile is unset and experimental is off, noting default flip in 2026.8.0.
  • Remove [experimental] labeling from settings documentation/schema and centralize precompiled eligibility logic via should_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)
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

Suggested change
- 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`.

Copilot uses AI. Check for mistakes.
/// 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(),
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

Suggested change
*crate::cli::version::V < versions::Versioning::new("2026.8").unwrap(),
*crate::cli::version::V < versions::Versioning::new("2026.8.0").unwrap(),

Copilot uses AI. Check for mistakes.
Comment on lines +757 to 768
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()
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot uses AI. Check for mistakes.
Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +759 to +764
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"
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

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");

/// 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(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

For consistency with the TODO comment and the user-facing warning message, it would be better to use 2026.8.0 here instead of 2026.8.

Suggested change
*crate::cli::version::V < versions::Versioning::new("2026.8").unwrap(),
*crate::cli::version::V < versions::Versioning::new("2026.8.0").unwrap(),

@github-actions
Copy link

github-actions bot commented Feb 8, 2026

Hyperfine Performance

mise x -- echo

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>
Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is ON, but a Cloud Agent failed to start.

`mise settings ruby.compile=false` not `mise settings set ruby.compile=false`

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jdx jdx merged commit 422a54e into main Feb 8, 2026
35 checks passed
@jdx jdx deleted the feat/ruby-precompiled-gradual-rollout branch February 8, 2026 14:06
mise-en-dev added a commit that referenced this pull request Feb 9, 2026
### 🚀 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)
lucasew pushed a commit to lucasew/CONTRIB-mise that referenced this pull request Feb 18, 2026
…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>
lucasew pushed a commit to lucasew/CONTRIB-mise that referenced this pull request Feb 18, 2026
### 🚀 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants