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
Run a real production Next.js 16 App Route as an app-only Perry dylib, with runtime and stdlib supplied once by separate shared provider images, and pass the same black-box verifier as Node without compatibility fallbacks.
This is the correctness gate required before the Perry-vs-Node 1/10/100 deployment RSS, CPU, and startup comparison is meaningful. The current benchmark is promising but lower-bound-only because it calls userland directly and fabricates the final response.
Fixed reproduction — do not design another app
#8034 contains a complete copy/paste fixture generator pinned to Next.js 16.3.0 / React 19.2.4, plus a 21-request verifier. The app already exercises:
production next build --webpack output;
the generated routeModule.handle / AppRouteRouteModule.handle path;
a re-exported imported GET/POST handler;
method, pathname, query, headers, and POST body;
Next's AsyncLocalStorage-backed headers() before and after async continuations;
a request-time dynamic import;
a two-chunk streamed NextResponse;
status, custom response header, and Set-Cookie; and
20 distinct concurrent request contexts.
Every child issue uses that app. Smaller compiler/runtime fixtures are welcome for localization, but they cannot replace #8034 as acceptance evidence.
These reduce the work but do not replace the composed production test. If current main already fixes a child behavior, close that child with a #8034 regression proving it rather than with a synthetic-only test.
Ten consecutive cold Perry process starts pass; each process passes two verifier runs.
A 100-iteration run of the 20-way concurrent request batch has zero context leaks, hangs, truncations, or wrong values.
Normal GC and forced/verified GC runs pass.
Startup/request stderr contains no skipped-forwarding, unsettled-await, unimplemented, or compatibility-fallback diagnostic.
A source/test audit finds no direct userland GET invocation, ignored Response, hard-coded output, lazy-module eager-init workaround, or legacy fallback in the Perry path.
Explicitly out of scope
Turbopack; this first gate pins webpack.
The final performance verdict and thresholds.
Eager relocation optimization for 100 unique app images.
Once this tracker is green, run the separate performance matrix for 1, 10, and 100 copies of the same real Next deployment, followed by 100 distinct builds, against one Node process per app and a defensible shared-Node topology.
Baseline
The lower-bound observation was recorded with Perry 0.5.1503 at 564c56308d221a51b50308d9165578fbb176e877. Reproduce #8034 on current main before implementing and record that SHA in the test output; do not assume the old baseline identifies the first current failure.
Goal
Run a real production Next.js 16 App Route as an app-only Perry dylib, with runtime and stdlib supplied once by separate shared provider images, and pass the same black-box verifier as Node without compatibility fallbacks.
This is the correctness gate required before the Perry-vs-Node 1/10/100 deployment RSS, CPU, and startup comparison is meaningful. The current benchmark is promising but lower-bound-only because it calls userland directly and fabricates the final response.
Fixed reproduction — do not design another app
#8034 contains a complete copy/paste fixture generator pinned to Next.js
16.3.0/ React19.2.4, plus a 21-request verifier. The app already exercises:next build --webpackoutput;routeModule.handle/AppRouteRouteModule.handlepath;GET/POSThandler;headers()before and after async continuations;NextResponse;Set-Cookie; andEvery child issue uses that app. Smaller compiler/runtime fixtures are welcome for localization, but they cannot replace #8034 as acceptance evidence.
Work items
NextRequestandnextUrl.searchParamsacross the production import/re-export boundaryNextResponsestatus, headers, cookies, and streamExisting groundwork to retain
.next/server/**discovery and path-based lazy module initializationURLSearchParamssubclassesResponse.bodygroundworknode:async_hooksparity inventoryThese reduce the work but do not replace the composed production test. If current
mainalready fixes a child behavior, close that child with a #8034 regression proving it rather than with a synthetic-only test.Suggested execution order
Items 2–6 may proceed in parallel when their focused fixtures isolate them, but #8034 is the shared final oracle.
Definition of done
handlepipeline.GETinvocation, ignoredResponse, hard-coded output, lazy-module eager-init workaround, or legacy fallback in the Perry path.Explicitly out of scope
async_hooksprovider failure in [parity] node:async_hooks — 113 failing node-suite tests (2026-07-22 baseline) #6764.Once this tracker is green, run the separate performance matrix for 1, 10, and 100 copies of the same real Next deployment, followed by 100 distinct builds, against one Node process per app and a defensible shared-Node topology.
Baseline
The lower-bound observation was recorded with Perry
0.5.1503at564c56308d221a51b50308d9165578fbb176e877. Reproduce #8034 on currentmainbefore implementing and record that SHA in the test output; do not assume the old baseline identifies the first current failure.