Skip to content

[world-vercel] Always try JSON queue transport as a fallback#1717

Draft
VaguelySerious wants to merge 2 commits intomainfrom
peter/json-transport-fallback
Draft

[world-vercel] Always try JSON queue transport as a fallback#1717
VaguelySerious wants to merge 2 commits intomainfrom
peter/json-transport-fallback

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

No description provided.

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@vercel
Copy link
Copy Markdown
Contributor

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

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Apr 13, 2026

🦋 Changeset detected

Latest commit: 00bea6d

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

This PR includes changesets to release 17 packages
Name Type
@workflow/world-vercel Patch
@workflow/cli Patch
@workflow/core Patch
workflow Patch
@workflow/world-testing Patch
@workflow/builders Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/ai 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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 13, 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.044s (+5.5% 🔺) 1.005s (~) 0.961s 10 1.00x
💻 Local Next.js (Turbopack) 0.047s 1.006s 0.959s 10 1.06x
🐘 Postgres Next.js (Turbopack) 0.054s (+10.2% 🔺) 1.011s (~) 0.957s 10 1.23x
🐘 Postgres Express 0.057s (~) 1.012s (~) 0.955s 10 1.30x
🐘 Postgres Nitro 0.060s (-10.6% 🟢) 1.010s (~) 0.950s 10 1.36x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.246s (-4.6%) 2.052s (+14.0% 🔺) 1.806s 10 1.00x
▲ Vercel Next.js (Turbopack) 0.340s (+29.9% 🔺) 2.113s (-6.5% 🟢) 1.773s 10 1.38x
▲ 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 🥇 Next.js (Turbopack) 1.117s 2.007s 0.890s 10 1.00x
🐘 Postgres Next.js (Turbopack) 1.129s (+0.6%) 2.008s (~) 0.879s 10 1.01x
💻 Local Nitro 1.134s (+0.5%) 2.006s (~) 0.872s 10 1.02x
🐘 Postgres Nitro 1.141s (-0.8%) 2.008s (~) 0.867s 10 1.02x
🐘 Postgres Express 1.144s (-0.6%) 2.011s (~) 0.867s 10 1.02x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.948s (-1.7%) 3.230s (-16.4% 🟢) 1.282s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.964s (-4.0%) 3.809s (-7.1% 🟢) 1.845s 10 1.01x
▲ 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 🥇 Next.js (Turbopack) 10.780s 11.023s 0.244s 3 1.00x
🐘 Postgres Next.js (Turbopack) 10.846s (+0.5%) 11.021s (~) 0.176s 3 1.01x
🐘 Postgres Nitro 10.895s (~) 11.018s (~) 0.123s 3 1.01x
💻 Local Nitro 10.929s (~) 11.023s (~) 0.094s 3 1.01x
🐘 Postgres Express 10.968s (+0.8%) 11.353s (+3.0%) 0.385s 3 1.02x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 16.802s (-4.6%) 18.622s (-5.3% 🟢) 1.820s 2 1.00x
▲ Vercel Express 17.651s (~) 18.731s (-7.3% 🟢) 1.080s 2 1.05x
▲ 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
🐘 Postgres 🥇 Next.js (Turbopack) 14.404s (+1.7%) 15.021s (~) 0.617s 4 1.00x
🐘 Postgres Nitro 14.470s (-0.6%) 15.021s (~) 0.550s 4 1.00x
🐘 Postgres Express 14.546s (~) 15.024s (~) 0.479s 4 1.01x
💻 Local Next.js (Turbopack) 14.673s 15.029s 0.356s 4 1.02x
💻 Local Nitro 15.033s (~) 15.530s (+3.3%) 0.497s 4 1.04x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 31.459s (-17.9% 🟢) 33.295s (-17.2% 🟢) 1.835s 2 1.00x
▲ Vercel Express 31.561s (-11.7% 🟢) 33.039s (-12.7% 🟢) 1.478s 2 1.00x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 13.652s (+1.8%) 14.023s (-1.0%) 0.371s 7 1.00x
🐘 Postgres Nitro 13.912s (-1.5%) 14.449s (-2.0%) 0.537s 7 1.02x
🐘 Postgres Express 14.155s (+1.5%) 15.023s (+5.0%) 0.868s 6 1.04x
💻 Local Next.js (Turbopack) 16.051s 16.864s 0.812s 6 1.18x
💻 Local Nitro 16.848s (+0.6%) 17.031s (~) 0.183s 6 1.23x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 52.479s (-12.0% 🟢) 54.430s (-11.9% 🟢) 1.951s 2 1.00x
▲ Vercel Express 53.344s (-2.1%) 55.185s (-2.2%) 1.841s 2 1.02x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.227s (+3.5%) 2.010s (~) 0.783s 15 1.00x
🐘 Postgres Nitro 1.256s (-2.0%) 2.010s (~) 0.754s 15 1.02x
🐘 Postgres Express 1.265s (-0.8%) 2.010s (~) 0.745s 15 1.03x
💻 Local Next.js (Turbopack) 1.514s 2.005s 0.491s 15 1.23x
💻 Local Nitro 1.562s (+2.6%) 2.005s (~) 0.443s 15 1.27x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.360s (-9.7% 🟢) 4.189s (-6.6% 🟢) 1.829s 8 1.00x
▲ Vercel Express 2.552s (-5.1% 🟢) 3.942s (-11.5% 🟢) 1.390s 9 1.08x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.322s (-1.1%) 3.009s (~) 0.686s 10 1.00x
🐘 Postgres Nitro 2.336s (-0.9%) 3.008s (~) 0.672s 10 1.01x
🐘 Postgres Next.js (Turbopack) 2.396s (-2.1%) 3.010s (~) 0.614s 10 1.03x
💻 Local Next.js (Turbopack) 2.797s 3.109s 0.312s 10 1.20x
💻 Local Nitro 3.302s (+11.4% 🔺) 4.010s (+6.7% 🔺) 0.708s 8 1.42x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.548s (~) 4.477s (+7.5% 🔺) 1.929s 7 1.00x
▲ Vercel Express 3.186s (+20.9% 🔺) 4.605s (+4.7%) 1.419s 7 1.25x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.466s (-0.6%) 4.009s (~) 0.543s 8 1.00x
🐘 Postgres Express 3.479s (~) 4.009s (~) 0.530s 8 1.00x
🐘 Postgres Next.js (Turbopack) 3.625s (+0.7%) 4.009s (~) 0.385s 8 1.05x
💻 Local Next.js (Turbopack) 7.942s 8.768s 0.826s 4 2.29x
💻 Local Nitro 8.287s (-1.0%) 9.022s (~) 0.735s 4 2.39x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.338s (+3.7%) 5.085s (+0.6%) 1.747s 6 1.00x
▲ Vercel Express 3.762s (+20.3% 🔺) 5.459s (+10.7% 🔺) 1.696s 6 1.13x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.232s (+3.5%) 2.008s (~) 0.776s 15 1.00x
🐘 Postgres Express 1.262s (~) 2.008s (~) 0.746s 15 1.02x
🐘 Postgres Nitro 1.268s (~) 2.008s (~) 0.740s 15 1.03x
💻 Local Next.js (Turbopack) 1.513s 2.006s 0.493s 15 1.23x
💻 Local Nitro 1.521s (~) 2.006s (~) 0.485s 15 1.23x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.103s (-5.7% 🟢) 3.775s (-6.2% 🟢) 1.672s 8 1.00x
▲ Vercel Express 2.198s (-4.5%) 3.555s (-17.8% 🟢) 1.357s 9 1.05x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.330s (-1.4%) 3.010s (~) 0.679s 10 1.00x
🐘 Postgres Nitro 2.349s (-0.6%) 3.009s (~) 0.660s 10 1.01x
🐘 Postgres Next.js (Turbopack) 2.363s (~) 3.010s (~) 0.647s 10 1.01x
💻 Local Next.js (Turbopack) 2.960s 3.565s 0.605s 9 1.27x
💻 Local Nitro 3.135s (+1.2%) 4.011s (~) 0.877s 8 1.35x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.507s (-7.2% 🟢) 3.785s (-13.8% 🟢) 1.278s 9 1.00x
▲ Vercel Next.js (Turbopack) 3.179s (+10.2% 🔺) 5.016s (+7.2% 🔺) 1.837s 6 1.27x
▲ 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 🥇 Nitro 3.468s (-0.8%) 4.009s (~) 0.541s 8 1.00x
🐘 Postgres Express 3.479s (-0.8%) 4.012s (~) 0.533s 8 1.00x
🐘 Postgres Next.js (Turbopack) 3.625s (+1.3%) 4.011s (~) 0.386s 8 1.05x
💻 Local Next.js (Turbopack) 8.034s 8.521s 0.486s 4 2.32x
💻 Local Nitro 8.971s (-3.9%) 9.525s (-5.0%) 0.554s 4 2.59x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.375s (+4.9%) 4.888s (-4.5%) 1.513s 7 1.00x
▲ Vercel Next.js (Turbopack) 3.436s (+2.3%) 5.676s (+4.5%) 2.240s 6 1.02x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | 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.749s (+16.8% 🔺) 1.006s (~) 0.257s 60 1.00x
🐘 Postgres Nitro 0.802s (-4.2%) 1.022s (+1.5%) 0.220s 59 1.07x
💻 Local Next.js (Turbopack) 0.838s 1.005s 0.167s 60 1.12x
🐘 Postgres Express 0.847s (+1.6%) 1.023s (+1.7%) 0.176s 59 1.13x
💻 Local Nitro 0.995s (+0.6%) 1.309s (+4.3%) 0.314s 46 1.33x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 8.408s (-22.3% 🟢) 10.115s (-20.2% 🟢) 1.708s 6 1.00x
▲ Vercel Express 8.868s (-8.3% 🟢) 10.221s (-11.5% 🟢) 1.354s 6 1.05x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

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.840s (+11.9% 🔺) 2.029s (~) 0.189s 45 1.00x
🐘 Postgres Nitro 1.890s (-2.5%) 2.053s (-8.8% 🟢) 0.163s 44 1.03x
🐘 Postgres Express 2.051s (+4.5%) 2.714s (+21.9% 🔺) 0.663s 34 1.11x
💻 Local Next.js (Turbopack) 2.685s 3.008s 0.323s 30 1.46x
💻 Local Nitro 3.074s (+1.8%) 3.923s (+9.4% 🔺) 0.850s 23 1.67x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 26.837s (-3.9%) 28.017s (-7.3% 🟢) 1.179s 4 1.00x
▲ Vercel Next.js (Turbopack) 27.094s (-8.2% 🟢) 29.327s (-7.1% 🟢) 2.233s 4 1.01x
▲ 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 🥇 Next.js (Turbopack) 3.730s (+16.9% 🔺) 4.010s (+0.8%) 0.280s 30 1.00x
🐘 Postgres Nitro 3.828s (-1.7%) 4.009s (-3.4%) 0.181s 30 1.03x
🐘 Postgres Express 4.036s (~) 4.627s (+3.8%) 0.592s 26 1.08x
💻 Local Next.js (Turbopack) 8.673s 9.017s 0.344s 14 2.33x
💻 Local Nitro 9.178s (-0.7%) 9.865s (-1.5%) 0.686s 13 2.46x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 74.519s (-2.8%) 76.165s (-4.1%) 1.646s 2 1.00x
▲ Vercel Express 75.254s (+6.0% 🔺) 76.644s (+4.0%) 1.390s 2 1.01x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

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.251s (+18.2% 🔺) 1.007s (~) 0.755s 60 1.00x
🐘 Postgres Express 0.281s (-0.7%) 1.007s (~) 0.727s 60 1.12x
🐘 Postgres Nitro 0.283s (+2.8%) 1.006s (~) 0.723s 60 1.13x
💻 Local Next.js (Turbopack) 0.565s 1.005s 0.440s 60 2.25x
💻 Local Nitro 0.586s (+0.9%) 1.004s (~) 0.418s 60 2.33x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.425s (-1.2%) 2.700s (-16.1% 🟢) 1.275s 23 1.00x
▲ Vercel Next.js (Turbopack) 1.486s (-8.0% 🟢) 3.004s (-13.2% 🟢) 1.519s 21 1.04x
▲ 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 🥇 Next.js (Turbopack) 0.469s (+11.6% 🔺) 1.006s (~) 0.537s 90 1.00x
🐘 Postgres Express 0.485s (-3.5%) 1.007s (~) 0.522s 90 1.04x
🐘 Postgres Nitro 0.488s (-2.4%) 1.007s (~) 0.519s 90 1.04x
💻 Local Nitro 2.538s (+2.5%) 3.009s (~) 0.471s 30 5.41x
💻 Local Next.js (Turbopack) 2.568s 3.009s 0.440s 30 5.48x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.962s (+13.0% 🔺) 4.315s (-3.7%) 1.353s 22 1.00x
▲ Vercel Next.js (Turbopack) 3.002s (-4.9%) 4.882s (~) 1.880s 19 1.01x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | 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.741s (+11.7% 🔺) 1.006s (~) 0.264s 120 1.00x
🐘 Postgres Nitro 0.781s (~) 1.016s (+0.8%) 0.235s 119 1.05x
🐘 Postgres Express 0.788s (~) 1.007s (~) 0.219s 120 1.06x
💻 Local Next.js (Turbopack) 10.663s 11.208s 0.545s 11 14.39x
💻 Local Nitro 11.311s (+1.8%) 11.939s (+0.8%) 0.629s 11 15.26x
💻 Local Express ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.863s (-11.1% 🟢) 7.349s (-14.7% 🟢) 1.487s 17 1.00x
▲ Vercel Next.js (Turbopack) 37.363s (+540.2% 🔺) 39.243s (+403.6% 🔺) 1.880s 4 6.37x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | 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 🥇 Next.js (Turbopack) 0.173s 1.003s 0.012s 1.018s 0.845s 10 1.00x
🐘 Postgres Next.js (Turbopack) 0.188s (+13.2% 🔺) 1.000s (~) 0.001s (+30.0% 🔺) 1.010s (~) 0.822s 10 1.09x
💻 Local Nitro 0.206s (+1.4%) 1.004s (~) 0.012s (+2.5%) 1.019s (~) 0.813s 10 1.19x
🐘 Postgres Express 0.210s (+1.7%) 0.998s (~) 0.001s (-15.4% 🟢) 1.009s (~) 0.799s 10 1.22x
🐘 Postgres Nitro 0.212s (~) 0.996s (~) 0.001s (~) 1.010s (~) 0.797s 10 1.23x
💻 Local Express ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.420s (-7.4% 🟢) 2.593s (-6.3% 🟢) 0.953s (+34.7% 🔺) 3.890s (-2.0%) 2.470s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.606s (-11.7% 🟢) 3.148s (-7.5% 🟢) 0.560s (+111.2% 🔺) 4.170s (-0.9%) 2.564s 10 1.13x
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express | 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 🥇 Next.js (Turbopack) 0.597s (+3.5%) 1.009s (~) 0.005s (+40.6% 🔺) 1.022s (~) 0.425s 59 1.00x
🐘 Postgres Nitro 0.607s (-1.1%) 1.005s (~) 0.004s (+5.0%) 1.023s (~) 0.416s 59 1.02x
🐘 Postgres Express 0.617s (+1.5%) 1.002s (~) 0.004s (-18.9% 🟢) 1.022s (~) 0.405s 59 1.03x
💻 Local Next.js (Turbopack) 0.657s 1.011s 0.010s 1.023s 0.366s 59 1.10x
💻 Local Nitro 0.939s (+29.3% 🔺) 1.013s (~) 0.009s (-13.1% 🟢) 1.228s (+19.9% 🔺) 0.288s 49 1.57x
💻 Local Express ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.974s (-12.9% 🟢) 5.784s (-10.4% 🟢) 0.263s (-11.2% 🟢) 6.514s (-12.3% 🟢) 2.540s 10 1.00x
▲ Vercel Express 4.283s (+3.1%) 5.477s (-7.5% 🟢) 0.445s (+62.3% 🔺) 6.490s (-2.4%) 2.207s 10 1.08x
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack) | Express

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.905s (-2.8%) 1.092s (-1.8%) 0.000s (-34.5% 🟢) 1.098s (-1.9%) 0.194s 55 1.00x
🐘 Postgres Nitro 0.948s (-3.3%) 1.143s (-4.2%) 0.000s (-27.8% 🟢) 1.158s (-4.9%) 0.210s 53 1.05x
🐘 Postgres Express 0.953s (+0.8%) 1.104s (-5.6% 🟢) 0.000s (+23.6% 🔺) 1.117s (-5.7% 🟢) 0.165s 55 1.05x
💻 Local Nitro 1.213s (-2.1%) 2.019s (~) 0.001s (+100.0% 🔺) 2.021s (~) 0.808s 30 1.34x
💻 Local Next.js (Turbopack) 1.269s 2.021s 0.000s 2.023s 0.754s 30 1.40x
💻 Local Express ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.034s (+15.8% 🔺) 4.149s (+8.2% 🔺) 0.000s (-100.0% 🟢) 4.580s (+6.0% 🔺) 1.546s 14 1.00x
▲ Vercel Next.js (Turbopack) 3.371s (+13.3% 🔺) 4.936s (+5.9% 🔺) 0.000s (-100.0% 🟢) 5.570s (+7.2% 🔺) 2.199s 11 1.11x
▲ 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.724s (-3.1%) 2.179s (+2.0%) 0.000s (+Infinity% 🔺) 2.189s (+2.0%) 0.465s 28 1.00x
🐘 Postgres Nitro 1.805s (+2.4%) 2.140s (+1.9%) 0.000s (-100.0% 🟢) 2.182s (+3.3%) 0.377s 28 1.05x
🐘 Postgres Next.js (Turbopack) 1.839s (-2.3%) 2.146s (-5.1% 🟢) 0.000s (+Infinity% 🔺) 2.158s (-4.9%) 0.319s 28 1.07x
💻 Local Nitro 3.659s (+4.5%) 4.099s (~) 0.000s (-64.3% 🟢) 4.101s (~) 0.442s 15 2.12x
💻 Local Next.js (Turbopack) 3.699s 4.318s 0.001s 4.322s 0.622s 14 2.15x
💻 Local Express ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.131s (-2.3%) 5.097s (-9.8% 🟢) 0.000s (-100.0% 🟢) 5.509s (-12.6% 🟢) 1.378s 12 1.00x
▲ Vercel Next.js (Turbopack) 4.439s (+5.2% 🔺) 6.098s (+6.8% 🔺) 0.011s (+558.8% 🔺) 6.614s (+6.4% 🔺) 2.175s 10 1.07x
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express | Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

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


Some benchmark jobs failed:

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

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 13, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 923 0 67 990
✅ 💻 Local Development 898 0 182 1080
✅ 📦 Local Production 898 0 182 1080
✅ 🐘 Local Postgres 898 0 182 1080
✅ 🪟 Windows 82 0 8 90
❌ 🌍 Community Worlds 133 74 24 231
✅ 📋 Other 228 0 42 270
Total 4060 74 687 4821

❌ Failed Tests

🌍 Community Worlds (74 failed)

mongodb (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KP4K2SEHZ56KZ708EP9NWEME
  • webhookWorkflow | wrun_01KP4K31V6J2PNFY1QYSVXSG32
  • fetchWorkflow | wrun_01KP4K69XY4TRWVS5MPACQSRSY
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KP4KA55G0BVHX9JYSSN2044A
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KP4KG2T5KQ3RZE9EZPTH0B3A

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KP4K2SEHZ56KZ708EP9NWEME
  • webhookWorkflow | wrun_01KP4K31V6J2PNFY1QYSVXSG32
  • fetchWorkflow | wrun_01KP4K69XY4TRWVS5MPACQSRSY
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KP4KA55G0BVHX9JYSSN2044A
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KP4KG2T5KQ3RZE9EZPTH0B3A

turso (60 failed):

  • addTenWorkflow | wrun_01KP4K1QDAHRG6BRZY00GKNT3C
  • addTenWorkflow | wrun_01KP4K1QDAHRG6BRZY00GKNT3C
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KP4K2YQY0DHJT3P1N8Y4TMTT
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KP4K1XK9A3MXEK8BB29MJMN9
  • promiseRaceWorkflow | wrun_01KP4K21Q8QQ0B0KSFJEWG6E8P
  • promiseAnyWorkflow | wrun_01KP4K23M4YJJH5MW0SFCNQPWS
  • importedStepOnlyWorkflow | wrun_01KP4K3940969JJGRC65MFKWRH
  • hookWorkflow | wrun_01KP4K2F8W10VQXEHVRVJ5BYJ8
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KP4K2SEHZ56KZ708EP9NWEME
  • webhookWorkflow | wrun_01KP4K31V6J2PNFY1QYSVXSG32
  • sleepingWorkflow | wrun_01KP4K38EZCQJPQWSSQK4BG3TG
  • parallelSleepWorkflow | wrun_01KP4K3MCPF3PS4BYQZNYETM8X
  • nullByteWorkflow | wrun_01KP4K3QE4JVHD9378ZDCW35ES
  • workflowAndStepMetadataWorkflow | wrun_01KP4K3SAD945QQDCEW9S7ABG1
  • fetchWorkflow | wrun_01KP4K69XY4TRWVS5MPACQSRSY
  • promiseRaceStressTestWorkflow | wrun_01KP4K6CY671Y841JTBNAGHVR4
  • 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()
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KP4K9J5K4AWCGHACB3FJF7Z9
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KP4KA55G0BVHX9JYSSN2044A
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KP4KARD2N0F823BWB9PJXND8
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KP4KBA9BF114V9GBDEM4RCYB
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KP4KBHWKT2BCSYV9G3GA5ZT1
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KP4KBPN9G0BQZHDA3AMJEN6N
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KP4KBRFSBPQSBNDR8PH2H411
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KP4KC16KWG2SQ3XZ6RF44ENE
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KP4KCEKVRKWJVQ8ABB34YA98
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KP4KCKAM44Q83S30NT4K2GTC
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KP4KCS90P0P8CDQ0PH97ADG1
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KP4KCZ31B90FQ1R3KA2AXFQ1
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KP4KD3TCNRBXYJQGYG0FJE5M
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KP4KD9YW2CTJ94SDXP61D3ZK
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KP4KDFSVHTDT9T5GBMVFNQSQ
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KP4KDSHAD80F29FX3G3E7XK0
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KP4KE1SP5R6BD3SX8STWNY56
  • cancelRun - cancelling a running workflow | wrun_01KP4KE7N9WN71Y2V7Q9V7B90H
  • cancelRun via CLI - cancelling a running workflow | wrun_01KP4KEGBT07H5PDWDRBYK9Z18
  • 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_01KP4KEVHHD6NP6MS7MDWTQ4Q6
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KP4KFE6YM40VYZYVDSDCT288
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KP4KFS82DEKZE5K3CASRYR8B
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KP4KFZ4SWKCTX7A5PHC502R0
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KP4KG10MCEDNHBPKJ2Y2E2GQ
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KP4KG2T5KQ3RZE9EZPTH0B3A
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KP4KG5TWENZZYDZJBA3EZWH3

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 83 0 7
✅ example 83 0 7
✅ express 83 0 7
✅ fastify 83 0 7
✅ hono 83 0 7
✅ nextjs-turbopack 88 0 2
✅ nextjs-webpack 88 0 2
✅ nitro 83 0 7
✅ nuxt 83 0 7
✅ sveltekit 83 0 7
✅ vite 83 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 76 0 14
✅ express-stable 76 0 14
✅ fastify-stable 76 0 14
✅ hono-stable 76 0 14
✅ nextjs-turbopack-canary 63 0 27
✅ nextjs-turbopack-stable 82 0 8
✅ nextjs-webpack-canary 63 0 27
✅ nextjs-webpack-stable 82 0 8
✅ nitro-stable 76 0 14
✅ nuxt-stable 76 0 14
✅ sveltekit-stable 76 0 14
✅ vite-stable 76 0 14
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 76 0 14
✅ express-stable 76 0 14
✅ fastify-stable 76 0 14
✅ hono-stable 76 0 14
✅ nextjs-turbopack-canary 63 0 27
✅ nextjs-turbopack-stable 82 0 8
✅ nextjs-webpack-canary 63 0 27
✅ nextjs-webpack-stable 82 0 8
✅ nitro-stable 76 0 14
✅ nuxt-stable 76 0 14
✅ sveltekit-stable 76 0 14
✅ vite-stable 76 0 14
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 76 0 14
✅ express-stable 76 0 14
✅ fastify-stable 76 0 14
✅ hono-stable 76 0 14
✅ nextjs-turbopack-canary 63 0 27
✅ nextjs-turbopack-stable 82 0 8
✅ nextjs-webpack-canary 63 0 27
✅ nextjs-webpack-stable 82 0 8
✅ nitro-stable 76 0 14
✅ nuxt-stable 76 0 14
✅ sveltekit-stable 76 0 14
✅ vite-stable 76 0 14
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 82 0 8
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 6 0 0
❌ mongodb 56 7 8
✅ redis-dev 6 0 0
❌ redis 56 7 8
✅ turso-dev 6 0 0
❌ turso 3 60 8
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 76 0 14
✅ e2e-local-postgres-nest-stable 76 0 14
✅ e2e-local-prod-nest-stable 76 0 14

📋 View full workflow run

…es unhandled to the caller, crashing the workflow instead of being silently handled.

This commit fixes the issue reported at packages/world-vercel/src/queue.ts:260

**Bug Explanation:**

In `packages/world-vercel/src/queue.ts`, the `queue` function sends messages via CBOR transport and falls back to JSON transport on failure. The error handling logic catches `DuplicateMessageError` from the primary CBOR `send()` call, but the JSON fallback `send(jsonTransport)` on line 263 is not wrapped in any error handling.

The scenario where this manifests:
1. `send(cborTransport)` is called with an `idempotencyKey` in `sendOpts`
2. The server successfully receives and processes the message
3. The CBOR response parsing fails (e.g., network issue, malformed response), throwing a non-`DuplicateMessageError`
4. The catch block falls through the `DuplicateMessageError` check and enters the `if (useCbor)` fallback
5. `send(jsonTransport)` is called with the same `sendOpts` including the same `idempotencyKey`
6. The server already has this message, so it throws `DuplicateMessageError`
7. This error propagates completely unhandled to the caller, crashing the workflow

This is a regression from the design intent. The code explicitly handles `DuplicateMessageError` for the primary path with a comment saying "Silently handle idempotency key conflicts - the message was already queued. This matches the behavior of world-local and world-postgres." The JSON fallback should have the same handling.

**Fix Explanation:**

Wrapped the `send(jsonTransport)` fallback call in its own try-catch block that handles `DuplicateMessageError` identically to the primary path — returning a placeholder `messageId` with the `msg_duplicate_` prefix. Any other errors from the fallback are re-thrown as before. This ensures consistent behavior regardless of which transport path encounters a duplicate message.

Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: VaguelySerious <mittgfu@gmail.com>
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