Skip to content

[codex] Add workflow history replay helper#2073

Draft
pranaygp wants to merge 1 commit into
mainfrom
codex/replay-history-harness
Draft

[codex] Add workflow history replay helper#2073
pranaygp wants to merge 1 commit into
mainfrom
codex/replay-history-harness

Conversation

@pranaygp
Copy link
Copy Markdown
Contributor

Summary

  • adds replayWorkflowHistory for running workflow code against a supplied event history without committing new runtime events
  • returns completed, suspended, failed, and cancelled replay outcomes, including pending operation summaries for incomplete histories
  • validates basic history integrity, including cross-run events and non-terminal events after terminal run events
  • updates the Next Turbopack workbench registry so the dot-prefixed agent workflow file is included in local manifest generation

Testing

  • fnm exec --using v22.18.0 pnpm --dir packages/core exec vitest run src/runtime/replay-history.test.ts src/workflow.test.ts
  • fnm exec --using v22.18.0 pnpm --filter @workflow/core build
  • fnm exec --using v22.18.0 pnpm build
  • fnm exec --using v22.18.0 pnpm exec biome check --write packages/core/src/runtime.ts packages/core/src/workflow.ts packages/core/src/runtime/replay-history.ts packages/core/src/runtime/replay-history.test.ts workbench/scripts/generate-workflows-registry.js workbench/nextjs-turbopack/package.json
  • fnm exec --using v22.18.0 pnpm --dir workbench/nextjs-turbopack generate:workflows plus manifest grep for app/.well-known/agent/v1/steps.ts and wellKnownAgentWorkflow
  • DEPLOYMENT_URL=http://localhost:3100 APP_NAME=nextjs-turbopack fnm exec --using v22.18.0 pnpm --dir packages/core exec vitest run e2e/e2e.test.ts -t 'wellKnownAgentWorkflow'\n\n## E2E note\n- Initial full pnpm test:e2e run reached 128 passed / 1 failed; the only failure was the dot-prefixed agent workflow missing from the local manifest. That is addressed by this PR, and the targeted case now passes.\n- A later combined full run hit a long-running agent approval timeout followed by local-world stream/retry timeouts and an ECONNRESET. I am leaving this as a draft until the full local E2E run is clean.

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 22, 2026

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

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

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 22, 2026

🦋 Changeset detected

Latest commit: 82ec955

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

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

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

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

📊 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.032s (-28.9% 🟢) 1.006s (~) 0.974s 10 1.00x
💻 Local Nitro 0.033s (-24.6% 🟢) 1.005s (~) 0.972s 10 1.03x
🐘 Postgres Nitro 0.048s (-49.3% 🟢) 1.011s (-3.1%) 0.962s 10 1.53x
💻 Local Next.js (Turbopack) 0.049s 1.006s 0.957s 10 1.55x
🐘 Postgres Express 0.052s (-10.9% 🟢) 1.010s (~) 0.958s 10 1.64x
🐘 Postgres Next.js (Turbopack) 0.054s 1.011s 0.957s 10 1.72x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.277s (+17.6% 🔺) 2.082s (-2.5%) 1.805s 10 1.00x
▲ Vercel Nitro 0.295s (-27.9% 🟢) 2.142s (-14.6% 🟢) 1.847s 10 1.07x
▲ Vercel Next.js (Turbopack) 0.357s (+41.8% 🔺) 2.532s (+8.5% 🔺) 2.175s 10 1.29x

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

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.074s (-5.1% 🟢) 2.006s (~) 0.933s 10 1.00x
💻 Local Express 1.077s (-4.3%) 2.006s (~) 0.929s 10 1.00x
🐘 Postgres Nitro 1.080s (-5.3% 🟢) 2.010s (~) 0.930s 10 1.01x
🐘 Postgres Express 1.085s (-5.4% 🟢) 2.009s (~) 0.925s 10 1.01x
💻 Local Next.js (Turbopack) 1.107s 2.006s 0.899s 10 1.03x
🐘 Postgres Next.js (Turbopack) 1.117s 2.008s 0.891s 10 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.649s (-57.6% 🟢) 3.377s (-42.8% 🟢) 1.728s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.678s (-17.6% 🟢) 4.075s (+6.4% 🔺) 2.398s 10 1.02x
▲ Vercel Express 1.787s (-4.7%) 4.028s (+5.8% 🔺) 2.241s 10 1.08x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 10.405s (-4.7%) 11.022s (~) 0.617s 3 1.00x
🐘 Postgres Nitro 10.405s (-4.3%) 11.015s (~) 0.610s 3 1.00x
🐘 Postgres Express 10.409s (-5.1% 🟢) 11.016s (~) 0.608s 3 1.00x
💻 Local Nitro 10.426s (-4.8%) 11.024s (~) 0.598s 3 1.00x
💻 Local Next.js (Turbopack) 10.656s 11.023s 0.367s 3 1.02x
🐘 Postgres Next.js (Turbopack) 10.684s 11.020s 0.336s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.397s (-21.1% 🟢) 15.486s (-22.6% 🟢) 2.089s 2 1.00x
▲ Vercel Nitro 13.434s (-43.4% 🟢) 15.308s (-39.1% 🟢) 1.874s 2 1.00x
▲ Vercel Next.js (Turbopack) 14.027s (-19.0% 🟢) 16.198s (-16.5% 🟢) 2.171s 2 1.05x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 13.424s (-8.0% 🟢) 14.018s (-6.7% 🟢) 0.594s 5 1.00x
🐘 Postgres Express 13.443s (-7.8% 🟢) 14.017s (-6.7% 🟢) 0.574s 5 1.00x
💻 Local Express 13.492s (-9.9% 🟢) 14.027s (-6.7% 🟢) 0.536s 5 1.01x
💻 Local Nitro 13.505s (-10.3% 🟢) 14.029s (-12.5% 🟢) 0.524s 5 1.01x
💻 Local Next.js (Turbopack) 14.040s 14.627s 0.587s 5 1.05x
🐘 Postgres Next.js (Turbopack) 14.101s 15.015s 0.913s 4 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 21.101s (-58.1% 🟢) 23.138s (-56.0% 🟢) 2.036s 3 1.00x
▲ Vercel Next.js (Turbopack) 21.417s (-59.3% 🟢) 23.700s (-56.6% 🟢) 2.283s 3 1.01x
▲ Vercel Nitro 21.433s (-66.7% 🟢) 23.650s (-64.5% 🟢) 2.216s 3 1.02x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 11.901s (-15.0% 🟢) 12.144s (-16.8% 🟢) 0.244s 8 1.00x
🐘 Postgres Nitro 11.927s (-14.6% 🟢) 12.390s (-13.4% 🟢) 0.463s 8 1.00x
💻 Local Nitro 11.980s (-28.6% 🟢) 12.398s (-27.2% 🟢) 0.417s 8 1.01x
💻 Local Express 11.988s (-27.8% 🟢) 12.398s (-27.2% 🟢) 0.410s 8 1.01x
💻 Local Next.js (Turbopack) 13.075s 13.596s 0.522s 7 1.10x
🐘 Postgres Next.js (Turbopack) 13.204s 14.017s 0.813s 7 1.11x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 32.119s (-92.4% 🟢) 33.322s (-92.2% 🟢) 1.203s 3 1.00x
▲ Vercel Express 32.159s (-73.5% 🟢) 34.197s (-72.3% 🟢) 2.038s 3 1.00x
▲ Vercel Next.js (Turbopack) 33.727s (-91.4% 🟢) 35.927s (-90.9% 🟢) 2.200s 3 1.05x

🔍 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 🥇 Nitro 1.147s (-10.0% 🟢) 2.007s (~) 0.860s 15 1.00x
🐘 Postgres Express 1.147s (-9.0% 🟢) 2.007s (~) 0.860s 15 1.00x
💻 Local Nitro 1.155s (-29.2% 🟢) 2.006s (-3.3%) 0.851s 15 1.01x
💻 Local Express 1.184s (-20.5% 🟢) 2.006s (~) 0.822s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.204s 2.007s 0.803s 15 1.05x
💻 Local Next.js (Turbopack) 1.282s 2.006s 0.724s 15 1.12x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.406s (-15.9% 🟢) 4.132s (-10.6% 🟢) 1.726s 8 1.00x
▲ Vercel Nitro 2.571s (-8.8% 🟢) 4.018s (-7.1% 🟢) 1.447s 8 1.07x
▲ Vercel Next.js (Turbopack) 2.790s (-17.9% 🟢) 4.477s (-9.2% 🟢) 1.686s 7 1.16x

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

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.198s (-49.3% 🟢) 2.007s (-33.3% 🟢) 0.810s 15 1.00x
🐘 Postgres Nitro 1.207s (-48.6% 🟢) 2.007s (-33.3% 🟢) 0.799s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.331s 2.007s 0.675s 15 1.11x
💻 Local Nitro 1.602s (-49.0% 🟢) 2.006s (-48.4% 🟢) 0.403s 15 1.34x
💻 Local Next.js (Turbopack) 1.799s 2.073s 0.274s 15 1.50x
💻 Local Express 1.821s (-38.3% 🟢) 2.073s (-40.0% 🟢) 0.252s 15 1.52x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.535s (-12.7% 🟢) 5.152s (-13.0% 🟢) 1.616s 6 1.00x
▲ Vercel Next.js (Turbopack) 3.704s (-47.8% 🟢) 5.618s (-36.9% 🟢) 1.914s 6 1.05x
▲ Vercel Express 4.413s (+21.9% 🔺) 6.259s (+22.5% 🔺) 1.846s 5 1.25x

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

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.308s (-62.5% 🟢) 2.007s (-50.0% 🟢) 0.699s 15 1.00x
🐘 Postgres Nitro 1.312s (-62.3% 🟢) 2.007s (-49.9% 🟢) 0.695s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.573s 2.007s 0.434s 15 1.20x
💻 Local Nitro 3.996s (-52.1% 🟢) 4.294s (-52.4% 🟢) 0.297s 7 3.06x
💻 Local Express 5.481s (-34.3% 🟢) 6.013s (-33.4% 🟢) 0.532s 5 4.19x
💻 Local Next.js (Turbopack) 5.481s 6.013s 0.532s 6 4.19x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.516s (-38.1% 🟢) 7.198s (-34.3% 🟢) 1.682s 5 1.00x
▲ Vercel Nitro 6.463s (+83.3% 🔺) 8.151s (+47.3% 🔺) 1.688s 4 1.17x
▲ Vercel Express 309.673s (+7203.6% 🔺) 311.957s (+4991.4% 🔺) 2.284s 1 56.14x

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

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.145s (-8.9% 🟢) 2.008s (~) 0.863s 15 1.00x
🐘 Postgres Nitro 1.149s (-8.6% 🟢) 2.009s (~) 0.860s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.202s 2.007s 0.805s 15 1.05x
💻 Local Next.js (Turbopack) 1.329s 2.006s 0.678s 15 1.16x
💻 Local Nitro 1.378s (-26.1% 🟢) 2.006s (-14.3% 🟢) 0.628s 15 1.20x
💻 Local Express 1.483s (-21.7% 🟢) 2.073s (-12.3% 🟢) 0.590s 15 1.29x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.666s (-9.1% 🟢) 4.488s (-3.3%) 1.822s 7 1.00x
▲ Vercel Nitro 3.047s (+23.9% 🔺) 4.413s (+5.9% 🔺) 1.366s 7 1.14x
▲ Vercel Express 3.387s (+31.2% 🔺) 5.159s (+18.6% 🔺) 1.772s 6 1.27x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.204s (-48.5% 🟢) 2.008s (-33.3% 🟢) 0.804s 15 1.00x
🐘 Postgres Express 1.212s (-48.2% 🟢) 2.009s (-33.3% 🟢) 0.797s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.323s 2.008s 0.685s 15 1.10x
💻 Local Nitro 1.630s (-46.8% 🟢) 2.006s (-48.4% 🟢) 0.376s 15 1.35x
💻 Local Next.js (Turbopack) 1.998s 2.391s 0.394s 13 1.66x
💻 Local Express 2.052s (-34.5% 🟢) 2.508s (-33.3% 🟢) 0.457s 12 1.70x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.568s (+11.8% 🔺) 5.449s (+13.7% 🔺) 1.880s 6 1.00x
▲ Vercel Nitro 3.603s (+11.4% 🔺) 5.511s (+8.5% 🔺) 1.908s 6 1.01x
▲ Vercel Next.js (Turbopack) 3.999s (+27.3% 🔺) 5.710s (+26.3% 🔺) 1.711s 6 1.12x

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

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.312s (-62.5% 🟢) 2.007s (-50.0% 🟢) 0.695s 15 1.00x
🐘 Postgres Nitro 1.322s (-62.0% 🟢) 2.008s (-49.9% 🟢) 0.686s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.619s 2.007s 0.388s 15 1.23x
💻 Local Nitro 4.797s (-47.5% 🟢) 5.511s (-45.0% 🟢) 0.715s 6 3.66x
💻 Local Next.js (Turbopack) 6.118s 6.816s 0.698s 5 4.66x
💻 Local Express 6.756s (-23.2% 🟢) 7.218s (-22.2% 🟢) 0.462s 5 5.15x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.158s (+1.3%) 6.980s (+2.4%) 1.822s 5 1.00x
▲ Vercel Next.js (Turbopack) 5.328s (-21.1% 🟢) 7.267s (-14.9% 🟢) 1.939s 5 1.03x
▲ Vercel Express 108.825s (+1595.9% 🔺) 111.221s (+1259.9% 🔺) 2.397s 3 21.10x

🔍 Observability: Nitro | 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 🥇 Nitro 0.419s (-48.9% 🟢) 1.007s (~) 0.587s 60 1.00x
🐘 Postgres Express 0.449s (-46.5% 🟢) 1.024s (~) 0.575s 59 1.07x
💻 Local Express 0.473s (-51.9% 🟢) 1.004s (-6.7% 🟢) 0.531s 60 1.13x
💻 Local Nitro 0.474s (-51.7% 🟢) 1.004s (-8.2% 🟢) 0.530s 60 1.13x
💻 Local Next.js (Turbopack) 0.708s 1.005s 0.297s 60 1.69x
🐘 Postgres Next.js (Turbopack) 0.720s 1.023s 0.302s 59 1.72x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.022s (-65.4% 🟢) 6.905s (-57.1% 🟢) 1.883s 9 1.00x
▲ Vercel Express 5.103s (-73.2% 🟢) 6.750s (-68.4% 🟢) 1.647s 9 1.02x
▲ Vercel Nitro 5.442s (-75.3% 🟢) 7.130s (-70.3% 🟢) 1.688s 9 1.08x

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

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.008s (-49.0% 🟢) 1.435s (-36.5% 🟢) 0.427s 63 1.00x
🐘 Postgres Nitro 1.042s (-45.9% 🟢) 1.481s (-29.5% 🟢) 0.439s 61 1.03x
💻 Local Nitro 1.185s (-61.0% 🟢) 2.006s (-46.6% 🟢) 0.821s 45 1.18x
💻 Local Express 1.228s (-59.3% 🟢) 2.006s (-44.0% 🟢) 0.779s 45 1.22x
🐘 Postgres Next.js (Turbopack) 1.579s 2.007s 0.428s 45 1.57x
💻 Local Next.js (Turbopack) 1.810s 2.028s 0.218s 45 1.80x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 12.944s (-67.2% 🟢) 14.865s (-64.0% 🟢) 1.921s 7 1.00x
▲ Vercel Next.js (Turbopack) 13.487s (-72.9% 🟢) 15.666s (-69.7% 🟢) 2.179s 6 1.04x
▲ Vercel Express 14.713s (-57.4% 🟢) 17.068s (-53.6% 🟢) 2.355s 6 1.14x

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

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.078s (-47.9% 🟢) 2.582s (-40.9% 🟢) 0.504s 47 1.00x
🐘 Postgres Nitro 2.087s (-49.1% 🟢) 2.528s (-45.1% 🟢) 0.441s 48 1.00x
💻 Local Nitro 2.633s (-71.7% 🟢) 3.008s (-70.0% 🟢) 0.375s 40 1.27x
💻 Local Express 2.712s (-70.5% 🟢) 3.008s (-70.0% 🟢) 0.295s 40 1.31x
🐘 Postgres Next.js (Turbopack) 3.129s 4.008s 0.880s 30 1.51x
💻 Local Next.js (Turbopack) 3.810s 4.042s 0.232s 30 1.83x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 40.727s (-68.7% 🟢) 42.700s (-67.7% 🟢) 1.972s 3 1.00x
▲ Vercel Next.js (Turbopack) 43.164s (-59.7% 🟢) 45.932s (-57.8% 🟢) 2.768s 3 1.06x
▲ Vercel Nitro 44.340s (-54.2% 🟢) 46.292s (-53.0% 🟢) 1.952s 3 1.09x

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

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.160s (-43.5% 🟢) 1.006s (~) 0.846s 60 1.00x
🐘 Postgres Express 0.187s (-33.9% 🟢) 1.005s (~) 0.819s 60 1.17x
🐘 Postgres Next.js (Turbopack) 0.226s 1.006s 0.780s 60 1.41x
💻 Local Nitro 0.359s (-40.6% 🟢) 1.004s (-1.7%) 0.644s 60 2.25x
💻 Local Express 0.486s (-13.4% 🟢) 1.095s (+9.1% 🔺) 0.610s 55 3.04x
💻 Local Next.js (Turbopack) 0.531s 1.004s 0.473s 60 3.32x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.273s (+16.3% 🔺) 4.106s (+12.9% 🔺) 1.833s 15 1.00x
▲ Vercel Next.js (Turbopack) 2.296s (+13.5% 🔺) 4.274s (+12.7% 🔺) 1.978s 15 1.01x
▲ Vercel Nitro 2.318s (+39.6% 🔺) 3.991s (+19.1% 🔺) 1.672s 16 1.02x

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

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.290s (-41.6% 🟢) 1.006s (~) 0.716s 90 1.00x
🐘 Postgres Express 0.313s (-38.6% 🟢) 1.006s (~) 0.693s 90 1.08x
🐘 Postgres Next.js (Turbopack) 0.424s 1.006s 0.582s 90 1.46x
💻 Local Nitro 2.028s (-20.1% 🟢) 2.537s (-15.7% 🟢) 0.508s 36 6.99x
💻 Local Express 2.116s (-15.8% 🟢) 2.797s (-7.1% 🟢) 0.681s 33 7.29x
💻 Local Next.js (Turbopack) 2.295s 2.977s 0.682s 31 7.91x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 8.884s (+191.6% 🔺) 10.924s (+127.2% 🔺) 2.041s 9 1.00x
▲ Vercel Next.js (Turbopack) 9.448s (+167.3% 🔺) 11.471s (+120.9% 🔺) 2.023s 8 1.06x
▲ Vercel Nitro 10.462s (+224.3% 🔺) 12.356s (+156.3% 🔺) 1.894s 8 1.18x

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

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.604s (-26.2% 🟢) 1.005s (-1.2%) 0.401s 120 1.00x
🐘 Postgres Nitro 0.616s (-22.0% 🟢) 1.006s (~) 0.390s 120 1.02x
🐘 Postgres Next.js (Turbopack) 0.862s 1.032s 0.170s 117 1.43x
💻 Local Nitro 9.423s (-15.8% 🟢) 9.946s (-14.7% 🟢) 0.522s 13 15.60x
💻 Local Express 10.209s (-8.8% 🟢) 10.611s (-11.1% 🟢) 0.402s 12 16.90x
💻 Local Next.js (Turbopack) 10.922s 11.662s 0.740s 11 18.07x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 21.448s (+107.7% 🔺) 23.985s (+95.2% 🔺) 2.537s 6 1.00x
▲ Vercel Express 24.418s (+229.1% 🔺) 26.866s (+190.6% 🔺) 2.448s 6 1.14x
▲ Vercel Nitro 29.198s (+278.1% 🔺) 30.591s (+225.4% 🔺) 1.394s 4 1.36x

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

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.120s (+424.2% 🔺) 2.005s (+99.6% 🔺) 0.010s (-20.8% 🟢) 2.017s (+98.0% 🔺) 0.896s 10 1.00x
💻 Local Express 1.132s (+468.5% 🔺) 2.005s (+99.6% 🔺) 0.013s (+5.0%) 2.020s (+98.4% 🔺) 0.888s 10 1.01x
🐘 Postgres Nitro 1.142s (+457.1% 🔺) 2.001s (+100.2% 🔺) 0.001s (-33.3% 🟢) 2.011s (+98.8% 🔺) 0.869s 10 1.02x
🐘 Postgres Express 1.143s (+457.2% 🔺) 1.995s (+99.8% 🔺) 0.002s (+6.2% 🔺) 2.011s (+98.8% 🔺) 0.868s 10 1.02x
💻 Local Next.js (Turbopack) 1.185s 2.004s 0.012s 2.020s 0.835s 10 1.06x
🐘 Postgres Next.js (Turbopack) 1.202s 2.001s 0.002s 2.010s 0.808s 10 1.07x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.161s (-43.6% 🟢) 3.339s (-36.7% 🟢) 2.086s (+181.1% 🔺) 5.926s (-8.6% 🟢) 3.765s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.304s (-66.4% 🟢) 3.415s (-60.5% 🟢) 2.905s (+359.7% 🔺) 6.801s (-30.5% 🟢) 4.498s 10 1.07x
▲ Vercel Express 2.342s (-6.5% 🟢) 3.528s (-13.7% 🟢) 1.781s (+85.4% 🔺) 5.897s (+5.5% 🔺) 3.555s 10 1.08x

🔍 Observability: Nitro | 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.496s (+137.5% 🔺) 2.005s (+99.2% 🔺) 0.004s (+4.4%) 2.025s (+97.9% 🔺) 0.528s 30 1.00x
🐘 Postgres Nitro 1.538s (+146.4% 🔺) 2.003s (+98.9% 🔺) 0.004s (-3.3%) 2.025s (+98.0% 🔺) 0.487s 30 1.03x
💻 Local Express 1.541s (+103.6% 🔺) 2.012s (+95.5% 🔺) 0.010s (+6.9% 🔺) 2.024s (+94.7% 🔺) 0.483s 30 1.03x
🐘 Postgres Next.js (Turbopack) 1.655s 2.010s 0.004s 2.025s 0.370s 30 1.11x
💻 Local Next.js (Turbopack) 1.848s 2.009s 0.010s 2.201s 0.353s 28 1.23x
💻 Local Nitro 1.934s (+130.6% 🔺) 2.010s (+98.6% 🔺) 0.011s (+13.1% 🔺) 2.423s (+117.2% 🔺) 0.489s 25 1.29x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.886s (-9.5% 🟢) 7.539s (-5.9% 🟢) 0.349s (-14.5% 🟢) 8.496s (-3.8%) 2.610s 8 1.00x
▲ Vercel Nitro 5.995s (-79.6% 🟢) 7.395s (-76.0% 🟢) 1.004s (+796.3% 🔺) 9.096s (-71.4% 🟢) 3.102s 7 1.02x
▲ Vercel Next.js (Turbopack) 6.362s (-62.4% 🟢) 7.878s (-56.8% 🟢) 0.546s (+158.3% 🔺) 9.296s (-50.9% 🟢) 2.935s 7 1.08x

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

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.630s (-34.9% 🟢) 0.997s (-20.1% 🟢) 0.000s (+22.0% 🔺) 1.031s (-18.0% 🟢) 0.400s 59 1.00x
🐘 Postgres Express 0.648s (-32.6% 🟢) 1.026s (-19.7% 🟢) 0.000s (-20.7% 🟢) 1.041s (-20.3% 🟢) 0.394s 58 1.03x
🐘 Postgres Next.js (Turbopack) 0.730s 1.018s 0.000s 1.024s 0.294s 59 1.16x
💻 Local Nitro 1.342s (+9.8% 🔺) 2.014s (~) 0.000s (+333.3% 🔺) 2.017s (~) 0.675s 30 2.13x
💻 Local Express 1.356s (+10.7% 🔺) 2.015s (~) 0.000s (-20.0% 🟢) 2.017s (~) 0.661s 30 2.15x
💻 Local Next.js (Turbopack) 1.444s 2.014s 0.000s 2.017s 0.573s 30 2.29x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.486s (-6.8% 🟢) 5.129s (+0.5%) 0.000s (-50.0% 🟢) 5.876s (+6.2% 🔺) 2.390s 11 1.00x
▲ Vercel Next.js (Turbopack) 3.696s (-63.7% 🟢) 5.225s (-54.6% 🟢) 0.000s (+Infinity% 🔺) 5.817s (-51.7% 🟢) 2.121s 11 1.06x
▲ Vercel Nitro 3.713s (+21.7% 🔺) 4.722s (+7.5% 🔺) 0.000s (+116.7% 🔺) 5.276s (+9.7% 🔺) 1.562s 12 1.07x

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

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.199s (-32.3% 🟢) 1.930s (-11.4% 🟢) 0.000s (NaN%) 1.967s (-10.6% 🟢) 0.768s 31 1.00x
🐘 Postgres Nitro 1.236s (-31.0% 🟢) 2.064s (-3.6%) 0.000s (-100.0% 🟢) 2.084s (-4.2%) 0.848s 29 1.03x
🐘 Postgres Next.js (Turbopack) 1.514s 2.105s 0.000s 2.112s 0.598s 29 1.26x
💻 Local Next.js (Turbopack) 2.984s 3.559s 0.001s 3.563s 0.579s 17 2.49x
💻 Local Nitro 3.086s (-8.9% 🟢) 3.778s (-6.3% 🟢) 0.001s (+64.1% 🔺) 3.784s (-6.3% 🟢) 0.698s 16 2.57x
💻 Local Express 3.204s (-7.6% 🟢) 3.904s (-3.2%) 0.000s (-68.8% 🟢) 3.906s (-3.2%) 0.702s 16 2.67x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.535s (+20.7% 🔺) 7.484s (+24.3% 🔺) 0.000s (NaN%) 8.148s (+26.2% 🔺) 2.613s 8 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Nitro 14/21
🐘 Postgres Nitro 11/21
▲ Vercel Express 11/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 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)
  • 🌐 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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 1198 2 219 1419
✅ 💻 Local Development 1587 0 219 1806
❌ 📦 Local Production 1586 1 219 1806
✅ 🐘 Local Postgres 1587 0 219 1806
✅ 🪟 Windows 129 0 0 129
✅ 📋 Other 727 0 176 903
Total 6814 3 1052 7869

❌ Failed Tests

▲ Vercel Production (2 failed)

nextjs-webpack (2 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KS6NTXSVCSVQSYWK1032KDEB | 🔍 observability
  • distributedAbortController - manual abort triggers signal | wrun_01KS6P7A783WEF0V3TSY2A0T1Y | 🔍 observability
📦 Local Production (1 failed)

nitro-stable (1 failed):

  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries

Details by Category

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

📋 View full workflow run


Some E2E test jobs failed:

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

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.

1 participant