Skip to content

fix(next): stabilize deferred canary e2e in nextjs workbenches#1468

Open
ijjk wants to merge 9 commits intomainfrom
ijjk/re-enable-agent-tests
Open

fix(next): stabilize deferred canary e2e in nextjs workbenches#1468
ijjk wants to merge 9 commits intomainfrom
ijjk/re-enable-agent-tests

Conversation

@ijjk
Copy link
Member

@ijjk ijjk commented Mar 20, 2026

Deferred build stabilization (canary)

  • Fixed a race in deferred discovery validation where newly discovered workflow/step files could be dropped during concurrent validation + discovery updates.
  • Stabilized deferred watch rebuild handling so transient stale/missing discovered files trigger a retry based on refreshed input signatures.
  • Ensured deferred workflow bundling does not retain interim esbuild contexts between passes (keepInterimBundleContext: false) to avoid context buildup in canary watch mode.

Validation

  • nextjs-turbopack (Next.js canary): repeated packages/core/e2e/dev.test.ts runs passed.
  • nextjs-webpack (Next.js canary): packages/core/e2e/dev.test.ts passed.

Brief summary:

  • Fixes deferred workflow discovery bootstrap for Next.js canary by initializing from the entry graph rather than dot-prefixed file seeding.
  • Keeps alias handling aligned for app/pages/workflows and symlinked paths.
  • Validated test:e2e for both workbench/nextjs-webpack and workbench/nextjs-turbopack with NEXT_CANARY=1.

x-ref: #1400

This reverts commit a2c0c7e.

…xperimental DurableAgent tests (#1400)"

This reverts commit a2c0c7e.
@changeset-bot
Copy link

changeset-bot bot commented Mar 20, 2026

🦋 Changeset detected

Latest commit: a25e1b2

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

This PR includes changesets to release 16 packages
Name Type
@workflow/builders Patch
@workflow/next Patch
@workflow/astro Patch
@workflow/cli Patch
@workflow/nest Patch
@workflow/nitro Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch
@workflow/vitest Patch
workflow Patch
@workflow/world-testing Patch
@workflow/nuxt Patch
@workflow/ai Patch
@workflow/core Patch
@workflow/web-shared 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
Contributor

vercel bot commented Mar 20, 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 Mar 21, 2026 11:13pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Mar 21, 2026 11:13pm
example-workflow Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workbench-astro-workflow Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workbench-express-workflow Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workbench-fastify-workflow Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workbench-hono-workflow Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workbench-nestjs-workflow Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workbench-nitro-workflow Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workbench-nuxt-workflow Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workbench-vite-workflow Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workflow-docs Ready Ready Preview, Comment, Open in v0 Mar 21, 2026 11:13pm
workflow-nest Ready Ready Preview, Comment Mar 21, 2026 11:13pm
workflow-swc-playground Ready Ready Preview, Comment Mar 21, 2026 11:13pm

@github-actions
Copy link
Contributor

github-actions bot commented Mar 20, 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 🥇 Express 0.048s (+6.3% 🔺) 1.006s (~) 0.958s 10 1.00x
💻 Local Nitro 0.048s (~) 1.006s (~) 0.958s 10 1.00x
💻 Local Next.js (Turbopack) 0.049s 1.005s 0.956s 10 1.02x
🐘 Postgres Next.js (Turbopack) 0.053s 1.011s 0.958s 10 1.12x
🌐 Redis Next.js (Turbopack) 0.055s 1.005s 0.950s 10 1.15x
🐘 Postgres Express 0.059s (-17.4% 🟢) 1.012s (~) 0.954s 10 1.23x
🐘 Postgres Nitro 0.061s (-11.4% 🟢) 1.012s (~) 0.950s 10 1.29x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.440s (-23.7% 🟢) 2.286s (-10.6% 🟢) 1.846s 10 1.00x
▲ Vercel Nitro 0.503s (+1.4%) 2.397s (-5.8% 🟢) 1.895s 10 1.14x
▲ Vercel Next.js (Turbopack) 0.503s (-30.2% 🟢) 2.527s (-2.4%) 2.023s 10 1.14x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 1.123s 2.006s 0.883s 10 1.00x
🐘 Postgres Next.js (Turbopack) 1.124s 2.012s 0.888s 10 1.00x
💻 Local Express 1.126s (~) 2.005s (~) 0.880s 10 1.00x
🌐 Redis Next.js (Turbopack) 1.127s 2.006s 0.880s 10 1.00x
💻 Local Nitro 1.129s (~) 2.006s (~) 0.877s 10 1.01x
🐘 Postgres Express 1.147s (+0.7%) 2.013s (~) 0.866s 10 1.02x
🐘 Postgres Nitro 1.157s (+1.3%) 2.011s (~) 0.854s 10 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.061s (-11.3% 🟢) 3.701s (-2.9%) 1.640s 10 1.00x
▲ Vercel Express 2.115s (-4.2%) 3.576s (-8.2% 🟢) 1.461s 10 1.03x
▲ Vercel Nitro 2.140s (-8.4% 🟢) 3.709s (-4.3%) 1.569s 10 1.04x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 10.739s 11.023s 0.284s 3 1.00x
🐘 Postgres Next.js (Turbopack) 10.764s 11.036s 0.272s 3 1.00x
💻 Local Next.js (Turbopack) 10.787s 11.023s 0.236s 3 1.00x
💻 Local Express 10.932s (~) 11.023s (~) 0.091s 3 1.02x
🐘 Postgres Nitro 10.959s (~) 11.042s (~) 0.083s 3 1.02x
🐘 Postgres Express 10.959s (~) 11.043s (~) 0.084s 3 1.02x
💻 Local Nitro 10.977s (+0.8%) 11.023s (~) 0.046s 3 1.02x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 16.893s (-4.9%) 19.010s (-4.0%) 2.117s 2 1.00x
▲ Vercel Nitro 17.543s (+0.8%) 19.288s (+2.3%) 1.746s 2 1.04x
▲ Vercel Express 17.852s (+2.7%) 19.555s (+1.0%) 1.703s 2 1.06x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 14.232s 15.042s 0.810s 4 1.00x
🌐 Redis Next.js (Turbopack) 14.258s 15.029s 0.771s 4 1.00x
💻 Local Next.js (Turbopack) 14.557s 15.029s 0.471s 4 1.02x
🐘 Postgres Nitro 14.692s (-0.9%) 15.041s (~) 0.348s 4 1.03x
🐘 Postgres Express 14.704s (+0.9%) 15.043s (~) 0.340s 4 1.03x
💻 Local Express 14.967s (~) 15.029s (-3.2%) 0.062s 4 1.05x
💻 Local Nitro 15.130s (+1.5%) 16.032s (+6.7% 🔺) 0.902s 4 1.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 31.652s (-6.3% 🟢) 33.516s (-5.8% 🟢) 1.864s 2 1.00x
▲ Vercel Next.js (Turbopack) 32.347s (~) 33.995s (-2.0%) 1.648s 2 1.02x
▲ Vercel Nitro 33.794s (+4.5%) 35.249s (+1.4%) 1.455s 2 1.07x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 13.276s 14.040s 0.764s 7 1.00x
🌐 Redis Next.js (Turbopack) 13.416s 14.025s 0.609s 7 1.01x
🐘 Postgres Nitro 14.135s (-1.6%) 15.039s (~) 0.904s 6 1.06x
🐘 Postgres Express 14.304s (+2.1%) 15.040s (+4.0%) 0.736s 6 1.08x
💻 Local Next.js (Turbopack) 16.079s 16.531s 0.452s 6 1.21x
💻 Local Express 16.735s (~) 17.032s (~) 0.297s 6 1.26x
💻 Local Nitro 16.930s (+2.9%) 17.033s (~) 0.103s 6 1.28x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 55.088s (-2.0%) 57.127s (~) 2.039s 2 1.00x
▲ Vercel Express 55.998s (-2.9%) 57.693s (-3.0%) 1.695s 2 1.02x
▲ Vercel Next.js (Turbopack) 60.307s (-3.9%) 62.150s (-3.6%) 1.843s 2 1.09x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.212s 2.010s 0.799s 15 1.00x
🐘 Postgres Nitro 1.279s (-1.1%) 2.011s (~) 0.732s 15 1.06x
🐘 Postgres Express 1.281s (+1.2%) 2.011s (~) 0.730s 15 1.06x
🌐 Redis Next.js (Turbopack) 1.321s 2.007s 0.686s 15 1.09x
💻 Local Next.js (Turbopack) 1.517s 2.005s 0.488s 15 1.25x
💻 Local Express 1.525s (+1.2%) 2.005s (~) 0.481s 15 1.26x
💻 Local Nitro 1.566s (+5.6% 🔺) 2.007s (~) 0.441s 15 1.29x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.471s (-5.6% 🟢) 4.002s (-4.7%) 1.531s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.587s (+3.8%) 3.844s (-1.5%) 1.257s 8 1.05x
▲ Vercel Express 2.810s (+1.9%) 4.066s (-11.9% 🟢) 1.256s 8 1.14x

🔍 Observability: Nitro | Next.js (Turbopack) | Express

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.438s (-1.3%) 3.011s (~) 0.573s 10 1.00x
🐘 Postgres Next.js (Turbopack) 2.447s 3.012s 0.565s 10 1.00x
🐘 Postgres Express 2.477s (+0.7%) 3.012s (~) 0.535s 10 1.02x
🌐 Redis Next.js (Turbopack) 2.575s 3.008s 0.433s 10 1.06x
💻 Local Nitro 2.998s (+4.4%) 3.565s (+14.7% 🔺) 0.567s 9 1.23x
💻 Local Express 3.002s (~) 3.759s (+5.4% 🔺) 0.757s 8 1.23x
💻 Local Next.js (Turbopack) 3.257s 4.010s 0.753s 8 1.34x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.941s (+3.0%) 4.319s (-3.2%) 1.378s 8 1.00x
▲ Vercel Next.js (Turbopack) 3.525s (+34.0% 🔺) 4.604s (+14.4% 🔺) 1.079s 7 1.20x
▲ Vercel Nitro 3.882s (+53.0% 🔺) 5.278s (+38.6% 🔺) 1.396s 6 1.32x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.588s (-1.2%) 4.012s (~) 0.425s 8 1.00x
🐘 Postgres Express 3.654s (+1.8%) 4.013s (~) 0.360s 8 1.02x
🐘 Postgres Next.js (Turbopack) 3.703s 4.013s 0.310s 8 1.03x
🌐 Redis Next.js (Turbopack) 4.146s 4.869s 0.723s 7 1.16x
💻 Local Express 8.306s (-2.0%) 9.021s (~) 0.715s 4 2.32x
💻 Local Next.js (Turbopack) 8.471s 9.272s 0.801s 4 2.36x
💻 Local Nitro 8.615s (+6.1% 🔺) 9.275s (+5.8% 🔺) 0.660s 4 2.40x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.109s (-5.4% 🟢) 4.614s (-1.1%) 1.505s 7 1.00x
▲ Vercel Nitro 3.372s (+10.8% 🔺) 4.903s (+9.7% 🔺) 1.531s 7 1.08x
▲ Vercel Next.js (Turbopack) 3.542s (+5.6% 🔺) 5.083s (+1.4%) 1.540s 6 1.14x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.198s 2.011s 0.813s 15 1.00x
🌐 Redis Next.js (Turbopack) 1.263s 2.006s 0.744s 15 1.05x
🐘 Postgres Express 1.273s (+1.1%) 2.011s (~) 0.738s 15 1.06x
🐘 Postgres Nitro 1.279s (~) 2.010s (~) 0.731s 15 1.07x
💻 Local Next.js (Turbopack) 1.519s 2.006s 0.487s 15 1.27x
💻 Local Nitro 1.564s (~) 2.007s (~) 0.443s 15 1.30x
💻 Local Express 1.615s (+5.1% 🔺) 2.074s (+3.4%) 0.459s 15 1.35x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.168s (+2.0%) 3.594s (-2.7%) 1.426s 9 1.00x
▲ Vercel Next.js (Turbopack) 2.268s (-12.8% 🟢) 3.660s (-8.7% 🟢) 1.393s 9 1.05x
▲ Vercel Express 2.408s (+8.9% 🔺) 3.692s (-4.6%) 1.284s 9 1.11x

🔍 Observability: Nitro | Next.js (Turbopack) | Express

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 2.423s 3.010s 0.588s 10 1.00x
🐘 Postgres Nitro 2.453s (~) 3.011s (~) 0.557s 10 1.01x
🐘 Postgres Express 2.460s (~) 3.013s (~) 0.553s 10 1.02x
🌐 Redis Next.js (Turbopack) 2.568s 3.008s 0.440s 10 1.06x
💻 Local Express 3.051s (+0.6%) 3.888s (+3.4%) 0.836s 8 1.26x
💻 Local Next.js (Turbopack) 3.081s 3.885s 0.804s 8 1.27x
💻 Local Nitro 3.124s (+3.2%) 4.011s (+9.2% 🔺) 0.887s 8 1.29x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.569s (-0.7%) 3.805s (-1.4%) 1.237s 9 1.00x
▲ Vercel Express 2.677s (~) 3.984s (-13.6% 🟢) 1.307s 9 1.04x
▲ Vercel Next.js (Turbopack) 2.834s (+19.1% 🔺) 4.069s (+11.1% 🔺) 1.235s 8 1.10x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.593s (~) 4.014s (~) 0.420s 8 1.00x
🐘 Postgres Nitro 3.595s (-0.6%) 4.013s (~) 0.418s 8 1.00x
🐘 Postgres Next.js (Turbopack) 3.707s 4.013s 0.306s 8 1.03x
🌐 Redis Next.js (Turbopack) 4.133s 5.012s 0.880s 6 1.15x
💻 Local Next.js (Turbopack) 7.971s 8.518s 0.548s 4 2.22x
💻 Local Express 8.902s (-1.7%) 9.275s (-5.1% 🟢) 0.373s 4 2.48x
💻 Local Nitro 9.111s (+5.4% 🔺) 9.269s (+2.7%) 0.158s 4 2.54x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.809s (-8.4% 🟢) 4.156s (-8.5% 🟢) 1.347s 8 1.00x
▲ Vercel Nitro 2.935s (+3.7%) 4.360s (-1.6%) 1.425s 7 1.04x
▲ Vercel Next.js (Turbopack) 3.895s (-0.6%) 5.275s (-3.9%) 1.381s 6 1.39x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

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.677s 1.009s 0.332s 60 1.00x
🌐 Redis Next.js (Turbopack) 0.688s 1.004s 0.317s 60 1.02x
💻 Local Next.js (Turbopack) 0.822s 1.021s 0.200s 59 1.21x
🐘 Postgres Nitro 0.859s (-4.2%) 1.008s (-3.3%) 0.149s 60 1.27x
🐘 Postgres Express 0.897s (+3.6%) 1.043s (+1.7%) 0.146s 58 1.33x
💻 Local Express 1.017s (+3.4%) 1.530s (+39.7% 🔺) 0.514s 40 1.50x
💻 Local Nitro 1.031s (+7.8% 🔺) 1.881s (+84.2% 🔺) 0.851s 32 1.52x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 9.491s (-9.6% 🟢) 10.812s (-12.3% 🟢) 1.321s 6 1.00x
▲ Vercel Nitro 10.323s (+8.1% 🔺) 11.977s (+9.5% 🔺) 1.654s 6 1.09x
▲ Vercel Express 11.577s (+16.5% 🔺) 13.150s (+12.4% 🔺) 1.573s 5 1.22x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 1.633s 2.006s 0.373s 45 1.00x
🐘 Postgres Next.js (Turbopack) 1.639s 2.032s 0.393s 45 1.00x
🐘 Postgres Nitro 2.028s (-6.2% 🟢) 2.737s (-8.1% 🟢) 0.709s 33 1.24x
🐘 Postgres Express 2.165s (+2.3%) 3.012s (~) 0.847s 30 1.33x
💻 Local Next.js (Turbopack) 2.585s 3.007s 0.422s 30 1.58x
💻 Local Express 3.024s (~) 3.688s (+4.0%) 0.664s 25 1.85x
💻 Local Nitro 3.050s (+3.2%) 3.967s (+27.5% 🔺) 0.917s 23 1.87x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 29.813s (-10.3% 🟢) 31.727s (-9.7% 🟢) 1.914s 3 1.00x
▲ Vercel Nitro 30.562s (-1.5%) 32.294s (-0.6%) 1.732s 3 1.03x
▲ Vercel Next.js (Turbopack) 31.344s (-4.0%) 33.369s (-2.3%) 2.025s 3 1.05x

🔍 Observability: Express | 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 🥇 Next.js (Turbopack) 3.356s 4.013s 0.658s 30 1.00x
🌐 Redis Next.js (Turbopack) 3.414s 4.008s 0.594s 30 1.02x
🐘 Postgres Nitro 4.127s (-4.8%) 4.933s (-1.6%) 0.806s 25 1.23x
🐘 Postgres Express 4.425s (+3.8%) 5.014s (+0.8%) 0.589s 24 1.32x
💻 Local Next.js (Turbopack) 8.626s 9.160s 0.535s 14 2.57x
💻 Local Express 9.125s (~) 9.787s (~) 0.663s 13 2.72x
💻 Local Nitro 9.320s (+3.2%) 9.711s (+2.4%) 0.390s 13 2.78x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 82.105s (-11.1% 🟢) 84.002s (-10.9% 🟢) 1.898s 2 1.00x
▲ Vercel Express 83.022s (-5.8% 🟢) 84.412s (-6.0% 🟢) 1.391s 2 1.01x
▲ Vercel Next.js (Turbopack) 88.895s (-8.8% 🟢) 90.785s (-8.6% 🟢) 1.890s 2 1.08x

🔍 Observability: Nitro | 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 🥇 Next.js (Turbopack) 0.213s 1.009s 0.796s 60 1.00x
🐘 Postgres Nitro 0.293s (~) 1.008s (~) 0.715s 60 1.38x
🐘 Postgres Express 0.307s (+1.8%) 1.009s (~) 0.702s 60 1.44x
🌐 Redis Next.js (Turbopack) 0.411s 1.004s 0.594s 60 1.93x
💻 Local Next.js (Turbopack) 0.563s 1.004s 0.441s 60 2.65x
💻 Local Express 0.585s (-3.0%) 1.005s (~) 0.419s 60 2.75x
💻 Local Nitro 0.640s (+7.1% 🔺) 1.005s (~) 0.365s 60 3.01x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.936s (-22.9% 🟢) 3.264s (-19.0% 🟢) 1.328s 19 1.00x
▲ Vercel Nitro 2.180s (-6.0% 🟢) 3.432s (-11.3% 🟢) 1.252s 18 1.13x
▲ Vercel Next.js (Turbopack) 2.414s (+27.1% 🔺) 4.005s (+12.0% 🔺) 1.591s 16 1.25x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

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.504s 1.009s 0.505s 90 1.00x
🐘 Postgres Nitro 0.528s (-2.0%) 1.009s (~) 0.481s 90 1.05x
🐘 Postgres Express 0.534s (+1.3%) 1.010s (~) 0.475s 90 1.06x
🌐 Redis Next.js (Turbopack) 1.181s 2.006s 0.825s 45 2.34x
💻 Local Express 2.554s (-1.0%) 3.009s (~) 0.455s 30 5.07x
💻 Local Next.js (Turbopack) 2.574s 3.009s 0.436s 30 5.10x
💻 Local Nitro 2.705s (+9.3% 🔺) 3.010s (~) 0.305s 30 5.36x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.858s (-7.2% 🟢) 4.305s (-4.3%) 1.446s 21 1.00x
▲ Vercel Nitro 2.901s (~) 4.557s (+8.1% 🔺) 1.656s 20 1.02x
▲ Vercel Next.js (Turbopack) 3.388s (-1.5%) 4.702s (-2.2%) 1.315s 20 1.19x

🔍 Observability: Express | 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 🥇 Next.js (Turbopack) 0.743s 1.017s 0.275s 118 1.00x
🐘 Postgres Nitro 0.881s (-6.1% 🟢) 1.040s (-12.7% 🟢) 0.159s 116 1.19x
🐘 Postgres Express 0.940s (+4.7%) 1.228s (+18.0% 🔺) 0.288s 98 1.27x
🌐 Redis Next.js (Turbopack) 2.782s 3.057s 0.275s 40 3.75x
💻 Local Next.js (Turbopack) 10.592s 11.208s 0.616s 11 14.26x
💻 Local Express 11.334s (~) 11.850s (-1.5%) 0.516s 11 15.26x
💻 Local Nitro 11.970s (+7.7% 🔺) 12.426s (+6.5% 🔺) 0.457s 10 16.12x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.662s (-15.0% 🟢) 8.213s (-12.4% 🟢) 1.551s 15 1.00x
▲ Vercel Nitro 7.051s (-15.7% 🟢) 8.602s (-11.8% 🟢) 1.552s 15 1.06x
▲ Vercel Express 7.983s (+9.8% 🔺) 9.415s (+5.2% 🔺) 1.432s 13 1.20x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 0.168s 1.001s 0.012s 1.018s 0.850s 10 1.00x
🐘 Postgres Next.js (Turbopack) 0.174s 1.000s 0.001s 1.013s 0.838s 10 1.04x
🌐 Redis Next.js (Turbopack) 0.175s 1.000s 0.002s 1.007s 0.833s 10 1.04x
💻 Local Express 0.204s (~) 1.003s (~) 0.012s (+2.5%) 1.018s (~) 0.814s 10 1.21x
🐘 Postgres Nitro 0.211s (-11.8% 🟢) 0.992s (~) 0.001s (~) 1.011s (~) 0.800s 10 1.25x
💻 Local Nitro 0.211s (+7.4% 🔺) 1.003s (~) 0.011s (-4.2%) 1.018s (~) 0.807s 10 1.25x
🐘 Postgres Express 0.215s (-0.7%) 1.000s (+0.6%) 0.002s (+25.0% 🔺) 1.014s (~) 0.799s 10 1.28x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.527s (-9.5% 🟢) 2.524s (-4.4%) 0.555s (+9989.1% 🔺) 3.600s (+11.3% 🔺) 2.073s 10 1.00x
▲ Vercel Nitro 1.610s (-2.5%) 2.621s (-2.2%) 0.558s (+9193.3% 🔺) 3.745s (+14.4% 🔺) 2.135s 10 1.05x
▲ Vercel Next.js (Turbopack) 1.645s (-4.9%) 2.676s (-10.4% 🟢) 0.592s (+9606.6% 🔺) 3.845s (+7.0% 🔺) 2.201s 10 1.08x

🔍 Observability: Express | 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
🌐 Redis 🥇 Next.js (Turbopack) 0.487s 1.000s 0.005s 1.013s 0.526s 60 1.00x
🐘 Postgres Next.js (Turbopack) 0.605s 1.008s 0.003s 1.027s 0.422s 59 1.24x
🐘 Postgres Nitro 0.658s (-8.9% 🟢) 1.004s (~) 0.004s (+8.5% 🔺) 1.026s (~) 0.368s 59 1.35x
💻 Local Next.js (Turbopack) 0.686s 1.025s 0.010s 1.041s 0.355s 58 1.41x
🐘 Postgres Express 0.702s (+1.2%) 1.005s (~) 0.005s (+25.2% 🔺) 1.028s (~) 0.327s 59 1.44x
💻 Local Express 0.741s (-4.6%) 1.010s (-1.7%) 0.009s (-7.9% 🟢) 1.023s (-1.7%) 0.283s 59 1.52x
💻 Local Nitro 0.797s (+9.6% 🔺) 1.027s (+1.8%) 0.011s (+16.7% 🔺) 1.043s (+1.9%) 0.246s 58 1.64x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.913s (-9.6% 🟢) 4.895s (-11.1% 🟢) 0.210s (-19.7% 🟢) 5.647s (-10.3% 🟢) 1.734s 11 1.00x
▲ Vercel Express 3.923s (-10.1% 🟢) 4.936s (-11.5% 🟢) 0.283s (+6.3% 🔺) 5.725s (-10.8% 🟢) 1.802s 11 1.00x
▲ Vercel Next.js (Turbopack) 4.436s (-2.5%) 5.525s (-4.5%) 0.265s (+32.5% 🔺) 6.444s (-1.3%) 2.008s 10 1.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 0.893s 1.000s 0.000s 1.004s 0.111s 60 1.00x
🐘 Postgres Next.js (Turbopack) 1.061s 1.766s 0.000s 1.784s 0.723s 34 1.19x
🐘 Postgres Nitro 1.117s (+21.3% 🔺) 1.812s (+70.6% 🔺) 0.000s (+69.7% 🔺) 1.858s (+71.8% 🔺) 0.741s 33 1.25x
🐘 Postgres Express 1.167s (+30.7% 🔺) 1.960s (+81.0% 🔺) 0.000s (+77.4% 🔺) 1.980s (+79.2% 🔺) 0.812s 31 1.31x
💻 Local Next.js (Turbopack) 1.251s 2.020s 0.000s 2.024s 0.773s 30 1.40x
💻 Local Express 1.270s (+0.9%) 2.022s (~) 0.001s (-11.8% 🟢) 2.025s (~) 0.755s 30 1.42x
💻 Local Nitro 1.331s (+8.6% 🔺) 2.055s (+1.8%) 0.000s (-7.7% 🟢) 2.058s (+1.8%) 0.728s 30 1.49x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.028s (+26.6% 🔺) 3.666s (+11.5% 🔺) 0.001s (+Infinity% 🔺) 4.227s (+7.2% 🔺) 1.199s 15 1.00x
▲ Vercel Nitro 3.123s (+23.0% 🔺) 4.151s (+29.2% 🔺) 0.000s (+638.5% 🔺) 4.695s (+24.9% 🔺) 1.572s 13 1.03x
▲ Vercel Next.js (Turbopack) 3.182s (+8.6% 🔺) 4.068s (+2.0%) 0.000s (+34.6% 🔺) 4.673s (+1.8%) 1.492s 13 1.05x

🔍 Observability: Express | 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
🌐 Redis 🥇 Next.js (Turbopack) 1.634s 2.001s 0.000s 2.006s 0.372s 30 1.00x
🐘 Postgres Nitro 2.055s (+8.6% 🔺) 2.378s (+7.2% 🔺) 0.000s (+107.7% 🔺) 2.397s (+7.0% 🔺) 0.342s 26 1.26x
🐘 Postgres Express 2.072s (+14.8% 🔺) 2.648s (+26.2% 🔺) 0.000s (+Infinity% 🔺) 2.666s (+25.7% 🔺) 0.594s 23 1.27x
🐘 Postgres Next.js (Turbopack) 2.271s 3.055s 0.000s 3.090s 0.818s 20 1.39x
💻 Local Next.js (Turbopack) 3.548s 4.164s 0.001s 4.169s 0.621s 15 2.17x
💻 Local Express 3.712s (+7.8% 🔺) 4.232s (+3.3%) 0.001s (+62.5% 🔺) 4.236s (+3.3%) 0.524s 15 2.27x
💻 Local Nitro 3.927s (+18.0% 🔺) 4.391s (+10.6% 🔺) 0.000s (+14.3% 🔺) 4.395s (+10.6% 🔺) 0.468s 14 2.40x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.849s (+14.0% 🔺) 4.979s (+9.7% 🔺) 0.000s (-100.0% 🟢) 5.534s (+8.9% 🔺) 1.685s 12 1.00x
▲ Vercel Express 4.064s (+23.7% 🔺) 5.056s (+10.7% 🔺) 0.000s (-100.0% 🟢) 5.579s (+8.5% 🔺) 1.515s 11 1.06x
▲ Vercel Next.js (Turbopack) 4.319s (-1.1%) 5.284s (-2.1%) 0.000s (-100.0% 🟢) 5.886s (-1.3%) 1.568s 11 1.12x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Next.js (Turbopack) 16/21
🐘 Postgres Next.js (Turbopack) 17/21
▲ Vercel Express 10/21
Fastest World by Framework

Winner determined by most benchmark wins

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

📋 View full workflow run

@github-actions
Copy link
Contributor

github-actions bot commented Mar 20, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 780 0 67 847
✅ 💻 Local Development 782 0 142 924
✅ 📦 Local Production 782 0 142 924
✅ 🐘 Local Postgres 782 0 142 924
✅ 🪟 Windows 72 0 5 77
❌ 🌍 Community Worlds 118 56 21 195
✅ 📋 Other 198 0 33 231
Total 3514 56 552 4122

❌ Failed Tests

🌍 Community Worlds (56 failed)

mongodb (3 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KM9EYA9AHBJJ296NA4YDJ72C
  • webhookWorkflow | wrun_01KM9EYKC40E5NS7NQT61MAQYT
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KM9F4YAHFWJ1QWW9T7M7XMGE

redis (2 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KM9EYA9AHBJJ296NA4YDJ72C
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KM9F4YAHFWJ1QWW9T7M7XMGE

turso (51 failed):

  • addTenWorkflow | wrun_01KM9EX4WJ7C49PWQBYBQ0W11W
  • addTenWorkflow | wrun_01KM9EX4WJ7C49PWQBYBQ0W11W
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KM9ASX7ZN33YHD5A2Y27YKD3
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KM9EXBJ6F5492KCMG1GC0DGT
  • promiseRaceWorkflow | wrun_01KM9EXFYC9JX03S76H4284PAN
  • promiseAnyWorkflow | wrun_01KM9EXJ27JS2JYE2B05EM440C
  • importedStepOnlyWorkflow | wrun_01KM9ATAJ2KJ0XVMWGDFHM399S
  • hookWorkflow | wrun_01KM9EXZS98PFHV3Z9YDTQVZH5
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KM9EYA9AHBJJ296NA4YDJ72C
  • webhookWorkflow | wrun_01KM9EYKC40E5NS7NQT61MAQYT
  • sleepingWorkflow | wrun_01KM9EYTTYF9MFPMV7CYEPTKT6
  • parallelSleepWorkflow | wrun_01KM9EZ7FH7BMYF62P6YVM9GVJ
  • nullByteWorkflow | wrun_01KM9EZC12DACDYVZTG0QKWJ4C
  • workflowAndStepMetadataWorkflow | wrun_01KM9EZF46GDE7CR5MD4TP0CHH
  • fetchWorkflow | wrun_01KM9F17Z5TVVRXSPYYCZQK28Y
  • promiseRaceStressTestWorkflow | wrun_01KM9F1B2ZX8X8G4PNVPYMZS5H
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KM9F4A66C8F1KPYP17AJA9AA
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KM9F4YAHFWJ1QWW9T7M7XMGE
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KM9F5K302Y9RJ7VDFAXFGXFC
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KM9F68JSFWJYQEKJ44E7M7F7
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KM9F6HP6EX9G4TSFN5S3J7MT
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KM9F6Q4EF498KN2P69EJ2X36
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KM9F6SA7JKJTJP1NBADCPYJ1
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KM9F78H4ZBW9PF7Y8PNR0N84
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KM9F7E4PT7DT4VY4RF7SD7GY
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KM9F7MPVTEZ8HHDC3Y6NG1K0
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KM9F7V9PY5QHEB7YBXZM21YR
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KM9F82VERRCV5TRYVWEP5G5T
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KM9F89G6MWEYFCFBZVY02RKQ
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KM9F8G37P5Z8BNH7YB1R5C3G
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KM9F8TKBZGWYXQT986KHE3MA
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KM9F92DG6XWAC99KJHN4MNCD
  • cancelRun - cancelling a running workflow | wrun_01KM9F990D56MNRJ30WQZPVXZZ
  • cancelRun via CLI - cancelling a running workflow | wrun_01KM9F9J7PDHGFJ9WN8VQ654ET
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KM9F9YCRBD870AXZ4VGSVH0F
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KM9FAJ1TCB9HPC3TFNHDZK8J
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KM9FAW8WVJVKXZC6MAGRVPD9

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 70 0 7
✅ example 70 0 7
✅ express 70 0 7
✅ fastify 70 0 7
✅ hono 70 0 7
✅ nextjs-turbopack 75 0 2
✅ nextjs-webpack 75 0 2
✅ nitro 70 0 7
✅ nuxt 70 0 7
✅ sveltekit 70 0 7
✅ vite 70 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 66 0 11
✅ express-stable 66 0 11
✅ fastify-stable 66 0 11
✅ hono-stable 66 0 11
✅ nextjs-turbopack-canary 55 0 22
✅ nextjs-turbopack-stable 72 0 5
✅ nextjs-webpack-canary 55 0 22
✅ nextjs-webpack-stable 72 0 5
✅ nitro-stable 66 0 11
✅ nuxt-stable 66 0 11
✅ sveltekit-stable 66 0 11
✅ vite-stable 66 0 11
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 66 0 11
✅ express-stable 66 0 11
✅ fastify-stable 66 0 11
✅ hono-stable 66 0 11
✅ nextjs-turbopack-canary 55 0 22
✅ nextjs-turbopack-stable 72 0 5
✅ nextjs-webpack-canary 55 0 22
✅ nextjs-webpack-stable 72 0 5
✅ nitro-stable 66 0 11
✅ nuxt-stable 66 0 11
✅ sveltekit-stable 66 0 11
✅ vite-stable 66 0 11
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 66 0 11
✅ express-stable 66 0 11
✅ fastify-stable 66 0 11
✅ hono-stable 66 0 11
✅ nextjs-turbopack-canary 55 0 22
✅ nextjs-turbopack-stable 72 0 5
✅ nextjs-webpack-canary 55 0 22
✅ nextjs-webpack-stable 72 0 5
✅ nitro-stable 66 0 11
✅ nuxt-stable 66 0 11
✅ sveltekit-stable 66 0 11
✅ vite-stable 66 0 11
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 72 0 5
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 3 0 2
❌ mongodb 52 3 5
✅ redis-dev 3 0 2
❌ redis 53 2 5
✅ turso-dev 3 0 2
❌ turso 4 51 5
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 66 0 11
✅ e2e-local-postgres-nest-stable 66 0 11
✅ e2e-local-prod-nest-stable 66 0 11

📋 View full workflow run

@socket-security
Copy link

socket-security bot commented Mar 20, 2026

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatednpm/​@​vercel/​analytics@​2.0.0 ⏵ 2.0.1991008391 +4100

View full report

@VaguelySerious
Copy link
Member

Awesome! Will look at this tomorrow

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