Skip to content

Clarify RSC React compatibility policy#3732

Merged
justin808 merged 1 commit into
mainfrom
codex/issue-3620-rsc-compat-policy
Jun 6, 2026
Merged

Clarify RSC React compatibility policy#3732
justin808 merged 1 commit into
mainfrom
codex/issue-3620-rsc-compat-policy

Conversation

@justin808

@justin808 justin808 commented Jun 6, 2026

Copy link
Copy Markdown
Member

Summary

Fixes #3620 by documenting and testing the current generated-RSC compatibility policy.

  • Clarifies that generated RSC apps intentionally stay on React 19.0.x via ~19.0.4, not React 19.1/19.2 just because those versions are current on npm.
  • Keeps react-on-rails-rsc as an exact 19.0.5-rc.6 generator pin until a stable 19.0.5 release ships.
  • Adds focused spec coverage for the React range behavior: accepts 19.0.4/19.0.7 and rejects 19.0.3/19.1.0/19.2.7.
  • Coordinates with Allow react-on-rails-rsc prereleases in react-on-rails-pro peer range #3609 by separating package peer metadata compatibility from exact generator install behavior.

Live package evidence

  • npm view react-on-rails-rsc dist-tags versions version peerDependencies --json
    • latest: 19.0.4
    • next: 19.0.5-rc.6
    • no stable 19.0.5 is published
    • latest stable peer dependencies: react: ^19.0.3, react-dom: ^19.0.3, webpack: ^5.59.0
  • npm view react react-dom react-server-dom-webpack dist-tags version peerDependencies --json
    • react@latest: 19.2.7
    • react-dom@latest: 19.2.7, peer react: ^19.2.7
    • react-server-dom-webpack@latest: 19.2.7, peers react: ^19.2.7, react-dom: ^19.2.7, webpack: ^5.59.0

Validation

  • bundle exec rspec react_on_rails/spec/react_on_rails/generators/js_dependency_manager_spec.rb
    • 79 examples, 0 failures
  • pnpm prettier --check docs/pro/react-server-components/upgrading-existing-pro-app.md docs/pro/react-server-components/create-without-ssr.md docs/pro/react-server-components/rspack-compatibility.md
    • Passed; all matched files use Prettier style
  • script/ci-changes-detector origin/main
    • Merge base: 30ec8e12b95b3ca56cee8f46ba62e6dde2b9433d
    • Recommended CI: RSpec gem tests and Generator tests
  • git diff --check origin/main..HEAD
    • Passed with no output
  • Self-review:
    • Diff is limited to js_dependency_manager.rb, js_dependency_manager_spec.rb, and the targeted RSC docs.
    • Did not touch install_generator_spec.rb, active RSC generator PR files, workflow files, rsc_setup.rb, or rsc_use_client_css.spec.ts.

Note

Low Risk
Documentation, comment, and spec-only changes; generator dependency constants are unchanged, so install behavior is unaffected.

Overview
Documents and tests the generated RSC compatibility policy (fixes #3620): apps should stay on React 19.0.x via react@~19.0.4 / react-dom@~19.0.4 (patch ≥ 19.0.4), not 19.1/19.2, and keep react-on-rails-rsc@19.0.5-rc.6 as an exact pin until stable 19.0.5 ships.

Docs (create-without-ssr, upgrading-existing-pro-app, rspack-compatibility) switch manual install examples from exact 19.0.4 to ~19.0.4, tighten prerequisite/troubleshooting tables, add a React and Package Version Policy section for Rspack, and explain that Pro peer metadata (#3609) can differ from generator install pins.

Generator (js_dependency_manager.rb): richer comments on RSC_REACT_VERSION_RANGE vs RSC_PACKAGE_VERSION_PIN—no constant value changes in this diff.

Tests: js_dependency_manager_spec asserts ~19.0.4 accepts 19.0.4/19.0.7 and rejects 19.0.3/19.1.0/19.2.7.

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

Summary by CodeRabbit

Release Notes

  • Documentation
    • Clarified React 19.0.x version requirements for Server Components with specific minimum patch versions
    • Added explicit version pinning guidance for server component package dependencies
    • Updated setup and troubleshooting instructions with exact version specifications
    • Added new "React and Package Version Policy" sections to clarify intended version targeting and upgrade guidance

@coderabbitai

coderabbitai Bot commented Jun 6, 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: cf82f2f7-2f30-4be8-9261-b3455c288517

📥 Commits

Reviewing files that changed from the base of the PR and between 30ec8e1 and 91366ab.

📒 Files selected for processing (5)
  • docs/pro/react-server-components/create-without-ssr.md
  • docs/pro/react-server-components/rspack-compatibility.md
  • docs/pro/react-server-components/upgrading-existing-pro-app.md
  • react_on_rails/lib/generators/react_on_rails/js_dependency_manager.rb
  • react_on_rails/spec/react_on_rails/generators/js_dependency_manager_spec.rb

Walkthrough

This PR clarifies the React Server Components generator version policy by documenting and validating that React 19.0.x (patch >= 19.0.4) pairs with an exact react-on-rails-rsc@19.0.5-rc.6 prerelease pin. Changes span user-facing RSC documentation, generator code comments, and test coverage.

Changes

RSC version policy alignment

Layer / File(s) Summary
User-facing RSC documentation updates
docs/pro/react-server-components/create-without-ssr.md, docs/pro/react-server-components/upgrading-existing-pro-app.md, docs/pro/react-server-components/rspack-compatibility.md
Installation, setup, and upgrade guides align on React 19.0.x patch >= 19.0.4, exact react-on-rails-rsc@19.0.5-rc.6 pinning, and explicit warnings against upgrading to React 19.1/19.2 without coordinating the package pin. A new "React and Package Version Policy" section clarifies that the stable React constraint is intentionally kept separate from the prerelease package pin.
Generator policy code and test validation
react_on_rails/lib/generators/react_on_rails/js_dependency_manager.rb, react_on_rails/spec/react_on_rails/generators/js_dependency_manager_spec.rb
Expands the RSC_REACT_VERSION_RANGE comment to explain the stable 19.0.x range and its separation from the prerelease package pin. New spec example verifies that the range requires patch >= 19.0.4 and rejects 19.0.3, 19.1.0, and 19.2.7.

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • shakacode/react_on_rails#3590: Both PRs update the react-on-rails-rsc exact RC version pinning in js_dependency_manager.rb and its spec, aligning generator behavior with the version policy.
  • shakacode/react_on_rails#3664: Implements generator changes and recovery messaging that enforce the react-on-rails-rsc@19.0.5-rc.6 pin documented in this PR's clarifications.
  • shakacode/react_on_rails#3577: Earlier RC pin rollout (rc.5 → rc.6) with matching updates to the same RSC documentation sections.

Suggested labels

review-needed, documentation, 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 directly and concisely summarizes the main change: clarifying the RSC React compatibility policy through documentation and code comments.
Linked Issues check ✅ Passed All PR objectives from issue #3620 are met: React range (~19.0.4) confirmed, compatibility relationship documented in code comments and docs, tests added for range behavior, and prerelease pin explicitly discussed.
Out of Scope Changes check ✅ Passed All changes are directly scoped to issue #3620: documentation updates, code comments clarifying policy, and tests validating React version range behavior with no unrelated modifications.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ 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 codex/issue-3620-rsc-compat-policy

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.

@greptile-apps

greptile-apps Bot commented Jun 6, 2026

Copy link
Copy Markdown

Greptile Summary

This PR clarifies the React version compatibility policy for generated RSC apps: react and react-dom stay on the ~19.0.4 range (React 19.0.x, patch ≥ 19.0.4) and react-on-rails-rsc is pinned exactly to 19.0.5-rc.6 until a stable 19.0.5 ships.

  • Updates three RSC documentation files to consistently reflect the ~19.0.4 range and the exact RC pin, replacing older exact-version install commands and vague "React 19" language.
  • Expands the comment block around RSC_REACT_VERSION_RANGE and RSC_PACKAGE_VERSION_PIN in js_dependency_manager.rb with the rationale for keeping them on separate tracks.
  • Adds a focused spec that uses Gem::Requirement to assert the ~19.0.4 range admits 19.0.4/19.0.7 and rejects 19.0.3/19.1.0/19.2.7.

Confidence Score: 4/5

Safe to merge — all logic stays unchanged; this is a documentation and comment clarification with one new spec.

The Ruby source change is purely comments, the three doc files are internally consistent with each other and with the constants in js_dependency_manager.rb, and the new spec correctly exercises the ~19.0.4 boundary. The only non-obvious element is the spec's implicit reliance on RubyGems and npm sharing equivalent ~ semantics for three-part versions, which works but is undocumented.

react_on_rails/spec/react_on_rails/generators/js_dependency_manager_spec.rb — the Gem::Requirement proxy for npm semver is correct but benefits from an explanatory comment.

Important Files Changed

Filename Overview
react_on_rails/lib/generators/react_on_rails/js_dependency_manager.rb Comment-only change expanding the explanation of RSC_REACT_VERSION_RANGE and its separation from RSC_PACKAGE_VERSION_PIN; no logic altered.
react_on_rails/spec/react_on_rails/generators/js_dependency_manager_spec.rb Adds a new spec that uses Gem::Requirement/Gem::Version to verify that ~19.0.4 admits 19.0.4–19.0.7 and rejects 19.0.3/19.1.0/19.2.7; equivalence between RubyGems ~> and npm ~ semantics is implicit and undocumented.
docs/pro/react-server-components/create-without-ssr.md Install commands updated from exact 19.0.4 pins to ~19.0.4 range; note blocks rewritten to clarify the 19.0.x-only policy and RC pin rationale.
docs/pro/react-server-components/rspack-compatibility.md Adds a new React and Package Version Policy section explaining the intentional ~19.0.4 range and the exact RSC package pin; no breaking changes.
docs/pro/react-server-components/upgrading-existing-pro-app.md Requirements table, upgrade commands, callout blocks, and troubleshooting text updated to reflect the 19.0.x-only policy and exact react-on-rails-rsc RC pin.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[RSC Generator invoked] --> B{use_rsc?}
    B -->|yes| C["add_react_dependencies\nreact at ~19.0.4\nreact-dom at ~19.0.4"]
    B -->|yes| D["add_rsc_dependencies\nreact-on-rails-rsc at 19.0.5-rc.6 exact"]
    B -->|no| E[skip RSC packages]
    C --> F{"React version\nin ~19.0.4 range?"}
    F -->|"19.0.4 to 19.0.x"| G[Accepted]
    F -->|"less than 19.0.4 or 19.1.0 plus"| H[Rejected]
    D --> I["Exact pin - no range resolution\nuntil stable 19.0.5 ships"]
Loading

Reviews (1): Last reviewed commit: "Clarify RSC React compatibility policy" | Re-trigger Greptile

Comment on lines +664 to +666
it "keeps the generated RSC React policy on the 19.0.x patch track" do
range = ReactOnRails::Generators::JsDependencyManager::RSC_REACT_VERSION_RANGE
requirement = Gem::Requirement.new(range.sub(/\A~/, "~> "))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 The spec delegates npm ~ range semantics to Gem::Requirement/Gem::Version, relying on the coincidental equivalence that RubyGems ~> X.Y.Z (3-part) and npm ~X.Y.Z both resolve to >= X.Y.Z, < X.(Y+1). That equivalence is real and the test cases are correct, but it's non-obvious to a future reader — a brief inline comment would clarify why this cross-ecosystem proxy is valid here and prevent someone from "fixing" it to a pure string comparison that doesn't actually exercise the range.

Suggested change
it "keeps the generated RSC React policy on the 19.0.x patch track" do
range = ReactOnRails::Generators::JsDependencyManager::RSC_REACT_VERSION_RANGE
requirement = Gem::Requirement.new(range.sub(/\A~/, "~> "))
it "keeps the generated RSC React policy on the 19.0.x patch track" do
range = ReactOnRails::Generators::JsDependencyManager::RSC_REACT_VERSION_RANGE
# npm `~X.Y.Z` and RubyGems `~> X.Y.Z` have equivalent semantics for a
# three-part version: both mean `>= X.Y.Z, < X.(Y+1)`. We exploit that
# equivalence here so we can validate the npm range with Gem::Requirement
# without pulling in a Node runtime.
requirement = Gem::Requirement.new(range.sub(/\A~/, "~> "))

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!

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 91366ab4a3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

# pnpm add react@19.0.4 react-dom@19.0.4 react-on-rails-rsc@19.0.5-rc.6
# bun add react@19.0.4 react-dom@19.0.4 react-on-rails-rsc@19.0.5-rc.6
yarn add react@~19.0.4 react-dom@~19.0.4 react-on-rails-rsc@19.0.5-rc.6
# npm install react@~19.0.4 react-dom@~19.0.4 react-on-rails-rsc@19.0.5-rc.6

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve the RSC RC as an exact dependency

When users follow the npm variant here, react-on-rails-rsc@19.0.5-rc.6 will not be kept as the exact pin this section now requires: I checked the local npm semantics (npm install --help exposes -E|--save-exact, and npm config ls -l shows save-exact = false with save-prefix = "^"). That means an app can record a range for the RSC RC and later drift even though the surrounding note says to keep the exact generator pin; use the package-manager exact flag, as the generator’s own manual recovery command does.

Useful? React with 👍 / 👎.

@justin808 justin808 merged commit 65261b0 into main Jun 6, 2026
22 checks passed
@justin808 justin808 deleted the codex/issue-3620-rsc-compat-policy branch June 6, 2026 20:58
@claude

claude Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Code Review

Overall: Solid, low-risk PR. Docs are clearer and more actionable, and the spec addition meaningfully validates the tilde-range semantics rather than just string-matching the constant. Scoping is tight — only js_dependency_manager.rb (comment-only), its spec, and three RSC docs.


Spec: Gem::Requirement as an npm-semver proxy

The test converts the npm tilde range to Ruby's pessimistic constraint operator:

requirement = Gem::Requirement.new(range.sub(/\A~/, "~> "))

For a three-component version like 19.0.4, npm ~19.0.4 (>=19.0.4 <19.1.0) and Ruby ~> 19.0.4 (>= 19.0.4, < 19.1) are semantically equivalent for non-prerelease inputs, so the five assertions are correct. Consider adding a brief comment in the spec explaining why Gem::Requirement is an acceptable proxy here — it's non-obvious at a glance that a Ruby gem-version API is being used to validate an npm range.


Docs: slightly redundant upgrade condition

In upgrading-existing-pro-app.md the upgrade trigger reads:

If React is outside the supported 19.0.x range or below 19.0.4

"Below 19.0.4" is already a subset of "outside the supported 19.0.x range (patch >= 19.0.4)". The intent — flag both too-old and too-new React — is clear from context, but consider simplifying to: "If React is not on 19.0.x with patch >= 19.0.4".


Minor

  • The new React and Package Version Policy section in rspack-compatibility.md is a useful addition; having the rationale prose adjacent to the compatibility matrix makes the table easier to interpret for first-time readers.
  • Renaming the spec description from "pins react-on-rails-rsc to the React 19 compatibility track" to "pins react-on-rails-rsc to the exact RSC package compatibility track" is a good precision improvement.

it "pins react-on-rails-rsc to the React 19 compatibility track" do
it "keeps the generated RSC React policy on the 19.0.x patch track" do
range = ReactOnRails::Generators::JsDependencyManager::RSC_REACT_VERSION_RANGE
requirement = Gem::Requirement.new(range.sub(/\A~/, "~> "))

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 ~~> substitution is clever but non-obvious: it converts npm's tilde range (~19.0.4 = >=19.0.4 <19.1.0) to Ruby's pessimistic constraint operator (~> 19.0.4 = >= 19.0.4, < 19.1). For three-component versions with non-prerelease inputs the two semantics are equivalent, which is why the five test cases below are correct.

A one-liner comment here would help future readers avoid wondering whether this is accidentally using gem-version semantics to validate npm behaviour:

Suggested change
requirement = Gem::Requirement.new(range.sub(/\A~/, "~> "))
# npm `~x.y.z` and Ruby `~> x.y.z` are equivalent for three-part non-prerelease versions:
# both allow only patch increments within the same minor (>=x.y.z <x.(y+1).0).
requirement = Gem::Requirement.new(range.sub(/\A~/, "~> "))

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Core Benchmark Summary

Benchmark RPS p50(ms) p90(ms) Status
/: Core 3.45 ▲19.1% (2.9) 1782.45 ▼31.3% (2593.35) 2821.45 ▼17.0% (3399.26) 200=114
/client_side_hello_world: Core 717.52 ▲8.9% (658.88) 8.49 ▼8.9% (9.32) 20.78 ▼1.2% (21.04) 200=21679
/client_side_rescript_hello_world: Core 500.54 ▼26.3% (678.77) 11.46 ▲22.8% (9.33) 18.68 ▼10.5% (20.88) 200=15122
/client_side_hello_world_shared_store: Core 678.02 ▲6.4% (637.49) 8.76 ▼10.3% (9.77) 22.33 ▲2.1% (21.87) 200=20482
/client_side_hello_world_shared_store_controller: Core 716.61 ▲15.4% (620.77) 8.86 ▼9.5% (9.79) 21.99 ▼2.4% (22.53) 200=21649
/client_side_hello_world_shared_store_defer: Core 670.73 ▲4.0% (644.68) 8.88 ▼9.1% (9.77) 23.01 ▲8.4% (21.23) 200=20276
/server_side_hello_world_shared_store: Core 15.04 ▲20.0% (12.53) 554.9 ▼11.2% (624.97) 721.62 ▼9.7% (798.9) 200=464
/server_side_hello_world_shared_store_controller: Core 15.22 ▲21.3% (12.55) 558.55 ▼6.7% (598.72) 747.83 ▼7.3% (806.79) 200=466
/server_side_hello_world_shared_store_defer: Core 14.95 ▲18.9% (12.57) 579.16 ▼6.0% (616.43) 724.64 ▼11.5% (818.63) 200=457
/server_side_hello_world: Core 29.98 ▲19.5% (25.09) 278.88 ▼7.1% (300.2) 321.26 ▼14.8% (377.24) 200=914
/server_side_hello_world_hooks: Core 30.33 ▲18.9% (25.52) 281.02 ▼6.5% (300.43) 328.46 ▼13.0% (377.66) 200=921
/server_side_hello_world_props: Core 30.11 ▲18.1% (25.5) 198.17 ▼36.7% (312.91) 308.08 ▼17.7% (374.52) 200=921
/client_side_log_throw: Core 734.98 ▲12.1% (655.76) 8.23 ▼14.3% (9.6) 14.36 ▼23.8% (18.84) 200=22205
/server_side_log_throw: Core 29.62 ▲18.4% (25.01) 212.94 ▼33.2% (318.59) 316.72 ▼17.9% (385.72) 200=902
/server_side_log_throw_plain_js: Core 30.0 ▲18.0% (25.42) 198.38 ▼32.8% (295.42) 310.65 ▼18.2% (379.6) 200=917
/server_side_log_throw_raise: Core 13.46 ▼46.9% (25.36) 221.28 ▼26.5% (301.15) 2337.58 ▲525.7% (373.61) 3xx=416
/server_side_log_throw_raise_invoker: Core 861.15 ▲11.1% (775.15) 7.91 ▼7.4% (8.54) 14.98 ▼5.2% (15.8) 200=26016
/server_side_hello_world_es5: Core 30.74 ▲25.4% (24.52) 277.59 ▼8.3% (302.69) 314.14 ▼16.9% (378.1) 200=935
/server_side_redux_app: Core 29.59 ▲19.4% (24.78) 306.0 ▼2.2% (312.84) 333.99 ▼13.5% (386.05) 200=897
/server_side_hello_world_with_options: Core 30.74 ▲19.5% (25.73) 278.98 ▼7.9% (303.04) 321.13 ▼14.6% (375.99) 200=932
/server_side_redux_app_cached: Core 486.45 ▼24.8% (646.91) 11.6 ▲12.9% (10.28) 14.07 ▼23.1% (18.3) 200=14793
/client_side_manual_render: Core 724.4 ▲4.0% (696.48) 9.31 ▲2.1% (9.12) 18.46 ▼3.0% (19.03) 200=21883
/render_js: Core 32.23 ▲22.5% (26.31) 263.66 ▼8.6% (288.6) 297.91 ▼16.0% (354.6) 200=983
/react_router: Core 21.33 ▼11.7% (24.15) 289.7 ▼12.0% (329.29) 403.43 ▲1.7% (396.6) 200=649
/pure_component: Core 30.94 ▲19.7% (25.84) 276.63 ▼8.4% (302.06) 319.78 ▼14.9% (375.77) 200=939
/css_modules_images_fonts_example: Core 30.11 ▲20.8% (24.93) 107.99 ▼63.9% (299.35) 305.72 ▼19.6% (380.03) 200=923
/turbolinks_cache_disabled: Core 501.54 ▼25.0% (668.74) 9.17 ▼4.6% (9.62) 13.23 ▼26.4% (17.97) 200=15255
/rendered_html: Core 30.93 ▲23.1% (25.12) 294.85 ▼5.1% (310.64) 319.95 ▼14.7% (375.31) 200=938
/xhr_refresh: Core 15.58 ▲17.8% (13.22) 368.71 ▼36.5% (581.02) 616.78 ▼22.5% (796.32) 200=481
/react_helmet: Core 30.08 ▲19.7% (25.12) 301.57 ▼3.0% (310.89) 325.93 ▼15.1% (383.97) 200=912
/broken_app: Core 24.73 ▼1.1% (25.01) 238.58 ▼21.4% (303.48) 263.2 ▼30.2% (377.0) 200=757
/image_example: Core 30.12 ▲20.8% (24.94) 278.07 ▼10.0% (308.98) 321.05 ▼15.2% (378.39) 200=918
/turbo_frame_tag_hello_world: Core 811.47 ▲10.4% (735.1) 8.13 ▼6.1% (8.65) 18.68 ▲9.3% (17.1) 200=24515
/manual_render_test: Core 717.86 ▲8.6% (660.78) 10.67 ▲13.1% (9.43) 20.17 ▲7.3% (18.81) 200=21556

▲/▼ 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 6, 2026

Copy link
Copy Markdown
Contributor

Pro (shard 1/2) Benchmark Summary

Benchmark RPS p50(ms) p90(ms) Status
/: Pro 136.83 ▼22.4% (176.38) 42.23 ▼1.2% (42.73) 72.38 ▲15.2% (62.84) 200=4138
/error_scenarios_hub: Pro 329.96 ▼5.8% (350.31) 23.25 ▲14.0% (20.39) 36.79 ▲15.9% (31.74) 200=9970
/ssr_async_error: Pro 271.58 ▼18.1% (331.52) 21.39 ▲1.0% (21.17) 66.81 ▲90.8% (35.01) 200=8206
/ssr_async_prop_error: Pro 275.75 ▼14.4% (322.33) 20.97 ▼5.0% (22.08) 32.66 ▼9.8% (36.22) 200=8334
/non_existing_react_component: Pro 330.32 ▼3.9% (343.7) 23.63 ▲14.0% (20.72) 34.25 ▼0.6% (34.45) 200=9982
/non_existing_rsc_payload: Pro 351.24 ▼2.0% (358.28) 21.37 ▲5.9% (20.18) 33.56 ▼3.2% (34.65) 200=10616
/cached_react_helmet: Pro 358.94 ▼1.6% (364.91) 15.21 ▼22.2% (19.54) 29.7 ▼2.6% (30.49) 200=10920
/cached_redux_component: Pro 378.49 ▼1.6% (384.57) 20.53 ▲5.5% (19.47) 31.04 ▼0.8% (31.28) 200=11437
/lazy_apollo_graphql: Pro 135.81 ▼9.0% (149.3) 53.78 ▲11.2% (48.34) 86.15 ▲10.7% (77.82) 200=4108
/redis_receiver: Pro 84.79 ▼2.9% (87.29) 63.62 ▼7.3% (68.61) 160.34 ▲9.2% (146.84) 200=2566,3xx=1
/stream_shell_error_demo: Pro 324.25 ▼1.1% (328.02) 23.68 ▲13.5% (20.86) 38.12 ▲10.8% (34.39) 200=9798
/test_incremental_rendering: Pro 280.67 ▼16.2% (335.04) 20.61 ▼4.8% (21.65) 39.62 ▲12.9% (35.08) 200=8482
/rsc_posts_page_over_redis: Pro 95.41 ▼6.9% (102.43) 77.62 ▲17.0% (66.37) 124.24 ▲13.6% (109.4) 200=2887
/async_on_server_sync_on_client: Pro 251.33 ▼20.4% (315.61) 22.75 ▲0.2% (22.7) 28.56 ▼29.2% (40.32) 200=7645
/server_router: Pro 276.64 ▼16.0% (329.26) 20.89 ▼3.0% (21.54) 83.64 ▲140.4% (34.8) 200=8361
/unwrapped_rsc_route_client_render: Pro 359.24 ▼4.5% (376.01) 21.32 ▲9.9% (19.41) 34.06 ▲13.6% (29.99) 200=10854
/async_render_function_returns_string: Pro 322.06 ▼3.8% (334.85) 23.79 ▲12.2% (21.21) 35.99 ▲6.3% (33.85) 200=9736
/async_components_demo: Pro 204.89 ▲2.6% (199.61) 40.18 ▲9.7% (36.64) 56.58 ▲11.0% (50.98) 200=6199
/stream_native_metadata: Pro 313.02 ▼6.4% (334.29) 10.91 ▼48.9% (21.35) 32.08 ▼6.6% (34.34) 200=9522
/rsc_native_metadata: Pro 267.52 ▼16.6% (320.61) 21.14 ▼7.1% (22.75) 27.2 ▼25.1% (36.32) 200=8137
/client_side_hello_world: Pro 346.31 ▼2.3% (354.59) 22.11 ▲11.6% (19.81) 35.2 ▲13.7% (30.95) 200=10465
/client_side_hello_world_shared_store_controller: Pro 272.12 ▼18.3% (333.13) 21.24 ▼1.1% (21.47) 31.48 ▼6.1% (33.51) 200=8223
/server_side_hello_world_shared_store: Pro 278.27 ▼1.4% (282.12) 28.56 ▲8.5% (26.33) 39.6 ▲2.2% (38.74) 200=8410
/server_side_hello_world_shared_store_defer: Pro 261.48 ▼8.2% (284.93) 30.53 ▲17.9% (25.9) 45.35 ▲17.8% (38.51) 200=7899
/server_side_hello_world_hooks: Pro 334.52 ▼2.6% (343.59) 21.98 ▲4.5% (21.04) 35.58 ▲1.3% (35.12) 200=10110
/server_side_log_throw: Pro 327.75 ▼3.2% (338.6) 23.9 ▲10.0% (21.72) 37.46 ▲7.6% (34.8) 200=9905
/server_side_log_throw_raise: Pro 560.3 ▼12.8% (642.27) 10.46 ▼8.0% (11.37) 18.74 ▲0.5% (18.64) 3xx=16928
/server_side_hello_world_es5: Pro 357.87 ▲7.1% (334.3) 15.63 ▼26.7% (21.32) 29.17 ▼17.7% (35.46) 200=10887
/server_side_hello_world_with_options: Pro 299.09 ▼10.2% (333.18) 19.28 ▼11.6% (21.81) 54.42 ▲57.3% (34.59) 200=9038
/client_side_manual_render: Pro 335.46 ▼8.1% (365.05) 17.11 ▼13.2% (19.72) 46.24 ▲49.9% (30.85) 200=10139
/react_router: Pro 432.65 ▲11.8% (386.94) 16.89 ▼6.1% (17.99) 28.99 ▼1.6% (29.46) 200=13073
/css_modules_images_fonts_example: Pro 296.72 ▼12.0% (337.12) 19.12 ▼12.7% (21.91) 23.4 ▼30.6% (33.71) 200=9026
/rendered_html: Pro 364.03 ▲8.1% (336.78) 21.58 ▲1.2% (21.33) 33.16 ▲1.8% (32.56) 200=11007
/react_helmet: Pro 350.06 ▲6.5% (328.74) 16.01 ▼28.6% (22.41) 30.03 ▼12.2% (34.19) 200=10583
/image_example: Pro 360.34 ▲9.0% (330.67) 15.35 ▼31.8% (22.5) 29.16 ▼16.9% (35.11) 200=10961
/posts_page: Pro 84.69 ▼82.0% (470.13) 93.97 ▲99.5% (47.11) 151.37 ▲126.4% (66.85) 200=2565

▲/▼ 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 6, 2026

Copy link
Copy Markdown
Contributor

Pro (shard 2/2) Benchmark Summary

Benchmark RPS p50(ms) p90(ms) Status
/empty: Pro 1566.46 ▲27.5% (1228.22) 5.5 ▼8.2% (5.99) 7.16 ▼21.2% (9.09) 200=47313
/ssr_shell_error: Pro 414.19 ▲24.5% (332.61) 18.94 ▼13.5% (21.89) 30.05 ▼14.8% (35.27) 200=12518
/ssr_sync_error: Pro 455.8 🟢 37.7% (331.02) 12.17 ▼42.7% (21.23) 23.49 ▼36.4% (36.94) 200=13774
/rsc_component_error: Pro 454.02 ▲37.6% (330.0) 16.84 ▼24.1% (22.18) 26.0 ▼28.9% (36.57) 200=13719
/non_existing_stream_react_component: Pro 458.07 ▲35.4% (338.19) 16.63 ▼19.9% (20.76) 28.16 ▼18.7% (34.65) 200=13840
/server_side_redux_app_cached: Pro 494.92 🟢 35.5% (365.37) 15.8 ▼22.6% (20.42) 24.43 ▼24.3% (32.25) 200=14952
/loadable: Pro 423.72 ▲40.0% (302.68) 18.62 ▼23.1% (24.22) 28.68 ▼21.7% (36.61) 200=12802
/apollo_graphql: Pro 183.06 ▲32.0% (138.66) 47.65 ▼5.2% (50.25) 67.25 ▼21.1% (85.19) 200=5500
/console_logs_in_async_server: Pro 3.57 ▲8.8% (3.28) 2120.34 ▼0.1% (2121.8) 2139.57 ▼2.0% (2183.57) 200=122
/stream_error_demo: Pro 463.86 🟢 44.1% (321.94) 16.41 ▼24.8% (21.84) 27.87 ▼23.9% (36.63) 200=14015
/stream_async_components: Pro 463.04 🟢 41.2% (327.82) 16.49 ▼27.3% (22.67) 27.61 ▼25.1% (36.85) 200=13990
/rsc_posts_page_over_http: Pro 451.99 ▲39.8% (323.38) 16.96 ▼24.6% (22.5) 26.08 ▼28.8% (36.61) 200=13654
/rsc_echo_props: Pro 311.19 🟢 37.8% (225.77) 25.59 ▼22.4% (32.96) 40.9 ▼19.2% (50.62) 200=9404
/async_on_server_sync_on_client_client_render: Pro 488.42 🟢 39.3% (350.56) 15.71 ▼24.0% (20.68) 23.9 ▼29.4% (33.86) 200=14759
/server_router_client_render: Pro 494.1 🟢 42.4% (346.95) 15.42 ▼25.2% (20.6) 23.16 ▼27.4% (31.89) 200=14930
/unwrapped_rsc_route_stream_render: Pro 409.48 ▲22.1% (335.3) 13.9 ▼33.8% (21.01) 34.72 ▼5.0% (36.53) 200=12385
/async_render_function_returns_component: Pro 406.76 ▲22.6% (331.65) 14.03 ▼32.9% (20.92) 31.29 ▼9.7% (34.67) 200=12290
/native_metadata: Pro 479.48 🟢 44.0% (332.92) 16.28 ▼26.6% (22.17) 26.3 ▼22.5% (33.95) 200=14488
/hybrid_metadata_streaming: Pro 456.84 ▲37.2% (332.89) 17.06 ▼22.3% (21.96) 27.47 ▼26.0% (37.1) 200=13801
/cache_demo: Pro 447.61 ▲38.4% (323.46) 17.02 ▼25.7% (22.9) 26.63 ▼29.3% (37.69) 200=13524
/client_side_hello_world_shared_store: Pro 462.95 ▲38.8% (333.51) 16.57 ▼22.9% (21.48) 26.43 ▼21.5% (33.65) 200=13986
/client_side_hello_world_shared_store_defer: Pro 387.22 ▲16.4% (332.52) 14.7 ▼32.6% (21.8) 24.84 ▼27.8% (34.41) 200=11701
/server_side_hello_world_shared_store_controller: Pro 375.31 ▲35.2% (277.57) 14.3 ▼45.6% (26.31) 29.13 ▼29.0% (41.01) 200=11416
/server_side_hello_world: Pro 438.83 ▲34.5% (326.21) 19.65 ▼12.2% (22.38) 26.82 ▼23.2% (34.94) 200=13260
/client_side_log_throw: Pro 423.99 ▲15.1% (368.5) 13.32 ▼31.9% (19.57) 35.16 ▲13.3% (31.04) 200=12811
/server_side_log_throw_plain_js: Pro 495.08 ▲33.2% (371.78) 15.65 ▼20.0% (19.56) 25.74 ▼18.2% (31.46) 200=14958
/server_side_log_throw_raise_invoker: Pro 556.74 ▲36.7% (407.2) 13.39 ▼21.3% (17.02) 22.85 ▼19.9% (28.53) 200=16836
/server_side_redux_app: Pro 379.75 ▲15.3% (329.29) 15.05 ▼32.2% (22.2) 41.52 ▲17.1% (35.46) 200=11475
/server_side_redux_app_cached: Pro 510.7 🟢 39.8% (365.37) 15.35 ▼24.8% (20.42) 23.55 ▼27.0% (32.25) 200=15426
/render_js: Pro 524.73 🟢 43.2% (366.5) 14.52 ▼26.2% (19.69) 22.79 ▼30.2% (32.66) 200=15854
/pure_component: Pro 477.38 🟢 44.0% (331.44) 13.11 ▼40.4% (22.01) 22.07 ▼39.5% (36.51) 200=14424
/turbolinks_cache_disabled: Pro 520.42 🟢 42.8% (364.46) 14.65 ▼26.9% (20.04) 21.81 ▼32.3% (32.23) 200=15722
/xhr_refresh: Pro 409.13 ▲46.7% (278.89) 19.21 ▼25.4% (25.75) 28.81 ▼26.0% (38.92) 200=12366
/broken_app: Pro 475.13 🟢 41.4% (336.07) 16.41 ▼25.7% (22.08) 23.73 ▼34.0% (35.96) 200=14355
/server_render_with_timeout: Pro 470.09 ▲41.5% (332.22) 16.75 ▼22.6% (21.64) 25.63 ▼24.3% (33.85) 200=14203

▲/▼ 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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Clarify RSC generator React and package compatibility policy

1 participant