Skip to content

CI: add Pro RSC rspack runtime gate#3817

Merged
justin808 merged 23 commits into
mainfrom
jg-codex/3481-3488-pro-rsc-rspack-ci
Jun 9, 2026
Merged

CI: add Pro RSC rspack runtime gate#3817
justin808 merged 23 commits into
mainfrom
jg-codex/3481-3488-pro-rsc-rspack-ci

Conversation

@justin808

@justin808 justin808 commented Jun 8, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds a Pro integration workflow job that builds the Pro dummy client/server/RSC bundles with Rspack, boots Rails plus the Pro Node renderer, and runs a focused RSC Playwright runtime gate.
  • Wires the Pro dummy app to Shakapacker's bundler-selecting runner, adds the Rspack config/dependencies, and selects the native react-on-rails-rsc Rspack manifest plugin when SHAKAPACKER_ASSETS_BUNDLER=rspack.
  • Adds source-level Jest coverage for the new Rspack path and package scripts.

Refs #3481
Refs #3488

  • 3bfb9e54 fixes the current-head dummy-app-rspack-rsc-runtime-gate readiness failure from https://github.com/shakacode/react_on_rails/actions/runs/27179165533/job/80234426668 by polling the Node renderer at http://[::1]:3800/info; the job log showed the renderer listening on http://[::1]:3800 while the readiness check was using localhost.

  • a6d365c9 addresses current Claude review notes from 2026-06-09: guards the RSC loader wrapper from double-wrapping and loosens the Rspack entrypoint test away from exact source-token matching.

  • 77047b92 addresses current Claude feedback from 2026-06-09: splits Rails readiness from renderer health checks, tries both IPv6 and IPv4 renderer loopback endpoints, and makes RSC loader injection idempotent for both function and array rule.use shapes.

Scope Notes

Validation

  • git fetch --prune origin main -> updated origin/main to 25b94cc7f026158275f3b1ab09b2d88399fd99fd before branching.
  • Live GitHub state checked for Add Rspack CI coverage for spec dummy apps via shakapacker-rspack #3481 and Rspack RSC: path to production-ready — pivot to native RSCRspackPlugin #3488 -> both open; Rspack RSC: path to production-ready — pivot to native RSCRspackPlugin #3488 assigned to justin808; Add Rspack CI coverage for spec dummy apps via shakapacker-rspack #3481 unassigned; no stop condition found.
  • pnpm install --lockfile-only -> passed.
  • pnpm install --frozen-lockfile -> passed.
  • git diff --check -> passed.
  • actionlint -> passed.
  • script/ci-changes-detector origin/main -> passed; detected JavaScript/TypeScript + React on Rails Pro Dummy app and recommended broad lint/test/Pro dummy/benchmark coverage.
  • cd react_on_rails_pro/spec/dummy && bundle check -> passed.
  • pnpm start format.listDifferent -> passed.
  • pnpm run lint -> passed.
  • cd react_on_rails_pro && bundle exec rubocop --ignore-parent-exclusion -> passed, 228 files inspected, no offenses.
  • pnpm --filter react_on_rails_pro_dummy exec jest --runInBand -> passed, 5 suites / 40 tests.
  • pnpm run build -> passed.
  • cd react_on_rails_pro/spec/dummy && pnpm run build:test -> passed with existing DefinePlugin warnings.
  • cd react_on_rails_pro/spec/dummy && pnpm run build:test:rspack -> passed with Rspack warnings for DefinePlugin and macro/import-fresh dynamic require handling.
  • Runtime gate: started Pro Node renderer on 3800 and Rails on 3000 with SHAKAPACKER_ASSETS_BUNDLER=rspack RAILS_ENV=test NODE_ENV=test; CI=true SHAKAPACKER_ASSETS_BUNDLER=rspack RAILS_ENV=test NODE_ENV=test pnpm e2e-test:rsc -> passed, 10 tests.
  • lsof -nP -iTCP:3000 -sTCP:LISTEN || true and lsof -nP -iTCP:3800 -sTCP:LISTEN || true -> no listeners after cleanup.
  • Pre-commit hook -> passed trailing newline, Prettier, and ESLint checks for changed files.
  • Pre-push hook -> passed branch-lint and markdown-links.

Review Follow-up

  • 148f98869 addresses Claude review feedback from 2026-06-08: the Rspack RSC runtime gate now waits for both Rails and the Node renderer /info endpoint, and bin/shakapacker restores environment defaults before loading Bundler/Shakapacker.
  • Additional validation after the review fix:
    • actionlint .github/workflows/pro-integration-tests.yml
    • git diff --check
    • ruby -c react_on_rails_pro/spec/dummy/bin/shakapacker
    • (cd react_on_rails_pro && bundle exec rubocop --ignore-parent-exclusion spec/dummy/bin/shakapacker)
    • pnpm --filter react_on_rails_pro_dummy exec jest --runInBand tests/rsc-rspack-config.test.js
    • /Users/justin/.agents/skills/autoreview/scripts/autoreview --mode local
    • pre-push hook: branch lint

Incomplete / Unknown

  • yamllint .github/ could not run locally: command not found; python3 -m yamllint .github/ also failed with No module named yamllint.
  • codex review --base origin/main was started, but the coordinator checkpoint asked to stop expanding scope; the process was terminated before a review result, so review outcome is UNKNOWN.
  • GitHub CI state is UNKNOWN until this draft PR's checks report.

Labels

Labels: full-ci recommended. This touches a GitHub Actions workflow, package/build config, lockfile, and Pro dummy RSC runtime gate. Benchmark label is not applied by this PR; the CI detector recommends benchmark jobs, but this diff does not change production runtime/performance code directly.


Note

Medium Risk
Touches Pro RSC build and CI runtime (bundler selection, RSC loaders/plugins, and full-stack boot checks); production app code is mostly unchanged, but regressions could break the RSC + Node renderer integration path.

Overview
Adds a Pro integration CI job (dummy-app-rspack-rsc-runtime-gate) that builds the dummy app with Rspack (SHAKAPACKER_ASSETS_BUNDLER=rspack), starts Rails and the Pro Node renderer on pinned 127.0.0.1 endpoints, waits on HTTP and h2c /info, then runs a focused RSC Playwright suite via e2e-test:rsc.

The Pro dummy app is wired for dual bundlers: bin/shakapacker uses Shakapacker’s generic runner, a new config/rspack/rspack.config.js forces rspack before loading the shared webpack config, and client/server/RSC webpack configs pick RSCRspackPlugin vs RSCWebpackPlugin and Rspack-specific server plugin filtering. rscWebpackConfig gains idempotent WebpackLoader injection for function- and array-shaped rule.use (still using WebpackLoader under rspack). New build:test:rspack / e2e-test:rsc scripts and Jest coverage lock in the rspack path; lockfile adds @rspack/*, shakapacker-rspack, and rspack-manifest-plugin. Several Pro node-renderer files only update license/header text.

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

Summary by CodeRabbit

  • New Features

    • Added RSPack bundler support and a CI Pro integration job to run RSC end-to-end tests.
  • Tests

    • Added RSC-focused Playwright E2E tests and new Jest suites validating RSPack/RSC configs and package scripts.
    • Added an npm script to run RSC E2E specs.
  • Chores

    • Updated dummy app dependencies and build/test scripts for RSPack.
    • Updated license/header notices across several files.

@coderabbitai

coderabbitai Bot commented Jun 8, 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

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: d5b4e41e-27a6-4ac5-8103-39da485ffa7b

📥 Commits

Reviewing files that changed from the base of the PR and between e5b3ca2 and 2d656dd.

📒 Files selected for processing (1)
  • .github/workflows/pro-integration-tests.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/pro-integration-tests.yml

Walkthrough

Adds a gated Pro CI job for Rspack+RSC E2E, updates the Pro dummy app to support Rspack (bundler selection, rspack config wrapper, Shakapacker runner), makes RSC plugin selection dynamic, hardens loader injection, updates packages/scripts, and adds contract Jest tests.

Changes

Rspack + RSC Integration and Testing

Layer / File(s) Summary
CI job: Rspack + RSC runtime-gated integration
.github/workflows/pro-integration-tests.yml
Adds a new Pro CI job that builds Rspack RSC bundles, launches the Node renderer (h2c) and Rails, probes readiness (HTTP + h2c), runs Playwright RSC E2E tests, and uploads JUnit + Playwright reports.
Bundler scaffolding: Shakapacker runner and Rspack config wrapper
react_on_rails_pro/spec/dummy/bin/shakapacker, react_on_rails_pro/spec/dummy/config/rspack/rspack.config.js
Switches bin/shakapacker to use shakapacker/runner and adds config/rspack/rspack.config.js which temporarily sets SHAKAPACKER_ASSETS_BUNDLER='rspack' while requiring the shared webpack config; rspack config includes a license header.
Dynamic RSC plugin selection for client and server configs
react_on_rails_pro/spec/dummy/config/webpack/clientWebpackConfig.js, react_on_rails_pro/spec/dummy/config/webpack/serverWebpackConfig.js
Client/server configs now select the appropriate RSC manifest plugin and bundler APIs at module load based on config.assets_bundler; server filtering excludes Rspack-specific manifest/CSS-extract plugins and uses the bundler's chunk plugin.
RSC loader injection robustness improvements
react_on_rails_pro/spec/dummy/config/webpack/rscWebpackConfig.js
Generalizes RSC loader injection to support array and function rule.use, avoids duplicate injection via a Symbol marker, finds JS loaders (babel-loader/swc-loader), and normalizes wrapper return shapes.
Package dependencies and test scripts
react_on_rails_pro/spec/dummy/package.json, react_on_rails_pro/spec/dummy/tests/package-scripts.test.js
Adds @rspack/cli and @rspack/core, updates shakapacker-rspack to ~10.1.0, introduces e2e-test:rsc and build:test:rspack scripts, and adds Jest tests asserting the new scripts.
Comprehensive Rspack configuration contract tests
react_on_rails_pro/spec/dummy/tests/rsc-rspack-config.test.js
Adds Jest tests validating the rspack config file, Shakapacker runner delegation, conditional client/server plugin selection/imports, plugin filtering, browser fallback exclusions for Node-only modules, and idempotent loader wrapping for function-shaped rules.
Pro license header updates
packages/react-on-rails-pro-node-renderer/src/shared/*, packages/react-on-rails-pro-node-renderer/tests/*
Replaces several top-of-file headers with React on Rails Pro proprietary/commercial license text and updates referenced license URLs.

Sequence Diagram(s)

sequenceDiagram
  participant CI as GitHub Actions
  participant Rails as Rails Server
  participant Renderer as Node Renderer
  participant Playwright as Playwright Tests
  CI->>CI: Install deps, build Rspack RSC bundles
  CI->>Rails: Start Rails server
  CI->>Renderer: Start Node renderer (h2c)
  CI->>Rails: Probe HTTP /health for readiness
  CI->>Renderer: Probe h2c /info endpoint for readiness
  CI->>Playwright: Run RSC E2E tests
  Playwright->>Rails: Execute RSC test scenarios
  Playwright->>Renderer: Invoke renderer during tests
  Playwright-->>CI: Upload JUnit XML + report
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related issues

Possibly related PRs

Suggested labels

enhancement, review-needed, P2

Suggested reviewers

  • AbanoubGhadban
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'CI: add Pro RSC rspack runtime gate' clearly and concisely summarizes the main change: adding a CI job for Pro RSC rspack runtime testing, which aligns with the primary changeset that introduces the new GitHub Actions integration job and supporting Rspack configuration.
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-codex/3481-3488-pro-rsc-rspack-ci

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.

@justin808

Copy link
Copy Markdown
Member Author

Workflow Change Audit:

  • Workflow changed: .github/workflows/pro-integration-tests.yml.
  • on: triggers: unchanged (push to main, pull_request with existing path ignores, and workflow_dispatch).
  • permissions: unchanged (contents: read).
  • Secrets: no new secret names introduced; the new job reuses existing secrets.REACT_ON_RAILS_PRO_LICENSE_V2 via REACT_ON_RAILS_PRO_LICENSE.
  • Third-party/local actions: no new action vendors or version changes. The new job reuses existing action patterns: actions/checkout@v4, ./.github/actions/setup-ruby, actions/setup-node@v4, pnpm/action-setup@v4, actions/cache@v4, ./.github/actions/setup-bundle, and actions/upload-artifact@v4.
  • New job: dummy-app-rspack-rsc-runtime-gate builds Pro dummy Rspack RSC bundles, boots Rails plus the Pro Node renderer, runs focused RSC Playwright coverage, and uploads Rspack-specific Playwright artifacts.

Comment thread .github/workflows/pro-integration-tests.yml Outdated
Comment thread react_on_rails_pro/spec/dummy/bin/shakapacker Outdated
Comment thread react_on_rails_pro/spec/dummy/config/webpack/rscWebpackConfig.js
Comment thread react_on_rails_pro/spec/dummy/tests/rsc-rspack-config.test.js
Comment thread react_on_rails_pro/spec/dummy/config/webpack/serverWebpackConfig.js
@github-actions

github-actions Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

Path Size
react-on-rails/client bundled (gzip) 61.41 KB (0%)
react-on-rails/client bundled (gzip) (time) 61.41 KB (0%)
react-on-rails/client bundled (brotli) 52.63 KB (0%)
react-on-rails/client bundled (brotli) (time) 52.63 KB (0%)
react-on-rails-pro/client bundled (gzip) 62.57 KB (0%)
react-on-rails-pro/client bundled (gzip) (time) 62.57 KB (0%)
react-on-rails-pro/client bundled (brotli) 53.69 KB (0%)
react-on-rails-pro/client bundled (brotli) (time) 53.69 KB (0%)
registerServerComponent/client bundled (gzip) 72.28 KB (0%)
registerServerComponent/client bundled (gzip) (time) 72.28 KB (0%)
registerServerComponent/client bundled (brotli) 62.14 KB (0%)
registerServerComponent/client bundled (brotli) (time) 62.14 KB (0%)
wrapServerComponentRenderer/client bundled (gzip) 65.87 KB (0%)
wrapServerComponentRenderer/client bundled (gzip) (time) 65.87 KB (0%)
wrapServerComponentRenderer/client bundled (brotli) 56.47 KB (0%)
wrapServerComponentRenderer/client bundled (brotli) (time) 56.47 KB (0%)

@claude

claude Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Code Review

Overview

This PR wires up a new Layer 2 CI lane — Pro RSC + Rspack runtime gate — that builds the Pro dummy app with Rspack, boots Rails + the Pro Node renderer, and runs a focused Playwright RSC gate. It also generalises the Webpack-only loader/plugin selection in the Pro dummy config to support both Webpack and Rspack at runtime.


What works well

  • Clean bundler-select pattern in rspack.config.js: setting SHAKAPACKER_ASSETS_BUNDLER before delegating to the shared webpack config is the right minimal touch — no config duplication.
  • typeof rule.use === 'function' branch in rscWebpackConfig.js correctly handles Rspack's dynamic-loader API (where rule.use is a factory function rather than a static array). The originalUse.call(this, data) forwarding preserves the context Rspack provides.
  • swc-loader fallback alongside babel-loader in the JS-loader search is a good defensive addition for Rspack's default toolchain.
  • module: false resolve fallback in clientWebpackConfig.js is the correct fix for browser bundles under Rspack.
  • Scope disciplinersc_use_client_css intentionally excluded with clear reasoning in the PR body.
  • Jest coverage for the new Rspack path and the new e2e-test:rsc script.

Issues

Actionable

  1. No wait for the Node renderer (port 3800) — flagged inline on line 657 of the workflow. The new job polls port 3000 (Rails) but starts the Node renderer without a matching readiness check. The two existing Playwright jobs share this gap; this is a good opportunity to close it for the new job. Intermittent failures would be hard to reproduce locally.

  2. ENV assignment order in bin/shakapacker — flagged inline. require "shakapacker" now runs before ENV["RAILS_ENV"] ||= "development" is set, which is the reverse of the original. Shakapacker is likely lazy about reading RAILS_ENV, but restoring the original ordering eliminates the ambiguity at zero cost.

Informational (no change required)

  1. Constructor-name plugin filter in serverWebpackConfig.js — consistent with the existing WebpackAssetsManifest/MiniCssExtractPlugin guards, but all three will silently break if the class is renamed upstream. Flagged inline.

  2. String-assertion tests in rsc-rspack-config.test.js — useful coupling guards but will break on reformatting/rename. Flagged inline with a suggestion to make the intent explicit in the describe block name.


Security / Performance

No security concerns. The new CI job adds a modest amount of wall-clock time (Rspack builds are fast) and two new build artifacts. Node version is pinned to 22.12.0 to avoid the known V8 bug — correct call.


Summary

The core logic is sound. One actionable fix recommended (Node renderer wait) and one low-risk ordering fix in the Ruby bin script. The rest is informational. Good to merge after addressing the wait issue.

@justin808

Copy link
Copy Markdown
Member Author

Review follow-up summary

Scan window: addressed current unresolved Claude feedback visible on 2026-06-09 after head ae98e52b3.

Mattered

  • Fixed the Rspack RSC runtime gate startup race: commit 148f98869 waits for both Rails and the Pro Node renderer /info endpoint before Playwright starts.
  • Restored Pro dummy bin/shakapacker environment-default ordering before Bundler/Shakapacker load.

Advisory / resolved with rationale

  • Left the RSC loader pass-through unchanged because returning the original result preserves the existing type when no JS loader is found.
  • Left source-coupling test names unchanged; the string assertions intentionally guard the Rspack source contract.
  • Left the constructor-name plugin guard unchanged because it matches adjacent existing plugin filters and has no confirmed blocker.

Validation

  • actionlint .github/workflows/pro-integration-tests.yml
  • git diff --check
  • ruby -c react_on_rails_pro/spec/dummy/bin/shakapacker
  • (cd react_on_rails_pro && bundle exec rubocop --ignore-parent-exclusion spec/dummy/bin/shakapacker)
  • pnpm --filter react_on_rails_pro_dummy exec jest --runInBand tests/rsc-rspack-config.test.js
  • /Users/justin/.agents/skills/autoreview/scripts/autoreview --mode local
  • pre-push hook: branch lint

Future full-PR scans can start after this comment unless check all reviews is requested.

@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code Review — CI: add Pro RSC rspack runtime gate

Overall: Well-structured PR that correctly wires dual-bundler support and adds a proper runtime gate. The CI job structure follows established patterns (including the workflow-level `defaults: run: working-directory: react_on_rails_pro`), the `wait_for_service` polling is solid, and the conditional plugin selection is readable. A few items below worth addressing before merge.


Issues

1. `rscLoaderWrapper` has no double-wrap guard (minor)

`configureRsc()` mutates `rule.use` in-place. Today `serverWebpackConfig(true)` calls `webpack-merge` which produces a fresh config object per invocation, so there's no shared-state risk at runtime. However, if the rules object were ever reused across calls (e.g. via module caching, a test harness, or a future refactor), the wrapper would stack silently — the RSC loader would be injected twice per file, breaking the RSC bundle with duplicate side-effects. A one-line name guard is cheap insurance.

See inline comment on `rscWebpackConfig.js`.

2. Source-text string matching in `rsc-rspack-config.test.js` is fragile

Tests like `expect(source).toContain("process.env.SHAKAPACKER_ASSETS_BUNDLER ||= 'rspack'")` will fail on a no-op quote-style change (`'rspack'` → `"rspack"`) or import reorder without any functional regression. Contract tests that verify file-system relationships ("does this path exist?") are valuable here; tests that re-assert the exact source text of implementation details are not — they'll create noise and erode trust in the test suite over time.

See inline comment on `rsc-rspack-config.test.js`.

3. Rspack manifest plugin filter relies on constructor name (minor)

`plugin.constructor.name !== 'RspackManifestPlugin'` is consistent with the existing filters for `WebpackAssetsManifest`, `MiniCssExtractPlugin`, etc., but constructor-name matching is fragile under minification or if the package renames the class. Worth a one-line comment acknowledging this is intentional and consistent with the established pattern.


Positives

  • The `wait_for_service` 300 s polling loop correctly gates on the Node renderer `/info` endpoint (not just a TCP port) — this was the right fix from the prior review.
  • `bin/shakapacker`: `Pathname.new(FILE).realpath` handles symlinked bin paths cleanly; `NODE_ENV ||= ENV.fetch("RAILS_ENV")` restores the env default correctly; `frozen_string_literal` pragma is good practice.
  • `config/rspack/rspack.config.js`: the `||=` guard ensures a caller-set `SHAKAPACKER_ASSETS_BUNDLER` is never silently overridden.
  • `module: false` in the client resolve fallback correctly prevents Rspack from attempting to polyfill the Node built-in `module` in the browser bundle.
  • The `e2e-test:rsc` script intentionally excludes `rsc_use_client_css` (documented in PR body and validated by test assertion) — this is the right scoping call.
  • `build:test:rspack` script is consistent with `build:test` — sets `SHAKAPACKER_ASSETS_BUNDLER=rspack` in both the precompile-hook and the main shakapacker invocation.

Comment thread react_on_rails_pro/spec/dummy/config/webpack/rscWebpackConfig.js Outdated
Comment thread react_on_rails_pro/spec/dummy/tests/rsc-rspack-config.test.js
@justin808

Copy link
Copy Markdown
Member Author

CI follow-up

Current-head dummy-app-rspack-rsc-runtime-gate failed in job https://github.com/shakacode/react_on_rails/actions/runs/27179165533/job/80234426668 while waiting for http://localhost:3800/info.

Evidence from the job log showed the Node renderer did start, but it was listening on http://[::1]:3800. Commit 3bfb9e54 updates the readiness probe to http://[::1]:3800/info.

Validation before push:

  • git diff --check
  • actionlint .github/workflows/pro-integration-tests.yml
  • pre-commit hook: trailing newlines, Prettier
  • pre-push hook: branch lint and markdown-link hook

@justin808

Copy link
Copy Markdown
Member Author

Review follow-up summary

Scan window: addressed current unresolved Claude feedback visible on 2026-06-09 after head 3bfb9e54.

Mattered

  • Added an rscLoaderWrapper name guard so repeated RSC configuration on the same rules object cannot stack wrappers.
  • Relaxed the Rspack entrypoint test to assert the structural contract instead of exact source-token formatting.

Fix commit: a6d365c9.

Validation

  • git diff --check
  • pnpm exec prettier --check -- react_on_rails_pro/spec/dummy/config/webpack/rscWebpackConfig.js react_on_rails_pro/spec/dummy/tests/rsc-rspack-config.test.js
  • pnpm --filter react_on_rails_pro_dummy exec jest --runInBand tests/rsc-rspack-config.test.js
  • pre-commit hook: trailing newlines, Prettier, ESLint
  • pre-push hook: branch lint and markdown-link hook

Optional

  • None left from this pass.

Skipped

  • None.

Future full-PR scans can start after this comment unless check all reviews is requested.

@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code Review — CI: add Pro RSC rspack runtime gate

Overview

This PR adds a Layer 2 CI job (dummy-app-rspack-rsc-runtime-gate) that builds client/server/RSC bundles with Rspack, boots Rails + the Pro Node renderer, and runs a focused RSC Playwright gate. It also wires the Pro dummy app for dual-bundler support (webpack/rspack) and adds Jest coverage for the new paths. The scope is well-contained to the test dummy app and CI infrastructure.


Issues

1. curl --fail diverges from every other readiness check in the file (medium risk)

Every other job in this workflow uses curl -s http://localhost:3000 > /dev/null (no --fail). The new wait_for_service helper adds --fail, which returns exit code 22 for any 4xx/5xx HTTP response. If the test Rails app serves a 404 at / (common when the root route isn't defined) or an early 500, the loop will retry for the full 300 seconds rather than recognising that the server is up. Since this service-readiness check only needs to confirm the TCP port is accepting connections (not that the app is healthy), dropping --fail is consistent with every sibling job. See inline comment.

2. rscLoaderWrapper mutates rule.use in-place — double-injection risk (low, worth noting)

Both the new function-shaped branch and the existing Array.isArray branch mutate the rule object returned from serverWebpackConfig(true). If anything in the call chain reuses the same config object across invocations (the comment on commonWebpackConfig already flags it as a mutable global), the RSC loader could be injected twice. The function-shaped branch is harder to catch because wrapping a wrapper is invisible to typeof rule.use === 'function'. A guard that checks for the presence of 'react-on-rails-rsc/WebpackLoader' before injecting would make both branches idempotent. See inline comment.

3. No behaviour test for the rule.use function-shaped wrapper (low)

rsc-rspack-config.test.js tests source-text patterns (does the file contain these strings?) but the new rscLoaderWrapper logic in rscWebpackConfig.js — the most complex new code path — has no behaviour test. A unit test that stubs a function-shaped rule with a swc-loader and asserts the RSC loader appears in the returned array would lock this in. Worth a follow-up if not in scope here.


Positives

  • The wait_for_service refactor is a clear improvement over copy-pasted per-service polling: centralised, named, and reusable within the step.
  • Correctly waits for both Rails and the Node renderer /info endpoint — the existing sibling jobs only poll Rails and assume the renderer is ready. The IPv6 [::1] address fix is well-motivated by the runner log evidence.
  • Plugin-name filter for RspackManifestPlugin in serverWebpackConfig.js follows the existing WebpackAssetsManifest/MiniCssExtractPlugin pattern exactly.
  • bin/shakapacker: switching to Shakapacker::Runner, using Pathname#realpath for symlink-safe Gemfile resolution, and seeding NODE_ENV from RAILS_ENV before loading Bundler are solid hygiene improvements.
  • The test that explicitly asserts rsc_use_client_css is absent from the focused gate is a good pattern for documenting a known gap rather than silently skipping it.

Comment thread .github/workflows/pro-integration-tests.yml Outdated
Comment thread react_on_rails_pro/spec/dummy/config/webpack/rscWebpackConfig.js
Comment thread .github/workflows/pro-integration-tests.yml Outdated
Comment thread .github/workflows/pro-integration-tests.yml Outdated
Comment thread react_on_rails_pro/spec/dummy/config/webpack/rscWebpackConfig.js Outdated
Comment thread react_on_rails_pro/spec/dummy/tests/rsc-rspack-config.test.js
@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code Review

Overview

This PR adds a Layer 2 Pro RSC Rspack CI gate — a new dummy-app-rspack-rsc-runtime-gate workflow job that builds the Pro dummy app's client/server/RSC bundles under Rspack, boots Rails + the Pro Node renderer, and runs two focused Playwright RSC tests (rsc_echo_props, rsc_route_ssr_false). It also wires the Pro dummy app for dual-bundler support (webpack vs rspack) via Shakapacker::Runner, adds Rspack config/dependencies, and selects the appropriate RSC manifest plugin at runtime. Jest tests lock in the new config paths.

The scope, structure, and validation checklist are thorough. A few issues worth addressing:


Issues

Medium — curl --fail may cause the Rails readiness check to loop forever (inline comment on line 665)

The two existing analogous jobs poll Rails with curl -s (no --fail). With --fail, any 4xx from the Rails root (common in test env) is treated as "not ready," causing a silent 300 s timeout rather than a boot failure. Removing --fail from the Rails check (or pointing at /up) fixes this; --fail is still appropriate for the /info endpoint.

Low — hardcoded [::1]:3800 for Node renderer health check (inline comment on line 678)

This was validated against a specific CI run log, which is good detective work, but it is brittle. If the Node renderer ever binds only to IPv4, or the runner's loopback stack changes, the job silently waits 300 s. A fallback that tries both [::1] and 127.0.0.1 — or a brief comment linking to the CI run that established this — would reduce future confusion.


Positives

  • Dual-bundler plugin selection (clientWebpackConfig.js, serverWebpackConfig.js): clean ternary on config.assets_bundler, consistent with Shakapacker's own pattern.
  • RspackManifestPlugin server-bundle filter: correctly follows the existing constructor-name filter pattern; no style regression.
  • module: false in resolve.fallback: correct addition for browser builds.
  • Symlink-safe Pathname.new(__FILE__).realpath in bin/shakapacker: good defensive change; frozen_string_literal is a welcome hygiene improvement.
  • Double-wrap guard via rule.use.name === 'rscLoaderWrapper': works reliably in Node.js config context (not minified); correctly uses originalUse.call(this, data) to preserve Webpack/Rspack context.
  • Jest tests: source-text assertions are a pragmatic choice for CI-portability. See inline note on the test file about an optional behavioral test for the function-wrapper path.

Summary

One actionable fix (the --fail flag on the Rails health check) and one low-risk improvement (the IPv6 fallback or comment). Everything else is well-constructed. The Playwright runtime gate and dual-bundler wiring are solid.

Comment thread .github/workflows/pro-integration-tests.yml
@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code review posted via inline comments below.

Comment thread .github/workflows/pro-integration-tests.yml
Comment thread .github/workflows/pro-integration-tests.yml
Comment thread react_on_rails_pro/spec/dummy/tests/rsc-rspack-config.test.js
@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Code Review

Overview: This PR adds a Layer 2 RSC Rspack CI runtime gate and necessary build plumbing: Rspack dependencies in the Pro dummy app, a bundler-selecting config entry point, conditional RSC manifest plugin selection (Rspack vs webpack), idempotent RSC loader injection for function-shaped rule.use, and a focused Playwright gate. The validation trail in the PR body is thorough.

Strengths:

  • IPv4 pinning cleanly closes the IPv6/localhost ambiguity that caused the previous CI failure.
  • RSC loader idempotency via Symbol.for is solid; the global symbol registry means the marker survives jest.requireActual module identity while still being reset by Jest module-cache wipes between tests.
  • Bundler-agnostic bin/shakapacker (Shakapacker::Runner + Pathname#realpath) is the right direction; the Jest test locks the contract.
  • Sequential readiness waits (Rails first, renderer second) are pragmatic: both services boot in parallel, logs stay readable, and renderer timeout is not wasted.
  • Two-call extractLoader (babel-loader or swc-loader) in the RSC wrapper correctly handles both transpiler stacks.

Issue 1 - Maintainability: duplicate inline Node.js in wait_for_h2c_service. The function contains two structural copies of the http2 client (line 697 polling, line 747 diagnostic). They diverge intentionally (diagnostic prints headers/body) but share about 20 lines of boilerplate. If h2c readiness logic changes (endpoint path, timeout, auth header) only one copy typically gets updated first. Keep the diagnostic copy in sync when updating the polling copy.

Issue 2 - Missing explanation: module: false in client resolve fallback. clientWebpackConfig.js adds module: false to resolve.fallback. Webpack 5 does not inject a module polyfill by default so this line had no effect there. It is needed under Rspack because Rspack browser-targeted configs emit a warning for the module built-in when no fallback is declared. A one-line comment would clarify intent for future editors.

Issue 3 - Company name capitalization: Seven files change the copyright from Shakacode LLC to ShakaCode LLC (capital C in Code). If this matches the legal entity name it is correct; if it is a typo it should be reverted since it touches legal notices.

Issue 4 (minor) - No background-process cleanup: Rails and the Node renderer are started in background but no trap/kill teardown step is added. The existing Playwright jobs follow the same pattern so this is consistent, not a regression.

Verdict: Approve after confirming the ShakaCode LLC capitalization is intentional. The Node.js heredoc duplication and missing module: false comment are worth a quick fix but not blockers.

Comment thread .github/workflows/pro-integration-tests.yml
Comment thread react_on_rails_pro/spec/dummy/config/webpack/clientWebpackConfig.js
@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) 2117.24 ▼4.4% (2215.05) 4.36 ▲6.4% (4.1) 5.4 ▲2.2% (5.29) 200=63520
Pro Node Renderer: react_ssr (non-RSC) 1881.15 ▼2.6% (1931.61) 4.79 ▲1.7% (4.71) 6.08 ▲0.6% (6.05) 200=56436

▲/▼ 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 3.46 ▲5.0% (3.3) 2410.43 ▲4.6% (2304.78) 2948.42 ▼2.3% (3018.8) 200=111
/client_side_hello_world: Core 688.27 ▲4.4% (659.39) 9.43 ▼0.2% (9.45) 19.68 ▲9.3% (18.01) 200=20795
/client_side_rescript_hello_world: Core 711.49 ▲9.3% (650.93) 9.09 ▼6.0% (9.67) 19.07 ▲6.0% (17.99) 200=21499
/client_side_hello_world_shared_store: Core 679.7 ▲5.8% (642.6) 9.32 ▼4.0% (9.7) 24.19 ▲22.5% (19.74) 200=20534
/client_side_hello_world_shared_store_controller: Core 464.62 ▼27.5% (641.01) 9.98 ▲2.3% (9.75) 14.27 ▼30.5% (20.54) 200=14132
/client_side_hello_world_shared_store_defer: Core 654.75 ▲1.9% (642.29) 8.93 ▼9.0% (9.82) 23.66 ▲17.8% (20.08) 200=19781
/server_side_hello_world_shared_store: Core 15.03 ▲6.2% (14.15) 559.56 ▲1.8% (549.77) 731.16 ▲1.9% (717.21) 200=460
/server_side_hello_world_shared_store_controller: Core 12.69 ▼10.2% (14.13) 470.13 ▼12.9% (540.02) 620.58 ▼12.4% (708.36) 200=391
/server_side_hello_world_shared_store_defer: Core 15.05 ▲5.6% (14.25) 548.45 ▼0.4% (550.84) 750.51 ▲3.8% (722.92) 200=460
/server_side_hello_world: Core 30.69 ▲7.7% (28.5) 208.94 ▼20.4% (262.51) 310.57 ▼6.5% (332.12) 200=936
/server_side_hello_world_hooks: Core 30.75 ▲7.3% (28.64) 273.45 ▲2.5% (266.89) 320.54 ▼4.8% (336.56) 200=937
/server_side_hello_world_props: Core 22.38 ▼22.5% (28.86) 279.1 ▲2.0% (273.5) 392.11 ▲17.1% (334.83) 200=680
/client_side_log_throw: Core 674.16 ▲1.9% (661.49) 9.18 ▼6.2% (9.78) 19.45 ▲3.3% (18.82) 200=20370
/server_side_log_throw: Core 29.5 ▲5.1% (28.07) 282.91 ▲1.3% (279.34) 338.48 0.0% (338.49) 200=896
/server_side_log_throw_plain_js: Core 25.53 ▼10.1% (28.41) 233.25 ▼11.0% (261.97) 309.22 ▼7.7% (334.9) 200=777
/server_side_log_throw_raise: Core 30.19 ▲6.6% (28.33) 279.47 ▲4.4% (267.71) 327.49 ▼1.4% (332.21) 3xx=918
/server_side_log_throw_raise_invoker: Core 777.22 ▼1.1% (786.1) 8.11 ▼3.7% (8.42) 18.64 ▲19.8% (15.56) 200=23479
/server_side_hello_world_es5: Core 30.56 ▲10.5% (27.64) 278.14 ▲3.9% (267.62) 328.85 ▼2.3% (336.55) 200=927
/server_side_redux_app: Core 28.96 ▲4.4% (27.75) 291.57 ▲3.1% (282.75) 338.67 ▼1.5% (343.95) 200=880
/server_side_hello_world_with_options: Core 30.55 ▲7.3% (28.46) 274.57 ▲0.3% (273.78) 322.31 ▼2.6% (330.97) 200=929
/server_side_redux_app_cached: Core 458.48 ▼30.3% (657.75) 12.68 ▲24.0% (10.22) 20.1 ▲8.4% (18.54) 200=13860
/client_side_manual_render: Core 692.8 ▲3.1% (671.93) 9.57 ▲0.1% (9.56) 19.23 ▲2.7% (18.72) 200=20928
/render_js: Core 32.72 ▲7.5% (30.43) 253.84 ▲0.7% (252.06) 297.6 ▼4.3% (310.82) 200=996
/react_router: Core 28.31 ▲4.9% (27.0) 227.0 ▼22.6% (293.16) 338.01 ▼5.0% (355.91) 200=864
/pure_component: Core 30.77 ▲5.6% (29.15) 294.15 ▲8.3% (271.55) 325.98 ▼1.8% (331.81) 200=933
/css_modules_images_fonts_example: Core 30.22 ▲8.5% (27.85) 277.52 ▲4.4% (265.83) 330.85 ▼1.6% (336.15) 200=920
/turbolinks_cache_disabled: Core 673.61 ▼2.3% (689.58) 11.78 ▲26.1% (9.34) 21.26 ▲13.6% (18.71) 200=20350
/rendered_html: Core 30.5 ▲5.0% (29.06) 275.64 ▲0.6% (274.06) 322.51 ▼3.4% (333.7) 200=928
/xhr_refresh: Core 12.32 ▼15.6% (14.6) 490.87 ▼5.1% (517.36) 572.24 ▼16.9% (688.89) 200=379
/react_helmet: Core 29.51 ▲4.9% (28.12) 283.21 ▲3.8% (272.89) 340.75 ▲0.7% (338.49) 200=895
/broken_app: Core 29.79 ▲6.2% (28.05) 287.31 ▲8.1% (265.77) 333.37 ▲0.9% (330.42) 200=903
/image_example: Core 30.12 ▲4.9% (28.7) 281.52 ▲0.4% (280.38) 334.94 ▼0.5% (336.76) 200=914
/turbo_frame_tag_hello_world: Core 773.56 ▲4.5% (740.0) 8.64 ▲0.7% (8.58) 17.1 ▲2.6% (16.66) 200=23370
/manual_render_test: Core 667.99 ▼0.9% (673.85) 7.58 ▼18.9% (9.35) 16.79 ▼9.5% (18.56) 200=20314

▲/▼ 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 209.45 ▲15.1% (182.0) 38.74 ▼10.2% (43.14) 59.09 ▼4.0% (61.54) 200=6331
/error_scenarios_hub: Pro 390.29 ▲8.3% (360.42) 19.03 ▼2.5% (19.53) 29.42 ▼1.8% (29.97) 200=11795
/ssr_async_error: Pro 368.71 ▲7.9% (341.61) 21.0 ▲0.6% (20.87) 31.84 ▼8.7% (34.89) 200=11143
/ssr_async_prop_error: Pro 345.22 ▲4.2% (331.45) 7.45 🟢 65.7% (21.73) 20.22 ▼42.8% (35.36) 200=10503
/non_existing_react_component: Pro 336.47 ▼5.3% (355.17) 17.24 ▼15.4% (20.37) 33.89 ▲5.2% (32.21) 200=10168
/non_existing_rsc_payload: Pro 392.0 ▲7.2% (365.59) 19.04 ▼3.5% (19.73) 30.32 ▼7.5% (32.78) 200=11848
/cached_react_helmet: Pro 447.53 ▲21.2% (369.24) 17.21 ▼7.1% (18.52) 26.02 ▼16.3% (31.08) 200=13522
/cached_redux_component: Pro 421.13 ▲8.9% (386.71) 18.42 ▼3.5% (19.1) 27.17 ▼10.5% (30.37) 200=12725
/lazy_apollo_graphql: Pro 141.76 ▼5.1% (149.45) 40.79 ▼15.6% (48.33) 56.1 ▼25.8% (75.63) 200=4316
/redis_receiver: Pro 104.71 ▲18.3% (88.51) 32.84 ▼51.0% (66.98) 92.69 ▼38.1% (149.68) 200=3189
/stream_shell_error_demo: Pro 356.55 ▲5.8% (336.92) 21.16 ▲2.1% (20.72) 33.16 ▼3.9% (34.5) 200=10776
/test_incremental_rendering: Pro 408.5 ▲20.1% (340.01) 18.09 ▼13.4% (20.9) 29.36 ▼12.9% (33.72) 200=12346
/rsc_posts_page_over_redis: Pro 106.45 ▲10.4% (96.46) 55.11 ▼24.1% (72.62) 117.2 0.0% (117.18) 200=3220
/async_on_server_sync_on_client: Pro 356.04 ▲10.9% (321.02) 24.38 ▲8.3% (22.52) 33.66 ▼13.9% (39.11) 200=10755
/server_router: Pro 368.92 ▲9.2% (337.88) 20.99 ▼2.7% (21.57) 31.39 ▼8.7% (34.38) 200=11147
/unwrapped_rsc_route_client_render: Pro 370.76 ▼3.1% (382.44) 15.48 ▼16.5% (18.55) 53.87 ▲80.6% (29.83) 200=11201
/async_render_function_returns_string: Pro 369.05 ▲8.0% (341.66) 15.02 ▼27.9% (20.82) 28.66 ▼15.3% (33.84) 200=11227
/async_components_demo: Pro 233.93 ▲14.5% (204.27) 34.07 ▼6.2% (36.31) 46.85 ▼7.7% (50.77) 200=7070
/stream_native_metadata: Pro 394.25 ▲16.0% (339.9) 13.82 ▼33.8% (20.87) 26.92 ▼27.1% (36.93) 200=11992
/rsc_native_metadata: Pro 378.24 ▲16.5% (324.58) 20.06 ▼7.5% (21.7) 34.05 ▼10.3% (37.96) 200=11428
/react_intl_rsc_demo: Pro 351.37 ▲5.7% (332.43) 7.57 🟢 64.6% (21.37) 19.93 ▼47.5% (37.98) 200=10692
/client_side_hello_world_shared_store: Pro 384.6 ▲12.7% (341.2) 16.35 ▼20.9% (20.66) 27.67 ▼12.7% (31.69) 200=11622
/client_side_hello_world_shared_store_defer: Pro 381.43 ▲12.6% (338.68) 19.76 ▼6.3% (21.09) 32.26 ▼4.6% (33.81) 200=11524
/server_side_hello_world_shared_store_controller: Pro 306.66 ▲7.0% (286.53) 7.75 🟢 70.5% (26.3) 23.05 ▼43.5% (40.77) 200=9332
/server_side_hello_world: Pro 365.01 ▲9.1% (334.46) 15.05 ▼32.2% (22.21) 28.76 ▼16.5% (34.44) 200=11105
/client_side_log_throw: Pro 417.58 ▲12.7% (370.42) 18.1 ▼5.9% (19.24) 29.79 ▼4.6% (31.22) 200=12632
/server_side_log_throw_plain_js: Pro 430.34 ▲13.3% (379.77) 17.96 ▼7.8% (19.47) 26.83 ▼15.3% (31.66) 200=13003
/server_side_log_throw_raise_invoker: Pro 504.83 ▲22.8% (411.23) 14.73 ▼13.0% (16.93) 25.23 ▼11.2% (28.4) 200=15252
/server_side_redux_app: Pro 393.29 ▲17.8% (333.83) 6.65 ▼69.8% (21.99) 18.05 ▼51.0% (36.86) 200=11964
/server_side_redux_app_cached: Pro 429.32 ▲14.0% (376.61) 5.88 ▼69.2% (19.08) 16.7 ▼45.1% (30.41) 200=13068
/render_js: Pro 460.42 ▲21.8% (377.93) 16.83 ▼13.8% (19.52) 26.73 ▼16.2% (31.91) 200=13909
/pure_component: Pro 392.13 ▲16.3% (337.29) 16.11 ▼24.9% (21.45) 27.22 ▼23.9% (35.77) 200=11851
/turbolinks_cache_disabled: Pro 405.89 ▲9.4% (370.87) 18.3 ▼6.3% (19.52) 28.62 ▼9.0% (31.44) 200=12265
/xhr_refresh: Pro 334.39 ▲16.0% (288.32) 23.3 ▼8.1% (25.35) 35.54 ▼8.4% (38.82) 200=10108
/broken_app: Pro 340.93 ▼0.5% (342.7) 16.99 ▼20.4% (21.34) 33.6 ▼3.2% (34.7) 200=10302
/server_render_with_timeout: Pro 335.59 ▲0.2% (334.88) 17.2 ▼19.4% (21.34) 34.34 ▼0.3% (34.45) 200=10141

▲/▼ 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 1291.48 ▲3.7% (1245.92) 6.74 ▲15.1% (5.86) 8.59 ▼5.9% (9.13) 200=39006
/ssr_shell_error: Pro 354.56 ▲3.5% (342.5) 22.36 ▲3.3% (21.65) 35.3 ▲2.1% (34.56) 200=10715
/ssr_sync_error: Pro 326.17 ▼3.3% (337.13) 19.47 ▼6.6% (20.84) 32.65 ▼2.4% (33.46) 200=9860
/rsc_component_error: Pro 327.77 ▼2.9% (337.59) 23.85 ▲12.3% (21.25) 37.9 ▲5.6% (35.88) 200=9905
/non_existing_stream_react_component: Pro 371.05 ▲6.4% (348.76) 21.07 ▲1.8% (20.69) 34.04 0.0% (34.05) 200=11211
/server_side_redux_app_cached: Pro 380.82 ▲1.1% (376.61) 20.97 ▲9.9% (19.08) 32.76 ▲7.7% (30.41) 200=11506
/loadable: Pro 290.9 ▼6.2% (310.18) 27.13 ▲16.3% (23.34) 38.92 ▲9.0% (35.7) 200=8793
/apollo_graphql: Pro 131.19 ▼7.4% (141.6) 42.22 ▼15.3% (49.82) 73.29 ▼11.7% (82.99) 200=3994
/console_logs_in_async_server: Pro 3.57 ▲11.1% (3.21) 2122.71 ▲0.1% (2121.27) 2153.26 ▼9.8% (2387.25) 200=122
/stream_error_demo: Pro 280.18 ▼15.0% (329.64) 27.85 ▲36.2% (20.45) 44.31 ▲29.3% (34.26) 200=8467
/stream_async_components: Pro 284.69 ▼13.8% (330.08) 27.55 ▲25.8% (21.9) 40.47 ▲8.3% (37.37) 200=8604
/rsc_posts_page_over_http: Pro 283.33 ▼14.1% (329.66) 27.7 ▲26.1% (21.97) 40.61 ▲11.4% (36.47) 200=8561
/rsc_echo_props: Pro 208.43 ▼7.4% (224.97) 27.15 ▼15.8% (32.25) 50.35 ▼1.7% (51.24) 200=6341
/async_on_server_sync_on_client_client_render: Pro 310.88 ▼11.9% (352.86) 28.15 ▲35.4% (20.79) 38.92 ▲15.6% (33.68) 200=9335
/server_router_client_render: Pro 318.1 ▼8.8% (348.89) 24.61 ▲20.8% (20.38) 37.55 ▲17.7% (31.9) 200=9610
/unwrapped_rsc_route_stream_render: Pro 270.93 ▼20.6% (341.09) 21.23 ▲3.3% (20.54) 41.84 ▲15.7% (36.17) 200=8190
/async_render_function_returns_component: Pro 311.29 ▼8.6% (340.48) 25.5 ▲25.4% (20.34) 39.64 ▲19.2% (33.26) 200=9407
/native_metadata: Pro 308.39 ▼8.4% (336.79) 25.61 ▲17.8% (21.74) 39.71 ▲2.7% (38.66) 200=9321
/hybrid_metadata_streaming: Pro 290.69 ▼13.6% (336.58) 30.42 ▲41.4% (21.51) 41.14 ▲17.8% (34.93) 200=8729
/cache_demo: Pro 276.61 ▼15.2% (326.2) 28.59 ▲32.9% (21.51) 44.72 ▲21.8% (36.71) 200=8358
/client_side_hello_world: Pro 339.98 ▼8.3% (370.62) 23.03 ▲22.8% (18.75) 35.42 ▲14.0% (31.06) 200=10272
/client_side_hello_world_shared_store_controller: Pro 304.71 ▼10.9% (341.96) 20.81 ▲2.1% (20.39) 34.38 ▲3.6% (33.18) 200=9209
/server_side_hello_world_shared_store: Pro 260.87 ▼10.1% (290.28) 30.76 ▲19.2% (25.8) 46.47 ▲19.2% (38.98) 200=7884
/server_side_hello_world_shared_store_defer: Pro 254.56 ▼11.4% (287.26) 21.98 ▼12.0% (24.98) 41.2 ▲7.6% (38.3) 200=7744
/server_side_hello_world_hooks: Pro 328.19 ▼7.4% (354.5) 23.33 ▲12.5% (20.74) 39.23 ▲13.9% (34.43) 200=9918
/server_side_log_throw: Pro 324.39 ▼5.4% (342.97) 24.19 ▲12.5% (21.5) 35.0 ▲2.2% (34.24) 200=9799
/server_side_log_throw_raise: Pro 694.08 ▲7.4% (646.39) 7.67 ▼29.8% (10.92) 16.8 ▼8.7% (18.4) 3xx=20970
/server_side_hello_world_es5: Pro 288.19 ▼15.9% (342.78) 20.2 ▼4.9% (21.25) 34.35 ▼4.9% (36.12) 200=8709
/server_side_hello_world_with_options: Pro 327.89 ▼2.3% (335.76) 23.95 ▲12.2% (21.34) 38.37 ▲13.5% (33.79) 200=9914
/client_side_manual_render: Pro 357.59 ▼4.0% (372.61) 21.56 ▲11.6% (19.32) 34.69 ▲9.9% (31.56) 200=10804
/react_router: Pro 394.11 ▼1.4% (399.64) 18.87 ▲8.0% (17.47) 33.52 ▲16.0% (28.89) 200=11908
/css_modules_images_fonts_example: Pro 325.77 ▼5.0% (342.96) 24.03 ▲12.9% (21.28) 35.09 ▲8.0% (32.48) 200=9845
/rendered_html: Pro 346.25 ▼0.5% (347.97) 22.39 ▲7.6% (20.81) 37.21 ▲11.3% (33.43) 200=10462
/react_helmet: Pro 343.7 ▲3.1% (333.47) 16.56 ▼23.7% (21.7) 31.0 ▼12.0% (35.22) 200=10389
/image_example: Pro 333.2 ▼3.0% (343.63) 23.76 ▲5.4% (22.54) 37.43 ▲11.7% (33.5) 200=10068
/posts_page: Pro 230.83 ▲57.6% (146.46) 34.02 ▼47.6% (64.95) 50.51 ▼45.0% (91.8) 200=6978

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

@justin808 justin808 merged commit e0f02df into main Jun 9, 2026
70 checks passed
@justin808 justin808 deleted the jg-codex/3481-3488-pro-rsc-rspack-ci branch June 9, 2026 12:00
justin808 added a commit that referenced this pull request Jun 9, 2026
…-floor-fix

* origin/main: (29 commits)
  Docs: align pr-batch closeout confidence handoff (#3835)
  Align adversarial review CI polling guidance (#3794)
  CI: add Pro RSC rspack runtime gate (#3817)
  Make RSCRoute refetch failures recoverable in production (#3786)
  Fix Pro node renderer license headers (#3834)
  Docs: fix anti-patterns in RSC tutorials (#3801)
  fix(pro): add RSC peer compatibility gate (#3831)
  Enforce Pro license headers in CI and pre-commit (#3821)
  Add RSC payload route-data helper (#3783)
  [Pro] Fix React.cache request dedupe in generated RSC configs (#3813)
  Docs: clarify RuboCop autofix ownership (#3827)
  Add Pro license header checker
  RSC: stop serializing props into embedded payload cache key (#3800)
  Make PR batches skip customer-feedback issues (#3826)
  Name the regressed benchmark+measure pairs in the issue body (#3830)
  Clarify agent batch policy handoffs (#3824)
  Filter Bencher alerts to tracked measures (drop orphaned p90 false positives) (#3829)
  Fix auto-bundled component pack normalization (#3818)
  Filter stale Bencher alerts before reporting (#3822)
  Tighten benchmark confirmation workflow permissions (#3819)
  ...

# Conflicts:
#	.github/workflows/benchmark.yml
@shakacode shakacode deleted a comment from claude Bot Jun 11, 2026
@shakacode shakacode deleted a comment from claude Bot Jun 11, 2026
@shakacode shakacode deleted a comment from claude Bot Jun 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant