Skip to content

Make root RuboCop bundle lint-only (no Rails/test stack)#3840

Closed
justin808 wants to merge 2 commits into
mainfrom
jg/3837-root-rubocop-lint-only-bundle
Closed

Make root RuboCop bundle lint-only (no Rails/test stack)#3840
justin808 wants to merge 2 commits into
mainfrom
jg/3837-root-rubocop-lint-only-bundle

Conversation

@justin808

@justin808 justin808 commented Jun 9, 2026

Copy link
Copy Markdown
Member

Summary

Follow-up to #3836. That PR centralized RuboCop ownership in the committed root Gemfile/Gemfile.lock, but it kept the root Gemfile doing eval_gemfile File.expand_path("react_on_rails/Gemfile", ...), so a root bundle install still pulled in the full OSS Rails/dev/test/runtime stack instead of only the lint gems.

This makes the root Gemfile a pure lint/tooling bundle for RuboCop (and the repo-root benchmark script-spec runner), without dragging in package test/runtime dependencies.

What changed

  • Gemfile: Removed the eval_gemfile react_on_rails/Gemfile, added an explicit source "https://rubygems.org", and declared only the gems the root .rubocop.yml needs — rubocop, rubocop-performance, rubocop-rspec (the require: plugins) — pinned to the versions the package locks resolve (1.61.0 / 1.20.2 / 2.31.0). Also added bare rspec (~> 3.13) so benchmark.yml's bundle exec rspec benchmarks/spec step (which Centralize RuboCop ownership in root bundle #3836 wired to the root bundle) keeps working. Those specs deliberately load no Rails and no react_on_rails gem (see benchmarks/spec/spec_helper.rb), so bare rspec — not the package's rspec-rails stack — is all the root bundle needs.
  • Gemfile.lock: Regenerated. Now resolves 25 lint/tooling gems (down from ~150+).
  • AGENTS.md: Updated the install note to describe the root Gemfile as a lint/tooling-only bundle.

Root lock now contains vs. excludes

Now contains (lint/tooling only) Now excludes (owned by package Gemfiles)
rubocop + plugins (rubocop-ast, rubocop-capybara, rubocop-factory_bot, rubocop-performance, rubocop-rspec, rubocop-rspec_rails), parser, ast, parallel, prism, etc. rails, actionpack, activesupport, nokogiri, shakapacker, the react_on_rails PATH gem
bare rspec (rspec-core/expectations/mocks/support, diff-lcs) for benchmarks/ script specs rspec-rails, runtime capybara/capybara-screenshot, cypress-on-rails, RBS/Steep, etc.

PLATFORMS keeps ruby / arm64-darwin / x86_64-linux, so script/check-gemfile-lock-platforms stays green.

CI lint steps already point BUNDLE_GEMFILE at the root Gemfile (from #3836), so the OSS package run (cd react_on_rails && bundle exec rubocop), the Pro run, the benchmarks lint, and the benchmark script specs all keep using the one committed root lock — now without installing the Rails/test stack.

Acceptance criteria

  • Root RuboCop commands still use one committed root lock (root Gemfile.lock).
  • Root bundle install for lint-only workflows avoids installing unnecessary Rails/test dependencies.
  • Package Gemfiles continue to own RBS/test/runtime dependencies.

Verification (local, Ruby 3.3.7, Bundler 4.0.10)

$ BUNDLE_GEMFILE=Gemfile bundle install            # 25 gems
$ bundle list | grep -iE 'rails|rspec-rails|actionpack|shakapacker|nokogiri' || echo none
none                                               # (only rubocop-capybara / rubocop-rspec_rails plugins present)

$ BUNDLE_GEMFILE=Gemfile bundle exec rubocop benchmarks
32 files inspected, no offenses detected

$ BUNDLE_GEMFILE=Gemfile bundle exec rspec benchmarks/spec
238 examples, 0 failures

$ cd react_on_rails     && BUNDLE_GEMFILE=../Gemfile bundle exec rubocop
217 files inspected, no offenses detected

$ cd react_on_rails_pro && BUNDLE_GEMFILE=../Gemfile bundle exec rubocop --ignore-parent-exclusion
231 files inspected, no offenses detected

$ ruby script/check-gemfile-lock-platforms
All 6 Gemfile.lock file(s) include x86_64-linux.

$ BUNDLE_GEMFILE=Gemfile BUNDLE_FROZEN=true bundle install   # frozen-mode (CI) install succeeds

Note: bare bundle exec rubocop from the repo root (the broad diagnostic sweep, not a CI step) reports 40 offenses, all confined to react_on_rails/spike/3313_prism_gemfile_rewriter/. This is pre-existing — the package .rubocop.yml excludes spike/**/*, the root config does not, and this PR does not touch .rubocop.yml or the RuboCop versions. No CI step runs the bare root sweep.

Fixes #3837

🤖 Generated with Claude Code


Note

Low Risk
Tooling and lockfile scope only; runtime and package test deps are unchanged on package Gemfiles. Main risk is contributors expecting a root bundle install to install the full gem stack.

Overview
The root Gemfile no longer eval_gemfile the react_on_rails package Gemfile. It is now an explicit lint/tooling-only bundle: pinned RuboCop plugins, an explicit benchmark gem (for Ruby ≥ 3.5), and bare rspec (~> 3.13) for repo-root benchmarks/spec (no Rails/rspec-rails).

Gemfile.lock was regenerated accordingly—roughly 25 gems instead of the full Rails/test/runtime graph (Rails, Shakapacker, PATH react_on_rails, etc. stay on package Gemfiles).

AGENTS.md documents that root bundle install is for RuboCop + benchmark script specs only, not the package stack. CI paths that already set BUNDLE_GEMFILE to the root Gemfile for RuboCop (and benchmark specs) keep the same contract with a lighter install.

Reviewed by Cursor Bugbot for commit 9b7c081. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • Documentation

    • Clarified install guidance to distinguish root-level lint/tooling dependencies from the runtime application stack and specify when to run a repo-root install.
  • Chores

    • Reworked the repo-root dependency config to be tooling-only and to explicitly pin and isolate linting and test tools (RuboCop family, rspec) plus a benchmark helper for tooling compatibility.

Follow-up to #3836. PR #3836 centralized RuboCop ownership in the committed
root Gemfile/Gemfile.lock but kept the root Gemfile eval_gemfile-ing
react_on_rails/Gemfile, so a root `bundle install` still pulled in the full
OSS Rails/dev/test/runtime stack instead of only lint gems.

This makes the root Gemfile a pure lint/tooling bundle:

- Remove `eval_gemfile File.expand_path("react_on_rails/Gemfile", ...)` and add
  an explicit `source "https://rubygems.org"`.
- Declare only the gems RuboCop's config needs: rubocop, rubocop-performance,
  rubocop-rspec (matching the root .rubocop.yml `require:` plugins), pinned to
  the same versions the package locks resolve (1.61.0 / 1.20.2 / 2.31.0).
- Add bare `rspec (~> 3.13)` so benchmark.yml's "Run benchmark script specs"
  step (`bundle exec rspec benchmarks/spec`, which #3836 wired to the root
  bundle) keeps working. Those specs deliberately load no Rails and no
  react_on_rails gem (see benchmarks/spec/spec_helper.rb), so bare rspec — not
  the package's rspec-rails stack — is all the root bundle needs.
- Regenerate the committed root Gemfile.lock: it now resolves 25 lint/tooling
  gems (down from ~150+) with no rails, actionpack, activesupport, nokogiri,
  shakapacker, rspec-rails, runtime capybara, or react_on_rails PATH gem.
  PLATFORMS keeps ruby/arm64-darwin/x86_64-linux so the committed-lock platform
  check stays green.
- Update AGENTS.md to describe the root Gemfile as a lint/tooling-only bundle.

The package Gemfiles continue to own RBS/test/runtime deps. Root RuboCop
commands still resolve from the one committed root lock; CI lint steps already
point BUNDLE_GEMFILE at the root Gemfile (from #3836), so they are unaffected.

Verification (local, Ruby 3.3.7, Bundler 4.0.10):
- root `bundle install`: 25 gems, no rails/rspec-rails/actionpack
- `cd react_on_rails && BUNDLE_GEMFILE=../Gemfile bundle exec rubocop`: 217 files, 0 offenses
- `cd react_on_rails_pro && BUNDLE_GEMFILE=../Gemfile bundle exec rubocop --ignore-parent-exclusion`: 231 files, 0 offenses
- root `bundle exec rubocop benchmarks`: 32 files, 0 offenses
- root `bundle exec rspec benchmarks/spec`: 238 examples, 0 failures
- script/check-gemfile-lock-platforms: all 6 locks include x86_64-linux

Fixes #3837

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 72f44d83-414d-463b-b45d-19520e6d1cad

📥 Commits

Reviewing files that changed from the base of the PR and between 2d38e2f and 9b7c081.

⛔ Files ignored due to path filters (1)
  • Gemfile.lock is excluded by !**/*.lock
📒 Files selected for processing (1)
  • Gemfile
🚧 Files skipped from review as they are similar to previous changes (1)
  • Gemfile

Walkthrough

Root Gemfile is refactored from a convenience setup that evaluated react_on_rails/Gemfile into an explicit lint/tooling-only bundle with pinned RuboCop and rspec gems. Documentation in AGENTS.md is updated to clarify the root bundle's limited scope and when to run bundle install at the repo root.

Changes

Root Gemfile Lint-Only Refactor

Layer / File(s) Summary
Root Gemfile rewrite and AGENTS.md update
Gemfile, AGENTS.md
Root Gemfile is converted from a convenience dev setup that eval_gemfiles react_on_rails/Gemfile into a lint/tooling-only bundle with explicit rubygems source and pinned rubocop, rubocop-performance, rubocop-rspec, rspec, and benchmark. AGENTS.md now documents that the root Gemfile is lint/tooling-only and that bundle install at the repo root should be run only when root Gemfile pins change.

Estimated Code Review Effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly Related Issues

Possibly Related PRs

Suggested Labels

review-needed, enhancement, full-ci, benchmark, P3

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main objective of the PR: converting the root RuboCop bundle from a developer-convenience setup that included the Rails/test stack to a lint-only tooling bundle.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch jg/3837-root-rubocop-lint-only-bundle

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code Review: Make root RuboCop bundle lint-only

Overall: Clean, well-reasoned change. Ready to merge.

Summary

This PR drops the eval_gemfile delegation from the root Gemfile and replaces it with an explicit lint/tooling-only bundle. The Gemfile.lock shrinks from ~150+ gems to 25 — a significant win for CI install time and attack surface. The logic is sound and well-documented.


Positives

  • Drastic scope reduction: 25 gems vs. ~150+ is a meaningful improvement for install time and dependency exposure.
  • Clear separation of concerns: The root bundle is now explicitly for lint tooling; package Gemfiles continue to own their runtime/test stacks. The inline comments in Gemfile explain all the design constraints well.
  • Backward-compatible: CI steps already set BUNDLE_GEMFILE to the root; behavior is unchanged, just faster to install.
  • Verification is thorough: The frozen-mode install test (BUNDLE_FROZEN=true) and the check that rails/rspec-rails don't appear in the lock are exactly the right assertions.

Minor observations

1. Version constraint style inconsistency — rspec

The three RuboCop gems use exact-version pins (= 1.61.0, etc.), but rspec uses a pessimistic constraint (~> 3.13). Both are defensible, but the comment says "pinned versions must match what the package locks resolve" — which only holds when the root pins exactly. A bundle update rspec run in isolation could drift the root lock ahead of what the package Gemfiles resolve.

Consider tightening to gem "rspec", "3.13.2" (matching the lock) for consistency with the RuboCop gems, or at minimum note in the comment that rspec is allowed to float within the minor.

2. Version drift has no automated backstop

The comment notes that the root's pinned versions must match the package lock's resolved versions, but there's no CI check to enforce this. If someone bumps rubocop in react_on_rails/Gemfile without touching the root Gemfile, the drift will be silent until RuboCop reports unexpected offenses. A lightweight guard (a new script or an extension to script/check-gemfile-lock-platforms) could catch this, but it's optional polish — the PR itself doesn't make the situation worse.

3. benchmark.yml rspec step has no explicit BUNDLE_GEMFILE

Line 151 of .github/workflows/benchmark.yml:

run: bundle exec rspec benchmarks/spec

This relies on the preceding setup-bundle action (with working-directory: .) having configured the root bundle. That works correctly, but unlike the RuboCop lint steps (which set BUNDLE_GEMFILE explicitly), this step is implicitly coupled to runner working-directory. Not a bug, but adding BUNDLE_GEMFILE: ${{ github.workspace }}/Gemfile here would make the intent explicit and consistent with the surrounding lint steps.

4. Platform list reduction — informational

PLATFORMS dropped from 9 variants to 3 (arm64-darwin, ruby, x86_64-linux), losing x86_64-darwin (Intel Mac). Since no gem in the new lock has native extensions, the generic ruby platform handles the fallback — Bundler will install source variants on unrecognized platforms. This is technically correct. Intel Mac developers may see a one-time Bundler notice on first install, but it won't block them.


Verdict

Items 1–4 are all minor polish or informational; none is blocking. The core change is correct and the tradeoff is clearly explained.

Comment thread Gemfile
gem "rubocop-performance", "1.20.2", require: false
gem "rubocop-rspec", "2.31.0", require: false

gem "rspec", "~> 3.13", require: false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The three RuboCop gems use exact-version pins (= x.y.z) but rspec uses a pessimistic constraint. The header comment says "pinned versions must match what the package locks resolve," which only holds for exact pins. A bundle update rspec in isolation could silently drift the root lock ahead of what the package Gemfiles resolve.

Consider pinning exactly to match the lock:

Suggested change
gem "rspec", "~> 3.13", require: false
gem "rspec", "3.13.2", require: false

Or, if patch-level flexibility is intentional, add a note here clarifying that rspec is explicitly allowed to float within the minor unlike the RuboCop gems.

@greptile-apps

greptile-apps Bot commented Jun 9, 2026

Copy link
Copy Markdown

Greptile Summary

This PR converts the root Gemfile from a full-stack bundle (via eval_gemfile react_on_rails/Gemfile) into a lean lint/tooling-only bundle that declares only RuboCop plugins and bare rspec for benchmark script specs. The lockfile shrinks from ~150+ gems to 25, and AGENTS.md is updated accordingly.

  • Gemfile: Removes eval_gemfile, adds an explicit source, moves the three RuboCop gems out of the development/test group to top-level, and adds gem "rspec", "~> 3.13" for benchmark.yml's script-spec step.
  • Gemfile.lock: Regenerated at 25 gems; PLATFORMS now carries ruby / arm64-darwin / x86_64-linux, dropping the native-gem platform variants that are no longer needed since all remaining gems are pure Ruby.
  • AGENTS.md: Clarifies that the root bundle is lint/tooling-only and that updating it requires re-running bundle install at the repo root.

Confidence Score: 5/5

Safe to merge — the change is a straightforward bundle isolation with no runtime code affected.

All three files change only Gemfile declarations and documentation. The root bundle now correctly declares only the four gems it actually needs. Removing native-gem platforms from the lockfile is safe because every remaining gem is pure Ruby, so the generic ruby platform covers all environments. CI lint steps continue pointing BUNDLE_GEMFILE at the root Gemfile, the check-gemfile-lock-platforms script still finds x86_64-linux, and the benchmarks/spec step retains rspec via the root bundle. No application logic, RuboCop version, or package Gemfile is touched.

No files require special attention.

Important Files Changed

Filename Overview
Gemfile Removed eval_gemfile, added explicit source, moved rubocop gems to top-level, added rspec ~> 3.13 for benchmark specs. Clean and well-documented.
Gemfile.lock Regenerated lock shrinking from ~150+ to 25 gems. PLATFORMS reduced to ruby/arm64-darwin/x86_64-linux, which is correct for a pure-Ruby gem set. x86_64-linux is still present, satisfying check-gemfile-lock-platforms.
AGENTS.md Documentation updated to accurately describe root Gemfile as lint/tooling-only bundle. No issues.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Root Gemfile] -->|BEFORE| B[eval_gemfile react_on_rails/Gemfile]
    B --> C[Full Rails/test stack ~150+ gems]
    C --> D[rubocop + plugins]
    C --> E[rails, nokogiri, rspec-rails, ...]

    A2[Root Gemfile] -->|AFTER| F[source rubygems.org only]
    F --> G[rubocop 1.61.0]
    F --> H[rubocop-performance 1.20.2]
    F --> I[rubocop-rspec 2.31.0]
    F --> J[rspec ~> 3.13 for benchmarks/spec]
    G & H & I & J --> K[Root Gemfile.lock ~25 gems]

    L[react_on_rails/Gemfile] --> M[Package Gemfile.lock: Rails/test/runtime stack]

    style C fill:#f96,stroke:#333
    style K fill:#6f9,stroke:#333
Loading

Reviews (1): Last reviewed commit: "Make root RuboCop bundle lint-only (no R..." | Re-trigger Greptile

@alexeyr-ci2

alexeyr-ci2 commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator
# The pinned versions below must match what the react_on_rails and
# react_on_rails_pro package locks resolve, to avoid version drift and
# unexpected new offenses.

Their gemfiles and locks should not include rubocop or any of its extensions, and rspec should be declared in shared file all of them import.

CI runs the root bundle on Ruby 4.0.5, where benchmark is no longer a
default gem. rubocop 1.61.0's executable requires it, and the lint-only
bundle no longer pulls it in transitively via the Rails stack, so the
lint-js-and-ruby job failed with LoadError. Declare it explicitly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

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.

Fix All in Cursor

Bugbot Autofix is ON. A cloud agent has been kicked off to fix the reported issue.

Reviewed by Cursor Bugbot for commit 9b7c081. Configure here.

Comment thread Gemfile
# It deliberately does NOT eval_gemfile the react_on_rails package Gemfile,
# so a root `bundle install` for lint-only workflows stays fast and does not
# pull in the Rails/test/runtime stack. The package Gemfiles continue to own
# their RBS/test/runtime dependencies.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Root rake breaks lint bundle

Medium Severity

Stopping the root Gemfile from loading the package bundle leaves AGENTS.md’s root bundle plus rake / rake run_rspec:gem flow without Rails and other package gems. The monorepo root Rakefile still eager-loads react_on_rails/rakelib, which requires rails/version before tasks run.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 9b7c081. Configure here.

@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code Review: Make root RuboCop bundle lint-only

Overall: Clean, well-motivated change. Approachable with one minor note.

What this does well

  • 83% lock reduction (~150 → 25 gems) translates directly to faster lint-only CI installs
  • The Gemfile comment block is excellent — covers the intent, the rspec rationale, the benchmarks connection, and the version-sync contract clearly enough that a future contributor will understand why before touching anything
  • Proactively adding benchmark as an explicit dep for Ruby ≥ 3.5 is the right forward-looking call; waiting for this to break on a runner upgrade would be annoying
  • AGENTS.md is updated accurately and removes the now-stale instruction about syncing with react_on_rails/Gemfile
  • All three verification paths in the PR description (rubocop OSS, rubocop Pro, rspec benchmarks) are covered and confirmed

Minor: rspec version constraint is looser than the rubocop gems

The Gemfile comment explicitly says the pinned versions must match what the package locks resolve. The rubocop gems follow this with exact pins ("1.61.0", etc.), but rspec uses ~> 3.13 — which allows minor bumps (e.g. 3.14 when it ships) that the package Gemfiles may not yet resolve. Since the benchmark specs load no Rails and no react_on_rails, a minor rspec bump is unlikely to cause real problems, but it is inconsistent with the stated pinning philosophy. Consider pinning exactly ("3.13.2" matches the current resolved version in the lock) or adding a comment explaining why rspec intentionally gets a looser constraint.

Observation: x86_64-darwin dropped from PLATFORMS

The old lock included x86_64-darwin (Intel Mac); the new one has only arm64-darwin, ruby, and x86_64-linux. Because none of the gems in the new bundle have platform-specific variants (no ffi, nokogiri, sqlite3, etc.), the ruby platform covers all architectures implicitly, so this is harmless in practice. Just worth being aware that an Intel Mac contributor running bundle lock will add x86_64-darwin back, which would show up as a trivial lock diff.

No automated parity check for rubocop versions

The version-sync requirement (root pins must match package lock resolutions) is documented in a comment but not CI-enforced. A future script/hook that compares root Gemfile pins to the resolved versions in react_on_rails/Gemfile.lock would prevent drift. Not a blocker for this PR, but worth a tracking issue.


This is a solid infrastructure improvement. The rspec constraint inconsistency is the only thing worth addressing before merge.

Comment thread Gemfile
gem "rubocop-performance", "1.20.2", require: false
gem "rubocop-rspec", "2.31.0", require: false

gem "rspec", "~> 3.13", require: false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The comment above (lines 17–19) says the pinned versions must match what the package locks resolve, but rspec uses ~> 3.13 while all three rubocop gems use exact pins. The current resolved version is 3.13.2 (visible in the new lock). A minor rspec bump wouldn't break the benchmark specs since they load no Rails, but it creates a subtle inconsistency with the stated intent. Either pin exactly:

Suggested change
gem "rspec", "~> 3.13", require: false
gem "rspec", "3.13.2", require: false

…or add a brief comment explaining why rspec intentionally gets a range constraint instead of an exact pin (e.g. "benchmarks/spec is stdlib-only so any 3.13.x is safe").

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Pro Node Renderer Benchmark Summary

Benchmark RPS p50(ms) p90(ms) Status
Pro Node Renderer: simple_eval (non-RSC) 2149.06 ▼3.3% (2223.37) 4.23 ▲3.7% (4.08) 5.36 ▲0.9% (5.31) 200=64474
Pro Node Renderer: react_ssr (non-RSC) 1818.11 ▼6.1% (1935.23) 4.87 ▲3.4% (4.71) 6.48 ▲7.4% (6.03) 200=54549

▲/▼ non-zero change vs baseline · 0.0% exact/near-zero match · 🔴 significant regression · 🟢 significant improvement (tracked measures) · (n) = baseline

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Core Benchmark Summary

Benchmark RPS p50(ms) p90(ms) Status
/: Core 2.87 ▼14.4% (3.35) 1903.99 ▼16.2% (2271.52) 3332.24 ▲16.0% (2872.09) 200=98
/client_side_hello_world: Core 620.41 ▼7.0% (666.87) 10.52 ▲11.8% (9.41) 21.58 ▲17.3% (18.4) 200=18744
/client_side_rescript_hello_world: Core 624.24 ▼4.3% (652.31) 9.41 ▼2.8% (9.68) 20.78 ▲16.2% (17.89) 200=18892
/client_side_hello_world_shared_store: Core 608.21 ▼4.9% (639.47) 9.53 ▼2.0% (9.72) 21.23 ▲7.1% (19.81) 200=18376
/client_side_hello_world_shared_store_controller: Core 610.48 ▼4.9% (641.86) 10.4 ▲7.1% (9.71) 21.11 ▲3.0% (20.49) 200=18493
/client_side_hello_world_shared_store_defer: Core 564.24 ▼12.4% (644.37) 11.22 ▲15.2% (9.74) 24.03 ▲20.0% (20.03) 200=17051
/server_side_hello_world_shared_store: Core 13.08 ▼8.8% (14.34) 649.56 ▲21.1% (536.59) 821.57 ▲16.6% (704.75) 200=401
/server_side_hello_world_shared_store_controller: Core 13.57 ▼5.2% (14.32) 633.46 ▲20.3% (526.76) 801.18 ▲15.6% (692.93) 200=416
/server_side_hello_world_shared_store_defer: Core 13.38 ▼7.4% (14.45) 610.95 ▲13.6% (537.7) 795.84 ▲12.4% (708.32) 200=414
/server_side_hello_world: Core 27.25 ▼5.5% (28.83) 216.68 ▼15.5% (256.41) 341.81 ▲5.0% (325.63) 200=833
/server_side_hello_world_hooks: Core 27.36 ▼6.0% (29.12) 310.63 ▲18.0% (263.32) 354.02 ▲5.8% (334.55) 200=832
/server_side_hello_world_props: Core 27.18 ▼6.7% (29.14) 310.59 ▲15.0% (270.11) 363.0 ▲9.7% (330.99) 200=827
/client_side_log_throw: Core 449.93 ▼32.4% (665.16) 12.13 ▲24.9% (9.72) 17.48 ▼5.9% (18.57) 200=13599
/server_side_log_throw: Core 26.45 ▼7.2% (28.49) 320.68 ▲16.3% (275.85) 371.8 ▲11.8% (332.68) 200=803
/server_side_log_throw_plain_js: Core 27.93 ▼3.6% (28.97) 295.79 ▲14.9% (257.52) 350.16 ▲6.9% (327.58) 200=851
/server_side_log_throw_raise: Core 30.99 ▲7.7% (28.79) 272.44 ▲4.5% (260.8) 316.08 ▼3.4% (327.31) 3xx=942
/server_side_log_throw_raise_invoker: Core 819.2 ▲2.4% (799.86) 9.82 ▲17.5% (8.36) 16.62 ▲5.9% (15.69) 200=24649
/server_side_hello_world_es5: Core 31.03 ▲10.8% (28.01) 272.77 ▲4.7% (260.45) 317.28 ▼3.7% (329.56) 200=944
/server_side_redux_app: Core 24.46 ▼12.9% (28.07) 239.57 ▼13.6% (277.3) 391.06 ▲15.8% (337.85) 200=745
/server_side_hello_world_with_options: Core 31.05 ▲6.7% (29.1) 291.94 ▲8.6% (268.89) 319.84 ▼1.8% (325.58) 200=942
/server_side_redux_app_cached: Core 740.72 ▲11.8% (662.6) 9.65 ▼6.1% (10.27) 16.44 ▼11.3% (18.53) 200=22378
/client_side_manual_render: Core 704.15 ▲4.4% (674.69) 8.38 ▼12.9% (9.62) 21.5 ▲15.1% (18.68) 200=21272
/render_js: Core 33.15 ▲7.1% (30.94) 254.74 ▲2.6% (248.39) 294.7 ▼3.2% (304.58) 200=1007
/react_router: Core 28.98 ▲4.9% (27.63) 290.01 ▲0.5% (288.67) 337.15 ▼3.7% (349.99) 200=884
/pure_component: Core 31.03 ▲4.8% (29.6) 273.36 ▲3.2% (264.88) 317.13 ▼2.7% (325.98) 200=944
/css_modules_images_fonts_example: Core 30.31 ▲7.1% (28.3) 279.05 ▲6.0% (263.34) 330.85 ▼0.6% (332.97) 200=923
/turbolinks_cache_disabled: Core 653.84 ▼4.7% (685.79) 9.96 ▲6.1% (9.39) 21.19 ▲15.1% (18.41) 200=19756
/rendered_html: Core 31.36 ▲6.4% (29.48) 266.39 ▼1.2% (269.63) 311.85 ▼5.0% (328.21) 200=954
/xhr_refresh: Core 15.79 ▲6.4% (14.84) 365.01 ▼29.1% (514.96) 640.6 ▼5.2% (676.05) 200=489
/react_helmet: Core 29.87 ▲4.5% (28.57) 282.01 ▲5.8% (266.51) 336.08 ▲1.0% (332.76) 200=907
/broken_app: Core 29.69 ▲4.4% (28.43) 282.86 ▲9.1% (259.27) 328.12 ▲1.3% (323.83) 200=902
/image_example: Core 30.64 ▲4.7% (29.27) 279.6 ▲1.5% (275.51) 324.58 ▼2.1% (331.67) 200=929
/turbo_frame_tag_hello_world: Core 778.71 ▲4.3% (746.66) 7.61 ▼10.4% (8.49) 13.68 ▼17.7% (16.61) 200=23534
/manual_render_test: Core 683.4 ▲1.0% (676.32) 7.41 ▼20.1% (9.27) 16.24 ▼12.3% (18.51) 200=20785

▲/▼ non-zero change vs baseline · 0.0% exact/near-zero match · 🔴 significant regression · 🟢 significant improvement (tracked measures) · (n) = baseline

@justin808

Copy link
Copy Markdown
Member Author

Closing as superseded by #3841. This PR narrowed the root Gemfile but left the root Rakefile eager-loading package tasks under the slim root bundle, which Cursor correctly flagged as breaking root rake flows. #3841 carries the same #3837 goal plus the Rakefile delegation/setup updates needed to keep root commands working with separate root/package bundles.

@justin808 justin808 closed this Jun 9, 2026
@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Pro (shard 1/2) Benchmark Summary

Benchmark RPS p50(ms) p90(ms) Status
/: Pro 187.6 ▲3.2% (181.79) 47.1 ▲10.4% (42.68) 58.92 ▼4.5% (61.67) 200=5669
/error_scenarios_hub: Pro 410.0 ▲13.5% (361.29) 18.71 ▼5.1% (19.71) 29.77 ▼1.7% (30.29) 200=12388
/ssr_async_error: Pro 375.88 ▲9.9% (342.16) 20.79 ▼1.6% (21.12) 33.16 ▼5.2% (34.99) 200=11358
/ssr_async_prop_error: Pro 372.31 ▲12.0% (332.29) 16.84 ▼22.6% (21.76) 28.55 ▼19.4% (35.42) 200=11252
/non_existing_react_component: Pro 333.63 ▼6.1% (355.44) 13.81 ▼32.3% (20.41) 19.85 ▼38.4% (32.2) 200=10148
/non_existing_rsc_payload: Pro 344.62 ▼6.0% (366.5) 16.67 ▼15.4% (19.71) 35.99 ▲9.6% (32.83) 200=10415
/cached_react_helmet: Pro 343.82 ▼7.2% (370.34) 16.65 ▼10.3% (18.57) 38.46 ▲23.4% (31.17) 200=10390
/cached_redux_component: Pro 439.91 ▲14.1% (385.6) 17.85 ▼6.4% (19.08) 26.45 ▼11.9% (30.01) 200=13297
/lazy_apollo_graphql: Pro 160.2 ▲7.6% (148.94) 48.13 ▼0.4% (48.31) 72.22 ▼4.8% (75.89) 200=4844
/redis_receiver: Pro 100.55 ▲15.1% (87.33) 66.98 0.0% (66.98) 144.21 ▼2.9% (148.52) 200=3011,3xx=29
/stream_shell_error_demo: Pro 323.9 ▼3.9% (337.08) 17.67 ▼14.8% (20.75) 44.46 ▲26.7% (35.1) 200=9789
/test_incremental_rendering: Pro 385.68 ▲14.3% (337.32) 19.74 ▼5.2% (20.81) 30.46 ▼8.6% (33.33) 200=11656
/rsc_posts_page_over_redis: Pro 105.84 ▲10.3% (95.98) 70.18 ▼4.7% (73.65) 104.59 ▼11.5% (118.14) 200=3203
/async_on_server_sync_on_client: Pro 368.49 ▲15.7% (318.59) 15.07 ▼33.0% (22.48) 28.85 ▼26.8% (39.39) 200=11139
/server_router: Pro 376.36 ▲11.3% (338.27) 20.76 ▼3.0% (21.4) 33.26 ▼3.6% (34.49) 200=11371
/unwrapped_rsc_route_client_render: Pro 352.13 ▼7.3% (379.74) 16.29 ▼12.2% (18.55) 44.46 ▲49.3% (29.79) 200=10639
/async_render_function_returns_string: Pro 388.7 ▲13.7% (341.85) 20.19 ▼3.0% (20.81) 32.34 ▼4.5% (33.87) 200=11744
/async_components_demo: Pro 216.72 ▲6.4% (203.71) 38.4 ▲7.3% (35.78) 54.09 ▲6.5% (50.78) 200=6548
/stream_native_metadata: Pro 314.53 ▼7.5% (340.02) 18.19 ▼13.5% (21.02) 43.2 ▲15.8% (37.32) 200=9505
/rsc_native_metadata: Pro 354.15 ▲8.9% (325.25) 17.59 ▼19.1% (21.73) 30.46 ▼18.2% (37.22) 200=10704
/react_intl_rsc_demo: Pro 375.35 ▲13.8% (329.8) 20.38 ▼6.3% (21.75) 33.63 ▼9.2% (37.04) 200=11342
/client_side_hello_world_shared_store: Pro 315.74 ▼8.3% (344.19) 17.97 ▼13.1% (20.68) 20.84 ▼34.0% (31.56) 200=9603
/client_side_hello_world_shared_store_defer: Pro 371.49 ▲9.4% (339.43) 8.87 🟢 57.7% (20.95) 27.78 ▼17.7% (33.74) 200=11301
/server_side_hello_world_shared_store_controller: Pro 319.43 ▲12.2% (284.71) 17.15 ▼34.6% (26.22) 33.29 ▼19.1% (41.15) 200=9719
/server_side_hello_world: Pro 381.29 ▲13.5% (335.91) 20.61 ▼7.2% (22.21) 32.46 ▼7.2% (34.98) 200=11519
/client_side_log_throw: Pro 345.36 ▼6.5% (369.33) 16.61 ▼13.1% (19.12) 26.96 ▼12.7% (30.87) 200=10437
/server_side_log_throw_plain_js: Pro 431.73 ▲13.7% (379.81) 18.12 ▼7.8% (19.65) 29.18 ▼8.0% (31.71) 200=13055
/server_side_log_throw_raise_invoker: Pro 479.18 ▲16.0% (413.15) 16.29 ▼2.5% (16.71) 24.94 ▼10.3% (27.81) 200=14477
/server_side_redux_app: Pro 378.42 ▲12.7% (335.87) 16.47 ▼25.3% (22.04) 27.77 ▼24.8% (36.94) 200=11437
/server_side_redux_app_cached: Pro 424.02 ▲12.3% (377.45) 18.6 ▼2.1% (19.0) 27.27 ▼9.9% (30.27) 200=12814
/render_js: Pro 358.34 ▼5.0% (377.0) 16.04 ▼17.1% (19.35) 26.02 ▼17.4% (31.49) 200=10829
/pure_component: Pro 318.04 ▼6.0% (338.49) 18.08 ▼15.6% (21.41) 41.16 ▲16.6% (35.3) 200=9611
/turbolinks_cache_disabled: Pro 424.95 ▲14.4% (371.62) 18.11 ▼6.9% (19.45) 28.65 ▼8.9% (31.44) 200=12838
/xhr_refresh: Pro 327.19 ▲13.9% (287.26) 24.28 ▼4.4% (25.39) 35.16 ▼10.4% (39.23) 200=9889
/broken_app: Pro 389.34 ▲14.6% (339.88) 20.15 ▼5.3% (21.27) 29.9 ▼13.6% (34.62) 200=11765
/server_render_with_timeout: Pro 386.3 ▲15.0% (335.92) 20.51 ▼4.7% (21.52) 29.84 ▼12.9% (34.27) 200=11674

▲/▼ non-zero change vs baseline · 0.0% exact/near-zero match · 🔴 significant regression · 🟢 significant improvement (tracked measures) · (n) = baseline

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Pro (shard 2/2) Benchmark Summary

Benchmark RPS p50(ms) p90(ms) Status
/empty: Pro 1287.89 ▲3.5% (1244.15) 6.26 ▲6.6% (5.87) 8.53 ▼8.1% (9.28) 200=38899
/ssr_shell_error: Pro 362.61 ▲6.1% (341.75) 21.6 ▲1.3% (21.33) 34.69 ▲0.1% (34.67) 200=10956
/ssr_sync_error: Pro 299.23 ▼11.7% (338.69) 19.39 ▼7.5% (20.95) 32.84 ▼2.8% (33.79) 200=9045
/rsc_component_error: Pro 300.61 ▼11.1% (338.07) 19.29 ▼8.4% (21.05) 46.33 ▲30.5% (35.49) 200=9085
/non_existing_stream_react_component: Pro 370.33 ▲6.3% (348.45) 23.67 ▲15.7% (20.46) 32.62 ▼4.9% (34.29) 200=11189
/server_side_redux_app_cached: Pro 351.99 ▼6.7% (377.45) 6.84 ▼64.0% (19.0) 19.5 ▼35.6% (30.27) 200=10710
/loadable: Pro 337.59 ▲8.9% (310.1) 23.47 ▲0.1% (23.46) 34.64 ▼3.5% (35.91) 200=10204
/apollo_graphql: Pro 147.1 ▲3.4% (142.32) 49.71 ▼0.6% (50.01) 80.17 ▼2.6% (82.27) 200=4448
/console_logs_in_async_server: Pro 3.16 ▼1.6% (3.21) 2118.53 ▼0.1% (2121.38) 2148.66 ▼9.4% (2370.69) 200=108
/stream_error_demo: Pro 352.89 ▲7.1% (329.63) 21.94 ▲7.5% (20.41) 33.33 ▼2.4% (34.14) 200=10663
/stream_async_components: Pro 355.22 ▲7.2% (331.23) 21.93 ▼1.1% (22.17) 32.92 ▼12.5% (37.61) 200=10735
/rsc_posts_page_over_http: Pro 295.17 ▼10.0% (327.92) 19.67 ▼9.7% (21.79) 47.3 ▲29.3% (36.58) 200=8921
/rsc_echo_props: Pro 245.52 ▲9.6% (224.09) 32.82 ▲3.1% (31.83) 50.78 ▼0.9% (51.25) 200=7420
/async_on_server_sync_on_client_client_render: Pro 375.9 ▲7.0% (351.22) 20.95 ▲1.0% (20.75) 33.2 ▼1.0% (33.53) 200=11356
/server_router_client_render: Pro 377.34 ▲8.5% (347.86) 20.48 ▲1.0% (20.28) 29.88 ▼6.5% (31.95) 200=11401
/unwrapped_rsc_route_stream_render: Pro 368.13 ▲9.0% (337.84) 20.48 ▲0.4% (20.4) 35.69 ▼2.2% (36.51) 200=11125
/async_render_function_returns_component: Pro 363.53 ▲6.8% (340.37) 21.64 ▲5.1% (20.58) 30.99 ▼7.5% (33.5) 200=10986
/native_metadata: Pro 356.27 ▲6.5% (334.59) 22.24 ▲4.4% (21.31) 31.48 ▼18.4% (38.56) 200=10764
/hybrid_metadata_streaming: Pro 355.35 ▲6.1% (334.96) 22.31 ▲3.9% (21.46) 35.16 ▲0.5% (34.98) 200=10736
/cache_demo: Pro 349.26 ▲7.2% (325.71) 21.68 ▼0.2% (21.72) 33.71 ▼8.1% (36.7) 200=10555
/client_side_hello_world: Pro 373.15 ▲0.9% (369.68) 20.72 ▲9.6% (18.9) 30.47 ▼3.6% (31.61) 200=11275
/client_side_hello_world_shared_store_controller: Pro 359.09 ▲5.2% (341.49) 20.95 ▲2.3% (20.48) 32.02 ▼3.4% (33.16) 200=10852
/server_side_hello_world_shared_store: Pro 298.94 ▲2.0% (292.95) 26.62 ▲2.9% (25.87) 37.3 ▼4.9% (39.2) 200=9033
/server_side_hello_world_shared_store_defer: Pro 313.07 ▲9.2% (286.76) 25.99 ▲3.4% (25.14) 36.71 ▼5.3% (38.78) 200=9463
/server_side_hello_world_hooks: Pro 370.27 ▲4.7% (353.73) 20.4 ▼2.6% (20.94) 32.22 ▼5.9% (34.24) 200=11192
/server_side_log_throw: Pro 355.63 ▲4.2% (341.44) 24.76 ▲16.0% (21.35) 32.64 ▼5.4% (34.52) 200=10678
/server_side_log_throw_raise: Pro 561.64 ▼13.1% (645.99) 10.32 ▼6.2% (11.0) 13.21 ▼27.5% (18.23) 3xx=17081
/server_side_hello_world_es5: Pro 293.49 ▼13.6% (339.71) 19.75 ▼7.0% (21.23) 31.78 ▼12.9% (36.49) 200=8870
/server_side_hello_world_with_options: Pro 351.64 ▲5.0% (335.05) 24.79 ▲14.9% (21.57) 33.16 ▼3.0% (34.19) 200=10624
/client_side_manual_render: Pro 390.18 ▲4.6% (372.98) 19.22 ▼0.7% (19.35) 29.4 ▼6.7% (31.51) 200=11793
/react_router: Pro 427.58 ▲8.8% (393.05) 16.89 ▼4.2% (17.64) 29.48 ▲2.7% (28.71) 200=12921
/css_modules_images_fonts_example: Pro 361.69 ▲5.3% (343.41) 15.68 ▼25.8% (21.14) 28.78 ▼11.7% (32.6) 200=11001
/rendered_html: Pro 294.52 ▼15.0% (346.49) 19.53 ▼5.2% (20.61) 51.5 ▲52.6% (33.75) 200=8900
/react_helmet: Pro 346.26 ▲4.3% (331.97) 25.25 ▲15.2% (21.91) 33.67 ▼4.5% (35.26) 200=10461
/image_example: Pro 291.25 ▼15.0% (342.81) 19.94 ▼11.8% (22.62) 56.54 ▲65.1% (34.26) 200=8801
/posts_page: Pro 248.57 ▲57.1% (158.18) 31.58 ▼47.5% (60.16) 47.77 ▼45.4% (87.48) 200=7510

▲/▼ non-zero change vs baseline · 0.0% exact/near-zero match · 🔴 significant regression · 🟢 significant improvement (tracked measures) · (n) = baseline

@justin808 justin808 deleted the jg/3837-root-rubocop-lint-only-bundle branch June 12, 2026 09:52
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.

Follow-up: Keep root RuboCop bundle lint-only

2 participants