You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
## 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>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+19-14Lines changed: 19 additions & 14 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,18 +24,7 @@ After a release, run `/update-changelog` in Claude Code to analyze commits, writ
24
24
25
25
### [Unreleased]
26
26
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
39
28
40
29
#### Added
41
30
@@ -45,11 +34,26 @@ After a release, run `/update-changelog` in Claude Code to analyze commits, writ
45
34
46
35
#### Changed
47
36
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).
49
38
-**[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).
50
39
-**[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).
51
40
-**[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).
52
41
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).
0 commit comments