Skip to content

Keep root RuboCop bundle lint-only#3841

Merged
justin808 merged 8 commits into
mainfrom
jg-codex/3837-root-rubocop-lint-only
Jun 9, 2026
Merged

Keep root RuboCop bundle lint-only#3841
justin808 merged 8 commits into
mainfrom
jg-codex/3837-root-rubocop-lint-only

Conversation

@justin808

@justin808 justin808 commented Jun 9, 2026

Copy link
Copy Markdown
Member

Summary

Closes #3837.

  • Keep the root Gemfile focused on repo-wide RuboCop, hook, release, and benchmark script tooling instead of evaluating the OSS package Gemfile.
  • Delegate package Rake tasks from the monorepo root through the react_on_rails bundle so root callers keep working without contaminating package locks.
  • Update setup/CI helpers and contributor docs so each command selects the intended Gemfile explicitly.

Validation

  • bundle install
  • bundle exec rake lint
  • (cd react_on_rails && bundle exec rake lint:rubocop) with package/root lockfile hashes unchanged
  • bundle exec rubocop Rakefile Gemfile rakelib/release.rake react_on_rails/rakelib/lint.rake
  • bundle exec ruby -c Rakefile
  • ruby -c rakelib/release.rake
  • ruby -c react_on_rails/rakelib/lint.rake
  • bundle exec rspec benchmarks/spec
  • zsh -n conductor-setup.sh
  • bash -n bin/ci-local bin/ci-rerun-failures bin/setup
  • shellcheck bin/ci-rerun-failures bin/ci-local bin/setup
  • pnpm exec prettier --check AGENTS.md .github/dependabot.yml
  • bundle exec bin/setup --help
  • bundle exec rake node_package
  • (cd react_on_rails && bundle exec rake rbs:validate)
  • (cd react_on_rails && bundle check)
  • (cd react_on_rails && BUNDLE_GEMFILE="$PWD/Gemfile" bundle exec rspec spec/react_on_rails/ruby_version_support_spec.rb)
  • (cd react_on_rails && BUNDLE_GEMFILE=../Gemfile bundle exec rubocop --format simple --cache false -- Rakefile ../Rakefile ../rakelib/release.rake)
  • codex review --base origin/main
  • git diff --check

Full CI and benchmark are requested because this changes root/package Rake delegation and setup/CI bundle selection.


Note

Medium Risk
Touches root vs package bundle boundaries, Rake delegation, and local CI/setup scripts; wrong Gemfile selection could break contributor workflows, but runtime gem behavior is unchanged.

Overview
Splits the monorepo root Ruby bundle from the OSS gem so bundle install at the repo root only pulls lint, hooks, release, and benchmark-spec tooling (RuboCop, Rake, RSpec, lefthook, etc.), instead of evaluating react_on_rails/Gemfile and dragging in Rails and the full test stack. Gemfile.lock shrinks accordingly; Dependabot’s bundler config now includes / for that lock.

Root rake still works via delegation: the root Rakefile no longer loads the package Rakefile; it runs common tasks (lint, run_rspec:*, shakapacker_examples:*, node_package, etc.) inside react_on_rails with bundle exec, auto-installing that bundle when needed. Root rake lint is root-tooling RuboCop only; full package lint stays cd react_on_rails && bundle exec rake lint.

Contributor and CI scripts (AGENTS.md, bin/setup, bin/ci-local, bin/ci-rerun-failures, conductor-setup.sh) now install and invoke the correct Gemfile per directory via a shared bundle_command helper. Package lint still invokes root RuboCop through BUNDLE_GEMFILE=../Gemfile with Bundler.with_unbundled_env.

Release rake drops the ReactOnRails::Utils require and uses a local release_truthy? for dry-run/override flags.

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

Summary by CodeRabbit

  • Chores

    • Centralized Bundler/Gemfile handling across the repo, CI, and setup scripts to ensure correct dependency installation and selection.
    • Improved dependency bootstrapping order and environment isolation for OSS and Pro flows.
    • Unified truthiness parsing for release tooling.
  • Documentation

    • Clarified workflow and setup commands to consistently scope package-specific bundle and task invocations.
  • Refactor

    • Reworked root-level task delegation and lint/test wrappers for clearer, safer task execution.

Agent Merge Confidence

Mode: accelerated-rc
Score: 9/10
Auto-merge recommendation: yes
Affected areas: root/OSS bundle separation, RuboCop lint routing, setup/CI scripts, Dependabot config.
Checks: current head 82993589292d0d9bd6e9fa0246eb22213b42f763 has 49 passing checks and 5 expected selector-skipped checks; full CI and benchmark labels are present and exercised.
Review threads: 0 unresolved current review threads.
Known residual risk: root bundle/package boundary touches setup and CI helper routing; mitigated by local shell/Rake/RuboCop/lint validations, full CI and benchmark pass, and current-head AI review checks.
Finalized by: Claude Code Review check claude-review for current head 82993589292d0d9bd6e9fa0246eb22213b42f763 (SUCCESS).

@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

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

This PR separates the root lint/dev Gemfile from package Gemfiles, updates Dependabot to include the repo root, adds bundler helpers and per-Gemfile execution in setup/CI scripts, delegates package rake tasks from the root Rakefile, rewires lint tasks to use the root bundle, and standardizes release flag parsing.

Changes

Bundler Environment Split for Lint-Only Root Bundle

Layer / File(s) Summary
Root Gemfile split and Dependabot configuration
.github/dependabot.yml, Gemfile
Root Gemfile no longer evals react_on_rails/Gemfile and instead lists repo-wide lint/dev gems; Dependabot Bundler directories now explicitly includes /.
Root Rakefile delegation framework
Rakefile
Adds require "bundler", delegation helpers (ensure_package_bundle, root_bundle_exec_in, define_package_task) and registers delegated package tasks; introduces lint namespace that runs RuboCop via root bundle.
Shell script bundler environment helpers
bin/setup, bin/ci-local, bin/ci-rerun-failures, conductor-setup.sh
Adds bundle_command helpers, per-Gemfile path variables, and ensure_oss_dependencies gating; CI and setup flows install root lint deps then package deps and run package tasks from react_on_rails/ as needed.
React_on_rails lint task integration with root bundle
react_on_rails/rakelib/lint.rake
Introduces root_bundle_command and wraps RuboCop calls in Bundler.with_unbundled_env, ensuring RuboCop runs against the monorepo root lint bundle; autofix similarly uses the root bundle.
Release rake refactoring and truthy helper
rakelib/release.rake
Removes ReactOnRails::Utils.object_to_boolean, adds release_truthy?, and updates override/dry-run parsing to use the new helper.
AGENTS.md workflow documentation updates
AGENTS.md
Agent command snippets updated to run root bundle then package bundle, and to scope rake commands to react_on_rails/ using bundle exec, matching script behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related issues

  • #3825: Consolidating Ruby lint ownership overlaps with this PR's root Gemfile / lint orchestration changes.

Possibly related PRs

Suggested labels

review-needed, enhancement, documentation, P2

Suggested reviewers

  • ihabadham
  • AbanoubGhadban
  • alexeyr-ci2
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title directly reflects the main objective: splitting the root bundle to keep it lint-only for RuboCop, avoiding unnecessary package dependencies at repo root.
Linked Issues check ✅ Passed All coding objectives from issue #3837 are met: root Gemfile is lint-only, root RuboCop uses committed root lock, package Gemfiles own dependencies, root tasks delegate to package tasks via bundle helpers.
Out of Scope Changes check ✅ Passed All changes directly support the lint-only root bundle objective: Gemfile simplification, Rakefile delegation, CI/setup script helpers for bundle selection, Dependabot configuration, and lint task organization.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch jg-codex/3837-root-rubocop-lint-only

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

Overview

This PR cleanly separates the monorepo root bundle from the OSS package bundle, shrinking the root Gemfile.lock from ~300 entries down to ~36. The delegation pattern in the root Rakefile, the bundle_command helper in CI scripts, and the Dependabot/conductor updates are all sound. A few things worth discussing below.


Issues Found

1. Rakefilelint:rubocop lints the package directory, not the monorepo root

root_bundle_exec_in(gem_root, "rubocop", ".") changes CWD to react_on_rails/ before running rubocop ., so it lints package files with the root bundle — identical to what react_on_rails/rakelib/lint.rake already does. The root-level files (Rakefile, rakelib/release.rake, Gemfile) are not linted by rake lint; only the optional diagnostic BUNDLE_GEMFILE=Gemfile bundle exec rubocop covers them. This is arguably by design (AGENTS.md marks it "not the CI contract"), but the desc says "Run root RuboCop with the root tooling bundle" which implies linting root files. Either fix the directory to __dir__ (the monorepo root) or update the description to clarify it lints the package directory.

2. Rakefilelint:lint is a confusing intermediate task

task lint: :rubocop defined inside namespace :lint creates a task named lint:lint. The top-level task lint: ["lint:lint"] then chains through it. The only thing lint:lint adds over lint:rubocop is a puts. Consider collapsing this into the top-level lint task directly, or renaming so rake -T output is less confusing.

3. Rakefile — hardcoded delegation list is a maintenance burden

The ~70-entry array is the right trade-off to avoid loading the package bundle into the root context, but it will silently fail to delegate any task added to react_on_rails/Rakefile in the future. Consider adding a comment or a CI/rake guard (e.g. a task that diffs this list against the package's defined tasks) so drift is caught.

4. rakelib/release.rake — verify release_truthy? parity with ReactOnRails::Utils.object_to_boolean

The new helper looks correct for nil, false, true, "true", "FALSE", etc. One edge case: Rake's TaskArguments#[] returns nil for unset args (which release_truthy?(nil)false ✓). If object_to_boolean accepted additional truthy values (e.g. :yes, "on") that internal callers rely on, the new helper is narrower — worth a grep to confirm nothing passes unexpected types.


Positive Notes

  • The bundle_command shell helper in bin/ci-local / bin/ci-rerun-failures correctly unsets all Bundler env vars before setting BUNDLE_GEMFILE. Since run_job uses eval, the function is available in scope — no subshell visibility issue.
  • The jq --argjson fix in ci-rerun-failures (replacing shell string interpolation into a jq filter) is a good correctness/injection fix.
  • bin/setup's local END_TIME=$(date +%s) → two-line fix is correct; local suppresses the exit status of command substitution in bash.
  • Version-pinning all root Gemfile deps with exact versions (= x.y.z) is appropriate for a tooling-only bundle.
  • Adding "/" to dependabot.yml and react_on_rails to conductor-setup.sh's LOCKFILE_DIRS are both necessary follow-ons for the split.

Comment thread Rakefile Outdated
Comment thread Rakefile Outdated
Comment thread Rakefile

@coderabbitai coderabbitai Bot left a comment

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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
bin/ci-local (1)

240-243: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use explicit root Gemfile for root dependency bootstrap.

Line 242 still runs bare bundle install. If the caller environment already has BUNDLE_GEMFILE set, this can install/update the wrong bundle and undermine the root-vs-package boundary this PR introduces.

Suggested fix
-if [ ! -d "node_modules" ] || [ ! -d "vendor/bundle" ]; then
+if [ ! -d "node_modules" ] || ! bundle_command "$ROOT_GEMFILE" bundle check >/dev/null 2>&1; then
   echo -e "${YELLOW}Installing dependencies...${NC}"
-  if ! (bundle install && pnpm install); then
+  if ! (bundle_command "$ROOT_GEMFILE" bundle install && pnpm install); then
     echo -e "${RED}✗ Dependency installation failed${NC}"
     echo -e "${RED}Cannot proceed without dependencies. Please fix the errors above.${NC}"
     exit 1
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@bin/ci-local` around lines 240 - 243, The script currently runs a bare
`bundle install` in bin/ci-local which can pick up a caller's BUNDLE_GEMFILE and
install/update the wrong bundle; update the installation step to explicitly
target the repository root Gemfile by invoking bundle with an explicit Gemfile
(e.g., set BUNDLE_GEMFILE=Gemfile or pass --gemfile=Gemfile) when running the
`bundle install` command so the root dependency bootstrap always uses the
intended Gemfile.
AGENTS.md (1)

116-116: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Verify bundle selection for package spec files.

With the root bundle now limited to lint/tooling (plus RSpec only for benchmark specs), running bundle exec rspec react_on_rails/spec/react_on_rails/... from the repo root would use the root bundle, which lacks the package's test dependencies. Consider updating this example to match the delegation pattern:

(cd react_on_rails && bundle exec rspec spec/react_on_rails/path/to/spec.rb)

This ensures the package bundle (which owns test dependencies per the PR objectives) is used for package tests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@AGENTS.md` at line 116, Update the example command in AGENTS.md that
currently shows "bundle exec rspec
react_on_rails/spec/react_on_rails/path/to/spec.rb" so it runs the package's
bundle instead of the repo root bundle; replace it with a delegated invocation
that cd's into the react_on_rails package (using a subshell or equivalent) and
then runs bundle exec rspec on the package-local spec path
(spec/react_on_rails/path/to/spec.rb) to ensure the package's test dependencies
are used.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@AGENTS.md`:
- Line 116: Update the example command in AGENTS.md that currently shows "bundle
exec rspec react_on_rails/spec/react_on_rails/path/to/spec.rb" so it runs the
package's bundle instead of the repo root bundle; replace it with a delegated
invocation that cd's into the react_on_rails package (using a subshell or
equivalent) and then runs bundle exec rspec on the package-local spec path
(spec/react_on_rails/path/to/spec.rb) to ensure the package's test dependencies
are used.

In `@bin/ci-local`:
- Around line 240-243: The script currently runs a bare `bundle install` in
bin/ci-local which can pick up a caller's BUNDLE_GEMFILE and install/update the
wrong bundle; update the installation step to explicitly target the repository
root Gemfile by invoking bundle with an explicit Gemfile (e.g., set
BUNDLE_GEMFILE=Gemfile or pass --gemfile=Gemfile) when running the `bundle
install` command so the root dependency bootstrap always uses the intended
Gemfile.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4e42514d-c3d8-4c31-b0a9-3503b6045951

📥 Commits

Reviewing files that changed from the base of the PR and between e73221d and e0c9318.

⛔ Files ignored due to path filters (1)
  • Gemfile.lock is excluded by !**/*.lock
📒 Files selected for processing (10)
  • .github/dependabot.yml
  • AGENTS.md
  • Gemfile
  • Rakefile
  • bin/ci-local
  • bin/ci-rerun-failures
  • bin/setup
  • conductor-setup.sh
  • rakelib/release.rake
  • react_on_rails/rakelib/lint.rake

Comment thread rakelib/release.rake
@greptile-apps

greptile-apps Bot commented Jun 9, 2026

Copy link
Copy Markdown

Greptile Summary

This PR separates the monorepo root Gemfile from the react_on_rails package Gemfile (previously connected via eval_gemfile), shrinking the root lockfile to tooling-only gems and delegating package Rake tasks through a subprocess bridge.

  • Gemfile / Gemfile.lock: Root Gemfile now has its own source block with only rubocop, lefthook, rake, rspec, benchmark, and gem-release; eval_gemfile is removed and the lockfile shrinks from ~300 gems to ~30.
  • Rakefile: Replaces direct load of the package Rakefile with a define_package_task / package_rake_task delegation pattern; a namespace :lint block keeps bundle exec rake lint working using the root bundle's RuboCop.
  • bin/ci-local, bin/ci-rerun-failures, bin/setup: Add a bundle_command helper (clears stale Bundler env vars, sets explicit BUNDLE_GEMFILE) and split OSS / root / Pro bundle invocations; rakelib/release.rake inlines a copy of ReactOnRails::Utils.object_to_boolean to drop the cross-bundle require.

Confidence Score: 3/5

The core Gemfile split and Rake delegation are correct, but bin/ci-local uses bare cd react_on_rails inside eval'd run_job strings that permanently change the shell cwd, breaking Pro-test jobs when Ruby and Pro tests run together.

Every new run_job call for OSS Ruby tests uses cd react_on_rails without a subshell wrapper. Since _run_job_shell uses eval, this changes the current shell's cwd after the first successful Ruby test job. Subsequent Pro-test jobs that rely on relative cd react_on_rails_pro then resolve to react_on_rails/react_on_rails_pro, which does not exist, causing those jobs to fail. This only fires in --all mode or when both packages change, but that is the most important scenario for a full local CI run.

bin/ci-local — all four new run_job commands wrapping OSS bundle tasks need their cd react_on_rails wrapped in subshell parentheses.

Important Files Changed

Filename Overview
bin/ci-local Adds bundle_command helper and ensure_oss_dependencies, but bare cd react_on_rails inside eval'd run_job strings permanently changes the script's cwd, breaking subsequent Pro-test jobs that use relative cd react_on_rails_pro.
Rakefile Replaces direct Rakefile/rakelib loading with a delegation mechanism via package_rake_task; works correctly, though lint:rubocop lints gem_root not the repo root's own Ruby files despite its description.
bin/ci-rerun-failures Adds bundle_command, ensure_oss_dependencies, and requires_oss_bundle helpers; uses absolute paths and subshells correctly so no cwd contamination issue.
Gemfile Removes eval_gemfile delegation and declares its own source block; correctly lists only the small tooling-only gem set with pinned versions.
rakelib/release.rake Removes dependency on ReactOnRails::Utils by inlining an identical release_truthy? helper; verified to match the original object_to_boolean implementation exactly.
react_on_rails/rakelib/lint.rake Extracts root_bundle_command helper and wraps RuboCop calls with Bundler.with_unbundled_env to ensure clean env when running cross-bundle rubocop.
bin/setup Adds bundle_command helper and an explicit react_on_rails dependency install step; also fixes a shellcheck warning for the local variable assignment.
conductor-setup.sh Adds react_on_rails to LOCKFILE_DIRS so that matching Bundler installs are performed for the now-independent package Gemfile.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["bundle exec rake task\n(repo root)"] --> B{task type?}
    B -->|"lint / lint:rubocop"| C["root_bundle_exec_in\nBUNDLE_GEMFILE=root Gemfile\nrubocop . in gem_root"]
    B -->|"delegated tasks\nnode_package, run_rspec:*, etc."| D["package_rake_task\nDir.chdir(gem_root)"]
    D --> E["ensure_package_bundle\nbundle check / install"]
    E --> F["Bundler.with_unbundled_env\nbundle exec rake task"]
    F --> G["react_on_rails/Rakefile\n(package bundle)"]
    B -->|"release / sync_github_release"| H["rakelib/release.rake\n(root bundle)"]
Loading

Comments Outside Diff (2)

  1. bin/ci-local, line 271-276 (link)

    P1 Bare cd inside eval permanently changes the script's working directory

    _run_job_shell uses eval "$command", which runs in the current shell. When a command like "cd react_on_rails && bundle_command ..." is eval'd and the cd succeeds, the script's cwd is now react_on_rails/ for all subsequent code. Later Pro-test jobs that use "cd react_on_rails_pro && ..." (a relative path) will look for react_on_rails/react_on_rails_pro — which doesn't exist — causing those jobs to fail silently or abort the script. The same issue affects the directory checks inside ensure_pro_dependencies ([ ! -d "react_on_rails_pro" ]).

    Wrapping each new command in a subshell (cd ... && ...) preserves the cwd while still making bundle_command available (bash functions are inherited by subshells).

  2. bin/ci-rerun-failures, line 164-172 (link)

    P2 requires_oss_bundle may not cover all OSS bundle cases

    The helper only matches "rspec-package-tests", "dummy-app-integration-tests", and "examples". The lint-js-and-ruby case uses the root bundle and doesn't need the OSS bundle, so that's fine today. But if a new command ID is added later that needs the OSS bundle, forgetting to update this function will silently skip ensure_oss_dependencies. A brief inline comment explaining the intended scope would help future authors.

    Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Reviews (1): Last reviewed commit: "Keep root RuboCop bundle lint-only" | Re-trigger Greptile

Comment thread bin/ci-local
Comment thread bin/ci-local
Comment thread bin/ci-local
Comment thread Rakefile

@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 e051b25. Configure here.

Comment thread bin/ci-local
@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code Review

Good architectural split — keeping the root bundle focused on tooling-only gems rather than pulling in the full Rails/RoR stack is a clear improvement. The lock file shrink alone is a strong signal.

A few items worth addressing before merge:

Delegation list will drift (Rakefile lines 86–152). The 65-entry hardcoded task list is the main maintainability risk. Any new task added to the package Rakefile must also be manually mirrored here. When a task is added to the package but not the root, rake <task> will fail with a cryptic "don't know how to build task" error instead of delegating. A CI check that diffs rake -T output, or a prominent comment directing contributors to update both places, would help catch this.

rake lint semantics have changed (Rakefile line 155). Previously it ran the full chain (RuboCop + ESLint + Prettier + stylelint). Now it only runs root-bundle RuboCop. AGENTS.md correctly redirects to (cd react_on_rails && bundle exec rake lint), but contributors with muscle memory and any external CI scripts that relied on root rake lint being the full suite will silently get partial coverage. Consider either delegating to the package's lint task (to preserve semantics) or amending the task desc to say explicitly that this is rubocop-only.

rubocop --version printed on every lint run (Rakefile line 73 / lint.rake line 18). The version is printed before the actual rubocop run on every invocation, which adds noise to CI logs. If it is intended as a diagnostic, wrapping it in a VERBOSE guard or moving it to the task desc would be cleaner.

bundle_command is duplicated across three scripts. The same 11-line function is copy-pasted verbatim into bin/ci-local, bin/ci-rerun-failures, and bin/setup. A shared bin/lib/bundle-helpers.sh sourced by all three would make future changes a single-point update. Not a blocker.

Minor positives: The jq --argjson fix in bin/ci-rerun-failures is a genuine correctness improvement (numeric JSON type). release_truthy? is a faithful copy of ReactOnRails::Utils.object_to_boolean so semantics are preserved. Bundler.with_unbundled_env usage in the delegation helpers is the right approach to prevent bundle contamination. ensure_package_bundle auto-installing on first use is a nice DX improvement. Adding "/" to dependabot bundler directories ensures root tooling gems get automated updates.

Comment thread Rakefile
Comment thread Rakefile Outdated
Comment thread Rakefile Outdated
Comment thread bin/ci-local
Comment thread Rakefile Outdated
Comment thread Rakefile Outdated
Comment thread bin/ci-local
Comment thread rakelib/release.rake
Comment thread bin/ci-local
Comment thread Rakefile
Comment thread bin/ci-rerun-failures Outdated
Comment thread Rakefile Outdated
Comment thread rakelib/release.rake
Comment thread Rakefile
Comment thread bin/ci-rerun-failures
@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code Review

Overview

This PR cleanly separates the monorepo root Ruby bundle from the OSS gem bundle, shrinking the root Gemfile.lock from ~300 gems down to ~36. The delegation approach (subprocess bundle exec rake rather than load-ing the package Rakefile) is sound, and the setup/CI scripts are updated consistently. Validation steps in the PR description are thorough.


Findings

Medium — requires_oss_bundle can silently drift from run_command (bin/ci-rerun-failures:57–65)

The pre-pass loop at line 353 checks requires_oss_bundle to decide whether to call ensure_oss_dependencies before running any commands. But the allowlist is a separate case statement that must be kept in sync with run_command manually. If a future contributor adds a new bundle_command "$OSS_GEMFILE" branch to run_command() and forgets to update requires_oss_bundle, OSS deps won't be installed and the failure will look like a bundle error, not a missing setup step. See inline comment for a co-location fix.

Low — rake lint behaviour change at the root (Rakefile:170)

rake lint now runs root tooling RuboCop only rather than the full package lint suite. This is documented in the desc string and in AGENTS.md, but it's a silent behaviour change for any CI scripts or contributor habits that relied on rake lint meaning "full lint." A brief puts hint at the end of the task pointing to the package command would help.

Low — release_truthy? carries over "t" as a truthy value (rakelib/release.rake:39)

Replacing ReactOnRails::Utils.object_to_boolean with a local function is the right move to cut the cross-bundle dependency. The implementation is correct for all practical inputs. The only nit is that "t" is a Rails-form-checkbox convention and looks like a typo in a CLI release context — worth a brief comment explaining its origin, or dropping it if no call site uses it.

Low — root_rubocop_paths scope (Rakefile:71)

Root-level lint:rubocop covers Gemfile Rakefile rakelib but not react_on_rails/rakelib/*.rake, which are edited in this PR and run with the root bundle. Intentional or oversight? Not a blocker, but worth a deliberate decision.


Positives

  • jq injection fix in bin/ci-rerun-failures (switching from string-concatenated $PR_NUMBER to --argjson) is a good security improvement.
  • Subshell scoping of eval in _run_job_shell prevents cd side-effects from leaking between jobs — good defensive change.
  • The bundle_command helper correctly unsets all relevant Bundler env vars (BUNDLE_APP_CONFIG, BUNDLE_BIN_PATH, BUNDLE_GEMFILE, BUNDLER_VERSION, RUBYOPT). The three-file duplication is a known shell scripting trade-off and the sync comments make it visible.
  • ensure_package_bundle / @package_bundle_ready memoisation is clean and avoids repeated bundle check subprocess calls within a single Rake run.
  • Gemfile.lock going from ~300 to ~36 gems is a meaningful CI setup-time win.

Overall this is a well-structured change with good validation coverage. The requires_oss_bundle drift risk is the only item I'd want addressed before merge; the rest are low-priority nits.

@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) 3985.37 🟢 79.2% (2223.37) 2.14 🟢 47.6% (4.08) 3.44 ▼35.2% (5.31) 200=119564
Pro Node Renderer: react_ssr (non-RSC) 3376.1 🟢 74.5% (1935.23) 2.76 🟢 41.4% (4.71) 3.43 ▼43.2% (6.03) 200=101285

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

@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code Review PR 3841: Keep root RuboCop bundle lint-only

@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Issues and Suggestions

  1. bundle_command is duplicated across three scripts

@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code Review - PR 3841: Keep root RuboCop bundle lint-only

Overview

This PR cleanly separates the monorepo root Ruby bundle from the OSS gem bundle. Previously the root Gemfile used eval_gemfile to pull in the entire Rails dependency tree; now it only contains lint/hook/release/benchmark tooling (~10 gems vs ~100). The delegation approach in the root Rakefile is elegant: root rake task shells out with bundle exec rake task inside the package directory, so the surface API is unchanged.


What is Good

  • Correct use of Bundler.with_unbundled_env in both the Ruby Rakefile and react_on_rails/rakelib/lint.rake prevents the parent bundle env from leaking into child processes.
  • bundle_command shell helper correctly unsets all Bundler-related env vars (BUNDLE_APP_CONFIG, BUNDLE_BIN_PATH, BUNDLE_GEMFILE, BUNDLER_VERSION, RUBYOPT) before setting the target BUNDLE_GEMFILE. This is the right pattern.
  • jq --argjson fix in bin/ci-rerun-failures is a genuine improvement. The old shell string interpolation inside a jq filter was fragile and potentially exploitable if the PR number were ever sourced from untrusted input.
  • Pinned exact versions in the new slim root Gemfile (= 1.61.0, etc.) is the right policy for tooling lockfiles.
  • Dependabot update to add / is correct now that the root has its own independent lock.
  • release_truthy? extraction avoids the cross-bundle require_relative on ReactOnRails::Utils, which would fail once the root bundle no longer evaluates the package Gemfile.

Issues and Suggestions

1. bundle_command is duplicated across three scripts

The same ~10-line function is copy-pasted into bin/ci-local, bin/ci-rerun-failures, and bin/setup, with a comment asking them to stay in sync. Drift here will be a silent bug (wrong Gemfile selected). Consider extracting to a sourced helper, e.g. bin/lib/bundle-helpers.sh, and sourcing it from each script.

2. Static delegation list is a maintenance footprint

The task delegation block in Rakefile is ~70 lines that must be manually kept in sync with the package Rakefile. The audit hint in the comment is helpful but easy to miss when adding new tasks. A CI check that diffs root vs package task lists would make drift visible automatically.

3. @package_bundle_ready on the main object

Using @package_bundle_ready at top-level scope works (it is an ivar on Ruby main object) and is safe for single-threaded Rake. It is a subtle pattern -- future contributors may not recognize it. Low priority.

4. release_truthy? -- nil handling is correct, but worth a test

ENV.fetch returning nil when absent means release_truthy?(nil) correctly returns false. The existing ReactOnRails::Utils.object_to_boolean also handles falsy inputs explicitly. Looks correct on audit -- just ensure benchmark specs cover this function if not already tested.

5. Root rake lint behavior change may surprise contributors

Previously rake lint ran the full package lint (RuboCop + ESLint + Prettier + Stylelint). Now it runs root-bundle RuboCop only and prints a hint. The AGENTS.md update is good. Consider making the task output more prominent (e.g. print the new recommended command in yellow/bold) so contributors who run rake lint by muscle memory immediately understand the scope change.

6. _run_job_shell subshell scope change

Wrapping eval in a subshell (eval) correctly scopes cd calls to the job, which is the intent. Side effect: any export or variable assignments in the command no longer propagate to subsequent jobs. Given the jobs being run this is the right tradeoff, but worth keeping in mind if future jobs rely on inter-job env propagation.


Minor / Nits

  • conductor-setup.sh: Adding react_on_rails before react_on_rails/spec/dummy in LOCKFILE_DIRS is correct and consistent with sibling package ordering.
  • bin/setup show_elapsed_time: splitting local END_TIME=1781041654 into two separate lines is a proper shellcheck fix (the combined form masks the command substitution exit code).
  • The large Gemfile.lock reduction from 292 to ~26 entries is expected and healthy.

Overall Assessment

Approve with suggestions. The architecture is sound and the implementation is correct. The main ask is to consider extracting bundle_command to a shared sourced helper to avoid silent drift risk across the three CI scripts. The task delegation list maintainability concern is worth tracking as a follow-up issue rather than blocking this PR.

Comment thread Rakefile
Comment thread bin/ci-local
Comment thread rakelib/release.rake
Comment thread Rakefile
@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 3.57 ▲6.4% (3.35) 2225.14 ▼2.0% (2271.52) 2706.49 ▼5.8% (2872.09) 200=118
/client_side_hello_world: Core 673.56 ▲1.0% (666.87) 11.74 ▲24.8% (9.41) 21.94 ▲19.2% (18.4) 200=20347
/client_side_rescript_hello_world: Core 682.1 ▲4.6% (652.31) 8.94 ▼7.6% (9.68) 22.76 ▲27.2% (17.89) 200=20608
/client_side_hello_world_shared_store: Core 458.03 ▼28.4% (639.47) 12.6 ▲29.6% (9.72) 19.56 ▼1.3% (19.81) 200=13840
/client_side_hello_world_shared_store_controller: Core 641.18 ▼0.1% (641.86) 12.35 ▲27.2% (9.71) 22.65 ▲10.5% (20.49) 200=19370
/client_side_hello_world_shared_store_defer: Core 633.33 ▼1.7% (644.37) 10.57 ▲8.5% (9.74) 21.29 ▲6.3% (20.03) 200=19133
/server_side_hello_world_shared_store: Core 15.93 ▲11.1% (14.34) 513.66 ▼4.3% (536.59) 692.51 ▼1.7% (704.75) 200=490
/server_side_hello_world_shared_store_controller: Core 15.96 ▲11.5% (14.32) 513.41 ▼2.5% (526.76) 655.24 ▼5.4% (692.93) 200=491
/server_side_hello_world_shared_store_defer: Core 16.07 ▲11.2% (14.45) 519.76 ▼3.3% (537.7) 730.21 ▲3.1% (708.32) 200=492
/server_side_hello_world: Core 32.33 ▲12.1% (28.83) 256.36 0.0% (256.41) 308.97 ▼5.1% (325.63) 200=983
/server_side_hello_world_hooks: Core 32.36 ▲11.1% (29.12) 259.57 ▼1.4% (263.32) 311.07 ▼7.0% (334.55) 200=984
/server_side_hello_world_props: Core 32.62 ▲12.0% (29.14) 259.79 ▼3.8% (270.11) 311.69 ▼5.8% (330.99) 200=987
/client_side_log_throw: Core 663.1 ▼0.3% (665.16) 9.23 ▼5.0% (9.72) 20.09 ▲8.2% (18.57) 200=20036
/server_side_log_throw: Core 31.52 ▲10.6% (28.49) 264.66 ▼4.1% (275.85) 326.14 ▼2.0% (332.68) 200=958
/server_side_log_throw_plain_js: Core 31.83 ▲9.9% (28.97) 204.99 ▼20.4% (257.52) 305.78 ▼6.7% (327.58) 200=970
/server_side_log_throw_raise: Core 32.22 ▲11.9% (28.79) 285.75 ▲9.6% (260.8) 315.02 ▼3.8% (327.31) 3xx=977
/server_side_log_throw_raise_invoker: Core 826.94 ▲3.4% (799.86) 7.67 ▼8.2% (8.36) 12.61 ▼19.6% (15.69) 200=24983
/server_side_hello_world_es5: Core 32.4 ▲15.7% (28.01) 280.24 ▲7.6% (260.45) 316.15 ▼4.1% (329.56) 200=982
/server_side_redux_app: Core 31.33 ▲11.6% (28.07) 262.53 ▼5.3% (277.3) 321.42 ▼4.9% (337.85) 200=953
/server_side_hello_world_with_options: Core 32.7 ▲12.4% (29.1) 256.42 ▼4.6% (268.89) 307.97 ▼5.4% (325.58) 200=993
/server_side_redux_app_cached: Core 680.45 ▲2.7% (662.6) 9.81 ▼4.5% (10.27) 20.34 ▲9.8% (18.53) 200=20559
/client_side_manual_render: Core 690.0 ▲2.3% (674.69) 8.91 ▼7.4% (9.62) 19.35 ▲3.6% (18.68) 200=20846
/render_js: Core 34.42 ▲11.2% (30.94) 238.56 ▼4.0% (248.39) 288.98 ▼5.1% (304.58) 200=1047
/react_router: Core 30.5 ▲10.4% (27.63) 270.81 ▼6.2% (288.67) 332.75 ▼4.9% (349.99) 200=928
/pure_component: Core 33.04 ▲11.6% (29.6) 256.02 ▼3.3% (264.88) 311.52 ▼4.4% (325.98) 200=1000
/css_modules_images_fonts_example: Core 32.54 ▲15.0% (28.3) 279.24 ▲6.0% (263.34) 312.25 ▼6.2% (332.97) 200=987
/turbolinks_cache_disabled: Core 731.97 ▲6.7% (685.79) 8.98 ▼4.4% (9.39) 21.52 ▲16.9% (18.41) 200=22112
/rendered_html: Core 32.85 ▲11.4% (29.48) 276.38 ▲2.5% (269.63) 309.57 ▼5.7% (328.21) 200=996
/xhr_refresh: Core 16.84 ▲13.5% (14.84) 502.59 ▼2.4% (514.96) 655.97 ▼3.0% (676.05) 200=513
/react_helmet: Core 32.06 ▲12.2% (28.57) 261.52 ▼1.9% (266.51) 316.16 ▼5.0% (332.76) 200=975
/broken_app: Core 31.83 ▲12.0% (28.43) 286.55 ▲10.5% (259.27) 322.89 ▼0.3% (323.83) 200=966
/image_example: Core 32.04 ▲9.5% (29.27) 259.31 ▼5.9% (275.51) 313.22 ▼5.6% (331.67) 200=975
/turbo_frame_tag_hello_world: Core 767.53 ▲2.8% (746.66) 8.67 ▲2.1% (8.49) 17.53 ▲5.5% (16.61) 200=23189
/manual_render_test: Core 709.82 ▲5.0% (676.32) 9.32 ▲0.6% (9.27) 22.36 ▲20.8% (18.51) 200=21442

▲/▼ 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 1/2) Benchmark Summary

Benchmark RPS p50(ms) p90(ms) Status
/: Pro 185.82 ▲2.2% (181.79) 42.94 ▲0.6% (42.68) 59.06 ▼4.2% (61.67) 200=5618
/error_scenarios_hub: Pro 376.47 ▲4.2% (361.29) 16.77 ▼14.9% (19.71) 27.77 ▼8.3% (30.29) 200=11377
/ssr_async_error: Pro 294.81 ▼13.8% (342.16) 19.63 ▼7.1% (21.12) 55.63 ▲59.0% (34.99) 200=8908
/ssr_async_prop_error: Pro 351.87 ▲5.9% (332.29) 9.52 ▼56.3% (21.76) 28.62 ▼19.2% (35.42) 200=10704
/non_existing_react_component: Pro 378.33 ▲6.4% (355.44) 22.99 ▲12.6% (20.41) 30.89 ▼4.1% (32.2) 200=11429
/non_existing_rsc_payload: Pro 400.33 ▲9.2% (366.5) 13.95 ▼29.2% (19.71) 26.62 ▼18.9% (32.83) 200=12118
/cached_react_helmet: Pro 396.7 ▲7.1% (370.34) 19.71 ▲6.2% (18.57) 28.8 ▼7.6% (31.17) 200=11988
/cached_redux_component: Pro 412.15 ▲6.9% (385.6) 19.35 ▲1.4% (19.08) 30.1 ▲0.3% (30.01) 200=12454
/lazy_apollo_graphql: Pro 133.81 ▼10.2% (148.94) 44.0 ▼8.9% (48.31) 84.51 ▲11.4% (75.89) 200=4046
/redis_receiver: Pro 87.51 ▲0.2% (87.33) 60.5 ▼9.7% (66.98) 160.36 ▲8.0% (148.52) 200=2641,3xx=7
/stream_shell_error_demo: Pro 365.45 ▲8.4% (337.08) 21.31 ▲2.7% (20.75) 34.66 ▼1.3% (35.1) 200=11044
/test_incremental_rendering: Pro 361.28 ▲7.1% (337.32) 21.51 ▲3.3% (20.81) 34.89 ▲4.7% (33.33) 200=10918
/rsc_posts_page_over_redis: Pro 102.86 ▲7.2% (95.98) 74.54 ▲1.2% (73.65) 114.53 ▼3.1% (118.14) 200=3113
/async_on_server_sync_on_client: Pro 350.67 ▲10.1% (318.59) 22.31 ▼0.7% (22.48) 35.62 ▼9.6% (39.39) 200=10596
/server_router: Pro 359.71 ▲6.3% (338.27) 21.58 ▲0.9% (21.4) 32.71 ▼5.2% (34.49) 200=10870
/unwrapped_rsc_route_client_render: Pro 411.16 ▲8.3% (379.74) 18.78 ▲1.2% (18.55) 27.63 ▼7.2% (29.79) 200=12423
/async_render_function_returns_string: Pro 304.1 ▼11.0% (341.85) 18.85 ▼9.4% (20.81) 50.26 ▲48.4% (33.87) 200=9190
/async_components_demo: Pro 220.03 ▲8.0% (203.71) 40.06 ▲12.0% (35.78) 50.14 ▼1.3% (50.78) 200=6648
/stream_native_metadata: Pro 377.19 ▲10.9% (340.02) 20.68 ▼1.6% (21.02) 33.5 ▼10.2% (37.32) 200=11396
/rsc_native_metadata: Pro 358.25 ▲10.1% (325.25) 21.1 ▼2.9% (21.73) 33.24 ▼10.7% (37.22) 200=10829
/react_intl_rsc_demo: Pro 352.62 ▲6.9% (329.8) 22.01 ▲1.2% (21.75) 33.31 ▼10.1% (37.04) 200=10656
/client_side_hello_world_shared_store: Pro 366.95 ▲6.6% (344.19) 21.24 ▲2.7% (20.68) 33.15 ▲5.0% (31.56) 200=11086
/client_side_hello_world_shared_store_defer: Pro 356.43 ▲5.0% (339.43) 24.27 ▲15.9% (20.95) 33.06 ▼2.0% (33.74) 200=10769
/server_side_hello_world_shared_store_controller: Pro 302.63 ▲6.3% (284.71) 26.05 ▼0.6% (26.22) 37.12 ▼9.8% (41.15) 200=9147
/server_side_hello_world: Pro 364.19 ▲8.4% (335.91) 21.5 ▼3.2% (22.21) 30.99 ▼11.4% (34.98) 200=11004
/client_side_log_throw: Pro 407.42 ▲10.3% (369.33) 19.17 ▲0.3% (19.12) 29.92 ▼3.1% (30.87) 200=12310
/server_side_log_throw_plain_js: Pro 406.12 ▲6.9% (379.81) 13.73 ▼30.1% (19.65) 26.15 ▼17.5% (31.71) 200=12276
/server_side_log_throw_raise_invoker: Pro 448.69 ▲8.6% (413.15) 17.3 ▲3.5% (16.71) 25.21 ▼9.4% (27.81) 200=13555
/server_side_redux_app: Pro 296.45 ▼11.7% (335.87) 19.54 ▼11.3% (22.04) 51.52 ▲39.5% (36.94) 200=8957
/server_side_redux_app_cached: Pro 398.28 ▲5.5% (377.45) 19.73 ▲3.8% (19.0) 28.33 ▼6.4% (30.27) 200=12038
/render_js: Pro 417.03 ▲10.6% (377.0) 18.72 ▼3.3% (19.35) 27.3 ▼13.3% (31.49) 200=12597
/pure_component: Pro 373.1 ▲10.2% (338.49) 21.12 ▼1.4% (21.41) 32.15 ▼8.9% (35.3) 200=11271
/turbolinks_cache_disabled: Pro 405.84 ▲9.2% (371.62) 18.8 ▼3.3% (19.45) 28.26 ▼10.1% (31.44) 200=12264
/xhr_refresh: Pro 249.1 ▼13.3% (287.26) 22.86 ▼10.0% (25.39) 26.86 ▼31.5% (39.23) 200=7530
/broken_app: Pro 375.2 ▲10.4% (339.88) 20.91 ▼1.7% (21.27) 30.15 ▼12.9% (34.62) 200=11337
/server_render_with_timeout: Pro 301.39 ▼10.3% (335.92) 19.15 ▼11.0% (21.52) 40.96 ▲19.5% (34.27) 200=9108

▲/▼ 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 1323.41 ▲6.4% (1244.15) 6.0 ▲2.1% (5.87) 9.42 ▲1.5% (9.28) 200=39974
/ssr_shell_error: Pro 374.03 ▲9.4% (341.75) 20.77 ▼2.6% (21.33) 33.47 ▼3.4% (34.67) 200=11305
/ssr_sync_error: Pro 377.6 ▲11.5% (338.69) 20.05 ▼4.3% (20.95) 31.09 ▼8.0% (33.79) 200=11413
/rsc_component_error: Pro 375.28 ▲11.0% (338.07) 8.85 ▼58.0% (21.05) 27.4 ▼22.8% (35.49) 200=11417
/non_existing_stream_react_component: Pro 399.96 ▲14.8% (348.45) 18.94 ▼7.4% (20.46) 29.44 ▼14.1% (34.29) 200=12082
/server_side_redux_app_cached: Pro 431.98 ▲14.4% (377.45) 18.17 ▼4.4% (19.0) 26.93 ▼11.0% (30.27) 200=13055
/loadable: Pro 370.17 ▲19.4% (310.1) 21.34 ▼9.0% (23.46) 33.35 ▼7.1% (35.91) 200=11187
/apollo_graphql: Pro 136.63 ▼4.0% (142.32) 42.99 ▼14.0% (50.01) 86.06 ▲4.6% (82.27) 200=4131
/console_logs_in_async_server: Pro 3.57 ▲11.2% (3.21) 2124.04 ▲0.1% (2121.38) 2161.01 ▼8.8% (2370.69) 200=122
/stream_error_demo: Pro 380.47 ▲15.4% (329.63) 14.41 ▼29.4% (20.41) 27.51 ▼19.4% (34.14) 200=11573
/stream_async_components: Pro 320.04 ▼3.4% (331.23) 17.9 ▼19.3% (22.17) 41.98 ▲11.6% (37.61) 200=9681
/rsc_posts_page_over_http: Pro 316.62 ▼3.4% (327.92) 18.13 ▼16.8% (21.79) 28.74 ▼21.4% (36.58) 200=9568
/rsc_echo_props: Pro 255.11 ▲13.8% (224.09) 31.41 ▼1.3% (31.83) 48.66 ▼5.1% (51.25) 200=7711
/async_on_server_sync_on_client_client_render: Pro 327.31 ▼6.8% (351.22) 17.64 ▼15.0% (20.75) 44.83 ▲33.7% (33.53) 200=9890
/server_router_client_render: Pro 323.56 ▼7.0% (347.86) 17.75 ▼12.5% (20.28) 54.88 ▲71.8% (31.95) 200=9792
/unwrapped_rsc_route_stream_render: Pro 375.19 ▲11.1% (337.84) 19.58 ▼4.0% (20.4) 31.88 ▼12.7% (36.51) 200=11338
/async_render_function_returns_component: Pro 309.71 ▼9.0% (340.37) 18.56 ▼9.8% (20.58) 33.61 ▲0.3% (33.5) 200=9360
/native_metadata: Pro 363.85 ▲8.7% (334.59) 8.89 ▼58.3% (21.31) 28.53 ▼26.0% (38.56) 200=11071
/hybrid_metadata_streaming: Pro 382.66 ▲14.2% (334.96) 19.98 ▼6.9% (21.46) 30.51 ▼12.8% (34.98) 200=11565
/cache_demo: Pro 316.32 ▼2.9% (325.71) 18.07 ▼16.8% (21.72) 61.52 ▲67.6% (36.7) 200=9558
/client_side_hello_world: Pro 419.67 ▲13.5% (369.68) 18.22 ▼3.6% (18.9) 28.74 ▼9.1% (31.61) 200=12679
/client_side_hello_world_shared_store_controller: Pro 380.28 ▲11.4% (341.49) 16.52 ▼19.3% (20.48) 27.61 ▼16.7% (33.16) 200=11493
/server_side_hello_world_shared_store: Pro 265.51 ▼9.4% (292.95) 21.45 ▼17.1% (25.87) 40.94 ▲4.4% (39.2) 200=8024
/server_side_hello_world_shared_store_defer: Pro 339.02 ▲18.2% (286.76) 23.56 ▼6.3% (25.14) 34.06 ▼12.2% (38.78) 200=10245
/server_side_hello_world_hooks: Pro 396.7 ▲12.1% (353.73) 18.62 ▼11.1% (20.94) 30.23 ▼11.7% (34.24) 200=11989
/server_side_log_throw: Pro 394.81 ▲15.6% (341.44) 19.82 ▼7.2% (21.35) 29.36 ▼14.9% (34.52) 200=11932
/server_side_log_throw_raise: Pro 740.73 ▲14.7% (645.99) 10.67 ▼3.0% (11.0) 17.78 ▼2.5% (18.23) 3xx=22376
/server_side_hello_world_es5: Pro 387.0 ▲13.9% (339.71) 20.26 ▼4.6% (21.23) 30.99 ▼15.1% (36.49) 200=11693
/server_side_hello_world_with_options: Pro 384.08 ▲14.6% (335.05) 20.46 ▼5.1% (21.57) 31.41 ▼8.1% (34.19) 200=11604
/client_side_manual_render: Pro 422.49 ▲13.3% (372.98) 18.09 ▼6.5% (19.35) 26.72 ▼15.2% (31.51) 200=12765
/react_router: Pro 318.67 ▼18.9% (393.05) 18.44 ▲4.6% (17.64) 21.18 ▼26.2% (28.71) 200=9630
/css_modules_images_fonts_example: Pro 319.27 ▼7.0% (343.41) 17.97 ▼15.0% (21.14) 30.35 ▼6.9% (32.6) 200=9650
/rendered_html: Pro 390.2 ▲12.6% (346.49) 19.87 ▼3.6% (20.61) 31.99 ▼5.2% (33.75) 200=11790
/react_helmet: Pro 377.79 ▲13.8% (331.97) 20.69 ▼5.6% (21.91) 30.63 ▼13.1% (35.26) 200=11417
/image_example: Pro 300.6 ▼12.3% (342.81) 19.15 ▼15.3% (22.62) 45.3 ▲32.2% (34.26) 200=9083
/posts_page: Pro 215.3 ▲36.1% (158.18) 26.12 ▼56.6% (60.16) 30.71 ▼64.9% (87.48) 200=6550

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Follow-up: Keep root RuboCop bundle lint-only

1 participant