Skip to content

[e2e] Add label-gated event log race repro#2159

Merged
VaguelySerious merged 10 commits into
mainfrom
peter/event-log-race-repro-ci
May 30, 2026
Merged

[e2e] Add label-gated event log race repro#2159
VaguelySerious merged 10 commits into
mainfrom
peter/event-log-race-repro-ci

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious commented May 29, 2026

(AI)

Adds a label-gated CI job for reproducing event-log race conditions.

The new event-log-race-repro label runs a single Next.js Turbopack preview deployment through repeated race attempts, writes a JSON artifact, and posts one sticky PR comment with a running history table. Each CI run is a column with timestamped links to the workflow logs and tested deployment, plus the outcome distribution for completed, USER_ERROR, CORRUPTED_EVENT_LOG, RUNTIME_ERROR, stuck, and other runs.

The default run keeps 1500 hook/sleep workflow runs at concurrency 50, then adds 250 parallel-step fanout runs and 250 step/sleep race runs. The step-heavy scenarios are meant to catch concurrent replays acting on stale event logs around step_created, step_completed, wait_completed, and branch decisions, not just hook/sleep interactions. The sticky comment also includes a per-scenario breakdown for the latest run.

This should still catch at least one failure on average for the current main/stable baseline, where CORRUPTED_EVENT_LOG is expected around 0.2% of runs.

This draft is expected to fail on the current unfixed baseline when the label is present; the failure output is the point of the harness. The sticky comment on this PR is the source of truth for the current run history and observed distribution.

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 29, 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 29, 2026 4:26pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 29, 2026 4:26pm
example-workflow Ready Ready Preview, Comment May 29, 2026 4:26pm
workbench-astro-workflow Ready Ready Preview, Comment May 29, 2026 4:26pm
workbench-express-workflow Ready Ready Preview, Comment May 29, 2026 4:26pm
workbench-fastify-workflow Ready Ready Preview, Comment May 29, 2026 4:26pm
workbench-hono-workflow Ready Ready Preview, Comment May 29, 2026 4:26pm
workbench-nitro-workflow Ready Ready Preview, Comment May 29, 2026 4:26pm
workbench-nuxt-workflow Ready Ready Preview, Comment May 29, 2026 4:26pm
workbench-sveltekit-workflow Ready Ready Preview, Comment May 29, 2026 4:26pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 29, 2026 4:26pm
workbench-vite-workflow Ready Ready Preview, Comment May 29, 2026 4:26pm
workflow-docs Ready Ready Preview, Comment, Open in v0 May 29, 2026 4:26pm
workflow-swc-playground Ready Ready Preview, Comment May 29, 2026 4:26pm
workflow-tarballs Ready Ready Preview, Comment May 29, 2026 4:26pm
workflow-web Ready Ready Preview, Comment May 29, 2026 4:26pm

@VaguelySerious VaguelySerious added the event-log-race-repro Run the event log race reproduction job label May 29, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 29, 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.042s (-3.5%) 1.004s (~) 0.963s 10 1.00x
💻 Local Express 0.043s (-2.0%) 1.005s (~) 0.962s 10 1.04x
💻 Local Next.js (Turbopack) 0.056s 1.006s 0.950s 10 1.34x
🐘 Postgres Express 0.057s (-2.4%) 1.011s (~) 0.954s 10 1.36x
🐘 Postgres Nitro 0.066s (-30.4% 🟢) 1.013s (-2.9%) 0.947s 10 1.59x
🐘 Postgres Next.js (Turbopack) 0.069s 1.012s 0.944s 10 1.65x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.293s (+24.6% 🔺) 2.247s (+5.2% 🔺) 1.953s 10 1.00x
▲ Vercel Next.js (Turbopack) 0.331s (+31.5% 🔺) 2.346s (+0.6%) 2.016s 10 1.13x
▲ 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 🥇 Nitro 1.095s (-3.2%) 2.006s (~) 0.911s 10 1.00x
💻 Local Express 1.098s (-2.4%) 2.006s (~) 0.908s 10 1.00x
🐘 Postgres Express 1.104s (-3.7%) 2.009s (~) 0.905s 10 1.01x
💻 Local Next.js (Turbopack) 1.113s 2.005s 0.892s 10 1.02x
🐘 Postgres Nitro 1.115s (-2.2%) 2.010s (~) 0.895s 10 1.02x
🐘 Postgres Next.js (Turbopack) 1.139s 2.009s 0.869s 10 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.678s (-10.5% 🟢) 3.395s (-10.8% 🟢) 1.717s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.979s (-2.8%) 3.835s (~) 1.856s 10 1.18x
▲ 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 🥇 Nitro 10.533s (-3.8%) 11.020s (~) 0.488s 3 1.00x
🐘 Postgres Express 10.548s (-3.8%) 11.019s (~) 0.471s 3 1.00x
🐘 Postgres Nitro 10.554s (-2.9%) 11.022s (~) 0.468s 3 1.00x
💻 Local Express 10.611s (-2.8%) 11.021s (~) 0.410s 3 1.01x
💻 Local Next.js (Turbopack) 10.630s 11.021s 0.391s 3 1.01x
🐘 Postgres Next.js (Turbopack) 10.896s 11.356s 0.460s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 14.195s (-16.4% 🟢) 15.409s (-23.0% 🟢) 1.214s 2 1.00x
▲ Vercel Next.js (Turbopack) 15.682s (-9.4% 🟢) 17.602s (-9.3% 🟢) 1.920s 2 1.10x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 13.724s (-8.9% 🟢) 14.026s (-12.5% 🟢) 0.302s 5 1.00x
🐘 Postgres Express 13.791s (-5.4% 🟢) 14.019s (-6.7% 🟢) 0.228s 5 1.00x
🐘 Postgres Nitro 13.873s (-5.0%) 14.019s (-6.7% 🟢) 0.146s 5 1.01x
💻 Local Next.js (Turbopack) 13.942s 14.225s 0.283s 5 1.02x
💻 Local Express 13.967s (-6.7% 🟢) 14.226s (-5.3% 🟢) 0.259s 5 1.02x
🐘 Postgres Next.js (Turbopack) 14.535s 15.014s 0.479s 4 1.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 24.224s (-51.8% 🟢) 25.759s (-51.0% 🟢) 1.535s 3 1.00x
▲ Vercel Next.js (Turbopack) 29.350s (-44.2% 🟢) 31.264s (-42.7% 🟢) 1.914s 2 1.21x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 12.414s (-26.0% 🟢) 13.024s (-23.5% 🟢) 0.610s 7 1.00x
💻 Local Express 12.512s (-24.6% 🟢) 13.024s (-23.5% 🟢) 0.512s 7 1.01x
🐘 Postgres Nitro 12.571s (-10.0% 🟢) 13.021s (-9.0% 🟢) 0.450s 7 1.01x
🐘 Postgres Express 12.715s (-9.2% 🟢) 13.159s (-9.8% 🟢) 0.444s 7 1.02x
💻 Local Next.js (Turbopack) 12.868s 13.168s 0.299s 7 1.04x
🐘 Postgres Next.js (Turbopack) 13.802s 14.304s 0.502s 7 1.11x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 35.785s (-70.5% 🟢) 37.877s (-69.4% 🟢) 2.092s 3 1.00x
▲ Vercel Next.js (Turbopack) 44.329s (-88.7% 🟢) 46.543s (-88.2% 🟢) 2.214s 2 1.24x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: 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.174s (-6.9% 🟢) 2.007s (~) 0.833s 15 1.00x
💻 Local Nitro 1.185s (-27.4% 🟢) 2.006s (-3.3%) 0.821s 15 1.01x
🐘 Postgres Nitro 1.191s (-6.6% 🟢) 2.008s (~) 0.817s 15 1.01x
💻 Local Express 1.200s (-19.4% 🟢) 2.006s (~) 0.805s 15 1.02x
💻 Local Next.js (Turbopack) 1.227s 2.005s 0.778s 15 1.05x
🐘 Postgres Next.js (Turbopack) 1.233s 2.007s 0.774s 15 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.793s (-2.3%) 4.343s (-6.1% 🟢) 1.550s 7 1.00x
▲ Vercel Next.js (Turbopack) 3.172s (-6.6% 🟢) 4.790s (-2.9%) 1.618s 7 1.14x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.230s (-47.9% 🟢) 2.007s (-33.3% 🟢) 0.776s 15 1.00x
🐘 Postgres Nitro 1.298s (-44.8% 🟢) 2.008s (-33.3% 🟢) 0.710s 15 1.06x
🐘 Postgres Next.js (Turbopack) 1.397s 2.007s 0.610s 15 1.14x
💻 Local Nitro 1.623s (-48.4% 🟢) 2.005s (-48.4% 🟢) 0.382s 15 1.32x
💻 Local Express 1.639s (-44.5% 🟢) 2.006s (-41.9% 🟢) 0.367s 15 1.33x
💻 Local Next.js (Turbopack) 1.702s 2.005s 0.303s 15 1.38x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.067s (+12.4% 🔺) 5.426s (+6.2% 🔺) 1.358s 6 1.00x
▲ Vercel Next.js (Turbopack) 5.020s (-29.3% 🟢) 6.682s (-25.0% 🟢) 1.662s 5 1.23x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.329s (-61.9% 🟢) 2.008s (-49.9% 🟢) 0.679s 15 1.00x
🐘 Postgres Nitro 1.437s (-58.7% 🟢) 2.008s (-49.9% 🟢) 0.571s 15 1.08x
🐘 Postgres Next.js (Turbopack) 1.671s 2.074s 0.403s 15 1.26x
💻 Local Express 4.314s (-48.3% 🟢) 5.013s (-44.5% 🟢) 0.699s 6 3.25x
💻 Local Next.js (Turbopack) 4.329s 5.011s 0.682s 6 3.26x
💻 Local Nitro 4.498s (-46.1% 🟢) 4.868s (-46.0% 🟢) 0.370s 7 3.39x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.696s (+34.3% 🔺) 7.629s (+24.5% 🔺) 1.934s 4 1.00x
▲ Vercel Next.js (Turbopack) 6.689s (-25.0% 🟢) 8.535s (-22.1% 🟢) 1.846s 4 1.17x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.174s (-6.6% 🟢) 2.006s (~) 0.833s 15 1.00x
🐘 Postgres Nitro 1.219s (-3.0%) 2.009s (~) 0.790s 15 1.04x
🐘 Postgres Next.js (Turbopack) 1.244s 2.009s 0.765s 15 1.06x
💻 Local Next.js (Turbopack) 1.373s 2.006s 0.633s 15 1.17x
💻 Local Express 1.485s (-21.6% 🟢) 2.006s (-15.2% 🟢) 0.520s 15 1.27x
💻 Local Nitro 1.615s (-13.4% 🟢) 2.005s (-14.3% 🟢) 0.390s 15 1.38x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.931s (+13.6% 🔺) 4.637s (+6.6% 🔺) 1.705s 7 1.00x
▲ Vercel Next.js (Turbopack) 3.337s (+13.8% 🔺) 4.951s (+6.7% 🔺) 1.614s 7 1.14x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: 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.225s (-47.7% 🟢) 2.007s (-33.3% 🟢) 0.782s 15 1.00x
🐘 Postgres Nitro 1.290s (-44.9% 🟢) 2.008s (-33.3% 🟢) 0.718s 15 1.05x
🐘 Postgres Next.js (Turbopack) 1.375s 2.007s 0.632s 15 1.12x
💻 Local Express 1.833s (-41.5% 🟢) 2.148s (-42.9% 🟢) 0.315s 14 1.50x
💻 Local Nitro 1.899s (-38.0% 🟢) 2.220s (-42.9% 🟢) 0.321s 14 1.55x
💻 Local Next.js (Turbopack) 1.956s 2.391s 0.436s 13 1.60x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.821s (+19.7% 🔺) 5.309s (+10.8% 🔺) 1.488s 6 1.00x
▲ Vercel Next.js (Turbopack) 5.670s (+80.4% 🔺) 7.153s (+58.2% 🔺) 1.483s 5 1.48x
▲ 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 🥇 Express 1.338s (-61.8% 🟢) 2.009s (-49.9% 🟢) 0.671s 15 1.00x
🐘 Postgres Nitro 1.420s (-59.2% 🟢) 2.008s (-49.9% 🟢) 0.588s 15 1.06x
🐘 Postgres Next.js (Turbopack) 1.667s 2.009s 0.342s 15 1.25x
💻 Local Next.js (Turbopack) 4.756s 5.511s 0.755s 6 3.56x
💻 Local Nitro 4.937s (-46.0% 🟢) 5.512s (-45.0% 🟢) 0.575s 6 3.69x
💻 Local Express 5.396s (-38.7% 🟢) 6.014s (-35.1% 🟢) 0.617s 6 4.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.501s (-14.3% 🟢) 7.048s (-13.8% 🟢) 1.548s 5 1.00x
▲ Vercel Next.js (Turbopack) 6.310s (-6.6% 🟢) 8.125s (-4.9%) 1.815s 4 1.15x
▲ 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
💻 Local 🥇 Nitro 0.585s (-40.4% 🟢) 1.004s (-8.2% 🟢) 0.419s 60 1.00x
🐘 Postgres Express 0.587s (-30.1% 🟢) 1.023s (~) 0.436s 59 1.00x
💻 Local Express 0.598s (-39.2% 🟢) 1.004s (-6.7% 🟢) 0.406s 60 1.02x
🐘 Postgres Nitro 0.601s (-26.7% 🟢) 1.024s (+1.8%) 0.423s 59 1.03x
💻 Local Next.js (Turbopack) 0.765s 1.095s 0.330s 55 1.31x
🐘 Postgres Next.js (Turbopack) 0.794s 1.006s 0.212s 60 1.36x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.950s (-68.7% 🟢) 7.351s (-65.5% 🟢) 1.402s 9 1.00x
▲ Vercel Next.js (Turbopack) 7.977s (-45.0% 🟢) 9.751s (-39.4% 🟢) 1.774s 7 1.34x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: 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.382s (-30.1% 🟢) 2.052s (-9.1% 🟢) 0.670s 44 1.00x
🐘 Postgres Nitro 1.446s (-25.0% 🟢) 2.054s (-2.2%) 0.609s 44 1.05x
💻 Local Express 1.535s (-49.1% 🟢) 2.051s (-42.8% 🟢) 0.517s 44 1.11x
💻 Local Nitro 1.556s (-48.7% 🟢) 2.122s (-43.5% 🟢) 0.565s 43 1.13x
💻 Local Next.js (Turbopack) 1.653s 2.006s 0.353s 45 1.20x
🐘 Postgres Next.js (Turbopack) 1.904s 2.076s 0.172s 44 1.38x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 15.408s (-55.4% 🟢) 17.095s (-53.6% 🟢) 1.687s 6 1.00x
▲ Vercel Next.js (Turbopack) 25.038s (-49.7% 🟢) 27.216s (-47.4% 🟢) 2.178s 4 1.63x
▲ 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 🥇 Express 2.694s (-32.5% 🟢) 3.084s (-29.4% 🟢) 0.390s 39 1.00x
🐘 Postgres Nitro 2.828s (-31.1% 🟢) 3.195s (-30.6% 🟢) 0.367s 38 1.05x
💻 Local Nitro 3.063s (-67.1% 🟢) 3.705s (-63.0% 🟢) 0.642s 33 1.14x
💻 Local Express 3.242s (-64.8% 🟢) 4.042s (-59.7% 🟢) 0.800s 30 1.20x
💻 Local Next.js (Turbopack) 3.516s 4.009s 0.492s 30 1.31x
🐘 Postgres Next.js (Turbopack) 3.751s 4.009s 0.258s 30 1.39x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 34.621s (-73.4% 🟢) 36.298s (-72.5% 🟢) 1.676s 4 1.00x
▲ Vercel Next.js (Turbopack) 40.573s (-62.1% 🟢) 42.479s (-61.0% 🟢) 1.906s 3 1.17x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.205s (-27.5% 🟢) 1.006s (~) 0.801s 60 1.00x
🐘 Postgres Nitro 0.228s (-19.5% 🟢) 1.007s (~) 0.779s 60 1.11x
🐘 Postgres Next.js (Turbopack) 0.299s 1.023s 0.724s 59 1.46x
💻 Local Nitro 0.437s (-27.7% 🟢) 1.004s (-1.7%) 0.566s 60 2.14x
💻 Local Express 0.456s (-18.7% 🟢) 1.021s (+1.6%) 0.565s 59 2.22x
💻 Local Next.js (Turbopack) 0.523s 1.038s 0.515s 58 2.55x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.383s (+17.8% 🔺) 4.084s (+7.7% 🔺) 1.701s 15 1.00x
▲ Vercel Express 2.465s (+26.1% 🔺) 3.887s (+6.9% 🔺) 1.422s 16 1.03x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: 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 🥇 Express 0.330s (-35.2% 🟢) 1.006s (~) 0.676s 90 1.00x
🐘 Postgres Nitro 0.379s (-23.7% 🟢) 1.006s (~) 0.628s 90 1.15x
🐘 Postgres Next.js (Turbopack) 0.488s 1.006s 0.518s 90 1.48x
💻 Local Express 2.060s (-18.0% 🟢) 2.580s (-14.3% 🟢) 0.520s 35 6.24x
💻 Local Nitro 2.082s (-18.0% 🟢) 2.592s (-13.9% 🟢) 0.510s 36 6.30x
💻 Local Next.js (Turbopack) 2.468s 3.043s 0.575s 30 7.47x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.164s (+69.5% 🔺) 6.903s (+43.6% 🔺) 1.739s 14 1.00x
▲ Vercel Next.js (Turbopack) 5.317s (+50.4% 🔺) 7.142s (+37.5% 🔺) 1.825s 13 1.03x
▲ 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 🥇 Express 0.622s (-24.0% 🟢) 1.006s (-1.1%) 0.384s 120 1.00x
🐘 Postgres Nitro 0.704s (-10.9% 🟢) 1.007s (~) 0.303s 120 1.13x
🐘 Postgres Next.js (Turbopack) 0.990s 1.652s 0.662s 73 1.59x
💻 Local Nitro 8.750s (-21.8% 🟢) 9.411s (-19.3% 🟢) 0.661s 13 14.06x
💻 Local Express 8.831s (-21.1% 🟢) 9.563s (-19.9% 🟢) 0.732s 13 14.19x
💻 Local Next.js (Turbopack) 9.717s 10.609s 0.891s 12 15.62x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 15.150s (+104.2% 🔺) 16.807s (+81.8% 🔺) 1.658s 8 1.00x
▲ Vercel Next.js (Turbopack) 16.104s (+55.9% 🔺) 18.015s (+46.6% 🔺) 1.911s 7 1.06x
▲ 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 🥇 Nitro 1.148s (+437.3% 🔺) 2.005s (+99.6% 🔺) 0.013s (+6.4% 🔺) 2.020s (+98.3% 🔺) 0.872s 10 1.00x
💻 Local Express 1.156s (+480.4% 🔺) 2.005s (+99.6% 🔺) 0.010s (-14.9% 🟢) 2.017s (+98.2% 🔺) 0.862s 10 1.01x
🐘 Postgres Express 1.162s (+466.6% 🔺) 2.001s (+100.3% 🔺) 0.001s (-25.0% 🟢) 2.010s (+98.7% 🔺) 0.848s 10 1.01x
💻 Local Next.js (Turbopack) 1.168s 2.003s 0.010s 2.016s 0.848s 10 1.02x
🐘 Postgres Nitro 1.174s (+472.8% 🔺) 1.997s (+99.8% 🔺) 0.001s (-20.0% 🟢) 2.011s (+98.8% 🔺) 0.836s 10 1.02x
🐘 Postgres Next.js (Turbopack) 1.221s 2.001s 0.001s 2.011s 0.790s 10 1.06x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.347s (-6.3% 🟢) 3.289s (-19.6% 🟢) 2.102s (+118.7% 🔺) 5.812s (+4.0%) 3.465s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.885s (-57.9% 🟢) 4.069s (-53.0% 🟢) 3.554s (+462.5% 🔺) 8.090s (-17.4% 🟢) 5.204s 10 1.23x
▲ 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
💻 Local 🥇 Express 1.557s (+105.7% 🔺) 2.008s (+95.2% 🔺) 0.011s (+16.8% 🔺) 2.021s (+94.3% 🔺) 0.463s 30 1.00x
💻 Local Nitro 1.572s (+87.5% 🔺) 2.009s (+98.5% 🔺) 0.011s (+14.9% 🔺) 2.021s (+81.2% 🔺) 0.449s 30 1.01x
🐘 Postgres Express 1.605s (+154.8% 🔺) 2.006s (+99.4% 🔺) 0.003s (-11.2% 🟢) 2.025s (+97.9% 🔺) 0.419s 30 1.03x
🐘 Postgres Nitro 1.636s (+162.1% 🔺) 2.003s (+99.0% 🔺) 0.004s (-8.9% 🟢) 2.026s (+98.2% 🔺) 0.390s 30 1.05x
🐘 Postgres Next.js (Turbopack) 1.759s 2.010s 0.004s 2.026s 0.267s 30 1.13x
💻 Local Next.js (Turbopack) 1.794s 2.008s 0.009s 2.200s 0.405s 28 1.15x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 6.187s (-4.9%) 7.300s (-8.9% 🟢) 0.215s (-47.4% 🟢) 8.049s (-8.9% 🟢) 1.861s 8 1.00x
▲ Vercel Next.js (Turbopack) 6.283s (-62.9% 🟢) 7.726s (-57.6% 🟢) 0.250s (+18.4% 🔺) 8.561s (-54.8% 🟢) 2.279s 8 1.02x
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express | 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.726s (-25.0% 🟢) 1.032s (-17.3% 🟢) 0.000s (-17.2% 🟢) 1.042s (-17.2% 🟢) 0.315s 58 1.00x
🐘 Postgres Express 0.735s (-23.5% 🟢) 1.071s (-16.2% 🟢) 0.000s (-58.9% 🟢) 1.086s (-16.9% 🟢) 0.351s 56 1.01x
🐘 Postgres Next.js (Turbopack) 0.808s 1.070s 0.000s 1.087s 0.279s 57 1.11x
💻 Local Express 1.369s (+11.7% 🔺) 2.012s (~) 0.000s (-60.0% 🟢) 2.014s (~) 0.645s 30 1.88x
💻 Local Nitro 1.372s (+12.2% 🔺) 2.012s (~) 0.000s (+100.0% 🔺) 2.014s (~) 0.642s 30 1.89x
💻 Local Next.js (Turbopack) 1.377s 2.010s 0.000s 2.013s 0.636s 30 1.90x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.886s (+3.9%) 4.961s (-2.8%) 0.000s (-100.0% 🟢) 5.416s (-2.1%) 1.530s 12 1.00x
▲ Vercel Next.js (Turbopack) 3.898s (-61.7% 🟢) 5.307s (-53.9% 🟢) 0.000s (+Infinity% 🔺) 5.882s (-51.2% 🟢) 1.984s 11 1.00x
▲ 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.442s (-18.6% 🟢) 2.143s (-1.6%) 0.000s (+Infinity% 🔺) 2.153s (-2.1%) 0.711s 28 1.00x
🐘 Postgres Nitro 1.453s (-18.9% 🟢) 2.103s (-1.8%) 0.000s (-3.4%) 2.117s (-2.6%) 0.664s 29 1.01x
🐘 Postgres Next.js (Turbopack) 1.619s 2.139s 0.000s 2.147s 0.528s 29 1.12x
💻 Local Next.js (Turbopack) 2.854s 3.554s 0.001s 3.557s 0.703s 17 1.98x
💻 Local Express 2.951s (-14.9% 🟢) 3.672s (-9.0% 🟢) 0.001s (-11.8% 🟢) 3.675s (-9.0% 🟢) 0.723s 17 2.05x
💻 Local Nitro 3.165s (-6.6% 🟢) 3.895s (-3.4%) 0.000s (-41.4% 🟢) 3.903s (-3.3%) 0.738s 16 2.20x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.776s (+2.8%) 7.544s (+8.1% 🔺) 0.003s (+2000.0% 🔺) 8.172s (+8.4% 🔺) 2.397s 8 1.00x
▲ Vercel Express 5.837s (+27.2% 🔺) 7.005s (+16.3% 🔺) 0.000s (+Infinity% 🔺) 7.418s (+14.9% 🔺) 1.581s 9 1.01x
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack) | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

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


Some benchmark jobs failed:

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

Check the workflow run for details.

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 29, 2026

🦋 Changeset detected

Latest commit: ebde477

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

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

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 29, 2026

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1255 0 219 1474
✅ 💻 Local Development 1657 0 219 1876
✅ 📦 Local Production 1657 0 219 1876
✅ 🐘 Local Postgres 1657 0 219 1876
✅ 🪟 Windows 134 0 0 134
✅ 📋 Other 762 0 176 938
Total 7122 0 1052 8174

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 108 0 26
✅ example 108 0 26
✅ express 108 0 26
✅ fastify 108 0 26
✅ hono 108 0 26
✅ nextjs-turbopack 132 0 2
✅ nextjs-webpack 132 0 2
✅ nitro 108 0 26
✅ nuxt 108 0 26
✅ sveltekit 127 0 7
✅ vite 108 0 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 109 0 25
✅ express-stable 109 0 25
✅ fastify-stable 109 0 25
✅ hono-stable 109 0 25
✅ nextjs-turbopack-canary 115 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 134 0 0
✅ nextjs-webpack-canary 115 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 134 0 0
✅ nitro-stable 109 0 25
✅ nuxt-stable 109 0 25
✅ sveltekit-stable 128 0 6
✅ vite-stable 109 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 109 0 25
✅ express-stable 109 0 25
✅ fastify-stable 109 0 25
✅ hono-stable 109 0 25
✅ nextjs-turbopack-canary 115 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 134 0 0
✅ nextjs-webpack-canary 115 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 134 0 0
✅ nitro-stable 109 0 25
✅ nuxt-stable 109 0 25
✅ sveltekit-stable 128 0 6
✅ vite-stable 109 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 109 0 25
✅ express-stable 109 0 25
✅ fastify-stable 109 0 25
✅ hono-stable 109 0 25
✅ nextjs-turbopack-canary 115 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 134 0 0
✅ nextjs-webpack-canary 115 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 134 0 0
✅ nitro-stable 109 0 25
✅ nuxt-stable 109 0 25
✅ sveltekit-stable 128 0 6
✅ vite-stable 109 0 25
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 134 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 109 0 25
✅ e2e-local-dev-tanstack-start- 109 0 25
✅ e2e-local-postgres-nest-stable 109 0 25
✅ e2e-local-postgres-tanstack-start- 109 0 25
✅ e2e-local-prod-nest-stable 109 0 25
✅ e2e-local-prod-tanstack-start- 109 0 25
✅ e2e-vercel-prod-tanstack-start 108 0 26

📋 View full workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 29, 2026

Event Log Race Repro

1 of 2000 latest repro runs did not complete cleanly.

Run History

Metric 2026-05-29 15:12 UTC #1
logs / deploy
2026-05-29 15:34 UTC #2
logs / deploy
2026-05-29 16:15 UTC #1
logs / deploy
2026-05-29 16:46 UTC #1
logs / deploy
Result 1/1500 non-completed 2/1500 non-completed 3/2000 non-completed 1/2000 non-completed
Total 1500 1500 2000 2000
completed 1499 1498 1997 1999
CORRUPTED_EVENT_LOG 0 1 2 1
USER_ERROR 0 0 0 0
RUNTIME_ERROR 0 0 0 0
stuck 0 1 0 0
other 1 0 1 0
Config 1500 runs / c50 / 5 iters 1500 runs / c50 / 5 iters 2000 runs / hook 1500, fanout 250, race 250 / c50 / step c50 / 5 iters 2000 runs / hook 1500, fanout 250, race 250 / c50 / step c50 / 5 iters
Timing sleep 5000ms / resume 15000+10000ms / timeout 150000ms sleep 5000ms / resume 15000+10000ms / timeout 150000ms sleep 5000ms / resume 15000+10000ms / timeout 150000ms sleep 5000ms / resume 15000+10000ms / timeout 150000ms

Latest Scenario Breakdown

Scenario Total completed CORRUPTED_EVENT_LOG USER_ERROR RUNTIME_ERROR stuck other
hook-sleep 1500 1500 0 0 0 0 0
step-fanout 250 249 1 0 0 0 0
step-sleep-race-step-biased 125 125 0 0 0 0 0
step-sleep-race-sleep-biased 125 125 0 0 0 0 0

Latest Non-Completed Runs

Scenario Attempt Outcome Status Error code Run
step-fanout 53 CORRUPTED_EVENT_LOG failed CORRUPTED_EVENT_LOG wrun_01KST9R93HWHTVGQFJ59B54XD1

Copy link
Copy Markdown
Member

@TooTallNate TooTallNate left a comment

Choose a reason for hiding this comment

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

Approve — well-built diagnostic harness, doing exactly what it claims

This is a real and useful piece of infrastructure. The harness has caught the ~0.2% baseline CORRUPTED_EVENT_LOG rate consistently across 4 separate CI runs (1, 2, 3, 1 races detected over 1500-2000 attempts), which validates both the hypothesis and the harness itself.

Architecture is clean

  • Label-gated (event-log-race-repro label OR manual dispatch) — won't run on every PR
  • All scenarios in one test with shared deployment, sequential execution per scenario, parallel within
  • Three scenario classes stressing different replay races:
    • hook-sleep Promise.race([hook, sleep]) — classic
    • step-fanout with parallel-step replays acting on stale logs
    • step-sleep-race biased both ways (step wins / sleep wins) to exercise branch-decision determinism
  • Sticky comment with history — last N runs visible at a glance, scenario breakdown for the latest run
  • --check mode in the renderer cleanly separates "render markdown" from "fail the CI step", so the same script powers both paths

Verified

  • All non-repro CI jobs pass (109/2 failures, only Benchmark Vercel (nitro-v3) flake and the expected Event Log Race Repro "failure")
  • The repro job runs ~24 min as expected for 2000 attempts at concurrency 50, plus the step-heavy scenarios
  • Sticky comment renders the history table correctly across 4 runs
  • The --check exit code logic correctly fails when nonCompleted > 0

Things to keep in mind (non-blockers)

  1. Drift risk: This is 881+372+405 lines of test + fixture + renderer scaffolding that depends on SDK surfaces (createHook, start, getHookByToken, resumeHook). If those APIs change, this harness needs updating. Worth a comment block at the top of the test file (or a README next to it) calling it out as "diagnostic-only, update when SDK race shapes change."

  2. Single-adapter coverage: Only runs against example-nextjs-workflow-turbopack. The races being targeted are SDK-level (event log replay), not adapter-specific, and the world-vercel backend is shared across adapters — so this is probably fine. But if races emerge that are adapter-specific (e.g. specific to webpack bundling), this won't catch them. Worth keeping in mind.

  3. Workflow file numbering: 101_hook_sleep_repro.ts follows the 1_, 2_, ..., 100_ convention. Good.

  4. Defensive env parsing: envNumber/envBoolean correctly fall back on invalid input. ✓

Sticky-comment design observations

The comment structure is well thought out:

  • <!-- event-log-race-repro-history JSON event-log-race-repro-history --> — hidden JSON for next run to read and append. Standard "sticky comment with state" pattern, clean.
  • Truncated to most recent N runs implicitly (the table doesn't grow unboundedly because old runs eventually scroll off in the markdown).

One micro-suggestion: if the history grows past 10-ish runs, the table could get unwieldy in the GitHub UI. Worth capping history.length in the renderer (history.slice(-10)) so old data ages out naturally. Not a blocker — easy to add later if it ever matters.

Bottom line

This is the right shape of tool for the problem (random races at 0.2% require a high-iteration harness to surface reliably). The label gating keeps it cheap by default. The sticky-comment history makes it actionable for tracking fixes over time.

Approving.

@github-actions
Copy link
Copy Markdown
Contributor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

event-log-race-repro Run the event log race reproduction job

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants