Skip to content

[tests] Fix abort-fetch e2e flake#2081

Merged
VaguelySerious merged 2 commits into
mainfrom
peter/diagnose-abort-fetch-flake
May 22, 2026
Merged

[tests] Fix abort-fetch e2e flake#2081
VaguelySerious merged 2 commits into
mainfrom
peter/diagnose-abort-fetch-flake

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious commented May 22, 2026

abortFetchInFlightWorkflow was the most flaky e2e test, with a sibling flake in abortVoidSleepTimeoutWorkflow. Both race a slow fetch against a 2s sleep, and the diagnostic commit in this PR confirmed the root cause: httpbin.org/delay/30 returns HTTP 502 from GH Actions runners in 56ms–1709ms intermittently — hit 4 times in a single CI run on the diagnostic commit alone.

Two failure modes, both caused by the same 502:

  • 502 in <2s → winner='fetch' (fetch wins the race) → first assertion fails
  • 502 in ~1.7s → winner='timeout' (sleep wins) but the 502 had already resolved, so fetchResult.aborted=false → later assertions fail

Changes

Commit 1 — diagnostics. fetchWithSignal now reports status, elapsedMs, and per-URL attempts. The two test assertions include the full returnValue JSON in their failure messages, so any future flake immediately shows what the upstream returned instead of just expected 'fetch' to be 'timeout'.

Commit 2 — fallback. Switch the slow-endpoint URL from a single httpbin.org/delay/30 to a primary postman-echo.com/delay/10 with httpbin.org/delay/10 as a fallback. The step only calls the fallback when the primary returns a 5xx or non-AbortError network failure — successful or aborted responses short-circuit. Both upstreams would need to be unhealthy at the same instant to flake the test.

The original concern (per-workbench /api/delay route) is sidestepped — we stay on shared external services but stop depending on any single one.

…tics

When abortFetchInFlightWorkflow flakes in CI, the assertion failure
("expected 'fetch' to be 'timeout'") gave us no signal as to why
httpbin.org/delay/30 returned early. The step now also reports
`status` and `elapsedMs`, and the test passes the full returnValue
JSON as the assertion message so the next flake reveals the response
status and timing.

Same treatment for abortVoidSleepTimeoutWorkflow which uses the same
step + URL and flakes for the same upstream reason.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 22, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment May 22, 2026 11:09am
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 22, 2026 11:09am
example-workflow Ready Ready Preview, Comment May 22, 2026 11:09am
workbench-astro-workflow Ready Ready Preview, Comment May 22, 2026 11:09am
workbench-express-workflow Ready Ready Preview, Comment May 22, 2026 11:09am
workbench-fastify-workflow Ready Ready Preview, Comment May 22, 2026 11:09am
workbench-hono-workflow Ready Ready Preview, Comment May 22, 2026 11:09am
workbench-nitro-workflow Ready Ready Preview, Comment May 22, 2026 11:09am
workbench-nuxt-workflow Ready Ready Preview, Comment May 22, 2026 11:09am
workbench-sveltekit-workflow Ready Ready Preview, Comment May 22, 2026 11:09am
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 22, 2026 11:09am
workbench-vite-workflow Ready Ready Preview, Comment May 22, 2026 11:09am
workflow-swc-playground Ready Ready Preview, Comment May 22, 2026 11:09am
workflow-tarballs Ready Ready Preview, Comment May 22, 2026 11:09am
workflow-web Ready Ready Preview, Comment May 22, 2026 11:09am
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
workflow-docs Skipped Skipped May 22, 2026 11:09am

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 22, 2026

🦋 Changeset detected

Latest commit: 017645f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1222 0 219 1441
✅ 💻 Local Development 1615 0 219 1834
✅ 📦 Local Production 1615 0 219 1834
✅ 🐘 Local Postgres 1615 0 219 1834
✅ 🪟 Windows 131 0 0 131
✅ 📋 Other 741 0 176 917
Total 6939 0 1052 7991

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 105 0 26
✅ example 105 0 26
✅ express 105 0 26
✅ fastify 105 0 26
✅ hono 105 0 26
✅ nextjs-turbopack 129 0 2
✅ nextjs-webpack 129 0 2
✅ nitro 105 0 26
✅ nuxt 105 0 26
✅ sveltekit 124 0 7
✅ vite 105 0 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 106 0 25
✅ express-stable 106 0 25
✅ fastify-stable 106 0 25
✅ hono-stable 106 0 25
✅ nextjs-turbopack-canary 112 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 131 0 0
✅ nextjs-webpack-canary 112 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 131 0 0
✅ nitro-stable 106 0 25
✅ nuxt-stable 106 0 25
✅ sveltekit-stable 125 0 6
✅ vite-stable 106 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 106 0 25
✅ express-stable 106 0 25
✅ fastify-stable 106 0 25
✅ hono-stable 106 0 25
✅ nextjs-turbopack-canary 112 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 131 0 0
✅ nextjs-webpack-canary 112 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 131 0 0
✅ nitro-stable 106 0 25
✅ nuxt-stable 106 0 25
✅ sveltekit-stable 125 0 6
✅ vite-stable 106 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 106 0 25
✅ express-stable 106 0 25
✅ fastify-stable 106 0 25
✅ hono-stable 106 0 25
✅ nextjs-turbopack-canary 112 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 131 0 0
✅ nextjs-webpack-canary 112 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 131 0 0
✅ nitro-stable 106 0 25
✅ nuxt-stable 106 0 25
✅ sveltekit-stable 125 0 6
✅ vite-stable 106 0 25
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 131 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 106 0 25
✅ e2e-local-dev-tanstack-start- 106 0 25
✅ e2e-local-postgres-nest-stable 106 0 25
✅ e2e-local-postgres-tanstack-start- 106 0 25
✅ e2e-local-prod-nest-stable 106 0 25
✅ e2e-local-prod-tanstack-start- 106 0 25
✅ e2e-vercel-prod-tanstack-start 105 0 26

📋 View full workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 0.031s (-27.8% 🟢) 1.006s (~) 0.975s 10 1.00x
💻 Local Express 0.033s (-26.4% 🟢) 1.006s (~) 0.973s 10 1.05x
🐘 Postgres Express 0.050s (-13.4% 🟢) 1.013s (~) 0.962s 10 1.61x
💻 Local Next.js (Turbopack) 0.051s 1.006s 0.955s 10 1.64x
🐘 Postgres Nitro 0.056s (-41.6% 🟢) 1.019s (-2.3%) 0.963s 10 1.79x
🐘 Postgres Next.js (Turbopack) 0.058s 1.012s 0.954s 10 1.86x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 0.245s (-2.4%) 2.250s (-3.6%) 2.004s 10 1.00x
▲ Vercel Nitro 0.408s (~) 2.303s (-8.2% 🟢) 1.895s 10 1.66x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.062s (-6.9% 🟢) 2.009s (~) 0.947s 10 1.00x
💻 Local Nitro 1.071s (-5.3% 🟢) 2.006s (~) 0.935s 10 1.01x
💻 Local Express 1.076s (-4.3%) 2.006s (~) 0.930s 10 1.01x
🐘 Postgres Express 1.082s (-5.6% 🟢) 2.009s (~) 0.927s 10 1.02x
💻 Local Next.js (Turbopack) 1.108s 2.006s 0.898s 10 1.04x
🐘 Postgres Next.js (Turbopack) 1.117s 2.009s 0.892s 10 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.651s (-57.6% 🟢) 3.291s (-44.3% 🟢) 1.640s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.795s (-11.8% 🟢) 3.884s (+1.4%) 2.089s 10 1.09x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.419s (-4.8%) 11.022s (~) 0.603s 3 1.00x
🐘 Postgres Express 10.427s (-4.9%) 11.018s (~) 0.591s 3 1.00x
💻 Local Express 10.439s (-4.4%) 11.022s (~) 0.583s 3 1.00x
🐘 Postgres Nitro 10.509s (-3.3%) 11.045s (~) 0.536s 3 1.01x
💻 Local Next.js (Turbopack) 10.680s 11.020s 0.341s 3 1.03x
🐘 Postgres Next.js (Turbopack) 10.748s 11.022s 0.274s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 13.455s (-43.3% 🟢) 15.211s (-39.4% 🟢) 1.756s 3 1.00x
▲ Vercel Next.js (Turbopack) 13.630s (-21.3% 🟢) 15.628s (-19.4% 🟢) 1.998s 3 1.01x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 13.457s (-10.7% 🟢) 14.026s (-12.5% 🟢) 0.569s 5 1.00x
🐘 Postgres Express 13.472s (-7.6% 🟢) 14.019s (-6.7% 🟢) 0.547s 5 1.00x
💻 Local Express 13.534s (-9.6% 🟢) 14.027s (-6.7% 🟢) 0.493s 5 1.01x
🐘 Postgres Nitro 13.897s (-4.8%) 14.439s (-3.9%) 0.542s 5 1.03x
💻 Local Next.js (Turbopack) 14.107s 15.030s 0.924s 4 1.05x
🐘 Postgres Next.js (Turbopack) 14.220s 15.017s 0.798s 4 1.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 20.543s (-68.1% 🟢) 21.668s (-67.5% 🟢) 1.126s 3 1.00x
▲ Vercel Next.js (Turbopack) 21.343s (-59.4% 🟢) 23.532s (-56.9% 🟢) 2.189s 3 1.04x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 11.885s (-29.2% 🟢) 12.021s (-29.4% 🟢) 0.136s 8 1.00x
🐘 Postgres Express 11.923s (-14.9% 🟢) 12.020s (-17.6% 🟢) 0.097s 8 1.00x
💻 Local Express 12.049s (-27.4% 🟢) 12.524s (-26.5% 🟢) 0.475s 8 1.01x
🐘 Postgres Nitro 13.175s (-5.7% 🟢) 13.591s (-5.0% 🟢) 0.415s 7 1.11x
🐘 Postgres Next.js (Turbopack) 13.401s 14.018s 0.616s 7 1.13x
💻 Local Next.js (Turbopack) 13.419s 14.170s 0.750s 7 1.13x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 26.586s (-93.7% 🟢) 28.027s (-93.4% 🟢) 1.441s 4 1.00x
▲ Vercel Next.js (Turbopack) 27.430s (-93.0% 🟢) 29.339s (-92.6% 🟢) 1.908s 4 1.03x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.150s (-8.7% 🟢) 2.007s (~) 0.857s 15 1.00x
💻 Local Express 1.186s (-20.3% 🟢) 2.006s (~) 0.819s 15 1.03x
💻 Local Nitro 1.190s (-27.0% 🟢) 2.006s (-3.3%) 0.816s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.198s 2.007s 0.809s 15 1.04x
💻 Local Next.js (Turbopack) 1.271s 2.006s 0.735s 15 1.11x
🐘 Postgres Nitro 1.343s (+5.4% 🔺) 2.012s (~) 0.669s 15 1.17x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.374s (-15.8% 🟢) 3.542s (-18.1% 🟢) 1.168s 9 1.00x
▲ Vercel Next.js (Turbopack) 2.386s (-29.8% 🟢) 3.775s (-23.5% 🟢) 1.390s 9 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.193s (-49.5% 🟢) 2.007s (-33.3% 🟢) 0.814s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.354s 2.006s 0.652s 15 1.14x
🐘 Postgres Nitro 1.498s (-36.3% 🟢) 2.164s (-28.1% 🟢) 0.666s 14 1.26x
💻 Local Nitro 1.761s (-44.0% 🟢) 2.006s (-48.4% 🟢) 0.244s 15 1.48x
💻 Local Next.js (Turbopack) 1.825s 2.294s 0.468s 14 1.53x
💻 Local Express 2.006s (-32.1% 🟢) 2.293s (-33.6% 🟢) 0.287s 14 1.68x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.145s (+2.3%) 5.379s (-9.2% 🟢) 1.234s 6 1.00x
▲ Vercel Next.js (Turbopack) 4.566s (-35.7% 🟢) 6.327s (-29.0% 🟢) 1.761s 5 1.10x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.327s (-62.0% 🟢) 2.007s (-49.9% 🟢) 0.681s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.639s 2.008s 0.369s 15 1.24x
🐘 Postgres Nitro 1.697s (-51.2% 🟢) 2.344s (-41.5% 🟢) 0.648s 13 1.28x
💻 Local Next.js (Turbopack) 4.871s 5.345s 0.474s 6 3.67x
💻 Local Nitro 5.064s (-39.4% 🟢) 5.679s (-37.0% 🟢) 0.616s 6 3.82x
💻 Local Express 5.506s (-34.0% 🟢) 6.214s (-31.2% 🟢) 0.708s 5 4.15x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.942s (+68.6% 🔺) 8.267s (+49.4% 🔺) 2.325s 4 1.00x
▲ Vercel Next.js (Turbopack) 6.527s (-26.8% 🟢) 8.273s (-24.5% 🟢) 1.747s 4 1.10x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.169s (-7.0% 🟢) 2.008s (~) 0.839s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.194s 2.008s 0.814s 15 1.02x
🐘 Postgres Nitro 1.382s (+10.0% 🔺) 2.013s (~) 0.631s 15 1.18x
💻 Local Nitro 1.419s (-23.9% 🟢) 2.007s (-14.3% 🟢) 0.587s 15 1.21x
💻 Local Express 1.485s (-21.6% 🟢) 2.007s (-15.1% 🟢) 0.522s 15 1.27x
💻 Local Next.js (Turbopack) 1.733s 2.391s 0.658s 13 1.48x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.632s (-10.2% 🟢) 4.572s (-1.5%) 1.940s 7 1.00x
▲ Vercel Nitro 2.812s (+14.3% 🔺) 4.353s (+4.4%) 1.541s 7 1.07x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.202s (-48.6% 🟢) 2.008s (-33.3% 🟢) 0.806s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.336s 2.009s 0.673s 15 1.11x
🐘 Postgres Nitro 1.912s (-18.3% 🟢) 2.506s (-16.8% 🟢) 0.594s 13 1.59x
💻 Local Next.js (Turbopack) 1.984s 2.507s 0.523s 12 1.65x
💻 Local Nitro 2.129s (-30.5% 🟢) 2.592s (-33.3% 🟢) 0.463s 12 1.77x
💻 Local Express 2.173s (-30.6% 🟢) 2.592s (-31.1% 🟢) 0.419s 12 1.81x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.637s (+15.7% 🔺) 5.188s (+14.7% 🔺) 1.551s 6 1.00x
▲ Vercel Nitro 3.661s (+13.2% 🔺) 4.893s (-3.6%) 1.232s 7 1.01x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.316s (-62.4% 🟢) 2.007s (-50.0% 🟢) 0.691s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.643s 2.074s 0.431s 15 1.25x
🐘 Postgres Nitro 1.764s (-49.3% 🟢) 2.514s (-37.3% 🟢) 0.749s 12 1.34x
💻 Local Next.js (Turbopack) 5.630s 6.012s 0.382s 5 4.28x
💻 Local Nitro 6.033s (-34.0% 🟢) 6.414s (-36.0% 🟢) 0.381s 5 4.59x
💻 Local Express 6.294s (-28.5% 🟢) 6.617s (-28.6% 🟢) 0.322s 5 4.78x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.579s (-17.4% 🟢) 7.709s (-9.8% 🟢) 2.130s 4 1.00x
▲ Vercel Nitro 5.998s (+17.8% 🔺) 7.479s (+9.7% 🔺) 1.481s 5 1.08x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.446s (-46.9% 🟢) 1.006s (-1.7%) 0.561s 60 1.00x
💻 Local Nitro 0.502s (-48.8% 🟢) 1.021s (-6.6% 🟢) 0.519s 59 1.13x
💻 Local Express 0.523s (-46.9% 🟢) 1.022s (-5.0% 🟢) 0.499s 59 1.17x
🐘 Postgres Next.js (Turbopack) 0.684s 1.006s 0.322s 60 1.54x
🐘 Postgres Nitro 0.721s (-12.1% 🟢) 1.287s (+27.9% 🔺) 0.566s 47 1.62x
💻 Local Next.js (Turbopack) 0.732s 1.004s 0.272s 60 1.64x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.217s (-76.3% 🟢) 6.824s (-71.6% 🟢) 1.607s 9 1.00x
▲ Vercel Next.js (Turbopack) 5.947s (-59.0% 🟢) 7.591s (-52.8% 🟢) 1.644s 9 1.14x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.049s (-46.9% 🟢) 1.706s (-24.4% 🟢) 0.657s 53 1.00x
🐘 Postgres Nitro 1.157s (-39.9% 🟢) 1.558s (-25.8% 🟢) 0.401s 58 1.10x
💻 Local Nitro 1.219s (-59.8% 🟢) 2.005s (-46.6% 🟢) 0.786s 45 1.16x
💻 Local Express 1.286s (-57.4% 🟢) 2.007s (-44.0% 🟢) 0.721s 45 1.23x
🐘 Postgres Next.js (Turbopack) 1.589s 2.007s 0.418s 45 1.52x
💻 Local Next.js (Turbopack) 1.831s 2.027s 0.196s 45 1.75x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 12.806s (-67.6% 🟢) 14.529s (-64.8% 🟢) 1.723s 7 1.00x
▲ Vercel Next.js (Turbopack) 14.083s (-71.7% 🟢) 16.343s (-68.4% 🟢) 2.260s 6 1.10x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.135s (-46.5% 🟢) 2.735s (-37.4% 🟢) 0.599s 44 1.00x
🐘 Postgres Nitro 2.498s (-39.1% 🟢) 3.039s (-34.0% 🟢) 0.540s 40 1.17x
💻 Local Nitro 2.720s (-70.8% 🟢) 3.007s (-70.0% 🟢) 0.288s 40 1.27x
💻 Local Express 2.853s (-69.0% 🟢) 3.110s (-69.0% 🟢) 0.258s 39 1.34x
🐘 Postgres Next.js (Turbopack) 3.162s 4.008s 0.845s 30 1.48x
💻 Local Next.js (Turbopack) 3.918s 4.366s 0.448s 28 1.83x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 28.344s (-70.8% 🟢) 30.492s (-69.0% 🟢) 2.148s 4 1.00x
▲ Vercel Next.js (Turbopack) 31.614s (-70.5% 🟢) 33.488s (-69.3% 🟢) 1.873s 4 1.12x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.179s (-36.7% 🟢) 1.006s (~) 0.827s 60 1.00x
🐘 Postgres Next.js (Turbopack) 0.224s 1.006s 0.781s 60 1.25x
🐘 Postgres Nitro 0.408s (+44.1% 🔺) 1.066s (+5.8% 🔺) 0.658s 57 2.28x
💻 Local Express 0.419s (-25.3% 🟢) 1.004s (~) 0.586s 60 2.34x
💻 Local Nitro 0.422s (-30.2% 🟢) 1.005s (-1.7%) 0.583s 60 2.36x
💻 Local Next.js (Turbopack) 0.611s 1.004s 0.394s 60 3.42x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.297s (+13.6% 🔺) 4.099s (+8.1% 🔺) 1.803s 15 1.00x
▲ Vercel Nitro 2.314s (+39.3% 🔺) 3.753s (+12.0% 🔺) 1.439s 16 1.01x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.337s (-33.8% 🟢) 1.017s (+1.1%) 0.680s 89 1.00x
🐘 Postgres Nitro 0.415s (-16.3% 🟢) 1.050s (+4.3%) 0.635s 86 1.23x
🐘 Postgres Next.js (Turbopack) 0.423s 1.006s 0.583s 90 1.25x
💻 Local Nitro 2.159s (-14.9% 🟢) 2.821s (-6.3% 🟢) 0.662s 32 6.40x
💻 Local Express 2.198s (-12.5% 🟢) 2.912s (-3.2%) 0.714s 31 6.51x
💻 Local Next.js (Turbopack) 2.202s 3.042s 0.840s 30 6.53x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.760s (+47.6% 🔺) 6.224s (+29.1% 🔺) 1.463s 15 1.00x
▲ Vercel Next.js (Turbopack) 5.324s (+50.6% 🔺) 7.178s (+38.2% 🔺) 1.853s 13 1.12x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.612s (-22.5% 🟢) 1.137s (+12.9% 🔺) 0.525s 106 1.00x
🐘 Postgres Express 0.614s (-25.0% 🟢) 1.006s (-1.1%) 0.392s 120 1.00x
🐘 Postgres Next.js (Turbopack) 0.889s 1.068s 0.179s 114 1.45x
💻 Local Nitro 10.117s (-9.6% 🟢) 10.860s (-6.9% 🟢) 0.742s 12 16.52x
💻 Local Express 10.585s (-5.4% 🟢) 11.118s (-6.9% 🟢) 0.534s 11 17.28x
💻 Local Next.js (Turbopack) 10.824s 11.483s 0.659s 11 17.67x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 13.197s (+70.9% 🔺) 14.742s (+56.8% 🔺) 1.545s 9 1.00x
▲ Vercel Next.js (Turbopack) 14.457s (+40.0% 🔺) 16.425s (+33.7% 🔺) 1.969s 8 1.10x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.130s (+428.7% 🔺) 2.005s (+99.6% 🔺) 0.012s (-2.4%) 2.020s (+98.2% 🔺) 0.890s 10 1.00x
💻 Local Express 1.138s (+471.4% 🔺) 2.005s (+99.6% 🔺) 0.013s (+4.1%) 2.020s (+98.4% 🔺) 0.882s 10 1.01x
🐘 Postgres Express 1.142s (+456.8% 🔺) 1.999s (+100.2% 🔺) 0.001s (-12.5% 🟢) 2.010s (+98.8% 🔺) 0.868s 10 1.01x
🐘 Postgres Nitro 1.188s (+479.4% 🔺) 1.998s (+99.8% 🔺) 0.000s (-73.3% 🟢) 2.011s (+98.8% 🔺) 0.823s 10 1.05x
🐘 Postgres Next.js (Turbopack) 1.192s 2.001s 0.001s 2.010s 0.817s 10 1.06x
💻 Local Next.js (Turbopack) 1.211s 2.004s 0.011s 2.018s 0.808s 10 1.07x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.088s (-45.5% 🟢) 3.011s (-42.9% 🟢) 1.894s (+155.2% 🔺) 5.290s (-18.4% 🟢) 3.202s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.093s (-69.5% 🟢) 3.282s (-62.1% 🟢) 1.741s (+175.5% 🔺) 5.489s (-43.9% 🟢) 3.396s 10 1.00x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.531s (+143.0% 🔺) 2.004s (+99.1% 🔺) 0.004s (+5.3% 🔺) 2.026s (+98.1% 🔺) 0.495s 30 1.00x
💻 Local Express 1.584s (+109.2% 🔺) 2.012s (+95.5% 🔺) 0.012s (+25.0% 🔺) 2.026s (+94.8% 🔺) 0.442s 30 1.03x
💻 Local Next.js (Turbopack) 1.676s 2.010s 0.010s 2.023s 0.348s 30 1.09x
🐘 Postgres Next.js (Turbopack) 1.707s 2.010s 0.004s 2.025s 0.318s 30 1.12x
💻 Local Nitro 1.719s (+104.9% 🔺) 2.011s (+98.7% 🔺) 0.009s (+1.0%) 2.202s (+97.3% 🔺) 0.483s 28 1.12x
🐘 Postgres Nitro 1.952s (+212.8% 🔺) 2.340s (+132.5% 🔺) 0.002s (-46.1% 🟢) 2.377s (+132.5% 🔺) 0.425s 26 1.28x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.918s (-79.9% 🟢) 6.798s (-77.9% 🟢) 0.332s (+196.4% 🔺) 7.549s (-76.2% 🟢) 1.631s 8 1.00x
▲ Vercel Next.js (Turbopack) 5.954s (-64.8% 🟢) 7.332s (-59.8% 🟢) 0.420s (+98.8% 🔺) 8.223s (-56.6% 🟢) 2.269s 8 1.01x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.660s (-31.3% 🟢) 1.030s (-19.4% 🟢) 0.000s (-20.7% 🟢) 1.046s (-19.9% 🟢) 0.386s 58 1.00x
🐘 Postgres Next.js (Turbopack) 0.769s 1.035s 0.000s 1.042s 0.272s 58 1.16x
🐘 Postgres Nitro 0.863s (-11.0% 🟢) 1.301s (+4.3%) 0.000s (-46.7% 🟢) 1.338s (+6.4% 🔺) 0.475s 45 1.31x
💻 Local Nitro 1.369s (+12.0% 🔺) 2.015s (~) 0.000s (+266.7% 🔺) 2.017s (~) 0.648s 30 2.07x
💻 Local Express 1.413s (+15.4% 🔺) 2.015s (~) 0.000s (-30.0% 🟢) 2.018s (~) 0.604s 30 2.14x
💻 Local Next.js (Turbopack) 1.427s 2.015s 0.000s 2.018s 0.591s 30 2.16x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.825s (+25.4% 🔺) 4.711s (+7.2% 🔺) 0.000s (+116.7% 🔺) 5.163s (+7.4% 🔺) 1.338s 12 1.00x
▲ Vercel Next.js (Turbopack) 4.097s (-59.8% 🟢) 5.684s (-50.7% 🟢) 0.000s (+Infinity% 🔺) 6.262s (-48.0% 🟢) 2.165s 10 1.07x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.336s (-24.6% 🟢) 2.029s (-6.8% 🟢) 0.000s (+Infinity% 🔺) 2.058s (-6.4% 🟢) 0.722s 30 1.00x
🐘 Postgres Next.js (Turbopack) 1.614s 2.180s 0.000s 2.192s 0.578s 28 1.21x
🐘 Postgres Nitro 2.659s (+48.4% 🔺) 3.258s (+52.2% 🔺) 0.000s (-100.0% 🟢) 3.312s (+52.3% 🔺) 0.653s 19 1.99x
💻 Local Next.js (Turbopack) 2.848s 3.364s 0.001s 3.368s 0.520s 18 2.13x
💻 Local Nitro 3.104s (-8.4% 🟢) 3.839s (-4.8%) 0.001s (+28.9% 🔺) 3.843s (-4.8%) 0.739s 16 2.32x
💻 Local Express 3.316s (-4.4%) 3.844s (-4.7%) 0.001s (+1.6%) 3.849s (-4.6%) 0.533s 16 2.48x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.675s (+38.6% 🔺) 6.613s (+23.0% 🔺) 0.000s (-100.0% 🟢) 7.055s (+21.8% 🔺) 1.380s 9 1.00x
▲ Vercel Next.js (Turbopack) 6.436s (+14.6% 🔺) 7.743s (+10.9% 🔺) 0.002s (+1700.0% 🔺) 8.446s (+12.0% 🔺) 2.010s 8 1.13x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Nitro 14/21
🐘 Postgres Express 19/21
▲ Vercel Nitro 16/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 18/21
Next.js (Turbopack) 🐘 Postgres 16/21
Nitro 🐘 Postgres 13/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Redis + BullMQ: Community world (local development)
  • 🌐 Cloudflare: Community world (local development)
  • 🌐 MySQL: Community world (local development)
  • 🌐 Azure: Community world (local development)
  • 🌐 NATS JetStream: Community world (local development)
  • 🌐 Upstash: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

The diagnostic patch in the previous commit confirmed the abort-fetch
flake: httpbin.org/delay/30 returns HTTP 502 from GH Actions runners in
56ms-1709ms intermittently — observed 4 times in a single CI run.

Switch the abort-fetch e2e tests to a primary slow endpoint
(postman-echo.com/delay/10) with httpbin.org/delay/10 as a fallback
that only kicks in when the primary returns a 5xx or non-AbortError
network failure. Both upstreams would need to be unhealthy at the same
instant to flake the test, which is exponentially less likely than
either failing alone.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@VaguelySerious VaguelySerious changed the title [tests] Diagnose abort-fetch e2e flake [tests] Fix abort-fetch e2e flake due to delay API 502 May 22, 2026
@VaguelySerious VaguelySerious changed the title [tests] Fix abort-fetch e2e flake due to delay API 502 [tests] Fix abort-fetch e2e flake (postman-echo with httpbin fallback) May 22, 2026
@vercel vercel Bot temporarily deployed to Preview – workflow-docs May 22, 2026 11:05 Inactive
@VaguelySerious VaguelySerious marked this pull request as ready for review May 22, 2026 11:06
@VaguelySerious VaguelySerious requested a review from a team as a code owner May 22, 2026 11:06
@VaguelySerious VaguelySerious changed the title [tests] Fix abort-fetch e2e flake (postman-echo with httpbin fallback) [tests] Fix abort-fetch e2e flake May 22, 2026
@VaguelySerious VaguelySerious merged commit 76d786e into main May 22, 2026
179 of 189 checks passed
@VaguelySerious VaguelySerious deleted the peter/diagnose-abort-fetch-flake branch May 22, 2026 11:35
@github-actions
Copy link
Copy Markdown
Contributor

No backport to stable for 76d786e (AI decision).

This commit fixes flakes in abortFetchInFlightWorkflow and abortVoidSleepTimeoutWorkflow e2e tests and the supporting fetchWithSignal step. Verified via git show origin/stable that none of these tests, the workflow definitions, or the step function exist on stable — the changes have no target to apply to.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

76d786efa1ab0bc2eba5d0f92a08096d07c8211a

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.

1 participant