Skip to content

[web-shared] Fix "Queued for" duration for retried steps#2087

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/fix-event-list-queued-duration
May 22, 2026
Merged

[web-shared] Fix "Queued for" duration for retried steps#2087
VaguelySerious merged 1 commit into
mainfrom
peter/fix-event-list-queued-duration

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious commented May 22, 2026

  • The "Queued for" time in the Events tab was wrong for any step that retried: it showed the time from step_created to the last step_started instead of the first.
  • A retried step emits multiple step_started events with the same correlationId; buildDurationMap in event-list-view.tsx overwrote info.queued on every one of them.
  • Anchor the queued duration on the first step_started for each correlation, and sort events chronologically inside the helper so its output no longer depends on the caller's sort direction (the events tab supports asc/desc and the descending path produced negative-ish garbage in some cases).

Trace viewer

Investigated both components/trace-viewer/ and components/new-trace-viewer/. Both compute the queued segment from the first chronologically-sorted mark (marks[0]) — they are not affected by this bug.

Steps that retry emit multiple `step_started` events with the same
`correlationId`. `buildDurationMap` overwrote `info.queued` on each one,
so the displayed value ended up as time from `step_created` to the
*last* `step_started`. Anchor on the first start instead, and process
events chronologically inside the helper so its output no longer depends
on the caller's sort direction.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@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 3:08pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 22, 2026 3:08pm
example-workflow Ready Ready Preview, Comment May 22, 2026 3:08pm
workbench-astro-workflow Ready Ready Preview, Comment May 22, 2026 3:08pm
workbench-express-workflow Ready Ready Preview, Comment May 22, 2026 3:08pm
workbench-fastify-workflow Ready Ready Preview, Comment May 22, 2026 3:08pm
workbench-hono-workflow Ready Ready Preview, Comment May 22, 2026 3:08pm
workbench-nitro-workflow Ready Ready Preview, Comment May 22, 2026 3:08pm
workbench-nuxt-workflow Ready Ready Preview, Comment May 22, 2026 3:08pm
workbench-sveltekit-workflow Ready Ready Preview, Comment May 22, 2026 3:08pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 22, 2026 3:08pm
workbench-vite-workflow Ready Ready Preview, Comment May 22, 2026 3:08pm
workflow-docs Ready Ready Preview, Comment, Open in v0 May 22, 2026 3:08pm
workflow-swc-playground Ready Ready Preview, Comment May 22, 2026 3:08pm
workflow-tarballs Ready Ready Preview, Comment May 22, 2026 3:08pm
workflow-web Ready Ready Preview, Comment May 22, 2026 3:08pm

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 22, 2026

🦋 Changeset detected

Latest commit: b085023

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

This PR includes changesets to release 16 packages
Name Type
@workflow/web-shared Patch
@workflow/web Patch
@workflow/cli Patch
workflow Patch
@workflow/world-testing Patch
@workflow/core Patch
@workflow/builders Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest 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 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 🥇 Nitro 0.031s (-27.6% 🟢) 1.006s (~) 0.975s 10 1.00x
💻 Local Express 0.032s (-28.9% 🟢) 1.006s (~) 0.975s 10 1.01x
💻 Local Next.js (Turbopack) 0.049s 1.005s 0.956s 10 1.58x
🐘 Postgres Express 0.051s (-11.7% 🟢) 1.012s (~) 0.961s 10 1.64x
🐘 Postgres Next.js (Turbopack) 0.052s 1.011s 0.959s 10 1.66x
🐘 Postgres Nitro 0.053s (-44.1% 🟢) 1.012s (-3.0%) 0.959s 10 1.71x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.266s (+13.0% 🔺) 2.434s (+14.0% 🔺) 2.168s 10 1.00x
▲ Vercel Next.js (Turbopack) 0.285s (+13.2% 🔺) 2.690s (+15.3% 🔺) 2.406s 10 1.07x
▲ Vercel Nitro 0.316s (-22.9% 🟢) 2.433s (-3.1%) 2.117s 10 1.19x

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

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.932s 10 1.00x
💻 Local Express 1.080s (-4.0%) 2.007s (~) 0.926s 10 1.01x
🐘 Postgres Nitro 1.088s (-4.6%) 2.011s (~) 0.923s 10 1.01x
🐘 Postgres Express 1.089s (-5.1% 🟢) 2.009s (~) 0.921s 10 1.01x
🐘 Postgres Next.js (Turbopack) 1.104s 2.010s 0.906s 10 1.03x
💻 Local Next.js (Turbopack) 1.108s 2.007s 0.898s 10 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.631s (-13.0% 🟢) 3.686s (-3.2%) 2.055s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.636s (-19.6% 🟢) 3.792s (-1.0%) 2.155s 10 1.00x
▲ Vercel Nitro 1.665s (-57.2% 🟢) 3.915s (-33.7% 🟢) 2.250s 10 1.02x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 10.415s (-4.2%) 11.014s (~) 0.599s 3 1.00x
🐘 Postgres Express 10.424s (-4.9%) 11.017s (~) 0.593s 3 1.00x
💻 Local Nitro 10.440s (-4.6%) 11.022s (~) 0.582s 3 1.00x
💻 Local Express 10.461s (-4.2%) 11.023s (~) 0.562s 3 1.00x
🐘 Postgres Next.js (Turbopack) 10.542s 11.018s 0.476s 3 1.01x
💻 Local Next.js (Turbopack) 10.658s 11.023s 0.365s 3 1.02x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.194s (-22.3% 🟢) 14.995s (-25.1% 🟢) 1.801s 3 1.00x
▲ Vercel Next.js (Turbopack) 13.268s (-23.4% 🟢) 15.057s (-22.4% 🟢) 1.788s 2 1.01x
▲ Vercel Nitro 13.313s (-43.9% 🟢) 15.580s (-38.0% 🟢) 2.268s 2 1.01x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 13.492s (-7.5% 🟢) 14.018s (-6.7% 🟢) 0.526s 5 1.00x
💻 Local Nitro 13.492s (-10.4% 🟢) 14.027s (-12.5% 🟢) 0.535s 5 1.00x
🐘 Postgres Nitro 13.495s (-7.5% 🟢) 14.017s (-6.7% 🟢) 0.522s 5 1.00x
💻 Local Express 13.554s (-9.5% 🟢) 14.028s (-6.7% 🟢) 0.474s 5 1.00x
🐘 Postgres Next.js (Turbopack) 13.865s 14.216s 0.352s 5 1.03x
💻 Local Next.js (Turbopack) 14.062s 15.030s 0.969s 4 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 20.881s (-60.3% 🟢) 23.195s (-57.5% 🟢) 2.314s 3 1.00x
▲ Vercel Express 21.461s (-57.3% 🟢) 23.623s (-55.1% 🟢) 2.162s 3 1.03x
▲ Vercel Nitro 21.977s (-65.9% 🟢) 23.875s (-64.2% 🟢) 1.898s 3 1.05x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 11.977s (-28.6% 🟢) 12.272s (-27.9% 🟢) 0.295s 8 1.00x
🐘 Postgres Nitro 11.977s (-14.2% 🟢) 12.393s (-13.4% 🟢) 0.416s 8 1.00x
🐘 Postgres Express 12.014s (-14.2% 🟢) 12.519s (-14.2% 🟢) 0.505s 8 1.00x
💻 Local Express 12.217s (-26.4% 🟢) 12.884s (-24.3% 🟢) 0.667s 7 1.02x
🐘 Postgres Next.js (Turbopack) 12.585s 13.019s 0.433s 7 1.05x
💻 Local Next.js (Turbopack) 13.017s 13.453s 0.436s 7 1.09x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 30.938s (-92.1% 🟢) 32.869s (-91.7% 🟢) 1.931s 3 1.00x
▲ Vercel Express 31.835s (-73.7% 🟢) 33.923s (-72.6% 🟢) 2.088s 3 1.03x
▲ Vercel Nitro 32.394s (-92.3% 🟢) 34.666s (-91.8% 🟢) 2.272s 3 1.05x

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

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.143s (-10.3% 🟢) 2.007s (~) 0.864s 15 1.00x
🐘 Postgres Express 1.149s (-8.8% 🟢) 2.008s (~) 0.858s 15 1.01x
💻 Local Nitro 1.174s (-28.1% 🟢) 2.007s (-3.3%) 0.833s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.182s 2.007s 0.825s 15 1.03x
💻 Local Express 1.197s (-19.6% 🟢) 2.007s (~) 0.810s 15 1.05x
💻 Local Next.js (Turbopack) 1.271s 2.006s 0.735s 15 1.11x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.489s (-11.7% 🟢) 3.924s (-9.2% 🟢) 1.435s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.563s (-24.6% 🟢) 4.212s (-14.6% 🟢) 1.649s 8 1.03x
▲ Vercel Express 2.658s (-7.1% 🟢) 4.193s (-9.3% 🟢) 1.536s 8 1.07x

🔍 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 1.197s (-49.1% 🟢) 2.006s (-33.3% 🟢) 0.809s 15 1.00x
🐘 Postgres Express 1.214s (-48.6% 🟢) 2.008s (-33.3% 🟢) 0.794s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.290s 2.007s 0.717s 15 1.08x
💻 Local Next.js (Turbopack) 1.742s 2.073s 0.331s 15 1.46x
💻 Local Nitro 1.890s (-39.9% 🟢) 2.150s (-44.7% 🟢) 0.260s 14 1.58x
💻 Local Express 2.115s (-28.4% 🟢) 2.470s (-28.5% 🟢) 0.355s 13 1.77x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.456s (-14.7% 🟢) 5.111s (-13.7% 🟢) 1.655s 7 1.00x
▲ Vercel Next.js (Turbopack) 3.659s (-48.5% 🟢) 5.400s (-39.4% 🟢) 1.741s 6 1.06x
▲ Vercel Express 3.692s (+2.0%) 5.470s (+7.0% 🔺) 1.777s 6 1.07x

🔍 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 🥇 Nitro 1.308s (-62.4% 🟢) 2.007s (-49.9% 🟢) 0.699s 15 1.00x
🐘 Postgres Express 1.331s (-61.8% 🟢) 2.008s (-49.9% 🟢) 0.676s 15 1.02x
🐘 Postgres Next.js (Turbopack) 1.497s 2.007s 0.510s 15 1.14x
💻 Local Next.js (Turbopack) 4.893s 5.513s 0.620s 6 3.74x
💻 Local Express 5.699s (-31.7% 🟢) 6.213s (-31.2% 🟢) 0.515s 5 4.36x
💻 Local Nitro 5.763s (-31.0% 🟢) 6.215s (-31.1% 🟢) 0.452s 5 4.41x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.182s (+22.2% 🔺) 7.074s (+15.5% 🔺) 1.893s 5 1.00x
▲ Vercel Nitro 6.300s (+78.7% 🔺) 7.681s (+38.8% 🔺) 1.381s 4 1.22x
▲ Vercel Next.js (Turbopack) 6.500s (-27.1% 🟢) 8.384s (-23.5% 🟢) 1.884s 4 1.25x

🔍 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 🥇 Nitro 1.143s (-9.0% 🟢) 2.008s (~) 0.865s 15 1.00x
🐘 Postgres Express 1.155s (-8.1% 🟢) 2.009s (~) 0.853s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.172s 2.008s 0.836s 15 1.02x
💻 Local Next.js (Turbopack) 1.377s 2.006s 0.629s 15 1.20x
💻 Local Nitro 1.451s (-22.2% 🟢) 2.006s (-14.3% 🟢) 0.555s 15 1.27x
💻 Local Express 1.464s (-22.7% 🟢) 2.007s (-15.1% 🟢) 0.543s 15 1.28x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.641s (+2.3%) 4.268s (-1.9%) 1.627s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.679s (-8.6% 🟢) 4.496s (-3.1%) 1.818s 7 1.01x
▲ Vercel Nitro 2.720s (+10.6% 🔺) 4.079s (-2.2%) 1.359s 8 1.03x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.212s (-48.2% 🟢) 2.009s (-33.3% 🟢) 0.797s 15 1.00x
🐘 Postgres Express 1.217s (-48.0% 🟢) 2.010s (-33.2% 🟢) 0.793s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.284s 2.007s 0.723s 15 1.06x
💻 Local Nitro 2.031s (-33.7% 🟢) 2.508s (-35.5% 🟢) 0.477s 12 1.68x
💻 Local Express 2.099s (-33.0% 🟢) 2.592s (-31.1% 🟢) 0.493s 12 1.73x
💻 Local Next.js (Turbopack) 2.129s 3.008s 0.878s 10 1.76x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.588s (+14.2% 🔺) 5.282s (+16.8% 🔺) 1.694s 6 1.00x
▲ Vercel Nitro 3.995s (+23.6% 🔺) 5.785s (+14.0% 🔺) 1.790s 6 1.11x
▲ Vercel Express 4.051s (+26.9% 🔺) 5.468s (+14.1% 🔺) 1.417s 6 1.13x

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

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.332s (-61.9% 🟢) 2.009s (-49.9% 🟢) 0.676s 15 1.00x
🐘 Postgres Nitro 1.338s (-61.6% 🟢) 2.008s (-49.9% 🟢) 0.670s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.500s 2.009s 0.509s 15 1.13x
💻 Local Nitro 5.749s (-37.1% 🟢) 6.346s (-36.7% 🟢) 0.597s 6 4.31x
💻 Local Next.js (Turbopack) 5.897s 6.419s 0.522s 5 4.43x
💻 Local Express 7.002s (-20.4% 🟢) 7.418s (-20.0% 🟢) 0.416s 5 5.26x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.032s (-21.6% 🟢) 7.251s (-11.3% 🟢) 2.219s 5 1.00x
▲ Vercel Nitro 6.409s (+25.8% 🔺) 8.314s (+22.0% 🔺) 1.905s 4 1.27x
▲ Vercel Next.js (Turbopack) 6.625s (-2.0%) 9.182s (+7.5% 🔺) 2.557s 4 1.32x

🔍 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 🥇 Nitro 0.463s (-43.6% 🟢) 1.023s (+1.7%) 0.561s 59 1.00x
🐘 Postgres Express 0.467s (-44.3% 🟢) 1.007s (-1.6%) 0.540s 60 1.01x
💻 Local Nitro 0.498s (-49.2% 🟢) 1.021s (-6.6% 🟢) 0.523s 59 1.08x
💻 Local Express 0.514s (-47.7% 🟢) 1.005s (-6.6% 🟢) 0.491s 60 1.11x
🐘 Postgres Next.js (Turbopack) 0.527s 1.006s 0.479s 60 1.14x
💻 Local Next.js (Turbopack) 0.789s 1.021s 0.232s 59 1.71x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.140s (-76.7% 🟢) 6.945s (-71.1% 🟢) 1.805s 9 1.00x
▲ Vercel Express 5.267s (-72.3% 🟢) 7.191s (-66.3% 🟢) 1.924s 9 1.02x
▲ Vercel Next.js (Turbopack) 5.325s (-63.3% 🟢) 7.449s (-53.7% 🟢) 2.124s 9 1.04x

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

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.051s (-46.8% 🟢) 1.724s (-23.7% 🟢) 0.672s 53 1.00x
🐘 Postgres Nitro 1.108s (-42.5% 🟢) 1.944s (-7.5% 🟢) 0.836s 47 1.05x
💻 Local Nitro 1.220s (-59.8% 🟢) 2.006s (-46.6% 🟢) 0.786s 45 1.16x
🐘 Postgres Next.js (Turbopack) 1.236s 2.008s 0.772s 45 1.18x
💻 Local Express 1.274s (-57.7% 🟢) 2.006s (-44.0% 🟢) 0.732s 45 1.21x
💻 Local Next.js (Turbopack) 1.905s 2.099s 0.194s 43 1.81x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 12.607s (-68.1% 🟢) 14.909s (-63.9% 🟢) 2.302s 7 1.00x
▲ Vercel Express 13.185s (-61.8% 🟢) 15.376s (-58.2% 🟢) 2.191s 6 1.05x
▲ Vercel Next.js (Turbopack) 13.294s (-73.3% 🟢) 15.467s (-70.1% 🟢) 2.173s 6 1.05x

🔍 Observability: Nitro | 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 🥇 Nitro 2.099s (-48.8% 🟢) 2.616s (-43.2% 🟢) 0.517s 46 1.00x
🐘 Postgres Express 2.127s (-46.7% 🟢) 2.735s (-37.4% 🟢) 0.608s 44 1.01x
🐘 Postgres Next.js (Turbopack) 2.417s 3.008s 0.591s 40 1.15x
💻 Local Express 2.725s (-70.4% 🟢) 3.008s (-70.0% 🟢) 0.283s 40 1.30x
💻 Local Nitro 2.725s (-70.7% 🟢) 3.008s (-70.0% 🟢) 0.283s 40 1.30x
💻 Local Next.js (Turbopack) 4.028s 4.602s 0.574s 27 1.92x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 28.084s (-71.0% 🟢) 30.227s (-69.3% 🟢) 2.144s 5 1.00x
▲ Vercel Next.js (Turbopack) 28.321s (-73.6% 🟢) 30.393s (-72.1% 🟢) 2.072s 4 1.01x
▲ Vercel Express 28.462s (-78.1% 🟢) 30.840s (-76.7% 🟢) 2.378s 4 1.01x

🔍 Observability: Nitro | 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 🥇 Nitro 0.171s (-39.7% 🟢) 1.006s (~) 0.835s 60 1.00x
🐘 Postgres Express 0.179s (-36.4% 🟢) 1.006s (~) 0.826s 60 1.05x
🐘 Postgres Next.js (Turbopack) 0.207s 1.006s 0.799s 60 1.21x
💻 Local Express 0.416s (-25.8% 🟢) 1.004s (~) 0.589s 60 2.43x
💻 Local Nitro 0.418s (-30.9% 🟢) 1.004s (-1.7%) 0.587s 60 2.45x
💻 Local Next.js (Turbopack) 0.542s 1.005s 0.462s 60 3.18x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.451s (+47.6% 🔺) 4.333s (+29.3% 🔺) 1.882s 15 1.00x
▲ Vercel Next.js (Turbopack) 2.550s (+26.1% 🔺) 4.428s (+16.7% 🔺) 1.878s 14 1.04x
▲ Vercel Express 2.780s (+42.3% 🔺) 4.642s (+27.6% 🔺) 1.861s 13 1.13x

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

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.293s (-41.0% 🟢) 1.006s (~) 0.713s 90 1.00x
🐘 Postgres Express 0.311s (-38.9% 🟢) 1.006s (~) 0.695s 90 1.06x
🐘 Postgres Next.js (Turbopack) 0.397s 1.006s 0.609s 90 1.36x
💻 Local Nitro 2.116s (-16.6% 🟢) 2.796s (-7.1% 🟢) 0.680s 33 7.23x
💻 Local Express 2.136s (-15.0% 🟢) 2.736s (-9.1% 🟢) 0.600s 33 7.30x
💻 Local Next.js (Turbopack) 2.239s 2.947s 0.708s 31 7.65x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.665s (+85.9% 🔺) 7.279s (+51.4% 🔺) 1.614s 13 1.00x
▲ Vercel Next.js (Turbopack) 6.891s (+94.9% 🔺) 8.835s (+70.1% 🔺) 1.944s 11 1.22x
▲ Vercel Nitro 39.955s (+1138.6% 🔺) 41.777s (+766.4% 🔺) 1.822s 9 7.05x

🔍 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 🥇 Nitro 0.630s (-20.3% 🟢) 1.006s (~) 0.376s 120 1.00x
🐘 Postgres Express 0.649s (-20.8% 🟢) 1.007s (-1.0%) 0.358s 120 1.03x
🐘 Postgres Next.js (Turbopack) 0.757s 1.005s 0.249s 120 1.20x
💻 Local Express 10.325s (-7.7% 🟢) 10.865s (-9.0% 🟢) 0.540s 12 16.39x
💻 Local Nitro 10.418s (-6.9% 🟢) 10.936s (-6.2% 🟢) 0.518s 11 16.53x
💻 Local Next.js (Turbopack) 10.889s 11.756s 0.866s 11 17.28x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 14.258s (+38.1% 🔺) 16.604s (+35.1% 🔺) 2.346s 8 1.00x
▲ Vercel Nitro 15.411s (+99.6% 🔺) 17.215s (+83.1% 🔺) 1.804s 8 1.08x
▲ Vercel Express 15.981s (+115.4% 🔺) 18.140s (+96.2% 🔺) 2.159s 7 1.12x

🔍 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
🐘 Postgres 🥇 Nitro 1.133s (+452.6% 🔺) 1.997s (+99.8% 🔺) 0.001s (-6.7% 🟢) 2.009s (+98.7% 🔺) 0.876s 10 1.00x
💻 Local Nitro 1.136s (+431.6% 🔺) 2.005s (+99.6% 🔺) 0.013s (+8.0% 🔺) 2.021s (+98.4% 🔺) 0.885s 10 1.00x
🐘 Postgres Express 1.145s (+458.4% 🔺) 1.999s (+100.2% 🔺) 0.001s (-18.8% 🟢) 2.012s (+98.9% 🔺) 0.866s 10 1.01x
🐘 Postgres Next.js (Turbopack) 1.162s 2.001s 0.001s 2.010s 0.848s 10 1.03x
💻 Local Express 1.166s (+485.7% 🔺) 2.006s (+99.7% 🔺) 0.013s (+7.4% 🔺) 2.021s (+98.5% 🔺) 0.855s 10 1.03x
💻 Local Next.js (Turbopack) 1.173s 2.004s 0.011s 2.018s 0.844s 10 1.04x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.191s (-12.6% 🟢) 3.391s (-17.1% 🟢) 1.722s (+79.2% 🔺) 5.637s (+0.8%) 3.447s 10 1.00x
▲ Vercel Nitro 2.211s (-42.3% 🟢) 3.379s (-36.0% 🟢) 1.786s (+140.6% 🔺) 5.690s (-12.2% 🟢) 3.479s 10 1.01x
▲ Vercel Next.js (Turbopack) 2.310s (-66.3% 🟢) 3.317s (-61.7% 🟢) 2.218s (+251.0% 🔺) 6.101s (-37.7% 🟢) 3.791s 10 1.05x

🔍 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 🥇 Nitro 1.510s (+141.9% 🔺) 2.004s (+99.0% 🔺) 0.004s (-5.7% 🟢) 2.027s (+98.2% 🔺) 0.517s 30 1.00x
🐘 Postgres Express 1.535s (+143.7% 🔺) 2.003s (+99.0% 🔺) 0.004s (+1.8%) 2.026s (+98.1% 🔺) 0.491s 30 1.02x
💻 Local Express 1.539s (+103.2% 🔺) 2.012s (+95.5% 🔺) 0.011s (+13.7% 🔺) 2.025s (+94.7% 🔺) 0.486s 30 1.02x
💻 Local Nitro 1.556s (+85.6% 🔺) 2.012s (+98.8% 🔺) 0.011s (+17.4% 🔺) 2.025s (+81.4% 🔺) 0.468s 30 1.03x
🐘 Postgres Next.js (Turbopack) 1.590s 2.008s 0.003s 2.023s 0.433s 30 1.05x
💻 Local Next.js (Turbopack) 1.724s 2.011s 0.011s 2.026s 0.302s 30 1.14x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.802s (-10.8% 🟢) 7.158s (-10.6% 🟢) 0.277s (-32.2% 🟢) 7.932s (-10.2% 🟢) 2.130s 8 1.00x
▲ Vercel Next.js (Turbopack) 6.093s (-64.0% 🟢) 7.492s (-58.9% 🟢) 0.246s (+16.4% 🔺) 8.250s (-56.4% 🟢) 2.157s 8 1.05x
▲ Vercel Nitro 6.194s (-79.0% 🟢) 7.563s (-75.5% 🟢) 0.282s (+151.5% 🔺) 8.361s (-73.7% 🟢) 2.167s 8 1.07x

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

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.647s (-33.2% 🟢) 1.015s (-18.7% 🟢) 0.000s (-18.6% 🟢) 1.031s (-18.0% 🟢) 0.384s 59 1.00x
🐘 Postgres Express 0.683s (-28.9% 🟢) 1.014s (-20.7% 🟢) 0.000s (-60.3% 🟢) 1.049s (-19.7% 🟢) 0.366s 58 1.06x
🐘 Postgres Next.js (Turbopack) 0.722s 1.053s 0.000s 1.060s 0.338s 57 1.12x
💻 Local Express 1.353s (+10.5% 🔺) 2.015s (~) 0.001s (+90.0% 🔺) 2.018s (~) 0.665s 30 2.09x
💻 Local Nitro 1.411s (+15.4% 🔺) 2.015s (~) 0.000s (+200.0% 🔺) 2.018s (~) 0.607s 30 2.18x
💻 Local Next.js (Turbopack) 1.512s 2.016s 0.001s 2.020s 0.508s 30 2.34x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.866s (+3.4%) 5.163s (+1.2%) 0.001s (+200.0% 🔺) 5.680s (+2.7%) 1.814s 11 1.00x
▲ Vercel Next.js (Turbopack) 3.896s (-61.7% 🟢) 5.280s (-54.2% 🟢) 0.000s (+Infinity% 🔺) 5.771s (-52.1% 🟢) 1.874s 11 1.01x
▲ Vercel Nitro 4.235s (+38.8% 🔺) 5.740s (+30.7% 🔺) 0.000s (+290.0% 🔺) 6.253s (+30.0% 🔺) 2.018s 10 1.10x

🔍 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.366s (-22.9% 🟢) 2.101s (-3.5%) 0.000s (+Infinity% 🔺) 2.114s (-3.8%) 0.749s 29 1.00x
🐘 Postgres Nitro 1.375s (-23.3% 🟢) 2.030s (-5.2% 🟢) 0.000s (+93.1% 🔺) 2.072s (-4.7%) 0.698s 29 1.01x
🐘 Postgres Next.js (Turbopack) 1.450s 2.069s 0.000s 2.087s 0.637s 30 1.06x
💻 Local Express 3.091s (-10.8% 🟢) 3.843s (-4.7%) 0.000s (-45.3% 🟢) 3.845s (-4.7%) 0.754s 16 2.26x
💻 Local Next.js (Turbopack) 3.192s 3.675s 0.001s 3.683s 0.491s 17 2.34x
💻 Local Nitro 3.229s (-4.7%) 3.968s (-1.6%) 0.001s (+17.2% 🔺) 3.971s (-1.6%) 0.742s 16 2.36x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.474s (+33.7% 🔺) 6.902s (+28.4% 🔺) 0.000s (-100.0% 🟢) 7.394s (+27.6% 🔺) 1.920s 9 1.00x
▲ Vercel Next.js (Turbopack) 5.842s (+4.0%) 7.272s (+4.2%) 0.000s (~) 7.808s (+3.6%) 1.966s 8 1.07x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

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

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1222 0 219 1441
✅ 💻 Local Development 1615 0 219 1834
✅ 📦 Local Production 1615 0 219 1834
✅ 🐘 Local Postgres 1615 0 219 1834
✅ 🪟 Windows 131 0 0 131
✅ 📋 Other 741 0 176 917
Total 6939 0 1052 7991

Details by Category

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

📋 View full workflow run

@VaguelySerious VaguelySerious marked this pull request as ready for review May 22, 2026 15:12
@VaguelySerious VaguelySerious requested a review from a team as a code owner May 22, 2026 15:12
Copy link
Copy Markdown
Contributor

@karthikscale3 karthikscale3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGMT

@VaguelySerious VaguelySerious merged commit a490f58 into main May 22, 2026
116 of 120 checks passed
@VaguelySerious VaguelySerious deleted the peter/fix-event-list-queued-duration branch May 22, 2026 16:52
github-actions Bot added a commit that referenced this pull request May 22, 2026
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@github-actions
Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2089. (backport job run)

VaguelySerious pushed a commit that referenced this pull request May 22, 2026
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Co-author-by: Peter Wielander <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.

2 participants