Skip to content

Fix Postgres step lifecycle event ordering#2714

Draft
NathanColosimo wants to merge 3 commits into
mainfrom
nathanc/2331-step-update-pg-transaction
Draft

Fix Postgres step lifecycle event ordering#2714
NathanColosimo wants to merge 3 commits into
mainfrom
nathanc/2331-step-update-pg-transaction

Conversation

@NathanColosimo

Copy link
Copy Markdown
Contributor

Summary

Fixes #2331 by writing Postgres step lifecycle entity updates and their event-log entries in the same transaction, so the step row lock serializes concurrent lifecycle writers until the log entry is durable.

Also allocates Postgres-backed event ids inside the protected lifecycle path and re-enables the previously skipped Postgres e2e regression coverage.

Testing

  • node_modules/.bin/tsc --noEmit -p packages/world-postgres/tsconfig.json
  • node_modules/.bin/biome check --diagnostic-level=error packages/world-postgres/src/storage.ts packages/world-postgres/test/storage.test.ts packages/core/e2e/e2e.test.ts packages/world-postgres/src/drizzle/migrations/0015_add_workflow_events_order_sequence.sql packages/world-postgres/src/drizzle/migrations/meta/_journal.json .changeset/step-lifecycle-pg-transaction.md
  • ../../node_modules/.bin/vitest run test/storage.test.ts src/reenqueue.test.ts src/util.test.ts src/queue.test.ts
  • pnpm --filter @workflow/world-postgres build

@vercel

vercel Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment Jul 1, 2026 6:35pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Jul 1, 2026 6:35pm
example-workflow Building Building Preview, Comment Jul 1, 2026 6:35pm
workbench-astro-workflow Ready Ready Preview, Comment Jul 1, 2026 6:35pm
workbench-express-workflow Ready Ready Preview, Comment Jul 1, 2026 6:35pm
workbench-fastify-workflow Ready Ready Preview, Comment Jul 1, 2026 6:35pm
workbench-hono-workflow Ready Ready Preview, Comment Jul 1, 2026 6:35pm
workbench-nitro-workflow Ready Ready Preview, Comment Jul 1, 2026 6:35pm
workbench-nuxt-workflow Ready Ready Preview, Comment Jul 1, 2026 6:35pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Jul 1, 2026 6:35pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment Jul 1, 2026 6:35pm
workbench-vite-workflow Ready Ready Preview, Comment Jul 1, 2026 6:35pm
workflow-swc-playground Ready Ready Preview, Comment Jul 1, 2026 6:35pm
workflow-tarballs Building Building Preview, Comment Jul 1, 2026 6:35pm
workflow-web Ready Ready Preview, Comment Jul 1, 2026 6:35pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
workflow-docs Skipped Skipped Jul 1, 2026 6:35pm

@changeset-bot

changeset-bot Bot commented Jun 30, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e27b3af

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

This PR includes changesets to release 1 package
Name Type
@workflow/world-postgres 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

github-actions Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1442 0 230 1672
✅ 💻 Local Development 1605 0 219 1824
✅ 📦 Local Production 1605 0 219 1824
✅ 🐘 Local Postgres 1605 0 219 1824
✅ 🪟 Windows 152 0 0 152
✅ 📋 Other 887 0 177 1064
Total 7296 0 1064 8360

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 125 0 27
✅ example 125 0 27
✅ express 125 0 27
✅ fastify 125 0 27
✅ hono 125 0 27
✅ nextjs-turbopack 149 0 3
✅ nextjs-webpack 149 0 3
✅ nitro 125 0 27
✅ nuxt 125 0 27
✅ sveltekit 144 0 8
✅ vite 125 0 27
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 127 0 25
✅ express-stable 127 0 25
✅ fastify-stable 127 0 25
✅ hono-stable 127 0 25
✅ nextjs-turbopack-canary 133 0 19
✅ nextjs-turbopack-stable 152 0 0
✅ nextjs-webpack-canary 133 0 19
✅ nextjs-webpack-stable 152 0 0
✅ nitro-stable 127 0 25
✅ nuxt-stable 127 0 25
✅ sveltekit-stable 146 0 6
✅ vite-stable 127 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 127 0 25
✅ express-stable 127 0 25
✅ fastify-stable 127 0 25
✅ hono-stable 127 0 25
✅ nextjs-turbopack-canary 133 0 19
✅ nextjs-turbopack-stable 152 0 0
✅ nextjs-webpack-canary 133 0 19
✅ nextjs-webpack-stable 152 0 0
✅ nitro-stable 127 0 25
✅ nuxt-stable 127 0 25
✅ sveltekit-stable 146 0 6
✅ vite-stable 127 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 127 0 25
✅ express-stable 127 0 25
✅ fastify-stable 127 0 25
✅ hono-stable 127 0 25
✅ nextjs-turbopack-canary 133 0 19
✅ nextjs-turbopack-stable 152 0 0
✅ nextjs-webpack-canary 133 0 19
✅ nextjs-webpack-stable 152 0 0
✅ nitro-stable 127 0 25
✅ nuxt-stable 127 0 25
✅ sveltekit-stable 146 0 6
✅ vite-stable 127 0 25
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 152 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 127 0 25
✅ e2e-local-dev-tanstack-start- 127 0 25
✅ e2e-local-postgres-nest-stable 127 0 25
✅ e2e-local-postgres-tanstack-start- 127 0 25
✅ e2e-local-prod-nest-stable 127 0 25
✅ e2e-local-prod-tanstack-start- 127 0 25
✅ e2e-vercel-prod-tanstack-start 125 0 27

📋 View full workflow run

@github-actions

github-actions Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 0.050s (+13.8% 🔺) 1.006s (~) 0.956s 10 1.00x
💻 Local Express 0.051s (+11.0% 🔺) 1.007s (~) 0.955s 10 1.02x
💻 Local Next.js (Turbopack) 0.054s (~) 1.006s (~) 0.952s 10 1.07x
🐘 Postgres Next.js (Turbopack) 0.061s (-44.6% 🟢) 1.012s (-2.7%) 0.951s 10 1.22x
🐘 Postgres Nitro 0.065s (+2.9%) 1.013s (~) 0.949s 10 1.29x
🐘 Postgres Express 0.068s (-7.3% 🟢) 1.012s (~) 0.944s 10 1.35x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.219s (-39.9% 🟢) 1.946s (+6.2% 🔺) 1.726s 10 1.00x
▲ Vercel Express 0.308s (+52.4% 🔺) 2.251s (+13.9% 🔺) 1.943s 10 1.40x
▲ Vercel Next.js (Turbopack) 0.871s (+88.5% 🔺) 2.707s (+5.5% 🔺) 1.836s 10 3.97x

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

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.083s (~) 2.007s (~) 0.924s 10 1.00x
💻 Local Next.js (Turbopack) 1.090s (+0.8%) 2.006s (~) 0.916s 10 1.01x
💻 Local Express 1.091s (+0.8%) 2.006s (~) 0.915s 10 1.01x
🐘 Postgres Nitro 1.095s (~) 2.011s (~) 0.916s 10 1.01x
🐘 Postgres Next.js (Turbopack) 1.101s (~) 2.010s (~) 0.909s 10 1.02x
🐘 Postgres Express 1.103s (+0.6%) 2.010s (~) 0.906s 10 1.02x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.358s (~) 2.719s (+3.3%) 1.361s 10 1.00x
▲ Vercel Nitro 1.552s (+15.3% 🔺) 3.322s (+17.5% 🔺) 1.770s 10 1.14x
▲ Vercel Next.js (Turbopack) 1.833s (-18.4% 🟢) 3.679s (-3.6%) 1.846s 10 1.35x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.484s (+0.6%) 11.023s (~) 0.539s 3 1.00x
💻 Local Express 10.491s (~) 11.023s (~) 0.532s 3 1.00x
💻 Local Next.js (Turbopack) 10.499s (~) 11.024s (~) 0.525s 3 1.00x
🐘 Postgres Nitro 10.508s (~) 11.018s (~) 0.510s 3 1.00x
🐘 Postgres Next.js (Turbopack) 10.534s (+1.3%) 11.016s (~) 0.482s 3 1.00x
🐘 Postgres Express 10.549s (+0.6%) 11.016s (~) 0.468s 3 1.01x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 11.604s (-2.5%) 13.696s (~) 2.092s 3 1.00x
▲ Vercel Express 11.666s (-3.2%) 13.375s (-1.8%) 1.709s 3 1.01x
▲ Vercel Next.js (Turbopack) 12.673s (~) 14.984s (+1.7%) 2.312s 3 1.09x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 13.627s (~) 14.027s (~) 0.400s 5 1.00x
🐘 Postgres Nitro 13.735s (~) 14.021s (~) 0.286s 5 1.01x
💻 Local Express 13.737s (~) 14.029s (~) 0.291s 5 1.01x
🐘 Postgres Next.js (Turbopack) 13.743s (+0.7%) 14.020s (~) 0.277s 5 1.01x
💻 Local Next.js (Turbopack) 13.776s (+0.8%) 14.025s (~) 0.249s 5 1.01x
🐘 Postgres Express 13.874s (+1.8%) 14.018s (~) 0.144s 5 1.02x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 16.203s (-1.4%) 18.087s (-3.4%) 1.884s 4 1.00x
▲ Vercel Nitro 16.255s (-3.1%) 18.224s (-1.1%) 1.969s 4 1.00x
▲ Vercel Next.js (Turbopack) 18.645s (+8.4% 🔺) 20.365s (+5.5% 🔺) 1.720s 3 1.15x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 12.229s (-2.0%) 13.017s (~) 0.788s 7 1.00x
🐘 Postgres Nitro 12.253s (~) 13.019s (~) 0.766s 7 1.00x
🐘 Postgres Next.js (Turbopack) 12.271s (-1.3%) 13.014s (+0.8%) 0.743s 7 1.00x
💻 Local Nitro 12.303s (+1.6%) 13.025s (~) 0.722s 7 1.01x
💻 Local Express 12.377s (+1.6%) 13.026s (~) 0.649s 7 1.01x
💻 Local Next.js (Turbopack) 12.614s (+3.6%) 13.167s (+1.1%) 0.553s 7 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 17.831s (+2.7%) 19.473s (+2.7%) 1.642s 5 1.00x
▲ Vercel Express 17.964s (+1.9%) 19.808s (+2.5%) 1.844s 5 1.01x
▲ Vercel Next.js (Turbopack) 20.501s (+3.2%) 22.733s (+3.9%) 2.232s 4 1.15x

🔍 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 🥇 Express 1.187s (~) 2.008s (~) 0.821s 15 1.00x
🐘 Postgres Nitro 1.203s (~) 2.007s (~) 0.804s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.208s (-5.0% 🟢) 2.008s (-1.6%) 0.800s 15 1.02x
💻 Local Express 1.402s (+0.7%) 2.006s (~) 0.604s 15 1.18x
💻 Local Nitro 1.424s (+1.7%) 2.007s (~) 0.582s 15 1.20x
💻 Local Next.js (Turbopack) 1.462s (+2.7%) 2.073s (+3.3%) 0.611s 15 1.23x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.053s (+4.0%) 3.631s (-2.7%) 1.579s 9 1.00x
▲ Vercel Nitro 2.236s (+2.2%) 3.817s (~) 1.582s 8 1.09x
▲ Vercel Next.js (Turbopack) 3.734s (+12.7% 🔺) 5.416s (+5.8% 🔺) 1.682s 6 1.82x

🔍 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 🥇 Nitro 1.362s (+3.0%) 2.152s (-23.9% 🟢) 0.790s 14 1.00x
🐘 Postgres Express 1.365s (+0.7%) 2.224s (-4.0%) 0.859s 14 1.00x
🐘 Postgres Next.js (Turbopack) 1.401s (+5.3% 🔺) 2.316s (-6.6% 🟢) 0.915s 13 1.03x
💻 Local Next.js (Turbopack) 2.271s (-17.1% 🟢) 2.918s (-6.1% 🟢) 0.647s 11 1.67x
💻 Local Nitro 2.432s (-3.5%) 3.009s (-3.2%) 0.577s 10 1.79x
💻 Local Express 2.598s (+0.6%) 3.109s (+3.3%) 0.512s 10 1.91x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.265s (-14.5% 🟢) 3.519s (-12.5% 🟢) 1.254s 9 1.00x
▲ Vercel Nitro 2.316s (-3.1%) 3.735s (-2.4%) 1.418s 9 1.02x
▲ Vercel Next.js (Turbopack) 4.021s (+10.8% 🔺) 5.580s (-3.4%) 1.559s 6 1.78x

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

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.722s (+8.4% 🔺) 4.583s (+14.2% 🔺) 2.861s 7 1.00x
🐘 Postgres Express 1.768s (+11.3% 🔺) 4.137s (+3.1%) 2.368s 8 1.03x
🐘 Postgres Next.js (Turbopack) 3.360s (+84.6% 🔺) 6.018s (+23.0% 🔺) 2.659s 5 1.95x
💻 Local Next.js (Turbopack) 4.211s (-46.3% 🟢) 4.870s (-39.3% 🟢) 0.659s 7 2.44x
💻 Local Express 4.657s (-30.1% 🟢) 5.681s (-23.4% 🟢) 1.024s 6 2.70x
💻 Local Nitro 4.709s (-23.4% 🟢) 5.013s (-26.5% 🟢) 0.304s 6 2.73x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.815s (+42.3% 🔺) 5.733s (+32.2% 🔺) 1.917s 6 1.00x
▲ Vercel Nitro 3.842s (+45.3% 🔺) 5.432s (+28.5% 🔺) 1.590s 7 1.01x
▲ Vercel Next.js (Turbopack) 4.536s (+9.3% 🔺) 6.367s (+4.2%) 1.831s 5 1.19x

🔍 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 🥇 Express 1.197s (+1.5%) 2.008s (~) 0.811s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.199s (+1.4%) 2.009s (~) 0.809s 15 1.00x
🐘 Postgres Nitro 1.210s (+3.2%) 2.009s (~) 0.799s 15 1.01x
💻 Local Nitro 1.423s (+3.8%) 2.007s (~) 0.584s 15 1.19x
💻 Local Express 1.484s (+2.6%) 2.007s (~) 0.524s 15 1.24x
💻 Local Next.js (Turbopack) 1.506s (+5.4% 🔺) 2.006s (~) 0.500s 15 1.26x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.957s (+2.1%) 3.542s (~) 1.585s 9 1.00x
▲ Vercel Express 2.076s (+9.7% 🔺) 3.590s (-3.3%) 1.515s 9 1.06x
▲ Vercel Next.js (Turbopack) 2.782s (-9.6% 🟢) 4.689s (-5.0%) 1.907s 7 1.42x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.320s (+1.0%) 2.141s (-13.3% 🟢) 0.822s 15 1.00x
🐘 Postgres Nitro 1.355s (+3.2%) 2.318s (-10.6% 🟢) 0.963s 13 1.03x
🐘 Postgres Next.js (Turbopack) 1.380s (-1.8%) 2.511s (-0.8%) 1.131s 12 1.05x
💻 Local Nitro 2.534s (-7.5% 🟢) 3.009s (-10.0% 🟢) 0.476s 10 1.92x
💻 Local Express 2.569s (-2.6%) 3.009s (~) 0.440s 10 1.95x
💻 Local Next.js (Turbopack) 2.682s (~) 3.109s (-3.1%) 0.427s 10 2.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.175s (-6.2% 🟢) 3.616s (-4.3%) 1.442s 9 1.00x
▲ Vercel Express 2.554s (+1.9%) 4.019s (+1.7%) 1.466s 8 1.17x
▲ Vercel Next.js (Turbopack) 3.475s (+2.0%) 5.194s (-1.4%) 1.720s 7 1.60x

🔍 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 🥇 Nitro 1.641s (~) 4.138s (-3.8%) 2.496s 8 1.00x
🐘 Postgres Express 1.686s (+5.9% 🔺) 4.011s (-3.0%) 2.324s 8 1.03x
🐘 Postgres Next.js (Turbopack) 3.169s (+21.6% 🔺) 6.015s (+15.0% 🔺) 2.846s 5 1.93x
💻 Local Nitro 5.444s (-15.5% 🟢) 6.218s (-16.2% 🟢) 0.774s 5 3.32x
💻 Local Next.js (Turbopack) 5.525s (-13.2% 🟢) 6.014s (-16.7% 🟢) 0.490s 5 3.37x
💻 Local Express 5.768s (-8.9% 🟢) 6.416s (-5.9% 🟢) 0.648s 5 3.51x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.706s (-4.7%) 4.182s (-4.6%) 1.476s 8 1.00x
▲ Vercel Express 2.800s (-1.0%) 4.290s (-5.9% 🟢) 1.489s 7 1.04x
▲ Vercel Next.js (Turbopack) 4.778s (+9.2% 🔺) 7.183s (+16.4% 🔺) 2.405s 5 1.77x

🔍 Observability: Nitro | 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 🥇 Express 0.563s (+1.9%) 1.006s (~) 0.443s 60 1.00x
🐘 Postgres Nitro 0.582s (+3.2%) 1.023s (~) 0.442s 59 1.03x
💻 Local Nitro 0.628s (+4.2%) 1.022s (-1.6%) 0.394s 59 1.12x
🐘 Postgres Next.js (Turbopack) 0.633s (+4.2%) 1.042s (-1.0%) 0.409s 58 1.12x
💻 Local Next.js (Turbopack) 0.647s (-2.1%) 1.005s (-5.0%) 0.358s 60 1.15x
💻 Local Express 0.659s (+19.4% 🔺) 1.022s (+1.7%) 0.363s 59 1.17x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.436s (-9.5% 🟢) 4.018s (-6.3% 🟢) 1.582s 15 1.00x
▲ Vercel Nitro 2.591s (-5.9% 🟢) 4.014s (-9.9% 🟢) 1.423s 15 1.06x
▲ Vercel Next.js (Turbopack) 3.526s (-2.4%) 5.442s (+1.1%) 1.917s 12 1.45x

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

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.377s (+4.9%) 2.030s (-1.2%) 0.652s 45 1.00x
🐘 Postgres Express 1.385s (+2.5%) 2.053s (+1.1%) 0.668s 44 1.01x
🐘 Postgres Next.js (Turbopack) 1.387s (-6.8% 🟢) 2.008s (-6.0% 🟢) 0.621s 45 1.01x
💻 Local Nitro 1.526s (+6.8% 🔺) 2.006s (~) 0.480s 45 1.11x
💻 Local Express 1.584s (+13.1% 🔺) 2.007s (~) 0.423s 45 1.15x
💻 Local Next.js (Turbopack) 1.610s (+8.1% 🔺) 2.029s (+1.1%) 0.418s 45 1.17x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.616s (-8.8% 🟢) 7.235s (-7.8% 🟢) 1.618s 13 1.00x
▲ Vercel Nitro 5.765s (-6.0% 🟢) 7.467s (-1.5%) 1.702s 13 1.03x
▲ Vercel Next.js (Turbopack) 8.150s (+2.8%) 10.046s (+2.6%) 1.896s 9 1.45x

🔍 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 🥇 Express 2.745s (+4.4%) 3.086s (~) 0.341s 39 1.00x
🐘 Postgres Nitro 2.788s (+7.1% 🔺) 3.111s (+2.5%) 0.323s 39 1.02x
🐘 Postgres Next.js (Turbopack) 2.797s (-5.1% 🟢) 3.059s (-11.3% 🟢) 0.262s 40 1.02x
💻 Local Nitro 3.348s (+5.4% 🔺) 4.009s (+1.6%) 0.661s 30 1.22x
💻 Local Express 3.365s (+12.6% 🔺) 4.010s (+15.7% 🔺) 0.645s 30 1.23x
💻 Local Next.js (Turbopack) 3.401s (+6.2% 🔺) 4.009s (~) 0.608s 30 1.24x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 11.159s (-4.7%) 12.765s (-4.6%) 1.606s 10 1.00x
▲ Vercel Nitro 11.279s (-4.8%) 13.065s (-2.6%) 1.786s 10 1.01x
▲ Vercel Next.js (Turbopack) 16.526s (-2.0%) 18.877s (+0.9%) 2.351s 7 1.48x

🔍 Observability: Express | Nitro | 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.184s (-20.5% 🟢) 1.007s (~) 0.823s 60 1.00x
🐘 Postgres Nitro 0.223s (+3.9%) 1.006s (~) 0.783s 60 1.21x
🐘 Postgres Express 0.248s (+11.8% 🔺) 1.006s (~) 0.758s 60 1.35x
💻 Local Nitro 0.545s (+26.9% 🔺) 1.005s (~) 0.460s 60 2.97x
💻 Local Express 0.572s (+27.1% 🔺) 1.005s (~) 0.434s 60 3.11x
💻 Local Next.js (Turbopack) 0.657s (+4.5%) 1.022s (+1.7%) 0.365s 59 3.57x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.105s (+18.6% 🔺) 2.524s (+1.9%) 1.419s 24 1.00x
▲ Vercel Nitro 1.164s (+13.5% 🔺) 2.519s (+3.3%) 1.355s 24 1.05x
▲ Vercel Next.js (Turbopack) 2.301s (+16.0% 🔺) 4.098s (+6.6% 🔺) 1.797s 15 2.08x

🔍 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 🥇 Nitro 0.352s (+4.6%) 1.007s (~) 0.655s 90 1.00x
🐘 Postgres Next.js (Turbopack) 0.362s (+13.9% 🔺) 1.018s (~) 0.655s 89 1.03x
🐘 Postgres Express 0.370s (+11.2% 🔺) 1.029s (+2.3%) 0.658s 88 1.05x
💻 Local Nitro 2.491s (+29.5% 🔺) 3.010s (+20.0% 🔺) 0.519s 30 7.08x
💻 Local Express 2.570s (+18.1% 🔺) 3.010s (+8.8% 🔺) 0.441s 30 7.31x
💻 Local Next.js (Turbopack) 2.630s (-10.1% 🟢) 3.008s (-11.0% 🟢) 0.378s 30 7.48x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.673s (+17.5% 🔺) 3.127s (+4.1%) 1.454s 29 1.00x
▲ Vercel Nitro 1.712s (+5.8% 🔺) 3.349s (+11.4% 🔺) 1.637s 27 1.02x
▲ Vercel Next.js (Turbopack) 2.917s (+17.0% 🔺) 5.130s (+24.9% 🔺) 2.214s 18 1.74x

🔍 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 🥇 Nitro 0.592s (+7.8% 🔺) 1.078s (-4.5%) 0.486s 113 1.00x
🐘 Postgres Express 0.611s (+12.5% 🔺) 1.140s (+2.0%) 0.528s 106 1.03x
🐘 Postgres Next.js (Turbopack) 0.634s (+26.8% 🔺) 3.088s (+22.8% 🔺) 2.454s 39 1.07x
💻 Local Nitro 5.708s (-40.8% 🟢) 8.557s (-20.6% 🟢) 2.848s 15 9.65x
💻 Local Next.js (Turbopack) 6.027s (-44.2% 🟢) 8.883s (-24.4% 🟢) 2.855s 14 10.18x
💻 Local Express 6.294s (-31.9% 🟢) 8.955s (-14.3% 🟢) 2.661s 14 10.64x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.964s (+10.5% 🔺) 3.792s (+3.6%) 1.828s 32 1.00x
▲ Vercel Nitro 1.992s (+18.8% 🔺) 3.661s (+6.1% 🔺) 1.669s 33 1.01x
▲ Vercel Next.js (Turbopack) 4.389s (+8.0% 🔺) 6.177s (+5.3% 🔺) 1.788s 20 2.23x

🔍 Observability: Express | Nitro | 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) 1.145s (+0.5%) 1.966s (~) 0.013s (+6.7% 🔺) 2.020s (~) 0.875s 10 1.00x
🐘 Postgres Nitro 1.159s (-2.4%) 2.001s (~) 0.001s (~) 2.011s (~) 0.852s 10 1.01x
💻 Local Nitro 1.163s (+0.5%) 2.005s (~) 0.012s (+14.0% 🔺) 2.020s (~) 0.857s 10 1.02x
💻 Local Express 1.165s (+2.1%) 2.005s (~) 0.013s (+20.8% 🔺) 2.021s (~) 0.856s 10 1.02x
🐘 Postgres Express 1.165s (+1.1%) 1.993s (~) 0.001s (~) 2.011s (~) 0.846s 10 1.02x
🐘 Postgres Next.js (Turbopack) 1.166s (-4.6%) 2.001s (+0.6%) 0.001s (+44.4% 🔺) 2.011s (~) 0.845s 10 1.02x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.020s (-0.9%) 3.206s (-4.4%) 1.583s (+14.3% 🔺) 5.306s (+1.4%) 3.286s 10 1.00x
▲ Vercel Nitro 2.068s (+8.2% 🔺) 3.265s (+4.9%) 1.596s (-2.5%) 5.321s (+3.0%) 3.253s 10 1.02x
▲ Vercel Next.js (Turbopack) 3.895s (+21.3% 🔺) 4.293s (+7.4% 🔺) 0.874s (+5.8% 🔺) 6.743s (+10.3% 🔺) 2.848s 10 1.93x

🔍 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
🐘 Postgres 🥇 Express 1.593s (~) 2.005s (-1.5%) 0.005s (-3.3%) 2.026s (-1.6%) 0.434s 30 1.00x
💻 Local Nitro 1.597s (+2.4%) 2.009s (~) 0.012s (-10.4% 🟢) 2.024s (~) 0.427s 30 1.00x
🐘 Postgres Nitro 1.611s (+2.4%) 2.003s (~) 0.005s (-11.7% 🟢) 2.025s (~) 0.415s 30 1.01x
💻 Local Next.js (Turbopack) 1.614s (+2.2%) 1.969s (~) 0.013s (+13.3% 🔺) 2.026s (~) 0.413s 30 1.01x
🐘 Postgres Next.js (Turbopack) 1.637s (-13.4% 🟢) 2.010s (-11.2% 🟢) 0.005s (-34.2% 🟢) 2.027s (-12.0% 🟢) 0.390s 30 1.03x
💻 Local Express 1.639s (+6.4% 🔺) 2.011s (~) 0.014s (+5.0%) 2.028s (~) 0.390s 30 1.03x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.434s (-3.7%) 6.894s (-3.8%) 0.303s (+48.7% 🔺) 7.671s (-3.2%) 2.237s 8 1.00x
▲ Vercel Nitro 5.606s (-1.0%) 6.819s (-2.1%) 0.258s (-9.3% 🟢) 7.598s (-1.0%) 1.992s 8 1.03x
▲ Vercel Next.js (Turbopack) 9.839s (+4.4%) 10.939s (+1.7%) 0.312s (+21.7% 🔺) 12.077s (+2.1%) 2.237s 5 1.81x

🔍 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.781s (+1.4%) 1.084s (-1.9%) 0.000s (-100.0% 🟢) 1.099s (-1.8%) 0.318s 55 1.00x
🐘 Postgres Express 0.794s (+2.0%) 1.083s (+2.2%) 0.000s (+Infinity% 🔺) 1.108s (+2.7%) 0.314s 55 1.02x
🐘 Postgres Next.js (Turbopack) 0.940s (-31.7% 🟢) 1.334s (-32.0% 🟢) 0.000s (+Infinity% 🔺) 1.342s (-33.0% 🟢) 0.401s 45 1.20x
💻 Local Next.js (Turbopack) 1.325s (-4.1%) 1.976s (~) 0.000s (+30.0% 🔺) 2.016s (~) 0.692s 30 1.70x
💻 Local Express 1.378s (+8.2% 🔺) 1.889s (-6.1% 🟢) 0.000s (-14.1% 🟢) 1.892s (-6.1% 🟢) 0.514s 32 1.76x
💻 Local Nitro 1.381s (+6.4% 🔺) 1.889s (-6.2% 🟢) 0.000s (+74.1% 🔺) 1.892s (-6.2% 🟢) 0.511s 32 1.77x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.871s (~) 4.166s (-3.8%) 0.000s (+Infinity% 🔺) 4.671s (-3.1%) 1.800s 13 1.00x
▲ Vercel Nitro 3.084s (-98.3% 🟢) 4.270s (-97.7% 🟢) 0.000s (+Infinity% 🔺) 4.746s (-97.5% 🟢) 1.662s 13 1.07x
▲ Vercel Next.js (Turbopack) 4.704s (+11.0% 🔺) 5.686s (+4.7%) 0.000s (+Infinity% 🔺) 6.747s (+8.9% 🔺) 2.043s 10 1.64x

🔍 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
🐘 Postgres 🥇 Express 1.698s (-1.8%) 2.394s (+4.6%) 0.000s (+8.0% 🔺) 2.412s (+4.6%) 0.714s 25 1.00x
🐘 Postgres Nitro 1.808s (-4.4%) 2.437s (~) 0.000s (+100.0% 🔺) 2.451s (~) 0.642s 25 1.06x
🐘 Postgres Next.js (Turbopack) 2.093s (-26.0% 🟢) 2.654s (-21.0% 🟢) 0.000s (+Infinity% 🔺) 2.662s (-21.5% 🟢) 0.569s 23 1.23x
💻 Local Nitro 3.325s (-9.8% 🟢) 3.842s (-11.0% 🟢) 0.001s (+6.9% 🔺) 3.845s (-11.0% 🟢) 0.520s 16 1.96x
💻 Local Express 3.463s (+1.9%) 3.965s (-1.4%) 0.001s (+50.0% 🔺) 3.968s (-1.5%) 0.505s 16 2.04x
💻 Local Next.js (Turbopack) 3.513s (+0.8%) 4.057s (+1.7%) 0.001s (+26.7% 🔺) 4.098s (+1.6%) 0.585s 15 2.07x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.421s (+2.3%) 5.527s (-2.7%) 0.000s (+Infinity% 🔺) 6.029s (-1.9%) 1.608s 10 1.00x
▲ Vercel Nitro 4.798s (+10.3% 🔺) 6.072s (+3.1%) 0.000s (+Infinity% 🔺) 6.533s (+1.2%) 1.735s 10 1.09x
▲ Vercel Next.js (Turbopack) 8.521s (+22.8% 🔺) 9.262s (+16.9% 🔺) 0.000s (+Infinity% 🔺) 10.446s (+18.2% 🔺) 1.926s 6 1.93x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 16/21
Next.js (Turbopack) 🐘 Postgres 16/21
Nitro 🐘 Postgres 16/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)
  • 🌐 Platformatic: Community world (local development)

📋 View full workflow run

@NathanColosimo NathanColosimo force-pushed the nathanc/2331-step-update-pg-transaction branch from 98f5ea8 to 1ed5483 Compare June 30, 2026 19:40
@vercel vercel Bot temporarily deployed to Preview – workflow-docs June 30, 2026 23:36 Inactive
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.

@workflow/world-postgres: late concurrent step_started can land after step_completed in the event log (non-atomic entity UPDATE + event INSERT)

1 participant