Skip to content

test(core): de-flake sleep/stepWinsRace e2e wall-clock bounds#2551

Closed
pranaygp wants to merge 1 commit into
mainfrom
pgp/fix-sleepwinsrace-flake
Closed

test(core): de-flake sleep/stepWinsRace e2e wall-clock bounds#2551
pranaygp wants to merge 1 commit into
mainfrom
pgp/fix-sleepwinsrace-flake

Conversation

@pranaygp

Copy link
Copy Markdown
Contributor

Problem

The sleepWinsRaceWorkflow e2e test (packages/core/e2e/e2e.test.ts) intermittently fails in CI at ~5110ms, just over its hard expect(returnValue.durationMs).toBeLessThan(5_000) wall-clock bound.

Root cause

The workflow runs a Promise.race between a 1s sleep and a 10s step (delayMsStep(10_000, 'step')), and the sleep is expected to win:

const winner = await Promise.race([
  delayMsStep(10_000, 'step'),
  sleep('1s').then(() => 'sleep'),
]);
return { winner, durationMs: endTime - startTime };

The meaningful invariant is the race outcomewinner === 'sleep' — which the test already asserts. The durationMs < 5000 check is only a secondary guard that we didn't block on the losing 10s branch. But it's an absolute wall-clock bound on a fast branch whose ~1s logical duration accrues preview-environment overhead (cold starts, VQS queue round-trips, replay), which intermittently pushes total elapsed time just past 5s. That makes 5000ms a brittle threshold, not a meaningful one.

Fix

  • Keep the real invariant (winner === 'sleep' / winner === 'step') as the primary assertion.
  • Widen the durationMs guard from < 5_000 to < 8_000 for both sleepWinsRaceWorkflow and its sibling stepWinsRaceWorkflow (same structure, same fragility).
  • 8s is not an arbitrary bump: the losing branch in each test is 10s, so an 8s ceiling still proves the slow branch did not win (≥2s clear of the loser) while leaving ~3s of headroom over the observed ~5.1s flake. The threshold is justified in an inline comment, mirroring the generous-bound pattern already used by parallelSleepWorkflow above (< 25_000 for a ~10s-sequential worst case).

This reduces flakiness without weakening coverage — the test still fails loudly if the slow branch ever wins.

Verification

Run in an isolated worktree off origin/main:

  • pnpm build (turbo, 27/27 tasks) — green
  • pnpm typecheck (turbo, 40/40 tasks incl. packages/core) — green
  • pnpm lint (biome) — no new diagnostics on the changed lines (pre-existing warnings elsewhere in the file are untouched)

Not run locally: the full e2e suite (test:e2e) requires a deployed preview/DEPLOYMENT_URL environment and cannot execute on a workstation, so the runtime behavior of the widened bound was not exercised here — only static checks were.

🤖 Generated with Claude Code

The sleepWinsRaceWorkflow e2e races a 1s sleep against a 10s step and
asserts the sleep wins. It carried a brittle `durationMs < 5000` guard
that intermittently failed in CI at ~5110ms — the fast branch is ~1s but
on preview environments it accrues queue round-trips, cold starts, and
replay overhead that can push wall-clock just past the hard 5s bound.

The real invariant (which branch won) is already asserted via
`winner === 'sleep'`; the duration check only exists to prove we did not
block on the 10s losing branch. Widen both this test and its sibling
`stepWinsRaceWorkflow` to `< 8000ms`: still comfortably below the 10s
loser (so it still proves the slow branch didn't win) while leaving
generous headroom for preview jitter. Justify the number in a comment,
mirroring the generous-bound pattern already used by parallelSleepWorkflow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@pranaygp pranaygp requested a review from a team as a code owner June 22, 2026 03:43
Copilot AI review requested due to automatic review settings June 22, 2026 03:43
@changeset-bot

changeset-bot Bot commented Jun 22, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 2db5de2

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

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

Click here to learn what changesets are, and how to add one.

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

@vercel

vercel Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

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 Jun 22, 2026 3:47am
example-nextjs-workflow-webpack Ready Ready Preview, Comment Jun 22, 2026 3:47am
example-workflow Ready Ready Preview, Comment Jun 22, 2026 3:47am
workbench-astro-workflow Ready Ready Preview, Comment Jun 22, 2026 3:47am
workbench-express-workflow Ready Ready Preview, Comment Jun 22, 2026 3:47am
workbench-fastify-workflow Ready Ready Preview, Comment Jun 22, 2026 3:47am
workbench-hono-workflow Ready Ready Preview, Comment Jun 22, 2026 3:47am
workbench-nitro-workflow Ready Ready Preview, Comment Jun 22, 2026 3:47am
workbench-nuxt-workflow Ready Ready Preview, Comment Jun 22, 2026 3:47am
workbench-sveltekit-workflow Ready Ready Preview, Comment Jun 22, 2026 3:47am
workbench-tanstack-start-workflow Ready Ready Preview, Comment Jun 22, 2026 3:47am
workbench-vite-workflow Ready Ready Preview, Comment Jun 22, 2026 3:47am
workflow-docs Ready Ready Preview, Comment, Open in v0 Jun 22, 2026 3:47am
workflow-swc-playground Ready Ready Preview, Comment Jun 22, 2026 3:47am
workflow-tarballs Ready Ready Preview, Comment Jun 22, 2026 3:47am
workflow-web Ready Ready Preview, Comment Jun 22, 2026 3:47am

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1144 0 224 1368
✅ 💻 Local Development 1909 0 219 2128
✅ 📦 Local Production 1909 0 219 2128
✅ 🐘 Local Postgres 1895 0 233 2128
✅ 🪟 Windows 152 0 0 152
✅ 📋 Other 885 0 179 1064
Total 7894 0 1074 8968

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 125 0 27
✅ example 125 0 27
✅ express 125 0 27
✅ fastify 125 0 27
✅ hono 125 0 27
✅ nitro 125 0 27
✅ nuxt 125 0 27
✅ sveltekit 144 0 8
✅ vite 125 0 27
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 127 0 25
✅ express-stable 127 0 25
✅ fastify-stable 127 0 25
✅ hono-stable 127 0 25
✅ nextjs-turbopack-canary 133 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 152 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 152 0 0
✅ nextjs-webpack-canary 133 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 152 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 152 0 0
✅ nitro-stable 127 0 25
✅ nuxt-stable 127 0 25
✅ sveltekit-stable 146 0 6
✅ vite-stable 127 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 127 0 25
✅ express-stable 127 0 25
✅ fastify-stable 127 0 25
✅ hono-stable 127 0 25
✅ nextjs-turbopack-canary 133 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 152 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 152 0 0
✅ nextjs-webpack-canary 133 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 152 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 152 0 0
✅ nitro-stable 127 0 25
✅ nuxt-stable 127 0 25
✅ sveltekit-stable 146 0 6
✅ vite-stable 127 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 126 0 26
✅ express-stable 126 0 26
✅ fastify-stable 126 0 26
✅ hono-stable 126 0 26
✅ nextjs-turbopack-canary 132 0 20
✅ nextjs-turbopack-stable-lazy-discovery-disabled 151 0 1
✅ nextjs-turbopack-stable-lazy-discovery-enabled 151 0 1
✅ nextjs-webpack-canary 132 0 20
✅ nextjs-webpack-stable-lazy-discovery-disabled 151 0 1
✅ nextjs-webpack-stable-lazy-discovery-enabled 151 0 1
✅ nitro-stable 126 0 26
✅ nuxt-stable 126 0 26
✅ sveltekit-stable 145 0 7
✅ vite-stable 126 0 26
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 152 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 127 0 25
✅ e2e-local-dev-tanstack-start- 127 0 25
✅ e2e-local-postgres-nest-stable 126 0 26
✅ e2e-local-postgres-tanstack-start- 126 0 26
✅ e2e-local-prod-nest-stable 127 0 25
✅ e2e-local-prod-tanstack-start- 127 0 25
✅ e2e-vercel-prod-tanstack-start 125 0 27

📋 View full workflow run

@github-actions

github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

📊 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.039s (-5.6% 🟢) 1.005s (~) 0.966s 10 1.00x
💻 Local Express 0.044s (+7.0% 🔺) 1.006s (~) 0.962s 10 1.14x
💻 Local Next.js (Turbopack) 0.050s (+4.4%) 1.006s (~) 0.956s 10 1.30x
🐘 Postgres Next.js (Turbopack) 0.057s (-2.2%) 1.012s (~) 0.955s 10 1.47x
🐘 Postgres Nitro 0.061s (-3.5%) 1.013s (~) 0.952s 10 1.58x
🐘 Postgres Express 0.063s (+1.8%) 1.014s (~) 0.952s 10 1.62x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.339s (-13.2% 🟢) 2.797s (+10.6% 🔺) 2.458s 10 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.082s (-0.6%) 2.006s (~) 0.924s 10 1.00x
💻 Local Express 1.094s (-0.5%) 2.006s (~) 0.912s 10 1.01x
💻 Local Next.js (Turbopack) 1.098s (+0.5%) 2.007s (~) 0.909s 10 1.01x
🐘 Postgres Nitro 1.100s (~) 2.010s (~) 0.910s 10 1.02x
🐘 Postgres Next.js (Turbopack) 1.100s (~) 2.010s (~) 0.909s 10 1.02x
🐘 Postgres Express 1.108s (~) 2.010s (~) 0.902s 10 1.02x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.641s (+6.6% 🔺) 3.636s (+3.5%) 1.995s 10 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.480s (~) 11.021s (~) 0.541s 3 1.00x
🐘 Postgres Express 10.527s (~) 11.021s (~) 0.494s 3 1.00x
🐘 Postgres Nitro 10.529s (~) 11.020s (~) 0.491s 3 1.00x
💻 Local Express 10.535s (~) 11.023s (~) 0.487s 3 1.01x
🐘 Postgres Next.js (Turbopack) 10.543s (~) 11.016s (~) 0.473s 3 1.01x
💻 Local Next.js (Turbopack) 10.551s (~) 11.023s (~) 0.473s 3 1.01x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 12.866s (~) 14.692s (-3.8%) 1.826s 3 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 13.690s (~) 14.027s (~) 0.337s 5 1.00x
🐘 Postgres Nitro 13.720s (-1.4%) 14.019s (~) 0.299s 5 1.00x
💻 Local Express 13.734s (-1.9%) 14.028s (-1.4%) 0.293s 5 1.00x
🐘 Postgres Express 13.751s (~) 14.019s (~) 0.268s 5 1.00x
🐘 Postgres Next.js (Turbopack) 13.784s (-1.0%) 14.020s (~) 0.237s 5 1.01x
💻 Local Next.js (Turbopack) 13.858s (+1.1%) 14.029s (~) 0.171s 5 1.01x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 19.171s (-10.8% 🟢) 20.565s (-12.5% 🟢) 1.394s 3 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 12.228s (-0.5%) 13.024s (~) 0.796s 7 1.00x
🐘 Postgres Nitro 12.353s (~) 13.021s (~) 0.668s 7 1.01x
💻 Local Express 12.377s (-1.7%) 13.026s (~) 0.649s 7 1.01x
🐘 Postgres Express 12.487s (~) 13.020s (~) 0.533s 7 1.02x
🐘 Postgres Next.js (Turbopack) 12.535s (~) 13.020s (~) 0.485s 7 1.03x
💻 Local Next.js (Turbopack) 12.549s (+0.7%) 13.026s (~) 0.477s 7 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 25.310s (+2.3%) 28.301s (+6.0% 🔺) 2.990s 4 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.165s (+0.6%) 2.007s (~) 0.842s 15 1.00x
🐘 Postgres Express 1.180s (-1.3%) 2.008s (~) 0.828s 15 1.01x
💻 Local Nitro 1.182s (-1.7%) 2.006s (~) 0.823s 15 1.01x
🐘 Postgres Nitro 1.184s (~) 2.008s (~) 0.824s 15 1.02x
💻 Local Next.js (Turbopack) 1.243s (-9.6% 🟢) 2.006s (~) 0.763s 15 1.07x
💻 Local Express 1.255s (+2.0%) 2.007s (~) 0.752s 15 1.08x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.221s (-16.1% 🟢) 3.643s (-18.2% 🟢) 1.422s 9 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.258s (+0.5%) 2.075s (+3.4%) 0.817s 15 1.00x
🐘 Postgres Nitro 1.284s (+1.2%) 2.007s (~) 0.724s 15 1.02x
🐘 Postgres Express 1.297s (-0.9%) 2.008s (-3.2%) 0.711s 15 1.03x
💻 Local Nitro 2.068s (+2.6%) 2.293s (-8.5% 🟢) 0.225s 14 1.64x
💻 Local Express 2.249s (+10.5% 🔺) 2.827s (+12.7% 🔺) 0.578s 11 1.79x
💻 Local Next.js (Turbopack) 2.441s (+4.2%) 3.008s (+3.1%) 0.567s 10 1.94x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.282s (+31.9% 🔺) 5.133s (+26.5% 🔺) 1.851s 6 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.440s (-0.7%) 3.344s (-9.1% 🟢) 1.904s 9 1.00x
🐘 Postgres Next.js (Turbopack) 1.482s (~) 3.884s (~) 2.403s 8 1.03x
🐘 Postgres Express 1.508s (-9.0% 🟢) 3.455s (-8.2% 🟢) 1.947s 9 1.05x
💻 Local Nitro 5.075s (+13.2% 🔺) 5.679s (+13.3% 🔺) 0.604s 6 3.52x
💻 Local Express 5.556s (-3.7%) 6.015s (-6.2% 🟢) 0.459s 5 3.86x
💻 Local Next.js (Turbopack) 6.155s (-8.0% 🟢) 6.814s (-8.2% 🟢) 0.659s 5 4.27x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 6.237s (+102.9% 🔺) 8.656s (+76.2% 🔺) 2.420s 4 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.178s (~) 2.008s (~) 0.830s 15 1.00x
🐘 Postgres Nitro 1.181s (-1.5%) 2.008s (~) 0.827s 15 1.00x
💻 Local Express 1.207s (-1.9%) 2.006s (~) 0.800s 15 1.02x
💻 Local Nitro 1.214s (-1.3%) 2.006s (~) 0.792s 15 1.03x
🐘 Postgres Express 1.227s (+2.6%) 2.007s (~) 0.781s 15 1.04x
💻 Local Next.js (Turbopack) 1.330s (-1.6%) 2.007s (~) 0.677s 15 1.13x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.254s (+4.0%) 3.599s (-7.2% 🟢) 1.345s 9 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.259s (~) 2.007s (-3.3%) 0.748s 15 1.00x
🐘 Postgres Nitro 1.268s (-0.6%) 2.008s (~) 0.740s 15 1.01x
🐘 Postgres Express 1.273s (-1.7%) 2.008s (~) 0.735s 15 1.01x
💻 Local Express 1.933s (-5.1% 🟢) 2.221s (-18.8% 🟢) 0.288s 14 1.54x
💻 Local Nitro 1.979s (-1.5%) 2.315s (~) 0.336s 13 1.57x
💻 Local Next.js (Turbopack) 2.487s (+2.9%) 3.311s (+13.5% 🔺) 0.824s 10 1.98x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.611s (-4.8%) 4.296s (~) 1.685s 7 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.467s (+2.5%) 3.677s (-2.2%) 2.211s 9 1.00x
🐘 Postgres Nitro 1.525s (+4.7%) 3.455s (-8.1% 🟢) 1.931s 9 1.04x
🐘 Postgres Next.js (Turbopack) 1.546s (+5.2% 🔺) 4.135s (+6.4% 🔺) 2.589s 8 1.05x
💻 Local Nitro 5.225s (+5.7% 🔺) 6.013s (+9.1% 🔺) 0.788s 5 3.56x
💻 Local Express 5.574s (-6.5% 🟢) 6.013s (-11.8% 🟢) 0.439s 5 3.80x
💻 Local Next.js (Turbopack) 7.136s (+5.1% 🔺) 7.517s (~) 0.380s 4 4.87x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.766s (-14.5% 🟢) 5.970s (-9.2% 🟢) 2.204s 6 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.531s (-6.1% 🟢) 1.006s (-1.7%) 0.474s 60 1.00x
🐘 Postgres Express 0.550s (-4.6%) 1.007s (-1.7%) 0.457s 60 1.03x
💻 Local Nitro 0.552s (-3.3%) 1.005s (-1.7%) 0.453s 60 1.04x
🐘 Postgres Nitro 0.559s (-0.5%) 1.023s (~) 0.464s 59 1.05x
💻 Local Next.js (Turbopack) 0.600s (-1.9%) 1.005s (-1.7%) 0.405s 60 1.13x
💻 Local Express 0.614s (+0.7%) 1.022s (+1.6%) 0.408s 59 1.16x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.703s (-10.3% 🟢) 4.308s (-14.7% 🟢) 1.605s 14 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.281s (~) 2.007s (~) 0.726s 45 1.00x
🐘 Postgres Nitro 1.312s (+3.0%) 2.007s (~) 0.695s 45 1.02x
🐘 Postgres Express 1.377s (+3.9%) 2.029s (+1.1%) 0.652s 45 1.08x
💻 Local Nitro 1.388s (~) 2.006s (~) 0.618s 45 1.08x
💻 Local Express 1.496s (-4.0%) 2.029s (~) 0.533s 45 1.17x
💻 Local Next.js (Turbopack) 1.545s (+4.7%) 2.029s (+1.1%) 0.484s 45 1.21x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 7.119s (-6.7% 🟢) 9.036s (-4.9%) 1.917s 10 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 2.541s (~) 3.008s (~) 0.467s 40 1.00x
🐘 Postgres Nitro 2.694s (+1.5%) 3.111s (-0.8%) 0.417s 39 1.06x
🐘 Postgres Express 2.766s (+4.9%) 3.111s (+1.7%) 0.346s 39 1.09x
💻 Local Nitro 3.091s (+3.1%) 3.567s (+3.8%) 0.476s 34 1.22x
💻 Local Express 3.193s (-1.8%) 3.913s (-2.4%) 0.719s 31 1.26x
💻 Local Next.js (Turbopack) 3.273s (+2.1%) 4.009s (+0.8%) 0.736s 30 1.29x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 13.376s (-19.9% 🟢) 15.926s (-16.3% 🟢) 2.550s 8 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.168s (-6.4% 🟢) 1.006s (~) 0.838s 60 1.00x
🐘 Postgres Nitro 0.209s (-1.5%) 1.007s (~) 0.798s 60 1.25x
🐘 Postgres Express 0.219s (~) 1.006s (~) 0.787s 60 1.31x
💻 Local Nitro 0.345s (+2.2%) 1.004s (~) 0.659s 60 2.06x
💻 Local Express 0.348s (+2.1%) 1.004s (~) 0.656s 60 2.08x
💻 Local Next.js (Turbopack) 0.610s (+0.7%) 1.005s (~) 0.395s 60 3.64x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.235s (-9.7% 🟢) 2.629s (-15.7% 🟢) 1.394s 23 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.266s (-0.9%) 1.017s (+1.1%) 0.751s 89 1.00x
🐘 Postgres Nitro 0.330s (+2.1%) 1.017s (+1.1%) 0.688s 89 1.24x
🐘 Postgres Express 0.339s (+5.5% 🔺) 1.029s (+2.3%) 0.691s 88 1.27x
💻 Local Express 1.992s (+1.9%) 2.377s (-3.7%) 0.385s 38 7.50x
💻 Local Nitro 2.001s (-1.2%) 2.442s (-1.1%) 0.441s 37 7.53x
💻 Local Next.js (Turbopack) 2.768s (+3.8%) 3.343s (+8.7% 🔺) 0.574s 27 10.41x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.035s (+20.0% 🔺) 3.837s (+6.9% 🔺) 1.802s 24 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.476s (-1.2%) 2.984s (-1.6%) 2.508s 41 1.00x
🐘 Postgres Nitro 0.523s (~) 1.069s (+1.8%) 0.546s 113 1.10x
🐘 Postgres Express 0.542s (+9.9% 🔺) 1.041s (+2.7%) 0.499s 116 1.14x
💻 Local Express 9.564s (-2.3%) 10.364s (-2.4%) 0.800s 12 20.08x
💻 Local Nitro 9.612s (+2.7%) 10.362s (+2.5%) 0.750s 12 20.18x
💻 Local Next.js (Turbopack) 10.256s (+1.9%) 11.210s (+0.8%) 0.954s 11 21.53x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.692s (+22.2% 🔺) 4.708s (+14.6% 🔺) 2.016s 26 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.156s (-1.2%) 1.998s (~) 0.001s (-47.4% 🟢) 2.010s (~) 0.854s 10 1.00x
🐘 Postgres Express 1.161s (-1.5%) 1.998s (~) 0.001s (~) 2.010s (~) 0.849s 10 1.00x
💻 Local Next.js (Turbopack) 1.163s (+0.8%) 2.003s (~) 0.012s (-4.0%) 2.020s (~) 0.857s 10 1.01x
💻 Local Nitro 1.166s (+1.4%) 2.004s (~) 0.010s (+10.9% 🔺) 2.017s (~) 0.851s 10 1.01x
🐘 Postgres Next.js (Turbopack) 1.166s (~) 2.001s (~) 0.001s (+16.7% 🔺) 2.012s (~) 0.845s 10 1.01x
💻 Local Express 1.188s (+1.2%) 2.004s (~) 0.012s (-0.8%) 2.019s (~) 0.831s 10 1.03x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.258s (+4.8%) 3.320s (-2.7%) 2.208s (+38.7% 🔺) 6.027s (+8.0% 🔺) 3.769s 10 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.576s (~) 2.010s (~) 0.011s (-7.7% 🟢) 2.024s (~) 0.447s 30 1.00x
🐘 Postgres Nitro 1.577s (-4.0%) 2.006s (-1.6%) 0.005s (+6.0% 🔺) 2.027s (-1.5%) 0.450s 30 1.00x
💻 Local Express 1.586s (~) 2.009s (~) 0.013s (+6.2% 🔺) 2.025s (~) 0.440s 30 1.01x
🐘 Postgres Next.js (Turbopack) 1.593s (~) 2.011s (~) 0.005s (-1.4%) 2.025s (~) 0.432s 30 1.01x
💻 Local Next.js (Turbopack) 1.634s (+1.0%) 2.010s (~) 0.012s (-5.5% 🟢) 2.027s (~) 0.393s 30 1.04x
🐘 Postgres Express 1.650s (+4.1%) 2.036s (+1.6%) 0.005s (+7.4% 🔺) 2.061s (+1.7%) 0.411s 30 1.05x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 6.350s (+11.0% 🔺) 7.621s (+0.6%) 0.216s (-30.2% 🟢) 8.314s (-1.3%) 1.965s 8 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.728s (-5.3% 🟢) 1.030s (-6.7% 🟢) 0.000s (-68.4% 🟢) 1.053s (-5.8% 🟢) 0.325s 57 1.00x
🐘 Postgres Express 0.753s (-1.4%) 1.047s (-1.5%) 0.000s (+Infinity% 🔺) 1.060s (-1.7%) 0.307s 57 1.03x
🐘 Postgres Next.js (Turbopack) 0.785s (+3.2%) 1.111s (+2.2%) 0.000s (-100.0% 🟢) 1.118s (+2.1%) 0.333s 54 1.08x
💻 Local Express 1.330s (+0.6%) 2.013s (~) 0.000s (-18.2% 🟢) 2.016s (~) 0.686s 30 1.83x
💻 Local Nitro 1.423s (+4.2%) 2.013s (~) 0.000s (~) 2.016s (~) 0.593s 30 1.95x
💻 Local Next.js (Turbopack) 1.484s (+2.5%) 2.012s (~) 0.000s (-11.1% 🟢) 2.015s (~) 0.531s 30 2.04x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.539s (-25.5% 🟢) 4.649s (-29.5% 🟢) 0.001s (+Infinity% 🔺) 5.130s (-28.0% 🟢) 1.592s 12 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro

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

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.547s (-6.5% 🟢) 2.216s (~) 0.000s (+100.0% 🔺) 2.230s (~) 0.683s 27 1.00x
🐘 Postgres Next.js (Turbopack) 1.609s (-15.7% 🟢) 2.177s (-14.4% 🟢) 0.000s (+Infinity% 🔺) 2.190s (-14.1% 🟢) 0.581s 28 1.04x
🐘 Postgres Express 1.841s (+20.4% 🔺) 2.343s (+11.5% 🔺) 0.000s (+7.7% 🔺) 2.362s (+9.8% 🔺) 0.521s 26 1.19x
💻 Local Express 3.487s (-4.3%) 3.963s (-6.3% 🟢) 0.001s (+3.1%) 3.972s (-6.1% 🟢) 0.486s 16 2.25x
💻 Local Nitro 3.571s (+2.0%) 4.156s (+4.9%) 0.000s (-58.5% 🟢) 4.167s (+4.9%) 0.596s 15 2.31x
💻 Local Next.js (Turbopack) 4.223s (+2.5%) 4.645s (+1.0%) 0.001s (-40.2% 🟢) 4.650s (+0.9%) 0.427s 13 2.73x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.160s (-9.3% 🟢) 6.784s (-5.0%) 0.000s (-100.0% 🟢) 7.230s (-6.3% 🟢) 2.070s 9 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Nitro 14/21
🐘 Postgres Next.js (Turbopack) 11/21
▲ Vercel Nitro 21/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 15/21
Next.js (Turbopack) 🐘 Postgres 18/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.

@pranaygp

Copy link
Copy Markdown
Contributor Author

closing this - we're solving the actual timing issues that cause this jitter rather than de-flaking the tests

@pranaygp pranaygp closed this Jun 22, 2026
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