Skip to content

Add PPR evals and fix env loading for agent-eval 0.9.5#92063

Open
gaojude wants to merge 1 commit intocanaryfrom
jude/ppr-evals-agent-eval-upgrade
Open

Add PPR evals and fix env loading for agent-eval 0.9.5#92063
gaojude wants to merge 1 commit intocanaryfrom
jude/ppr-evals-agent-eval-upgrade

Conversation

@gaojude
Copy link
Copy Markdown
Contributor

@gaojude gaojude commented Mar 29, 2026

Upgrades @vercel/agent-eval from 0.8.0 to 0.9.5. The new version loads .env / .env.local from its own cwd (evals/) rather than inheriting from the parent process, so the old process.loadEnvFile() call no longer works. Instead, run-evals.js now symlinks the root env files into evals/ before spawning the harness. evals/.env is added to .gitignore to keep secrets out of the tree.

Two new evals exercise PPR knowledge: agent-041-optimize-ppr-shell checks that the agent decomposes a monolithic loading.tsx into granular Suspense boundaries, and agent-042-enable-ppr verifies the agent knows PPR is enabled via cacheComponents: true (not the old experimental.ppr flag).

@nextjs-bot nextjs-bot added the created-by: Next.js team PRs by the Next.js team. label Mar 29, 2026
@gaojude gaojude requested a review from aurorascharff March 29, 2026 01:08
@nextjs-bot
Copy link
Copy Markdown
Collaborator

Stats from current PR

🔴 3 regressions

Metric Canary PR Change Trend
Cold (Listen) 1.066s 1.215s 🔴 +149ms (+14%) ▁▁▁▁▁
nextDevColdR..urationTurbo 1.035s 1.179s 🔴 +144ms (+14%) ▁▁▁▁▁
Cold (First Request) 2.244s 2.370s 🔴 +126ms (+6%) ▂▂▂▂▂
📊 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) 1.066s 1.215s 🔴 +149ms (+14%) ▁▁▁▁▁
Cold (Ready in log) 1.035s 1.179s 🔴 +144ms (+14%) ▁▁▁▁▁
Cold (First Request) 2.244s 2.370s 🔴 +126ms (+6%) ▂▂▂▂▂
Warm (Listen) 1.126s 1.114s ▁▁▁▁▁
Warm (Ready in log) 1.118s 1.108s ▁▁▁▁▁
Warm (First Request) 951ms 867ms ▁▁▁▁▁
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 559ms 558ms ▁▁▁▁▁
Cold (Ready in log) 515ms 521ms ▁▁▁▁▁
Cold (First Request) 2.320s 2.332s ▃▃▁▂▄
Warm (Listen) 558ms 558ms ▁▁▁▁▁
Warm (Ready in log) 521ms 521ms ▁▁▁▁▁
Warm (First Request) 2.353s 2.359s ▃▃▁▂▃

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 9.695s 9.573s ▁▁▁▁▁
Cached Build 9.673s 9.548s ▁▁▁▁▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 17.493s 17.616s ▁▂▁▂▁
Cached Build 17.586s 17.645s ▁▁▁▂▂
node_modules Size 485 MB 485 MB ▆▆▆██
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
02fkg8wfh0iju.js gzip 9.19 kB N/A -
050zwt5xh_0tx.js gzip 10.4 kB N/A -
06rvbj82bhyo0.js gzip 13 kB N/A -
087fzjd-gvlzv.js gzip 450 B N/A -
08kd-8q3-9e-y.js gzip 161 B N/A -
0b0tf-cqc0t_f.js gzip 65.7 kB N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0jilgfx1zucfp.js gzip 160 B N/A -
0jpxfjronl6qa.js gzip 156 B N/A -
0n2w1m-n02s0g.js gzip 155 B N/A -
0ppxcl_z43mad.js gzip 8.52 kB N/A -
19oha6-znmkcv.js gzip 8.55 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1hnuff-wo-6_b.js gzip 153 B N/A -
1k-qd_1qbbsix.js gzip 156 B N/A -
1t1io8vz1iho3.js gzip 156 B N/A -
1yl5jy653a49k.js gzip 13.7 kB N/A -
2_ocvpbol4ay2.js gzip 168 B N/A -
21-onqp0xrnd1.js gzip 157 B N/A -
2524qmz0et54b.js gzip 7.61 kB N/A -
26elcgxnn9zjd.js gzip 8.52 kB N/A -
2900hudr6gvm0.js gzip 2.28 kB N/A -
2c0c3jugbgl8f.js gzip 155 B N/A -
2cb1d0vrcv8ph.js gzip 70.8 kB N/A -
2ihlsvbo2c9e8.js gzip 215 B 215 B
2lv2js3kmdeho.js gzip 8.48 kB N/A -
2r1lapepmxlsw.js gzip 153 B N/A -
2rehygrd36hqv.js gzip 8.58 kB N/A -
2srwswih0m9_h.js gzip 13.3 kB N/A -
3-p9p9mheqhzx.js gzip 8.55 kB N/A -
31030bryqpolg.js gzip 8.53 kB N/A -
31dx5nmrzzuy7.js gzip 225 B N/A -
3ha7h58bte-tq.js gzip 49 kB N/A -
3hv075wnmnp-6.js gzip 156 B N/A -
3iu80eefg23ae.js gzip 9.77 kB N/A -
3k-48b78ys_vy.js gzip 10.1 kB N/A -
3m7-5rfj0avoz.js gzip 12.9 kB N/A -
3uqce_6sa526g.js gzip 8.47 kB N/A -
3ygl996o7b1vm.js gzip 154 B N/A -
3yurjqk-sjs3y.js gzip 1.46 kB N/A -
421vzwdt9j1b_.js gzip 5.62 kB N/A -
turbopack-09..dgrl.js gzip 4.16 kB N/A -
turbopack-0k..qc85.js gzip 4.16 kB N/A -
turbopack-0x..dcuq.js gzip 4.16 kB N/A -
turbopack-10..se-u.js gzip 4.16 kB N/A -
turbopack-10.._bbs.js gzip 4.16 kB N/A -
turbopack-1v..l_xw.js gzip 4.16 kB N/A -
turbopack-1v..ziot.js gzip 4.16 kB N/A -
turbopack-1v..p1k4.js gzip 4.14 kB N/A -
turbopack-23..uhk5.js gzip 4.16 kB N/A -
turbopack-27..an8t.js gzip 4.17 kB N/A -
turbopack-2c..cz4z.js gzip 4.16 kB N/A -
turbopack-36..zit7.js gzip 4.16 kB N/A -
turbopack-3y..ladh.js gzip 4.16 kB N/A -
turbopack-42..or-4.js gzip 4.16 kB N/A -
02hm69y2pdhqz.js gzip N/A 157 B -
03dgzoo-qf3sm.js gzip N/A 9.19 kB -
05qaokgw7ls07.js gzip N/A 162 B -
05tx5f25dlivn.js gzip N/A 8.53 kB -
0c7ez6p2qc57f.js gzip N/A 5.62 kB -
0n95_eeqgrhcd.js gzip N/A 13.7 kB -
0qnwuk92m8i7o.js gzip N/A 10.4 kB -
0r4wrn6n0ue2m.js gzip N/A 8.55 kB -
0rj3ihy82286x.js gzip N/A 70.8 kB -
0rp0fodtbt_6m.js gzip N/A 8.52 kB -
0sfck-km4dl1k.js gzip N/A 8.47 kB -
0x0xuhmxzwkp8.js gzip N/A 8.47 kB -
1-wdvgxnzicj7.js gzip N/A 1.46 kB -
11u6nxujb2eg4.js gzip N/A 450 B -
1gxpcuwuz8sla.js gzip N/A 155 B -
1h2m6kg4-m7d3.js gzip N/A 7.6 kB -
1y_gwpxs0gxrd.js gzip N/A 156 B -
25gmftimanniw.js gzip N/A 155 B -
27suvfgm54aoe.js gzip N/A 155 B -
2k9ax08cjl2id.js gzip N/A 12.9 kB -
2lms6k76q5-6m.js gzip N/A 13.3 kB -
2q3hz-jtbjs52.js gzip N/A 9.77 kB -
2qx4twi9i3xus.js gzip N/A 2.28 kB -
2srnqic6tvxxd.js gzip N/A 8.52 kB -
2tx5ug_nu2fr3.js gzip N/A 157 B -
2vlnbzuebndyi.js gzip N/A 155 B -
2x1lf38j5osyq.js gzip N/A 65.7 kB -
30l7m4nayp73a.js gzip N/A 8.55 kB -
34zoxk4e1s9ew.js gzip N/A 153 B -
37i10x8bxu1gx.js gzip N/A 156 B -
38rr7d3kfutni.js gzip N/A 13 kB -
3axctu0hicx1a.js gzip N/A 49 kB -
3h_ecpiaatwgc.js gzip N/A 10.1 kB -
3ity0aahajapd.js gzip N/A 225 B -
3q2rztpa5g415.js gzip N/A 159 B -
3w1sv0569vk1o.js gzip N/A 153 B -
3xuvmu4xf35h_.js gzip N/A 169 B -
43mlw9dy_8f02.js gzip N/A 8.58 kB -
turbopack-0s..4k3k.js gzip N/A 4.16 kB -
turbopack-1_..etfm.js gzip N/A 4.16 kB -
turbopack-14..27ax.js gzip N/A 4.16 kB -
turbopack-16..y659.js gzip N/A 4.16 kB -
turbopack-1d..b6b9.js gzip N/A 4.16 kB -
turbopack-1p..3f-_.js gzip N/A 4.16 kB -
turbopack-2_..lhs9.js gzip N/A 4.16 kB -
turbopack-2m..6cok.js gzip N/A 4.17 kB -
turbopack-2o..phbv.js gzip N/A 4.16 kB -
turbopack-30..z4a0.js gzip N/A 4.16 kB -
turbopack-32..ry9p.js gzip N/A 4.16 kB -
turbopack-3b..ojiu.js gzip N/A 4.14 kB -
turbopack-3o..uk35.js gzip N/A 4.16 kB -
turbopack-3v..5647.js gzip N/A 4.16 kB -
Total 464 kB 464 kB ⚠️ +9 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 717 B 715 B
Total 717 B 715 B ✅ -2 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 432 B 434 B
Total 432 B 434 B ⚠️ +2 B

📦 Webpack

Client

Main Bundles
Canary PR Change
5528-HASH.js gzip 5.54 kB N/A -
6280-HASH.js gzip 60.7 kB N/A -
6335.HASH.js gzip 169 B N/A -
912-HASH.js gzip 4.59 kB N/A -
e8aec2e4-HASH.js gzip 62.8 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 256 B 253 B 🟢 3 B (-1%)
main-HASH.js gzip 39.3 kB 39.2 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
262-HASH.js gzip N/A 4.59 kB -
2889.HASH.js gzip N/A 169 B -
5602-HASH.js gzip N/A 5.55 kB -
6948ada0-HASH.js gzip N/A 62.8 kB -
9544-HASH.js gzip N/A 61.4 kB -
Total 235 kB 235 kB ⚠️ +662 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 194 B 194 B
_error-HASH.js gzip 183 B 180 B 🟢 3 B (-2%)
css-HASH.js gzip 331 B 330 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB
edge-ssr-HASH.js gzip 256 B 256 B
head-HASH.js gzip 351 B 352 B
hooks-HASH.js gzip 384 B 383 B
image-HASH.js gzip 580 B 581 B
index-HASH.js gzip 260 B 260 B
link-HASH.js gzip 2.51 kB 2.51 kB
routerDirect..HASH.js gzip 320 B 319 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.98 kB 7.98 kB ✅ -1 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 125 kB 125 kB
page.js gzip 270 kB 270 kB
Total 395 kB 396 kB ⚠️ +200 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 619 B 615 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 43.7 kB 43.9 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 45.3 kB 45.5 kB ⚠️ +121 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 715 B 718 B
Total 715 B 718 B ⚠️ +3 B
Build Cache
Canary PR Change
0.pack gzip 4.35 MB 4.34 MB 🟢 5.73 kB (0%)
index.pack gzip 110 kB 110 kB
index.pack.old gzip 111 kB 110 kB
Total 4.57 MB 4.56 MB ✅ -6.5 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 335 kB 335 kB
app-page-exp..prod.js gzip 185 kB 185 kB
app-page-tur...dev.js gzip 335 kB 335 kB
app-page-tur..prod.js gzip 185 kB 185 kB
app-page-tur...dev.js gzip 331 kB 331 kB
app-page-tur..prod.js gzip 183 kB 183 kB
app-page.run...dev.js gzip 332 kB 332 kB
app-page.run..prod.js gzip 184 kB 184 kB
app-route-ex...dev.js gzip 76.2 kB 76.2 kB
app-route-ex..prod.js gzip 51.9 kB 51.9 kB
app-route-tu...dev.js gzip 76.3 kB 76.3 kB
app-route-tu..prod.js gzip 51.9 kB 51.9 kB
app-route-tu...dev.js gzip 75.9 kB 75.9 kB
app-route-tu..prod.js gzip 51.6 kB 51.6 kB
app-route.ru...dev.js gzip 75.8 kB 75.8 kB
app-route.ru..prod.js gzip 51.6 kB 51.6 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 43.5 kB 43.5 kB
pages-api-tu..prod.js gzip 33.1 kB 33.1 kB
pages-api.ru...dev.js gzip 43.4 kB 43.4 kB
pages-api.ru..prod.js gzip 33.1 kB 33.1 kB
pages-turbo....dev.js gzip 52.9 kB 52.9 kB
pages-turbo...prod.js gzip 38.7 kB 38.7 kB
pages.runtim...dev.js gzip 52.8 kB 52.8 kB
pages.runtim..prod.js gzip 38.7 kB 38.7 kB
server.runti..prod.js gzip 62.5 kB 62.5 kB
Total 2.98 MB 2.98 MB ✅ -1 B
📝 Changed Files (4 files)

Files with changes:

  • pages-api-tu..ntime.dev.js
  • pages-api-tu..time.prod.js
  • pages-turbo...ntime.dev.js
  • pages-turbo...time.prod.js
View diffs
pages-api-tu..ntime.dev.js

Diff too large to display

pages-api-tu..time.prod.js

Diff too large to display

pages-turbo...ntime.dev.js

Diff too large to display

pages-turbo...time.prod.js

Diff too large to display

📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/1360a1b825c87f49fb69b69dfb0f6b75edf1ad77/next

@nextjs-bot
Copy link
Copy Markdown
Collaborator

nextjs-bot commented Mar 29, 2026

Failing test suites

Commit: 9972d1b | About building and testing Next.js

pnpm test-start test/production/app-dir/server-action-period-hash/server-action-period-hash.test.ts (job)

  • app-dir - server-action-period-hash > should have same manifest between continuous two builds (DD)
  • app-dir - server-action-period-hash > should have different manifest between two builds with period hash (DD)
Expand output

● app-dir - server-action-period-hash › should have same manifest between continuous two builds

can not run export while server is running, use next.stop() first

  251 |   ) {
  252 |     if (this.childProcess) {
> 253 |       throw new Error(
      |             ^
  254 |         `can not run export while server is running, use next.stop() first`
  255 |       )
  256 |     }

  at NextStartInstance.build (lib/next-modes/next-start.ts:253:13)
  at Object.build (production/app-dir/server-action-period-hash/server-action-period-hash.test.ts:17:16)

● app-dir - server-action-period-hash › should have different manifest between two builds with period hash

can not run export while server is running, use next.stop() first

  251 |   ) {
  252 |     if (this.childProcess) {
> 253 |       throw new Error(
      |             ^
  254 |         `can not run export while server is running, use next.stop() first`
  255 |       )
  256 |     }

  at NextStartInstance.build (lib/next-modes/next-start.ts:253:13)
  at Object.build (production/app-dir/server-action-period-hash/server-action-period-hash.test.ts:27:16)

pnpm test-start-turbo test/e2e/app-dir/app-client-cache/client-cache.parallel-routes.test.ts (turbopack) (job)

  • segment cache (per-page dynamic stale time) > two dynamic pages with different stale times behave independently (DD)
  • segment cache (per-page dynamic stale time) > per-page value overrides global staleTimes.dynamic regardless of direction (DD)
Expand output

● segment cache (per-page dynamic stale time) › two dynamic pages with different stale times behave independently

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  50 |       }
  51 |
> 52 |       const result = Reflect.apply(target, thisArg, args)
     |                              ^
  53 |       return typeof result === 'function' ? wrapJestTestFn(result) : result
  54 |     },
  55 |     get(target, prop, receiver) {

  at Object.apply (lib/e2e-utils/index.ts:52:30)
  at it (e2e/app-dir/segment-cache/staleness/segment-cache-per-page-dynamic-stale-time.test.ts:133:3)
  at Object.describe (e2e/app-dir/segment-cache/staleness/segment-cache-per-page-dynamic-stale-time.test.ts:5:1)

● segment cache (per-page dynamic stale time) › per-page value overrides global staleTimes.dynamic regardless of direction

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  50 |       }
  51 |
> 52 |       const result = Reflect.apply(target, thisArg, args)
     |                              ^
  53 |       return typeof result === 'function' ? wrapJestTestFn(result) : result
  54 |     },
  55 |     get(target, prop, receiver) {

  at Object.apply (lib/e2e-utils/index.ts:52:30)
  at it (e2e/app-dir/segment-cache/staleness/segment-cache-per-page-dynamic-stale-time.test.ts:216:3)
  at Object.describe (e2e/app-dir/segment-cache/staleness/segment-cache-per-page-dynamic-stale-time.test.ts:5:1)

pnpm test-dev test/e2e/app-dir/navigation/navigation.test.ts (job)

  • app dir - navigation > navigating to dynamic params & changing the casing > should load the page correctly (DD)
Expand output

● app dir - navigation › navigating to dynamic params & changing the casing › should load the page correctly

page.waitForSelector: Timeout 5000ms exceeded.
Call log:
  - waiting for locator('[href=\'/dynamic-param-casing-change/paramA/paramB\']') to be visible

  545 |
  546 |     return this.startChain(async () => {
> 547 |       const el = await page.waitForSelector(selector, {
      |                             ^
  548 |         timeout,
  549 |         state,
  550 |       })

  at waitForSelector (lib/browsers/playwright.ts:547:29)
  at Playwright._chain (lib/browsers/playwright.ts:677:23)
  at Playwright._chain [as startChain] (lib/browsers/playwright.ts:658:17)
  at Playwright.startChain [as waitForElementByCss] (lib/browsers/playwright.ts:546:17)
  at Playwright.waitForElementByCss [as elementByCss] (lib/browsers/playwright.ts:431:17)
  at Object.elementByCss (e2e/app-dir/navigation/navigation.test.ts:919:10)
  at Proxy._chain (lib/browsers/playwright.ts:677:23)
  at Proxy._chain (lib/browsers/playwright.ts:653:17)
  at Proxy.continueChain (lib/browsers/playwright.ts:497:17)
  at Object.click (e2e/app-dir/navigation/navigation.test.ts:920:10)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

created-by: Next.js team PRs by the Next.js team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants