Skip to content

Commit 8e8e19c

Browse files
justin808claude
andauthored
Update changelog for 17.0.0.rc.6 (#4174)
## Why Stamps the `17.0.0.rc.6` changelog section so the release task can publish it and auto-create the GitHub release. This is the changelog step that comes **before** running `bundle exec rake release` (the release task reads the version + notes from `CHANGELOG.md`). ## What Ran a full `/update-changelog` classification sweep over the **78 merged PRs** in `v17.0.0.rc.5..origin/main` (plus one revert commit) before stamping. Most are docs/agent-workflow/CI/test changes (`no-entry`); the user-visible ones were already accumulated under `[Unreleased]` during development. **Stamping:** `bundle exec rake "update_changelog[17.0.0.rc.6]"` inserted the `### [17.0.0.rc.6] - 2026-06-21` header after `[Unreleased]`, moved the accumulated entries under it, and rewrote the compare links (`v17.0.0.rc.5...v17.0.0.rc.6`, `[unreleased]` → `main`). Prior RC sections are preserved (RC mode does not collapse them). **Changelog edits made in this pass:** - **Added one missing entry** — RSC-safe generated i18n locale defaults ([#4146](#4146)): the only user-visible PR merged after rc.5 that was not yet in the changelog (gem runtime change in `lib/react_on_rails/locales/`, fixes #4132). - **Co-credited [#4107](#4107 alongside #4130 on the "generated demo paths honor custom Shakapacker source roots" entry — #4107 is the demo-path-wrapping half of the same Issue #4062 work, already described in that entry. - **Added the missing PR link ([#4096](#4096 to the `RenderFunction` types-only breaking-change entry, which previously linked only the issue. - **Reordered** the rc.6 category sections to the standard **Added → Changed → Fixed**, matching rc.2/rc.4 and the changelog skill's documented order (the `[Unreleased]` accumulation had led with Fixed). The `17.0.0.rc.6` section contains 14 entries (3 Added, 4 Changed, 7 Fixed). ## Test plan - `bundle exec rake "update_changelog[17.0.0.rc.6]"` (run with a UTF-8 locale to avoid the `invalid byte sequence in US-ASCII` regex bug) → header + compare links stamped. - `pnpm exec prettier --check CHANGELOG.md` → clean. - Pre-commit/pre-push hooks: trailing-newlines, Lychee markdown links (8 OK / 0 errors), Prettier, branch-lint → all pass. - Verified `[Unreleased]` is now empty, version headers are newest-first, and compare links use the `v` prefix. ## Labels `Labels: none` — changelog/docs-only change; relies on the required PR gate plus the local verification above. ## After merge Run `bundle exec rake release` (no args — it reads `17.0.0.rc.6` from the changelog) to publish and auto-create the GitHub release. > Note: `main` currently shows pre-existing `detect-changes` failures unrelated to this changelog-only change. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent fb34d05 commit 8e8e19c

1 file changed

Lines changed: 19 additions & 14 deletions

File tree

CHANGELOG.md

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,7 @@ After a release, run `/update-changelog` in Claude Code to analyze commits, writ
2424

2525
### [Unreleased]
2626

27-
#### Fixed
28-
29-
- **Deferred hydration error reporting handles non-Error thrown values**: Delayed `hydrate_on` renders now normalize strings, `null`, and frozen `Error` instances before logging, so reporting the failure does not throw again or mutate user errors. [PR 4120](https://github.com/shakacode/react_on_rails/pull/4120) by [ihabadham](https://github.com/ihabadham).
30-
31-
- **Explicit Webpack installs now pass the resolved bundler to Shakapacker.** `rails generate react_on_rails:install --no-rspack` and `--webpack` now set `SHAKAPACKER_ASSETS_BUNDLER=webpack` before running `shakapacker:install`, so Shakapacker installs Webpack dependencies instead of falling back to its default bundler. Fixes [Issue 4108](https://github.com/shakacode/react_on_rails/issues/4108). [PR 4109](https://github.com/shakacode/react_on_rails/pull/4109) by [ihabadham](https://github.com/ihabadham).
32-
33-
- **Generated demo paths now honor custom Shakapacker source roots.** The install generator resolves demo components, entrypoints, stylesheets, TypeScript includes, Tailwind imports, and RSC hints from the app's Shakapacker `source_path` / `source_entry_path` settings, including slash entry roots, while wrapping long source hints in the generated demo views. Fixes [Issue 4062](https://github.com/shakacode/react_on_rails/issues/4062). [PR 4130](https://github.com/shakacode/react_on_rails/pull/4130) by [justin808](https://github.com/justin808).
34-
35-
- **Abort the in-flight SSR render when the client disconnects (Pro streaming)**: Previously, when an HTTP client disconnected (or a request timed out) mid-stream, the Node renderer kept driving the React render to completion against a consumer that was already gone — wasting CPU and, for RSC/`cache()`-wrapped data fetches, continuing to hit the app's database/APIs. The Pro streaming layer now propagates the consumer-side teardown upstream into ReactDOM's `PipeableStream.abort()`: when the renderer worker detects the client disconnect it destroys the render's output stream, which aborts the in-flight render and releases the request's RSC payload streams. Normal completion is unaffected (the abort only fires when the output is destroyed before it ends, and never when a render error closes the stream). This also establishes the precondition for React 19.2's [`cacheSignal`](https://react.dev/reference/react/cacheSignal), which React settles automatically once a render is aborted (the `cacheSignal`-specific test and docs remain a follow-up). Part of [Issue 3885](https://github.com/shakacode/react_on_rails/issues/3885). [PR 4093](https://github.com/shakacode/react_on_rails/pull/4093) by [justin808](https://github.com/justin808).
36-
- **[Pro]** **Bounded the RSCProvider RSC payload cache to prevent unbounded growth under high-cardinality props**: The provider-scoped promise cache (`fetchRSCPromisesRef`) and its companion bookkeeping (`lastSuccessfulRSCPromisesRef`, refetch versions, and the `versions`/`successfulVersions` state maps) are now backed by a bounded LRU (default cap 50 distinct RSC payload keys). High-cardinality `componentProps` (e.g. per-row or per-search-query routes) previously grew these maps without limit for the provider's entire lifetime — a latent memory leak. Eviction only affects cold, least-recently-used keys beyond the cap; same-key cache hits, refetch, `recoverOnError` restore, and version bumping are unchanged, and an in-flight refetch's key is pinned (with ref-counted pins, so overlapping same-key refetches stay protected until all of them settle) and cannot be evicted out from under its restore path. The per-key `useSyncExternalStore` subscription/fan-out optimization from the same issue is intentionally deferred pending profiling. Refs [Issue 3564](https://github.com/shakacode/react_on_rails/issues/3564). [PR 4097](https://github.com/shakacode/react_on_rails/pull/4097) by [justin808](https://github.com/justin808).
37-
38-
- **[Pro]** **Enrich deferred-render RSC errors with the bundle diagnostic**: When a Server Component failed during React's deferred render phase (a Suspense boundary resolving a lazy RSC element), the error surfaced through `renderToPipeableStream`'s `onError` as a generic React stream error — the original RSC bundle diagnostic (the real server-side error message and module path) was already out of scope and lost. The Pro streaming layer now threads the captured diagnostic through the request-scoped tracker and merges it into the surfaced error, so `ReactOnRails::PrerenderError` / `SmartError` output names the failing RSC component and module instead of a bare React message. Since React's `onError` carries no component key, attribution is conservative: one captured diagnostic is merged exactly, two or more produce a combined "one of these N RSC components failed" message (never a single false pinpoint), and each captured diagnostic is consumed on first use so an unrelated later failure in the same render is never mislabeled. Completes the deferred-render half of the bundle-diagnostic work (the fetch and preloaded-hydration halves shipped earlier). Closes [Issue 3475](https://github.com/shakacode/react_on_rails/issues/3475). [PR 4100](https://github.com/shakacode/react_on_rails/pull/4100) by [justin808](https://github.com/justin808).
27+
### [17.0.0.rc.6] - 2026-06-21
3928

4029
#### Added
4130

@@ -45,11 +34,26 @@ After a release, run `/update-changelog` in Claude Code to analyze commits, writ
4534

4635
#### Changed
4736

48-
- **Breaking (types only): `RenderFunction` no longer accepts the legacy 3-argument renderer shape**: The exported `RenderFunction` type is now exactly the 2-argument server/client render-function form (`(props, railsContext) => RenderFunctionResult`), equal to the existing `ServerRenderFunction`. It previously also accepted a 3-argument `(props, railsContext, domNodeId) => RenderFunctionResult` arm, which let nonsensical role combinations typecheck (a server render-function "returning" a renderer teardown, or a renderer "returning" a server-render hash). Renderer functions — the 3-argument form that owns its own DOM mount and may return a `{ teardown }` wrapper — should now be typed `RendererFunction`. `ReactComponentOrRenderFunction` already includes `RendererFunction`, so renderer-shaped functions remain registerable. The tighter type also drops the re-narrowing `as` casts the unified type forced in `createReactOutput` and the Pro tanstack-router render function. This is a compile-time-only change with no runtime behavior difference; only TypeScript consumers that annotated a 3-argument renderer as `RenderFunction` need to switch it to `RendererFunction`. Closes [Issue 3592](https://github.com/shakacode/react_on_rails/issues/3592) by [justin808](https://github.com/justin808).
37+
- **Breaking (types only): `RenderFunction` no longer accepts the legacy 3-argument renderer shape**: The exported `RenderFunction` type is now exactly the 2-argument server/client render-function form (`(props, railsContext) => RenderFunctionResult`), equal to the existing `ServerRenderFunction`. It previously also accepted a 3-argument `(props, railsContext, domNodeId) => RenderFunctionResult` arm, which let nonsensical role combinations typecheck (a server render-function "returning" a renderer teardown, or a renderer "returning" a server-render hash). Renderer functions — the 3-argument form that owns its own DOM mount and may return a `{ teardown }` wrapper — should now be typed `RendererFunction`. `ReactComponentOrRenderFunction` already includes `RendererFunction`, so renderer-shaped functions remain registerable. The tighter type also drops the re-narrowing `as` casts the unified type forced in `createReactOutput` and the Pro tanstack-router render function. This is a compile-time-only change with no runtime behavior difference; only TypeScript consumers that annotated a 3-argument renderer as `RenderFunction` need to switch it to `RendererFunction`. Closes [Issue 3592](https://github.com/shakacode/react_on_rails/issues/3592). [PR 4096](https://github.com/shakacode/react_on_rails/pull/4096) by [justin808](https://github.com/justin808).
4938
- **[Pro]** **Pinned `react-on-rails-rsc` to the stable `19.0.5` release**: The generator default, the root and Pro package manifests, the lockfile, and the Pro RSC install docs now pin the stable `react-on-rails-rsc@19.0.5` (previously the `19.0.5-rc.7` prerelease). The native RSC CSS FOUC fix requires `react-on-rails-rsc >= 19.0.5`. Closes [Issue 3634](https://github.com/shakacode/react_on_rails/issues/3634). [PR 4080](https://github.com/shakacode/react_on_rails/pull/4080) by [justin808](https://github.com/justin808).
5039
- **[Pro]** **RSC peer-compatibility warn-tier floor raised to stable `19.0.5`**: The Pro node renderer's `recommendedMin` for `react-on-rails-rsc` is now the published stable `19.0.5` (previously the dormant `19.0.2`). Anyone still on an older 19.x build (`19.0.2``19.0.4`) now gets a loud startup warning that they are missing the coordinated RSC fixes shipped in `19.0.5` (FOUC stylesheet preloading, async manifest signatures); `19.0.5`+ no longer warns. Refs [Issue 3632](https://github.com/shakacode/react_on_rails/issues/3632). [PR 4078](https://github.com/shakacode/react_on_rails/pull/4078) by [justin808](https://github.com/justin808).
5140
- **[Pro]** **RSC peer wildcard replaced with an explicit range**: The Pro npm package's optional `react-on-rails-rsc` peer dependency is now `^19.0.5` (`>= 19.0.5 < 20.0.0`) instead of `"*"`, so installs are floored at the RSC CSS FOUC fix release `19.0.5` and capped below the next major `20.0.0`, rather than `"*"` accepting any version including pre-FOUC builds and an unknown future major. Within the `19.x` line, per-version compatibility is enforced by the Pro node renderer's runtime version check (`rscPeerSupport.ts`), not by this advisory peer range. Fixes [Issue 3965](https://github.com/shakacode/react_on_rails/issues/3965). [PR 4082](https://github.com/shakacode/react_on_rails/pull/4082) by [justin808](https://github.com/justin808).
5241

42+
#### Fixed
43+
44+
- **Deferred hydration error reporting handles non-Error thrown values**: Delayed `hydrate_on` renders now normalize strings, `null`, and frozen `Error` instances before logging, so reporting the failure does not throw again or mutate user errors. [PR 4120](https://github.com/shakacode/react_on_rails/pull/4120) by [ihabadham](https://github.com/ihabadham).
45+
46+
- **Explicit Webpack installs now pass the resolved bundler to Shakapacker.** `rails generate react_on_rails:install --no-rspack` and `--webpack` now set `SHAKAPACKER_ASSETS_BUNDLER=webpack` before running `shakapacker:install`, so Shakapacker installs Webpack dependencies instead of falling back to its default bundler. Fixes [Issue 4108](https://github.com/shakacode/react_on_rails/issues/4108). [PR 4109](https://github.com/shakacode/react_on_rails/pull/4109) by [ihabadham](https://github.com/ihabadham).
47+
48+
- **Generated demo paths now honor custom Shakapacker source roots.** The install generator resolves demo components, entrypoints, stylesheets, TypeScript includes, Tailwind imports, and RSC hints from the app's Shakapacker `source_path` / `source_entry_path` settings, including slash entry roots, while wrapping long source hints in the generated demo views. Fixes [Issue 4062](https://github.com/shakacode/react_on_rails/issues/4062). [PR 4107](https://github.com/shakacode/react_on_rails/pull/4107) and [PR 4130](https://github.com/shakacode/react_on_rails/pull/4130) by [justin808](https://github.com/justin808).
49+
50+
- **RSC-safe generated i18n locale defaults**: The JavaScript locale compiler that generates `default.js` no longer imports `react-intl` or wraps messages in `defineMessages`; it now emits the message descriptor object directly. This lets the generated locale defaults be imported from React Server Component bundles without pulling in the client-oriented `react-intl` entrypoint, and without raising the minimum supported `react-intl` version. The exported `defaultMessages` shape is unchanged, and existing apps regenerate automatically because the compiler treats a `default.js` still using the old `defineMessages` template as stale. Fixes [Issue 4132](https://github.com/shakacode/react_on_rails/issues/4132). [PR 4146](https://github.com/shakacode/react_on_rails/pull/4146) by [justin808](https://github.com/justin808).
51+
52+
- **Abort the in-flight SSR render when the client disconnects (Pro streaming)**: Previously, when an HTTP client disconnected (or a request timed out) mid-stream, the Node renderer kept driving the React render to completion against a consumer that was already gone — wasting CPU and, for RSC/`cache()`-wrapped data fetches, continuing to hit the app's database/APIs. The Pro streaming layer now propagates the consumer-side teardown upstream into ReactDOM's `PipeableStream.abort()`: when the renderer worker detects the client disconnect it destroys the render's output stream, which aborts the in-flight render and releases the request's RSC payload streams. Normal completion is unaffected (the abort only fires when the output is destroyed before it ends, and never when a render error closes the stream). This also establishes the precondition for React 19.2's [`cacheSignal`](https://react.dev/reference/react/cacheSignal), which React settles automatically once a render is aborted (the `cacheSignal`-specific test and docs remain a follow-up). Part of [Issue 3885](https://github.com/shakacode/react_on_rails/issues/3885). [PR 4093](https://github.com/shakacode/react_on_rails/pull/4093) by [justin808](https://github.com/justin808).
53+
- **[Pro]** **Bounded the RSCProvider RSC payload cache to prevent unbounded growth under high-cardinality props**: The provider-scoped promise cache (`fetchRSCPromisesRef`) and its companion bookkeeping (`lastSuccessfulRSCPromisesRef`, refetch versions, and the `versions`/`successfulVersions` state maps) are now backed by a bounded LRU (default cap 50 distinct RSC payload keys). High-cardinality `componentProps` (e.g. per-row or per-search-query routes) previously grew these maps without limit for the provider's entire lifetime — a latent memory leak. Eviction only affects cold, least-recently-used keys beyond the cap; same-key cache hits, refetch, `recoverOnError` restore, and version bumping are unchanged, and an in-flight refetch's key is pinned (with ref-counted pins, so overlapping same-key refetches stay protected until all of them settle) and cannot be evicted out from under its restore path. The per-key `useSyncExternalStore` subscription/fan-out optimization from the same issue is intentionally deferred pending profiling. Refs [Issue 3564](https://github.com/shakacode/react_on_rails/issues/3564). [PR 4097](https://github.com/shakacode/react_on_rails/pull/4097) by [justin808](https://github.com/justin808).
54+
55+
- **[Pro]** **Enrich deferred-render RSC errors with the bundle diagnostic**: When a Server Component failed during React's deferred render phase (a Suspense boundary resolving a lazy RSC element), the error surfaced through `renderToPipeableStream`'s `onError` as a generic React stream error — the original RSC bundle diagnostic (the real server-side error message and module path) was already out of scope and lost. The Pro streaming layer now threads the captured diagnostic through the request-scoped tracker and merges it into the surfaced error, so `ReactOnRails::PrerenderError` / `SmartError` output names the failing RSC component and module instead of a bare React message. Since React's `onError` carries no component key, attribution is conservative: one captured diagnostic is merged exactly, two or more produce a combined "one of these N RSC components failed" message (never a single false pinpoint), and each captured diagnostic is consumed on first use so an unrelated later failure in the same render is never mislabeled. Completes the deferred-render half of the bundle-diagnostic work (the fetch and preloaded-hydration halves shipped earlier). Closes [Issue 3475](https://github.com/shakacode/react_on_rails/issues/3475). [PR 4100](https://github.com/shakacode/react_on_rails/pull/4100) by [justin808](https://github.com/justin808).
56+
5357
### [17.0.0.rc.5] - 2026-06-16
5458

5559
#### Fixed
@@ -2348,7 +2352,8 @@ such as:
23482352

23492353
- Fix several generator-related issues.
23502354

2351-
[unreleased]: https://github.com/shakacode/react_on_rails/compare/v17.0.0.rc.5...main
2355+
[unreleased]: https://github.com/shakacode/react_on_rails/compare/v17.0.0.rc.6...main
2356+
[17.0.0.rc.6]: https://github.com/shakacode/react_on_rails/compare/v17.0.0.rc.5...v17.0.0.rc.6
23522357
[17.0.0.rc.5]: https://github.com/shakacode/react_on_rails/compare/v17.0.0.rc.4...v17.0.0.rc.5
23532358
[17.0.0.rc.4]: https://github.com/shakacode/react_on_rails/compare/v17.0.0.rc.3...v17.0.0.rc.4
23542359
[17.0.0.rc.3]: https://github.com/shakacode/react_on_rails/compare/v17.0.0.rc.2...v17.0.0.rc.3

0 commit comments

Comments
 (0)