Skip to content

[core] Forward-port: preserve event-log order in hook-vs-sleep replay races (#2171)#2185

Open
VaguelySerious wants to merge 1 commit into
mainfrom
peter/forward-port-2171-main
Open

[core] Forward-port: preserve event-log order in hook-vs-sleep replay races (#2171)#2185
VaguelySerious wants to merge 1 commit into
mainfrom
peter/forward-port-2171-main

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

Forward-port of #2171 from `stable` to `main` (cherry-pick of merge commit `38c67a7`, applied with no conflicts).

Summary

Fixes a replay divergence where a buffered hook payload races a concurrent `sleep`, and `sleep` can win a `Promise.race` that the committed event log says the hook won — surfacing as `CorruptedEventLogError` on replay.

Branch-deciding deliveries (buffered hook payloads and wait completions) are now handed to the workflow in strict event-log order — anchored on event position rather than microtask-resolution timing — so the committed branch wins deterministically, independent of decryption/hydration time or `Promise.race` argument order.

See #2171 for full root-cause analysis and fix details.

Validation

  • Cherry-picked the squashed merge commit onto `main`; clean auto-merge, diff identical to the original PR.
  • `@workflow/core` typecheck: clean.
  • Affected tests (hook-sleep-interaction, async-deserialization-ordering, sleep, step): 87/87 pass.
  • Remaining `e2e/` failures in the full suite are pre-existing on clean `main` (require a full build setup) and unrelated to these runtime changes.

Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com

@VaguelySerious VaguelySerious requested a review from a team as a code owner May 31, 2026 08:56
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 31, 2026

🦋 Changeset detected

Latest commit: 63a12a8

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

This PR includes changesets to release 16 packages
Name Type
@workflow/core Patch
@workflow/builders Patch
@workflow/cli Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/web Patch
workflow Patch
@workflow/world-testing Patch
@workflow/astro Patch
@workflow/nest Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch
@workflow/nuxt Patch

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

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 31, 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 31, 2026 9:00am
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 31, 2026 9:00am
example-workflow Ready Ready Preview, Comment May 31, 2026 9:00am
workbench-astro-workflow Ready Ready Preview, Comment May 31, 2026 9:00am
workbench-express-workflow Ready Ready Preview, Comment May 31, 2026 9:00am
workbench-fastify-workflow Ready Ready Preview, Comment May 31, 2026 9:00am
workbench-hono-workflow Ready Ready Preview, Comment May 31, 2026 9:00am
workbench-nitro-workflow Ready Ready Preview, Comment May 31, 2026 9:00am
workbench-nuxt-workflow Ready Ready Preview, Comment May 31, 2026 9:00am
workbench-sveltekit-workflow Ready Ready Preview, Comment May 31, 2026 9:00am
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 31, 2026 9:00am
workbench-vite-workflow Ready Ready Preview, Comment May 31, 2026 9:00am
workflow-docs Ready Ready Preview, Comment, Open in v0 May 31, 2026 9:00am
workflow-swc-playground Ready Ready Preview, Comment May 31, 2026 9:00am
workflow-tarballs Ready Ready Preview, Comment May 31, 2026 9:00am
workflow-web Ready Ready Preview, Comment May 31, 2026 9:00am

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 31, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 1264 2 219 1485
✅ 💻 Local Development 1671 0 219 1890
✅ 📦 Local Production 1671 0 219 1890
✅ 🐘 Local Postgres 1671 0 219 1890
✅ 🪟 Windows 135 0 0 135
✅ 📋 Other 769 0 176 945
Total 7181 2 1052 8235

❌ Failed Tests

▲ Vercel Production (2 failed)

hono (1 failed):

  • cancelRun via CLI - cancelling a running workflow | wrun_01KSYP28WNWYSMQBHT1E6R1PBM | 🔍 observability

nuxt (1 failed):

  • cancelRun via CLI - cancelling a running workflow | wrun_01KSYP28WNWYSMQBHT1E6R1PBM | 🔍 observability

Details by Category

❌ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 109 0 26
✅ example 109 0 26
✅ express 109 0 26
✅ fastify 109 0 26
❌ hono 108 1 26
✅ nextjs-turbopack 133 0 2
✅ nextjs-webpack 133 0 2
✅ nitro 109 0 26
❌ nuxt 108 1 26
✅ sveltekit 128 0 7
✅ vite 109 0 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 110 0 25
✅ express-stable 110 0 25
✅ fastify-stable 110 0 25
✅ hono-stable 110 0 25
✅ nextjs-turbopack-canary 116 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 135 0 0
✅ nextjs-webpack-canary 116 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 135 0 0
✅ nitro-stable 110 0 25
✅ nuxt-stable 110 0 25
✅ sveltekit-stable 129 0 6
✅ vite-stable 110 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 110 0 25
✅ express-stable 110 0 25
✅ fastify-stable 110 0 25
✅ hono-stable 110 0 25
✅ nextjs-turbopack-canary 116 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 135 0 0
✅ nextjs-webpack-canary 116 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 135 0 0
✅ nitro-stable 110 0 25
✅ nuxt-stable 110 0 25
✅ sveltekit-stable 129 0 6
✅ vite-stable 110 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 110 0 25
✅ express-stable 110 0 25
✅ fastify-stable 110 0 25
✅ hono-stable 110 0 25
✅ nextjs-turbopack-canary 116 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 135 0 0
✅ nextjs-webpack-canary 116 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 135 0 0
✅ nitro-stable 110 0 25
✅ nuxt-stable 110 0 25
✅ sveltekit-stable 129 0 6
✅ vite-stable 110 0 25
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 135 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 110 0 25
✅ e2e-local-dev-tanstack-start- 110 0 25
✅ e2e-local-postgres-nest-stable 110 0 25
✅ e2e-local-postgres-tanstack-start- 110 0 25
✅ e2e-local-prod-nest-stable 110 0 25
✅ e2e-local-prod-tanstack-start- 110 0 25
✅ e2e-vercel-prod-tanstack-start 109 0 26

📋 View full workflow run


Some E2E test jobs failed:

  • Vercel Prod: failure
  • Local Dev: success
  • Local Prod: success
  • Local Postgres: success
  • Windows: success

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 31, 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.040s (-6.3% 🟢) 1.006s (~) 0.965s 10 1.00x
💻 Local Express 0.043s (-2.9%) 1.006s (~) 0.963s 10 1.06x
🐘 Postgres Express 0.053s (-9.3% 🟢) 1.010s (~) 0.957s 10 1.30x
💻 Local Next.js (Turbopack) 0.058s 1.005s 0.947s 10 1.43x
🐘 Postgres Nitro 0.063s (-33.6% 🟢) 1.013s (-2.9%) 0.950s 10 1.56x
🐘 Postgres Next.js (Turbopack) 0.068s 1.012s 0.944s 10 1.69x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.299s (+26.9% 🔺) 2.326s (+8.9% 🔺) 2.027s 10 1.00x
▲ Vercel Next.js (Turbopack) 0.301s (+19.5% 🔺) 2.352s (+0.8%) 2.052s 10 1.01x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.095s (-3.2%) 2.006s (~) 0.911s 10 1.00x
💻 Local Express 1.101s (-2.2%) 2.006s (~) 0.905s 10 1.01x
🐘 Postgres Nitro 1.105s (-3.0%) 2.010s (~) 0.905s 10 1.01x
🐘 Postgres Express 1.107s (-3.5%) 2.009s (~) 0.903s 10 1.01x
💻 Local Next.js (Turbopack) 1.132s 2.006s 0.874s 10 1.03x
🐘 Postgres Next.js (Turbopack) 1.139s 2.010s 0.871s 10 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.725s (-8.0% 🟢) 6.340s (+66.5% 🔺) 4.615s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.754s (-13.8% 🟢) 6.069s (+58.4% 🔺) 4.315s 10 1.02x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 10.530s (-3.6%) 11.023s (~) 0.493s 3 1.00x
💻 Local Nitro 10.534s (-3.8%) 11.023s (~) 0.489s 3 1.00x
🐘 Postgres Express 10.550s (-3.8%) 11.018s (~) 0.469s 3 1.00x
🐘 Postgres Nitro 10.559s (-2.9%) 11.018s (~) 0.460s 3 1.00x
💻 Local Next.js (Turbopack) 10.815s 11.021s 0.206s 3 1.03x
🐘 Postgres Next.js (Turbopack) 10.877s 11.019s 0.141s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 14.127s (-18.4% 🟢) 15.554s (-19.8% 🟢) 1.427s 2 1.00x
▲ Vercel Express 14.338s (-15.6% 🟢) 16.215s (-19.0% 🟢) 1.878s 2 1.01x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 13.736s (-8.2% 🟢) 14.027s (-6.7% 🟢) 0.291s 5 1.00x
💻 Local Nitro 13.739s (-8.8% 🟢) 14.026s (-12.5% 🟢) 0.287s 5 1.00x
🐘 Postgres Express 13.827s (-5.2% 🟢) 14.016s (-6.7% 🟢) 0.190s 5 1.01x
🐘 Postgres Nitro 13.863s (-5.0% 🟢) 14.020s (-6.7% 🟢) 0.157s 5 1.01x
💻 Local Next.js (Turbopack) 14.434s 15.029s 0.595s 4 1.05x
🐘 Postgres Next.js (Turbopack) 14.567s 15.026s 0.459s 4 1.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 21.767s (-56.7% 🟢) 23.611s (-55.1% 🟢) 1.844s 3 1.00x
▲ Vercel Next.js (Turbopack) 22.170s (-57.8% 🟢) 24.330s (-55.4% 🟢) 2.160s 3 1.02x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 12.405s (-11.4% 🟢) 13.016s (-10.8% 🟢) 0.612s 7 1.00x
💻 Local Nitro 12.512s (-25.4% 🟢) 13.025s (-23.5% 🟢) 0.513s 7 1.01x
🐘 Postgres Nitro 12.555s (-10.1% 🟢) 13.020s (-9.0% 🟢) 0.464s 7 1.01x
💻 Local Express 12.673s (-23.7% 🟢) 13.170s (-22.7% 🟢) 0.497s 7 1.02x
💻 Local Next.js (Turbopack) 13.514s 14.026s 0.512s 7 1.09x
🐘 Postgres Next.js (Turbopack) 13.875s 14.162s 0.287s 7 1.12x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 29.889s (-75.3% 🟢) 31.918s (-74.2% 🟢) 2.028s 3 1.00x
▲ Vercel Next.js (Turbopack) 30.963s (-92.1% 🟢) 33.325s (-91.6% 🟢) 2.363s 3 1.04x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.168s (-7.3% 🟢) 2.007s (~) 0.839s 15 1.00x
🐘 Postgres Nitro 1.189s (-6.7% 🟢) 2.007s (~) 0.818s 15 1.02x
💻 Local Express 1.213s (-18.5% 🟢) 2.006s (~) 0.793s 15 1.04x
💻 Local Nitro 1.228s (-24.7% 🟢) 2.006s (-3.3%) 0.778s 15 1.05x
🐘 Postgres Next.js (Turbopack) 1.272s 2.008s 0.736s 15 1.09x
💻 Local Next.js (Turbopack) 1.310s 2.005s 0.695s 15 1.12x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.605s (-8.9% 🟢) 4.437s (-4.0%) 1.833s 7 1.00x
▲ Vercel Next.js (Turbopack) 2.701s (-20.5% 🟢) 4.243s (-14.0% 🟢) 1.542s 8 1.04x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.213s (-48.6% 🟢) 2.007s (-33.3% 🟢) 0.794s 15 1.00x
🐘 Postgres Nitro 1.257s (-46.5% 🟢) 2.009s (-33.2% 🟢) 0.752s 15 1.04x
🐘 Postgres Next.js (Turbopack) 1.435s 2.008s 0.573s 15 1.18x
💻 Local Next.js (Turbopack) 1.702s 2.005s 0.303s 15 1.40x
💻 Local Express 1.860s (-37.0% 🟢) 2.150s (-37.7% 🟢) 0.291s 14 1.53x
💻 Local Nitro 1.911s (-39.2% 🟢) 2.222s (-42.8% 🟢) 0.311s 14 1.58x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.350s (-7.5% 🟢) 5.108s (~) 1.758s 6 1.00x
▲ Vercel Next.js (Turbopack) 3.671s (-48.3% 🟢) 6.307s (-29.2% 🟢) 2.635s 5 1.10x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.319s (-62.2% 🟢) 2.007s (-50.0% 🟢) 0.687s 15 1.00x
🐘 Postgres Nitro 1.413s (-59.4% 🟢) 2.007s (-49.9% 🟢) 0.595s 15 1.07x
🐘 Postgres Next.js (Turbopack) 1.775s 2.224s 0.449s 14 1.35x
💻 Local Next.js (Turbopack) 4.577s 5.012s 0.435s 6 3.47x
💻 Local Express 5.244s (-37.1% 🟢) 5.847s (-35.2% 🟢) 0.603s 6 3.97x
💻 Local Nitro 5.396s (-35.4% 🟢) 6.213s (-31.1% 🟢) 0.817s 5 4.09x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 105.877s (+2397.1% 🔺) 110.324s (+1700.6% 🔺) 4.447s 3 1.00x
▲ Vercel Next.js (Turbopack) 308.487s (+3360.1% 🔺) 310.186s (+2730.1% 🔺) 1.699s 1 2.91x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.171s (-6.9% 🟢) 2.008s (~) 0.837s 15 1.00x
🐘 Postgres Nitro 1.182s (-5.9% 🟢) 2.008s (~) 0.826s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.263s 2.008s 0.745s 15 1.08x
💻 Local Next.js (Turbopack) 1.404s 2.006s 0.602s 15 1.20x
💻 Local Nitro 1.558s (-16.5% 🟢) 2.006s (-14.3% 🟢) 0.448s 15 1.33x
💻 Local Express 1.586s (-16.2% 🟢) 2.006s (-15.1% 🟢) 0.420s 15 1.35x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.402s (-7.0% 🟢) 3.849s (-11.5% 🟢) 1.448s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.493s (-15.0% 🟢) 3.996s (-13.9% 🟢) 1.503s 8 1.04x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.274s (-45.6% 🟢) 2.074s (-31.1% 🟢) 0.801s 15 1.00x
🐘 Postgres Nitro 1.288s (-45.0% 🟢) 2.008s (-33.3% 🟢) 0.720s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.400s 2.008s 0.608s 15 1.10x
💻 Local Nitro 2.065s (-32.6% 🟢) 2.591s (-33.3% 🟢) 0.526s 12 1.62x
💻 Local Next.js (Turbopack) 2.121s 2.510s 0.389s 12 1.66x
💻 Local Express 2.131s (-32.0% 🟢) 2.675s (-28.9% 🟢) 0.544s 12 1.67x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.397s (+6.4% 🔺) 5.075s (+5.9% 🔺) 1.678s 6 1.00x
▲ Vercel Next.js (Turbopack) 3.712s (+18.1% 🔺) 5.507s (+21.8% 🔺) 1.794s 6 1.09x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.328s (-62.0% 🟢) 2.008s (-49.9% 🟢) 0.680s 15 1.00x
🐘 Postgres Nitro 1.452s (-58.3% 🟢) 2.074s (-48.3% 🟢) 0.622s 15 1.09x
🐘 Postgres Next.js (Turbopack) 1.771s 2.471s 0.701s 13 1.33x
💻 Local Next.js (Turbopack) 5.005s 5.517s 0.512s 6 3.77x
💻 Local Express 6.381s (-27.5% 🟢) 6.815s (-26.5% 🟢) 0.434s 5 4.80x
💻 Local Nitro 6.392s (-30.1% 🟢) 6.816s (-32.0% 🟢) 0.424s 5 4.81x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 66.173s (+879.3% 🔺) 68.299s (+699.4% 🔺) 2.126s 5 1.00x
▲ Vercel Express 108.275s (+1587.3% 🔺) 109.980s (+1244.8% 🔺) 1.705s 3 1.64x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.560s (-33.3% 🟢) 1.023s (~) 0.463s 59 1.00x
💻 Local Express 0.603s (-38.8% 🟢) 1.005s (-6.6% 🟢) 0.402s 60 1.08x
💻 Local Nitro 0.615s (-37.3% 🟢) 1.022s (-6.6% 🟢) 0.407s 59 1.10x
🐘 Postgres Nitro 0.623s (-24.1% 🟢) 1.058s (+5.2% 🔺) 0.436s 58 1.11x
🐘 Postgres Next.js (Turbopack) 0.843s 1.007s 0.164s 60 1.51x
💻 Local Next.js (Turbopack) 0.850s 1.004s 0.154s 60 1.52x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.076s (-73.3% 🟢) 7.323s (-65.7% 🟢) 2.248s 9 1.00x
▲ Vercel Next.js (Turbopack) 5.313s (-63.4% 🟢) 7.516s (-53.3% 🟢) 2.204s 8 1.05x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | 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.342s (-32.1% 🟢) 2.029s (-10.1% 🟢) 0.687s 45 1.00x
🐘 Postgres Nitro 1.346s (-30.1% 🟢) 2.008s (-4.4%) 0.661s 45 1.00x
💻 Local Nitro 1.484s (-51.1% 🟢) 2.006s (-46.6% 🟢) 0.522s 45 1.11x
💻 Local Express 1.568s (-48.0% 🟢) 2.029s (-43.4% 🟢) 0.461s 45 1.17x
💻 Local Next.js (Turbopack) 2.088s 2.943s 0.855s 31 1.56x
🐘 Postgres Next.js (Turbopack) 2.213s 3.045s 0.832s 30 1.65x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.314s (-61.4% 🟢) 16.008s (-56.5% 🟢) 2.694s 6 1.00x
▲ Vercel Next.js (Turbopack) 14.550s (-70.8% 🟢) 16.412s (-68.3% 🟢) 1.862s 6 1.09x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | 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.574s (-35.5% 🟢) 3.033s (-30.6% 🟢) 0.459s 40 1.00x
🐘 Postgres Nitro 2.648s (-35.5% 🟢) 3.009s (-34.6% 🟢) 0.361s 40 1.03x
💻 Local Nitro 3.229s (-65.3% 🟢) 4.009s (-60.0% 🟢) 0.780s 30 1.25x
💻 Local Express 3.328s (-63.9% 🟢) 4.009s (-60.0% 🟢) 0.681s 30 1.29x
🐘 Postgres Next.js (Turbopack) 4.261s 5.013s 0.752s 24 1.66x
💻 Local Next.js (Turbopack) 4.296s 5.010s 0.714s 24 1.67x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 30.149s (-76.8% 🟢) 31.788s (-75.9% 🟢) 1.639s 4 1.00x
▲ Vercel Next.js (Turbopack) 32.110s (-70.0% 🟢) 34.798s (-68.1% 🟢) 2.688s 4 1.07x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | 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.200s (-29.1% 🟢) 1.006s (~) 0.805s 60 1.00x
🐘 Postgres Nitro 0.226s (-20.4% 🟢) 1.006s (~) 0.780s 60 1.13x
🐘 Postgres Next.js (Turbopack) 0.291s 1.008s 0.717s 60 1.45x
💻 Local Nitro 0.446s (-26.3% 🟢) 1.004s (-1.7%) 0.559s 60 2.23x
💻 Local Express 0.523s (-6.6% 🟢) 1.095s (+9.1% 🔺) 0.572s 55 2.61x
💻 Local Next.js (Turbopack) 0.595s 1.022s 0.427s 59 2.97x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.651s (+35.6% 🔺) 4.521s (+24.3% 🔺) 1.870s 14 1.00x
▲ Vercel Next.js (Turbopack) 32.500s (+1506.9% 🔺) 34.864s (+819.0% 🔺) 2.364s 10 12.26x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.311s (-38.9% 🟢) 1.006s (~) 0.695s 90 1.00x
🐘 Postgres Nitro 0.370s (-25.5% 🟢) 1.018s (+1.1%) 0.648s 89 1.19x
🐘 Postgres Next.js (Turbopack) 0.502s 1.006s 0.504s 90 1.61x
💻 Local Nitro 2.114s (-16.7% 🟢) 2.637s (-12.4% 🟢) 0.524s 35 6.79x
💻 Local Express 2.115s (-15.8% 🟢) 2.715s (-9.8% 🟢) 0.600s 34 6.80x
💻 Local Next.js (Turbopack) 2.328s 3.076s 0.748s 30 7.48x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.812s (+64.4% 🔺) 10.281s (+98.0% 🔺) 4.469s 9 1.00x
▲ Vercel Express 308.226s (+10017.3% 🔺) 309.686s (+6342.0% 🔺) 1.460s 1 53.03x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.594s (-27.5% 🟢) 1.006s (-1.2%) 0.412s 120 1.00x
🐘 Postgres Nitro 0.693s (-12.3% 🟢) 1.006s (~) 0.313s 120 1.17x
🐘 Postgres Next.js (Turbopack) 1.008s 1.748s 0.740s 69 1.70x
💻 Local Nitro 9.567s (-14.5% 🟢) 10.279s (-11.9% 🟢) 0.712s 12 16.11x
💻 Local Express 9.765s (-12.7% 🟢) 10.274s (-14.0% 🟢) 0.509s 12 16.44x
💻 Local Next.js (Turbopack) 10.331s 11.301s 0.970s 11 17.40x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 11.538s (+11.7% 🔺) 15.094s (+22.9% 🔺) 3.556s 8 1.00x
▲ Vercel Express 13.016s (+75.4% 🔺) 18.531s (+100.5% 🔺) 5.514s 7 1.13x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.157s (+464.2% 🔺) 2.001s (+100.4% 🔺) 0.001s (-25.0% 🟢) 2.009s (+98.7% 🔺) 0.852s 10 1.00x
🐘 Postgres Nitro 1.162s (+466.9% 🔺) 1.998s (+99.9% 🔺) 0.002s (+20.0% 🔺) 2.012s (+98.9% 🔺) 0.849s 10 1.00x
💻 Local Express 1.165s (+485.3% 🔺) 2.005s (+99.6% 🔺) 0.012s (+1.7%) 2.020s (+98.4% 🔺) 0.854s 10 1.01x
💻 Local Nitro 1.167s (+446.1% 🔺) 2.005s (+99.6% 🔺) 0.012s (-6.4% 🟢) 2.019s (+98.2% 🔺) 0.852s 10 1.01x
💻 Local Next.js (Turbopack) 1.210s 2.003s 0.011s 2.018s 0.808s 10 1.05x
🐘 Postgres Next.js (Turbopack) 1.249s 2.003s 0.001s 2.013s 0.765s 10 1.08x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.209s (-67.8% 🟢) 3.274s (-62.2% 🟢) 1.704s (+169.7% 🔺) 5.698s (-41.8% 🟢) 3.489s 10 1.00x
▲ Vercel Express 2.299s (-8.2% 🟢) 3.606s (-11.9% 🟢) 1.202s (+25.1% 🔺) 5.334s (-4.6%) 3.035s 10 1.04x
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack) | Express

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.556s (+146.9% 🔺) 2.008s (+99.5% 🔺) 0.003s (-12.1% 🟢) 2.022s (+97.6% 🔺) 0.466s 30 1.00x
💻 Local Nitro 1.588s (+89.3% 🔺) 2.009s (+98.6% 🔺) 0.011s (+17.0% 🔺) 2.022s (+81.2% 🔺) 0.434s 30 1.02x
🐘 Postgres Nitro 1.608s (+157.6% 🔺) 2.007s (+99.3% 🔺) 0.004s (-4.1%) 2.028s (+98.4% 🔺) 0.420s 30 1.03x
🐘 Postgres Next.js (Turbopack) 1.800s 2.010s 0.004s 2.026s 0.226s 30 1.16x
💻 Local Express 2.008s (+165.3% 🔺) 2.010s (+95.3% 🔺) 0.010s (+1.6%) 2.423s (+133.0% 🔺) 0.414s 25 1.29x
💻 Local Next.js (Turbopack) 2.120s 2.008s 0.010s 2.422s 0.302s 25 1.36x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.660s (-13.0% 🟢) 8.452s (+5.5% 🔺) 0.237s (-42.0% 🟢) 9.212s (+4.3%) 3.552s 7 1.00x
▲ Vercel Next.js (Turbopack) 6.049s (-64.2% 🟢) 7.902s (-56.7% 🟢) 0.237s (+12.3% 🔺) 8.625s (-54.4% 🟢) 2.576s 7 1.07x
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express | 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.693s (-27.9% 🟢) 1.051s (-17.7% 🟢) 0.000s (+61.4% 🔺) 1.059s (-18.9% 🟢) 0.366s 57 1.00x
🐘 Postgres Nitro 0.700s (-27.7% 🟢) 1.015s (-18.7% 🟢) 0.000s (-59.3% 🟢) 1.025s (-18.5% 🟢) 0.324s 59 1.01x
🐘 Postgres Next.js (Turbopack) 0.856s 1.129s 0.000s 1.138s 0.281s 54 1.24x
💻 Local Nitro 1.352s (+10.5% 🔺) 2.014s (~) 0.000s (+266.7% 🔺) 2.016s (~) 0.665s 30 1.95x
💻 Local Express 1.438s (+17.4% 🔺) 2.014s (~) 0.000s (-10.0% 🟢) 2.016s (~) 0.579s 30 2.07x
💻 Local Next.js (Turbopack) 1.502s 2.013s 0.000s 2.016s 0.514s 30 2.17x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.377s (-9.7% 🟢) 4.775s (-6.4% 🟢) 0.000s (-54.2% 🟢) 5.283s (-4.5%) 1.906s 12 1.00x
▲ Vercel Next.js (Turbopack) 3.993s (-60.8% 🟢) 5.325s (-53.8% 🟢) 0.000s (+Infinity% 🔺) 5.894s (-51.1% 🟢) 1.901s 11 1.18x
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express | 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.406s (-20.6% 🟢) 2.104s (-3.4%) 0.000s (+Infinity% 🔺) 2.120s (-3.6%) 0.714s 29 1.00x
🐘 Postgres Nitro 1.518s (-15.3% 🟢) 2.178s (+1.7%) 0.000s (-100.0% 🟢) 2.189s (+0.7%) 0.671s 28 1.08x
🐘 Postgres Next.js (Turbopack) 1.676s 2.226s 0.000s 2.234s 0.558s 27 1.19x
💻 Local Next.js (Turbopack) 3.003s 3.556s 0.001s 3.561s 0.557s 17 2.14x
💻 Local Express 3.128s (-9.8% 🟢) 3.668s (-9.1% 🟢) 0.000s (-41.2% 🟢) 3.679s (-8.8% 🟢) 0.552s 17 2.22x
💻 Local Nitro 3.136s (-7.4% 🟢) 3.833s (-4.9%) 0.001s (+75.8% 🔺) 3.841s (-4.8%) 0.705s 16 2.23x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 49.669s (+784.3% 🔺) 52.156s (+647.0% 🔺) 0.000s (+14.3% 🔺) 54.191s (+618.7% 🔺) 4.522s 7 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Nitro 11/21
🐘 Postgres Express 20/21
▲ Vercel Express 15/21
Fastest World by Framework

Winner determined by most benchmark wins

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

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