Skip to content

Polish instant fix cards and validation messages#93894

Open
aurorascharff wants to merge 40 commits into
canaryfrom
aurorascharff/revamp-fix-cards
Open

Polish instant fix cards and validation messages#93894
aurorascharff wants to merge 40 commits into
canaryfrom
aurorascharff/revamp-fix-cards

Conversation

@aurorascharff
Copy link
Copy Markdown
Contributor

@aurorascharff aurorascharff commented May 16, 2026

What?

  • Rename cards to plain English: Prerender params if known, Mark the route as dynamic, For telemetry, use a timing API.
  • Remove Wrap body in Suspense card from viewport variants.
  • Body errors: during the initial renderduring prerendering; blocking navigationblocking the page load.
  • Server sync IO leads with the unstable value <expression>.
  • Client sync IO drops fixed at build time.
  • New loading-state icon for the block group.

Demo

aurorascharff and others added 30 commits May 14, 2026 11:08
Adds two pieces of framework correctness for `unstable_instant` validation:

1. **Navigation body factories** in `blocking-route-messages.ts`:
   - `createRuntimeBodyErrorInNavigation` (E1247)
   - `createDynamicBodyErrorInNavigation` (E1246)
   Wired into `trackDynamicHoleInNavigation` so the in-navigation case emits
   its own message ("accessed under `<Suspense>`" + nav-aware "Ways to fix")
   instead of reusing the initial-render copy ("accessed outside of
   `<Suspense>`"). Phase-neutral phrasing ("during the initial render or a
   navigation") accommodates the path firing from either prerender or
   client-nav validation.

2. **Clear-on-nav reducer** in the dev overlay:
   - `ACTION_INSTANT_ERRORS_CLEAR` reducer case in `shared.ts`.
   - `useClearInstantErrorsOnNav` hook in `dev-overlay.tsx` watches
     `usePathname()` and dispatches when the route changes.
   Only errors fired during a client navigation are eligible to clear:
   `*InNavigation` factories carry an `__nextInstantNav` marker, and wrapper
   headlines (E1082 / E1112 / E1113 / E1118) are detected via the stable
   "Could not validate `unstable_instant`" substring. Initial-render / SSR
   errors lack both signals and persist, so a page that fails to prerender
   stays in the overlay until the source is fixed.

Co-authored-by: Cursor <cursoragent@cursor.com>
Reads the `__nextInstantNav` marker from the error to pick the right
overlay copy for the blocking-route family:

- Headline: "Next.js encountered runtime/uncached data during a
  navigation." (in-nav) vs. "during the initial render." (initial).
- Explanation: "This prevents the navigation from being instant..." vs.
  the default "prevents the route from being prerendered..." string.

Adds `BLOCKING_ROUTE_NAVIGATION_EXPLANATION` next to `EXPLANATIONS` in
`instant-guidance-data.ts` so all overlay copy stays in one place.

Also renames the legacy `'navigation'` value of `GuidanceVariant` to
`'dynamic'` — the original name meant "uncached data" (from #92638) and
collides with the new in-navigation concept. The new shape is
`'runtime' | 'dynamic'` for what kind of data is accessed, plus an
orthogonal `inNavigation: boolean` for the phase.

Co-authored-by: Cursor <cursoragent@cursor.com>
Object markers on the Error don't survive RSC serialization
(`__NEXT_ERROR_CODE` already has a side-channel Map for this same
reason), so the previous `__nextInstantNav` property was getting
stripped before the dev overlay ever saw it.

Switches detection to two structural substrings already present in the
user-facing copy:

- \`accessed under \`<Suspense>\`\` — only emitted by the in-navigation
  body factories. The mirrored SSR factories say \`accessed outside of
  \`<Suspense>\`\`, so the two are unambiguous.
- \`Could not validate \`unstable_instant\`\` — already used to detect
  wrapper errors (E1082 / E1112 / E1113 / E1118), tied to the API name
  rather than phase wording.

Drops the marker helper from `blocking-route-messages.ts`.

Co-authored-by: Cursor <cursoragent@cursor.com>
The dev overlay renders in a separate React root mounted at the document
body (via `createRoot(container)` in `dev-overlay.browser.tsx`), so the
App Router's `PathnameContext` isn't in scope and `usePathname()` returns
`null` — making the previous `useClearInstantErrorsOnNav` effect a no-op.

Switches to a browser-level subscription: listen for `popstate` (back /
forward) and patch `history.pushState` / `history.replaceState` to detect
client navigations triggered by `next/link` and `router.push()`. Cleanup
restores the originals so the patch is scoped to overlay lifetime.

This matches the pattern other dev-overlay code already uses for current
path (e.g. `route-info.tsx` reads `window.location.pathname` directly).

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The new `createRuntimeBodyErrorInNavigation` / `createDynamicBodyErrorInNavigation`
factories produce "encountered runtime data during a navigation" wording in
the dev overlay (via inNavigation substring detection in errors.tsx). Seven
inline snapshots in instant-validation-parallel-slots.test.ts locked in the
older "during the initial render" + E1221 / E1220 wording — flipped to the
new "during a navigation" + E1247 / E1246.

The eighth test in this file is left at canary state: it relies on PR #93770's
"expected segment was not rendered" message which currently bakes in a
test/tmp/next-test-… absolute path. That test is broken on canary HEAD
too (verified directly) — not a regression from this PR.

Co-authored-by: Cursor <cursoragent@cursor.com>
`instant-validation.test.ts` (28 snapshots) and
`instant-validation-parallel-slots.test.ts` (7 snapshots) had build-mode
inline snapshots that pinned the older `createRuntimeBodyError` /
`createDynamicBodyError` wording. Switched to the new in-navigation
factory output:

  - "encountered runtime data during the initial render."
  + "encountered runtime data during the initial render or a navigation."

  - "accessed outside of `<Suspense>` prevents the route from being
    prerendered, blocking navigation and leading to a slower user
    experience."
  + "accessed under `<Suspense>` prevents the route from being
    prerendered or the navigation from being instant, leading to a
    slower user experience."

Captured without NEXT_SKIP_ISOLATE so the test packed next.js as a
tarball (matching the CI build path); avoids leaking local
`../../../packages/next/dist/esm/...` stack frames into the snapshots.

Co-authored-by: Cursor <cursoragent@cursor.com>
The in-navigation body factories said "accessed under \`<Suspense>\`",
which contradicts the fix bullet that recommends wrapping in Suspense.
The actual problem is the same as the SSR factories: data accessed
*outside* a Suspense boundary, where the prerender / prefetchable
shell can't proceed without waiting. Aligned both InNavigation factories
to "accessed outside of \`<Suspense>\`" so the diagnostic matches the
SSR factories — only the consequence clause differs (still includes
"or the navigation from being instant").

Refactored the substring detection that distinguishes in-navigation
vs SSR variants into a single `isBlockingRouteInNavError` helper in
`shared.ts`, used by both `getInstantErrorRoute` (clear-on-nav) and
`getBlockingRouteErrorDetails` (overlay headline phase). Helper keys
off "or a navigation" which is still unique to the InNavigation factory
pair (the diagnostic clause is now shared).

Also narrowed `getInstantErrorRoute` to detect *only* body factory
errors — wrapper errors like "Could not validate \`unstable_instant\`"
are no longer cleared on navigation. They describe a validation
infrastructure failure rather than a fixable route-level mistake and
should stay in the redbox stack until the user addresses the cause.

Snapshot updates across `instant-validation.test.ts` (dev + build
modes) and `instant-validation-parallel-slots.test.ts` (dev + build
modes) reflect the new wording. Build-mode snapshots captured without
NEXT_SKIP_ISOLATE so the test packs Next.js as a tarball and produces
the same stack frame shape CI sees (avoids leaking local dist paths).

Co-authored-by: Cursor <cursoragent@cursor.com>
- Drop history.pushState/replaceState patching in favor of state.page
  from ACTION_DEVTOOL_UPDATE_ROUTE_STATE (cooperates with App Router's
  own history patching).
- Update errors.test.ts for new {inNavigation, variant: 'dynamic'} shape
  and add InNavigation factory cases.
- Bump E1246/E1247 -> E1249/E1250 in level-* and causes tests after the
  factory wording change.

Co-authored-by: Cursor <cursoragent@cursor.com>
- Restore the 13-space indent on `Unrendered segment(s):` paths in dev
  inline snapshots (got stripped during the earlier wording sweep).
- Use the stable `app/...` prefix instead of the non-deterministic
  `test/tmp/next-test-<timestamp>-<rand>/...` path that crept into one
  parallel-slots snapshot.

Co-authored-by: Cursor <cursoragent@cursor.com>
`state.page` is the resolved URL (e.g. `/foo/123`), but an instant error's
embedded `Route "..."` uses the route pattern (`/foo/[param]`). Firing
the clear action on the initial '' → page transition would always wipe
dynamic-route errors before the redbox could open. Treat the first
non-empty page as the baseline and only dispatch on subsequent changes.

Co-authored-by: Cursor <cursoragent@cursor.com>
The SSR `createRuntimeBodyError` lists the Suspense placeholder first
(the most general fix) followed by `generateStaticParams`. The
in-navigation variant had them flipped, so the top-of-list suggestion
was the narrower one (only applies to dynamic-param routes). Reorder
the in-nav factory to match SSR, and refresh the build-mode CLI
snapshots and the runtime-body in-nav error code (E1250 → E1251).

Co-authored-by: Cursor <cursoragent@cursor.com>
The earlier wording sweep on the level-* tests preserved the pre-existing
2-space-shy indent on the `code` and `description` lines, so Jest's diff
reported a whitespace-only mismatch even though the values agreed. Match
them to the sibling JSON keys (13 spaces).

Co-authored-by: Cursor <cursoragent@cursor.com>
The previous patch overshot to 13 spaces in tests where the snapshot
braces sit two columns shallower (so sibling keys are at 11). Auto-align
each `code`/`description` line to the indent of the next sibling key.

Co-authored-by: Cursor <cursoragent@cursor.com>
`trackDynamicHoleInNavigation` is also reached during the build-time
prerender pass, so the CLI build error now reads "during the initial
render or a navigation" with the matching consequence clause. Update
the build-mode snapshots in `instant-validation-build` and the four
`instant-validation-level-*` tests to match.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ording

The earlier wording sweep also touched the 4 \`without-root-suspense\`
E1220 snapshots, which come from the SSR factory (initial-render path)
and should keep "during the initial render." Restore the SSR wording
on those four.

Co-authored-by: Cursor <cursoragent@cursor.com>
`Route "<path>":` in the error message is the route template
(e.g. `/foo/[slug]`), while `state.page` is the resolved URL
(e.g. `/foo/123`). Equality matching dropped SSR-streamed errors
on the destination page during navigation for any dynamic route.

Convert the template to a regex so the clear-on-nav reducer keeps
errors whose template matches the page the user just landed on.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 16, 2026

Tests Passed

Commit: 96f7844

Base automatically changed from aurorascharff/instant-nav-error-clear to canary May 18, 2026 15:50
…/revamp-fix-cards

# Conflicts:
#	packages/next/src/next-devtools/dev-overlay/container/errors.tsx
#	test/e2e/app-dir/instant-validation-build/instant-validation-build.test.ts
#	test/e2e/app-dir/instant-validation-level-error/instant-validation-level-error.test.ts
#	test/e2e/app-dir/instant-validation-level-manual-error/instant-validation-level-manual-error.test.ts
#	test/e2e/app-dir/instant-validation-level-manual-warning/instant-validation-level-manual-warning.test.ts
#	test/e2e/app-dir/instant-validation-level-warning/instant-validation-level-warning.test.ts
#	test/e2e/app-dir/instant-validation/instant-validation-parallel-slots.test.ts
#	test/e2e/app-dir/instant-validation/instant-validation.test.ts
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 18, 2026

Stats from current PR

✅ No significant changes detected

📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 811ms 810ms █▅▄▅▂
Cold (Ready in log) 789ms 788ms ▅▁▄▃▄
Cold (First Request) 1.223s 1.222s ▆▁▃▃▃
Warm (Listen) 810ms 811ms ▆▆▁▃▁
Warm (Ready in log) 789ms 788ms ▄▁▅▃▄
Warm (First Request) 609ms 610ms ▄▁▅▃▅
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 813ms 812ms ▆▃▆▆▆
Cold (Ready in log) 803ms 803ms ▃▃▅▃▃
Cold (First Request) 3.304s 3.306s ▂▁▃▁▂
Warm (Listen) 812ms 813ms █▁█▁█
Warm (Ready in log) 803ms 803ms ▃▃▆▂▃
Warm (First Request) 3.348s 3.299s ▃▁▃▂▄

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 4.742s 4.757s ▃▆▃▂▂
Cached Build 4.791s 4.810s ▄▂▃▃▃
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 24.527s 24.618s █▃▃▁▂
Cached Build 24.356s 24.571s ▂▂▄▃▄
node_modules Size 506 MB 506 MB ▁████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
02e5nsdh4mezp.js gzip 65.6 kB N/A -
04hm05ar7kldw.js gzip 5.73 kB N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0dvitrl5zg37g.js gzip 8.82 kB N/A -
0nbdg3pxro0q0.js gzip 161 B N/A -
0sf7ysou-72zd.js gzip 8.71 kB N/A -
0yrvsimft_l1i.js gzip 154 B N/A -
157abun3hwc_s.js gzip 10.3 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1jj68jv9537mc.js gzip 13.8 kB N/A -
1jpaub6y8xlfr.js gzip 2.3 kB N/A -
1mm72hljhgavt.js gzip 151 B N/A -
1ot0mvscrc_uf.js gzip 233 B N/A -
1rp2lwzqj8pyx.js gzip 154 B N/A -
1x-b4s872dj7x.js gzip 168 B N/A -
2_m3xv2uq3sjc.js gzip 1.46 kB N/A -
20jgkju22ogb8.js gzip 50.4 kB N/A -
24y34mwgrkqp4.js gzip 8.78 kB N/A -
2c-fd4y1zozz8.js gzip 8.79 kB N/A -
2d7416h_xd36x.js gzip 8.71 kB N/A -
2fsqrh_89dftj.js gzip 156 B N/A -
2g21ny1t2kw37.js gzip 7.61 kB N/A -
2h3crdoebvmqw.js gzip 155 B N/A -
2lyuhit6rn8fy.js gzip 9.44 kB N/A -
2q0gr8wfr3jwl.js gzip 8.77 kB N/A -
2t9e75oz6r0zp.js gzip 8.76 kB N/A -
2uku_olcn15b7.js gzip 8.79 kB N/A -
30r8mm-46bdqy.js gzip 220 B 220 B
32d78u_3xv8h-.js gzip 155 B N/A -
34408zgzxca4u.js gzip 155 B N/A -
3861-8mlbk29e.js gzip 160 B N/A -
3c1jdxkzlb8oq.js gzip 12.9 kB N/A -
3inab2jybr4k9.js gzip 450 B N/A -
3jkm5tdjvaf_q.js gzip 13.1 kB N/A -
3mt67agm5wp40.js gzip 10.6 kB N/A -
3qxbo9whz0_zq.js gzip 156 B N/A -
3saabek4kohwi.js gzip 10 kB N/A -
3x8edj7m4h48q.js gzip 155 B N/A -
4189xmby9yu1p.js gzip 13.6 kB N/A -
420cqkrongdbm.js gzip 70.9 kB N/A -
43a4huon821dy.js gzip 157 B N/A -
turbopack-0_..0npf.js gzip 4.2 kB N/A -
turbopack-1b..pie_.js gzip 4.2 kB N/A -
turbopack-1b..c3c8.js gzip 4.2 kB N/A -
turbopack-1x..3cv6.js gzip 4.2 kB N/A -
turbopack-24..z7x_.js gzip 4.19 kB N/A -
turbopack-2a..k8h8.js gzip 4.2 kB N/A -
turbopack-2n..83gl.js gzip 4.2 kB N/A -
turbopack-2q..1mee.js gzip 4.18 kB N/A -
turbopack-3-..ci53.js gzip 4.2 kB N/A -
turbopack-31..r3d-.js gzip 4.2 kB N/A -
turbopack-3f..35-d.js gzip 4.2 kB N/A -
turbopack-3j..pc9k.js gzip 4.2 kB N/A -
turbopack-3n..t_36.js gzip 4.2 kB N/A -
turbopack-3u..kax4.js gzip 4.21 kB N/A -
0_i7nqgx23st7.js gzip N/A 10 kB -
06puhytyxk31p.js gzip N/A 8.82 kB -
07j87s-m8pzj3.js gzip N/A 154 B -
0dblev-2x5u0j.js gzip N/A 157 B -
0j42f9zonj0wd.js gzip N/A 13 kB -
0m34gln_kt4fg.js gzip N/A 5.73 kB -
0t14int2pt6cf.js gzip N/A 70.9 kB -
0z4wbvbaiieoq.js gzip N/A 169 B -
106e_ossypdxc.js gzip N/A 50.3 kB -
1g3q1ww01thnl.js gzip N/A 2.3 kB -
1h2gqq36dakpw.js gzip N/A 156 B -
1hraqxuiymq6v.js gzip N/A 8.79 kB -
1l9un1sl77287.js gzip N/A 1.46 kB -
1t_1m0334xsea.js gzip N/A 163 B -
21-eavqb1k_36.js gzip N/A 13.9 kB -
2147zgtf14z-q.js gzip N/A 234 B -
22jy5dxns9wky.js gzip N/A 155 B -
23ajzjz3tak_s.js gzip N/A 158 B -
23bz3xsg-5-1s.js gzip N/A 8.71 kB -
27441mytv7pbm.js gzip N/A 9.43 kB -
2cjkwjgm1zcfs.js gzip N/A 8.71 kB -
2ibu0xgakbq9m.js gzip N/A 157 B -
2qzks5cplfa0e.js gzip N/A 157 B -
2scd8zaoyb8md.js gzip N/A 8.79 kB -
2st_qs6p_9us0.js gzip N/A 13.1 kB -
2zo2exm1d8qj1.js gzip N/A 13.6 kB -
33164ga-q1i-7.js gzip N/A 65.6 kB -
33ijys1njtgsq.js gzip N/A 156 B -
3f710q6kll2xn.js gzip N/A 7.61 kB -
3hn75zuxly9az.js gzip N/A 10.3 kB -
3hqh7m128tvsn.js gzip N/A 8.77 kB -
3hqti_t-zy1x4.js gzip N/A 449 B -
3mnawenie1flm.js gzip N/A 8.76 kB -
3ubsozlu6zs38.js gzip N/A 10.6 kB -
3ved-18z039fn.js gzip N/A 152 B -
40i9u0wb-12mz.js gzip N/A 157 B -
43iwfqjnx1cy_.js gzip N/A 8.78 kB -
43iyj8i94v87z.js gzip N/A 160 B -
turbopack-09..u-kn.js gzip N/A 4.2 kB -
turbopack-0m..ztwx.js gzip N/A 4.2 kB -
turbopack-0n..0-cv.js gzip N/A 4.2 kB -
turbopack-1q..-f4i.js gzip N/A 4.2 kB -
turbopack-2_..p-gd.js gzip N/A 4.2 kB -
turbopack-25..-8y5.js gzip N/A 4.2 kB -
turbopack-2y..phe3.js gzip N/A 4.2 kB -
turbopack-3b..bj4d.js gzip N/A 4.2 kB -
turbopack-3d..v1mf.js gzip N/A 4.18 kB -
turbopack-3h..47xj.js gzip N/A 4.2 kB -
turbopack-3n..9x41.js gzip N/A 4.2 kB -
turbopack-3n..3ztr.js gzip N/A 4.2 kB -
turbopack-3t..rw7p.js gzip N/A 4.2 kB -
turbopack-41..kxye.js gzip N/A 4.21 kB -
Total 469 kB 469 kB ⚠️ +76 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 720 B 717 B
Total 720 B 717 B ✅ -3 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 435 B 435 B
Total 435 B 435 B

📦 Webpack

Client

Main Bundles
Canary PR Change
2258-HASH.js gzip 61.4 kB N/A -
2266-HASH.js gzip 4.69 kB N/A -
3317.HASH.js gzip 169 B N/A -
4866-HASH.js gzip 5.64 kB N/A -
9e302639-HASH.js gzip 62.8 kB N/A -
framework-HASH.js gzip 59.5 kB 59.5 kB
main-app-HASH.js gzip 256 B 254 B
main-HASH.js gzip 39.9 kB 39.9 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
175fd0fd-HASH.js gzip N/A 62.8 kB -
2596-HASH.js gzip N/A 5.63 kB -
34-HASH.js gzip N/A 61.3 kB -
5691.HASH.js gzip N/A 169 B -
9156-HASH.js gzip N/A 4.68 kB -
Total 236 kB 236 kB ✅ -100 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 181 B 182 B
css-HASH.js gzip 334 B 332 B
dynamic-HASH.js gzip 1.79 kB 1.81 kB
edge-ssr-HASH.js gzip 255 B 255 B
head-HASH.js gzip 351 B 348 B
hooks-HASH.js gzip 385 B 384 B
image-HASH.js gzip 580 B 580 B
index-HASH.js gzip 257 B 259 B
link-HASH.js gzip 2.51 kB 2.52 kB
routerDirect..HASH.js gzip 318 B 319 B
script-HASH.js gzip 387 B 386 B
withRouter-HASH.js gzip 316 B 316 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.97 kB 7.99 kB ⚠️ +19 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 126 kB 126 kB
page.js gzip 276 kB 270 kB 🟢 5.32 kB (-2%)
Total 402 kB 396 kB ✅ -5.54 kB
Middleware
Canary PR Change
middleware-b..fest.js gzip 621 B 614 B 🟢 7 B (-1%)
middleware-r..fest.js gzip 155 B 155 B
middleware.js gzip 44.4 kB 44.8 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 46 kB 46.4 kB ⚠️ +419 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 719 B 717 B
Total 719 B 717 B ✅ -2 B
Build Cache
Canary PR Change
0.pack gzip 4.49 MB 4.49 MB 🟢 4.96 kB (0%)
index.pack gzip 116 kB 114 kB
index.pack.old gzip 114 kB 116 kB 🔴 +1.3 kB (+1%)
Total 4.72 MB 4.72 MB ✅ -4.79 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 351 kB 350 kB
app-page-exp..prod.js gzip 195 kB 195 kB
app-page-tur...dev.js gzip 350 kB 350 kB
app-page-tur..prod.js gzip 194 kB 194 kB
app-page-tur...dev.js gzip 347 kB 347 kB
app-page-tur..prod.js gzip 192 kB 192 kB
app-page.run...dev.js gzip 347 kB 347 kB
app-page.run..prod.js gzip 193 kB 193 kB
app-route-ex...dev.js gzip 77.5 kB 77.5 kB
app-route-ex..prod.js gzip 52.9 kB 52.9 kB
app-route-tu...dev.js gzip 77.6 kB 77.6 kB
app-route-tu..prod.js gzip 52.9 kB 52.9 kB
app-route-tu...dev.js gzip 77.2 kB 77.2 kB
app-route-tu..prod.js gzip 52.7 kB 52.7 kB
app-route.ru...dev.js gzip 77.1 kB 77.1 kB
app-route.ru..prod.js gzip 52.7 kB 52.7 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 44.3 kB 44.3 kB
pages-api-tu..prod.js gzip 33.8 kB 33.8 kB
pages-api.ru...dev.js gzip 44.3 kB 44.3 kB
pages-api.ru..prod.js gzip 33.7 kB 33.7 kB
pages-turbo....dev.js gzip 53.7 kB 53.7 kB
pages-turbo...prod.js gzip 39.4 kB 39.4 kB
pages.runtim...dev.js gzip 53.6 kB 53.6 kB
pages.runtim..prod.js gzip 39.4 kB 39.4 kB
server.runti..prod.js gzip 63.1 kB 63.1 kB
use-cache-pr...dev.js gzip 69.7 kB 69.7 kB
use-cache-pr...dev.js gzip 69.7 kB 69.7 kB
use-cache-pr...dev.js gzip 68 kB 68 kB
use-cache-pr...dev.js gzip 68 kB 68 kB
Total 3.37 MB 3.37 MB ✅ -42 B
📝 Changed Files (13 files)

Files with changes:

  • app-page-exp..ntime.dev.js
  • app-page-exp..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page.runtime.dev.js
  • app-page.runtime.prod.js
  • server.runtime.prod.js
  • use-cache-pr..ntime.dev.js
  • use-cache-pr..ntime.dev.js
  • use-cache-pr..ntime.dev.js
  • use-cache-pr..ntime.dev.js
View diffs
app-page-exp..ntime.dev.js

Diff too large to display

app-page-exp..time.prod.js
failed to diff
app-page-tur..ntime.dev.js

Diff too large to display

app-page-tur..time.prod.js

Diff too large to display

app-page-tur..ntime.dev.js

Diff too large to display

app-page-tur..time.prod.js

Diff too large to display

app-page.runtime.dev.js

Diff too large to display

app-page.runtime.prod.js

Diff too large to display

server.runtime.prod.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/96f7844718f1623575e21189debd9defc97f40b2/next

Commit: 96f7844

@aurorascharff aurorascharff marked this pull request as ready for review May 18, 2026 21:26
Copilot AI review requested due to automatic review settings May 18, 2026 21:26
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Polishes the Instant Validation developer experience by updating overlay fix cards and improving the wording/consistency of Instant/CLI validation messages (especially around prerendering and sync-IO), along with updating snapshots/error codes to match.

Changes:

  • Refined blocking-route + sync-IO error copy (e.g. “during prerendering”, “unstable value …”) and aligned fix bullets with updated guidance.
  • Updated Instant overlay fix card data + styling (card hover treatment, snippet border behavior), added a new “loading” icon, and stabilized dialog scrollbar layout.
  • Refreshed E2E / production test snapshots and updated errors.json with the new message templates / codes.

Reviewed changes

Copilot reviewed 21 out of 22 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
test/production/app-dir/build-output-prerender/build-output-prerender.test.ts Updates build/prerender CLI snapshot expectations for revised sync-IO wording.
test/e2e/app-dir/instant-validation/instant-validation.test.ts Updates Instant validation error code + message snapshots to match new copy.
test/e2e/app-dir/instant-validation/instant-validation-parallel-slots.test.ts Refreshes parallel-slots Instant validation snapshots for updated messages/codes.
test/e2e/app-dir/instant-validation-static-shells/instant-validation-static-shells.test.ts Adjusts “initial render” → “prerendering” wording assertions and codes.
test/e2e/app-dir/instant-validation-level-warning/instant-validation-level-warning.test.ts Updates warning-level Instant validation snapshots for new messages/codes.
test/e2e/app-dir/instant-validation-level-manual-warning/instant-validation-level-manual-warning.test.ts Updates manual-warning snapshots (page load phrasing, params guidance, codes).
test/e2e/app-dir/instant-validation-level-manual-error/instant-validation-level-manual-error.test.ts Updates manual-error snapshots for prerendering phrasing + codes.
test/e2e/app-dir/instant-validation-level-error/instant-validation-level-error.test.ts Updates error-level snapshots for prerendering phrasing + codes.
test/e2e/app-dir/instant-validation-causes/instant-validation-causes.test.ts Updates cause snapshots to new codes.
test/e2e/app-dir/instant-validation-build/instant-validation-build.test.ts Updates build Instant validation snapshot wording.
test/e2e/app-dir/cache-components-errors/cache-components-errors.test.ts Refreshes cache-components error snapshots for new copy/codes (runtime/uncached/sync-IO).
test/development/app-dir/cache-components-dev-fallback-validation/cache-components-dev-fallback-validation.test.ts Updates dev fallback validation snapshots for new messages/codes.
test/development/app-dir/cache-components-dev-errors/cache-components-dev-errors.test.ts Updates dev overlay error snapshots for new sync-IO/uncached wording + codes.
test/development/app-dir/cache-components-dev-cache-scope/cache-components-dev-cache-scope.test.ts Updates redbox description assertions for “prerendering” wording.
packages/next/src/server/app-render/sync-io-messages.ts Updates sync-IO error messages (server + client) and telemetry/timing guidance bullet.
packages/next/src/server/app-render/blocking-route-messages.ts Updates blocking-route error messages to “during prerendering” and revised fix bullets.
packages/next/src/next-devtools/dev-overlay/icons/fix-card-icons.tsx Adds a new loading/spinner icon for fix cards.
packages/next/src/next-devtools/dev-overlay/container/errors.tsx Updates overlay summaries and sync-IO header copy to match new wording.
packages/next/src/next-devtools/dev-overlay/components/instant/instant-guidance.tsx Improves fix card hover/snippet styling and adds link-icon hover behavior.
packages/next/src/next-devtools/dev-overlay/components/instant/instant-guidance-data.ts Renames cards/groups, removes viewport “wrap body” guidance, updates snippets to simpler client examples.
packages/next/src/next-devtools/dev-overlay/components/errors/dialog/dialog.tsx Adds scrollbar-gutter: stable to reduce scrollbar flicker on error swaps.
packages/next/errors.json Adds new error templates/codes for updated Instant/sync-IO messages and viewport guidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/next/src/server/app-render/sync-io-messages.ts Outdated
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.

2 participants