Skip to content

[core] Fix spurious "Event cursor missing after initial load" warning#2056

Merged
VaguelySerious merged 2 commits into
mainfrom
peter/fix-load-events-cursor-null
May 22, 2026
Merged

[core] Fix spurious "Event cursor missing after initial load" warning#2056
VaguelySerious merged 2 commits into
mainfrom
peter/fix-load-events-cursor-null

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

Summary

The V2 runtime's loadWorkflowRunEvents helper paginates through world.events.list and overwrites its cursor variable on every page. When the final page is empty (data: [], cursor: null, hasMore: false), the helper returns cursor: null despite having loaded events — which trips the cachedEvents ≠ null + eventsCursor = null branch in runtime.ts, logs Event cursor missing after initial load — falling back to full reload. This indicates a bug in the World implementation., and forces a full event reload on every subsequent replay iteration.

The trailing empty page is a normal, contract-compliant response, not a World bug. workflow-server can produce it whenever an underlying DynamoDB Query hits its Limit exactly — DynamoDB returns LastEvaluatedKey "just in case", the server passes that through as hasMore: true, and the next call returns an empty page. This is observable in production (38 distinct runs in 24h on agents-vade-review alone, each logging the warning multiple times per invocation).

Fix is one line: preserve the last non-null cursor across pages.

cursor = response.cursor ?? cursor;

This mirrors how runtime.ts:665 and runtime.ts:811 already treat incremental loads.

Test plan

  • packages/core/src/runtime/helpers.test.ts — added regression tests covering the trailing-empty-page case, multi-page traversal, and incremental loads that return zero new events. Verified the new tests fail against main (cursor is null instead of the expected last cursor) and pass with the one-line fix.
  • CI green

A World may legitimately return `{ data: [], cursor: null, hasMore: false }`
on a trailing empty page — e.g. when the previous page's DynamoDB query hit
`Limit` exactly and returned a `LastEvaluatedKey` "just in case". Overwriting
the cursor with null on that trailing page caused the V2 runtime to fall into
the "Event cursor missing after initial load" branch and do a full event
reload on every replay iteration.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown
Contributor

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 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.030s (-30.6% 🟢) 1.005s (~) 0.976s 10 1.00x
💻 Local Express 0.030s (-31.2% 🟢) 1.006s (~) 0.975s 10 1.02x
🐘 Postgres Express 0.047s (-18.3% 🟢) 1.013s (~) 0.965s 10 1.59x
🐘 Postgres Nitro 0.052s (-45.2% 🟢) 1.013s (-2.9%) 0.961s 10 1.75x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.303s (-26.0% 🟢) 2.103s (-16.2% 🟢) 1.800s 10 1.00x
▲ Vercel Express 0.321s (+36.2% 🔺) 2.500s (+17.0% 🔺) 2.179s 10 1.06x

🔍 Observability: Nitro | Express

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.069s (-5.0%) 2.006s (~) 0.936s 10 1.00x
💻 Local Nitro 1.069s (-5.5% 🟢) 2.006s (~) 0.937s 10 1.00x
🐘 Postgres Nitro 1.080s (-5.2% 🟢) 2.008s (~) 0.928s 10 1.01x
🐘 Postgres Express 1.087s (-5.2% 🟢) 2.010s (~) 0.924s 10 1.02x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.632s (-58.1% 🟢) 3.589s (-39.3% 🟢) 1.956s 10 1.00x
▲ Vercel Express 1.699s (-9.4% 🟢) 3.829s (+0.6%) 2.130s 10 1.04x

🔍 Observability: Nitro | Express

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 10.408s (-5.1% 🟢) 11.015s (~) 0.607s 3 1.00x
🐘 Postgres Nitro 10.414s (-4.2%) 11.018s (~) 0.604s 3 1.00x
💻 Local Express 10.415s (-4.6%) 11.022s (~) 0.607s 3 1.00x
💻 Local Nitro 10.439s (-4.6%) 11.021s (~) 0.582s 3 1.00x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.421s (-21.0% 🟢) 15.491s (-22.6% 🟢) 2.070s 2 1.00x
▲ Vercel Nitro 13.639s (-42.5% 🟢) 15.456s (-38.5% 🟢) 1.817s 2 1.02x

🔍 Observability: Express | Nitro

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 13.429s (-10.3% 🟢) 14.027s (-6.7% 🟢) 0.598s 5 1.00x
💻 Local Nitro 13.433s (-10.8% 🟢) 14.026s (-12.5% 🟢) 0.593s 5 1.00x
🐘 Postgres Express 13.471s (-7.6% 🟢) 14.016s (-6.7% 🟢) 0.546s 5 1.00x
🐘 Postgres Nitro 13.504s (-7.5% 🟢) 14.018s (-6.7% 🟢) 0.515s 5 1.01x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 23.011s (-54.3% 🟢) 25.176s (-52.1% 🟢) 2.165s 3 1.00x
▲ Vercel Nitro 25.134s (-61.0% 🟢) 27.141s (-59.3% 🟢) 2.007s 3 1.09x

🔍 Observability: Express | Nitro

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 11.872s (-15.2% 🟢) 12.016s (-17.7% 🟢) 0.144s 8 1.00x
💻 Local Nitro 11.873s (-29.3% 🟢) 12.021s (-29.4% 🟢) 0.147s 8 1.00x
💻 Local Express 11.886s (-28.4% 🟢) 12.147s (-28.7% 🟢) 0.261s 8 1.00x
🐘 Postgres Nitro 12.077s (-13.5% 🟢) 12.644s (-11.6% 🟢) 0.566s 8 1.02x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 28.335s (-93.3% 🟢) 30.639s (-92.8% 🟢) 2.304s 3 1.00x
▲ Vercel Express 32.259s (-73.4% 🟢) 35.048s (-71.7% 🟢) 2.789s 3 1.14x

🔍 Observability: Nitro | Express

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.146s (-9.1% 🟢) 2.008s (~) 0.862s 15 1.00x
🐘 Postgres Nitro 1.148s (-10.0% 🟢) 2.008s (~) 0.860s 15 1.00x
💻 Local Express 1.169s (-21.5% 🟢) 2.006s (~) 0.837s 15 1.02x
💻 Local Nitro 1.170s (-28.3% 🟢) 2.006s (-3.3%) 0.836s 15 1.02x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.895s (+2.7%) 4.451s (+3.0%) 1.555s 7 1.00x
▲ Vercel Express 3.961s (+38.5% 🔺) 5.418s (+17.2% 🔺) 1.457s 8 1.37x

🔍 Observability: Nitro | Express

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.202s (-48.9% 🟢) 2.007s (-33.3% 🟢) 0.805s 15 1.00x
🐘 Postgres Express 1.206s (-48.9% 🟢) 2.007s (-33.3% 🟢) 0.801s 15 1.00x
💻 Local Express 1.718s (-41.8% 🟢) 2.005s (-41.9% 🟢) 0.287s 15 1.43x
💻 Local Nitro 1.745s (-44.5% 🟢) 2.005s (-48.4% 🟢) 0.260s 15 1.45x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.983s (-1.7%) 5.466s (-7.7% 🟢) 1.483s 6 1.00x
▲ Vercel Express 4.901s (+35.4% 🔺) 7.138s (+39.7% 🔺) 2.237s 5 1.23x

🔍 Observability: Nitro | Express

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.327s (-61.9% 🟢) 2.008s (-49.9% 🟢) 0.682s 15 1.00x
🐘 Postgres Nitro 1.328s (-61.8% 🟢) 2.007s (-49.9% 🟢) 0.678s 15 1.00x
💻 Local Nitro 4.788s (-42.7% 🟢) 5.347s (-40.7% 🟢) 0.560s 6 3.61x
💻 Local Express 4.833s (-42.0% 🟢) 5.344s (-40.8% 🟢) 0.511s 6 3.64x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.721s (+34.9% 🔺) 8.050s (+31.4% 🔺) 2.329s 4 1.00x
▲ Vercel Nitro 7.040s (+99.7% 🔺) 9.183s (+65.9% 🔺) 2.143s 4 1.23x

🔍 Observability: Express | Nitro

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.148s (-8.7% 🟢) 2.007s (~) 0.859s 15 1.00x
🐘 Postgres Nitro 1.149s (-8.6% 🟢) 2.009s (~) 0.859s 15 1.00x
💻 Local Express 1.405s (-25.8% 🟢) 2.006s (-15.1% 🟢) 0.601s 15 1.22x
💻 Local Nitro 1.438s (-22.9% 🟢) 2.006s (-14.3% 🟢) 0.568s 15 1.25x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.441s (-0.7%) 3.745s (-10.2% 🟢) 1.304s 9 1.00x
▲ Vercel Express 2.873s (+11.3% 🔺) 4.586s (+5.4% 🔺) 1.713s 7 1.18x

🔍 Observability: Nitro | Express

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.211s (-48.3% 🟢) 2.008s (-33.3% 🟢) 0.797s 15 1.00x
🐘 Postgres Nitro 1.217s (-48.0% 🟢) 2.008s (-33.3% 🟢) 0.791s 15 1.00x
💻 Local Express 1.961s (-37.4% 🟢) 2.392s (-36.4% 🟢) 0.431s 13 1.62x
💻 Local Nitro 1.975s (-35.6% 🟢) 2.507s (-35.5% 🟢) 0.532s 12 1.63x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.485s (+7.8% 🔺) 5.149s (+1.4%) 1.664s 6 1.00x
▲ Vercel Express 3.487s (+9.2% 🔺) 5.457s (+13.9% 🔺) 1.970s 6 1.00x

🔍 Observability: Nitro | Express

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.299s (-62.9% 🟢) 2.008s (-49.9% 🟢) 0.709s 15 1.00x
🐘 Postgres Nitro 1.373s (-60.5% 🟢) 2.009s (-49.9% 🟢) 0.636s 15 1.06x
💻 Local Express 4.832s (-45.1% 🟢) 5.512s (-40.6% 🟢) 0.679s 6 3.72x
💻 Local Nitro 5.673s (-38.0% 🟢) 6.017s (-40.0% 🟢) 0.344s 5 4.37x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.430s (+6.6% 🔺) 7.082s (+3.9%) 1.652s 5 1.00x
▲ Vercel Express 6.328s (-1.4%) 8.217s (~) 1.889s 4 1.17x

🔍 Observability: Nitro | Express

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.431s (-48.6% 🟢) 1.006s (-1.6%) 0.575s 60 1.00x
🐘 Postgres Nitro 0.450s (-45.1% 🟢) 1.007s (~) 0.556s 60 1.05x
💻 Local Express 0.464s (-52.8% 🟢) 1.004s (-6.7% 🟢) 0.540s 60 1.08x
💻 Local Nitro 0.496s (-49.4% 🟢) 1.004s (-8.2% 🟢) 0.508s 60 1.15x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.792s (-74.8% 🟢) 6.495s (-69.6% 🟢) 1.703s 10 1.00x
▲ Vercel Nitro 4.893s (-77.8% 🟢) 6.665s (-72.3% 🟢) 1.772s 10 1.02x

🔍 Observability: 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.021s (-48.3% 🟢) 1.507s (-33.3% 🟢) 0.486s 60 1.00x
🐘 Postgres Nitro 1.087s (-43.6% 🟢) 1.807s (-14.0% 🟢) 0.720s 50 1.06x
💻 Local Express 1.174s (-61.1% 🟢) 2.006s (-44.1% 🟢) 0.832s 45 1.15x
💻 Local Nitro 1.200s (-60.5% 🟢) 2.006s (-46.6% 🟢) 0.806s 45 1.18x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 12.397s (-64.1% 🟢) 14.627s (-60.3% 🟢) 2.230s 7 1.00x
▲ Vercel Nitro 13.354s (-66.2% 🟢) 15.339s (-62.9% 🟢) 1.985s 6 1.08x

🔍 Observability: Express | Nitro

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.172s (-45.6% 🟢) 2.660s (-39.1% 🟢) 0.488s 46 1.00x
🐘 Postgres Nitro 2.185s (-46.8% 🟢) 2.984s (-35.2% 🟢) 0.799s 41 1.01x
💻 Local Express 2.691s (-70.8% 🟢) 3.058s (-69.5% 🟢) 0.366s 40 1.24x
💻 Local Nitro 2.751s (-70.4% 🟢) 3.082s (-69.2% 🟢) 0.331s 40 1.27x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 25.727s (-73.5% 🟢) 27.813s (-71.7% 🟢) 2.087s 5 1.00x
▲ Vercel Express 25.761s (-80.2% 🟢) 28.379s (-78.5% 🟢) 2.618s 5 1.00x

🔍 Observability: Nitro | Express

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.174s (-38.5% 🟢) 1.006s (~) 0.832s 60 1.00x
🐘 Postgres Nitro 0.187s (-34.0% 🟢) 1.006s (~) 0.819s 60 1.08x
💻 Local Express 0.394s (-29.7% 🟢) 1.004s (~) 0.610s 60 2.27x
💻 Local Nitro 0.409s (-32.4% 🟢) 1.004s (-1.7%) 0.595s 60 2.35x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.841s (+45.4% 🔺) 4.564s (+25.5% 🔺) 1.723s 14 1.00x
▲ Vercel Nitro 2.843s (+71.2% 🔺) 4.428s (+32.1% 🔺) 1.585s 14 1.00x

🔍 Observability: Express | Nitro

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.304s (-40.3% 🟢) 1.006s (~) 0.702s 90 1.00x
🐘 Postgres Nitro 0.308s (-37.9% 🟢) 1.006s (~) 0.698s 90 1.01x
💻 Local Nitro 2.130s (-16.1% 🟢) 2.852s (-5.2% 🟢) 0.722s 32 7.00x
💻 Local Express 2.148s (-14.6% 🟢) 2.686s (-10.8% 🟢) 0.538s 34 7.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.408s (+67.7% 🔺) 6.773s (+40.5% 🔺) 1.365s 14 1.00x
▲ Vercel Express 5.688s (+86.7% 🔺) 7.502s (+56.1% 🔺) 1.814s 13 1.05x

🔍 Observability: Nitro | Express

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.598s (-27.0% 🟢) 1.006s (-1.1%) 0.408s 120 1.00x
🐘 Postgres Nitro 0.636s (-19.6% 🟢) 1.006s (~) 0.370s 120 1.06x
💻 Local Express 9.968s (-10.9% 🟢) 10.612s (-11.1% 🟢) 0.644s 12 16.67x
💻 Local Nitro 10.253s (-8.4% 🟢) 10.864s (-6.9% 🟢) 0.611s 12 17.15x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 13.353s (+72.9% 🔺) 15.039s (+60.0% 🔺) 1.685s 9 1.00x
▲ Vercel Express 15.057s (+102.9% 🔺) 17.293s (+87.1% 🔺) 2.235s 7 1.13x

🔍 Observability: 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 🥇 Express 1.130s (+450.9% 🔺) 2.001s (+100.4% 🔺) 0.001s (-31.3% 🟢) 2.010s (+98.7% 🔺) 0.880s 10 1.00x
💻 Local Nitro 1.131s (+429.1% 🔺) 2.005s (+99.6% 🔺) 0.012s (-2.4%) 2.019s (+98.2% 🔺) 0.889s 10 1.00x
🐘 Postgres Nitro 1.139s (+455.4% 🔺) 2.002s (+100.3% 🔺) 0.001s (-13.3% 🟢) 2.011s (+98.9% 🔺) 0.873s 10 1.01x
💻 Local Express 1.142s (+473.7% 🔺) 2.005s (+99.6% 🔺) 0.011s (-10.7% 🟢) 2.018s (+98.2% 🔺) 0.876s 10 1.01x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.187s (-12.7% 🟢) 3.585s (-12.3% 🟢) 1.442s (+50.1% 🔺) 5.537s (-1.0%) 3.351s 10 1.00x
▲ Vercel Nitro 2.195s (-42.7% 🟢) 3.298s (-37.5% 🟢) 2.196s (+195.9% 🔺) 5.945s (-8.3% 🟢) 3.751s 10 1.00x

🔍 Observability: Express | Nitro

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.498s (+137.8% 🔺) 2.004s (+99.1% 🔺) 0.004s (+2.7%) 2.027s (+98.2% 🔺) 0.529s 30 1.00x
💻 Local Express 1.516s (+100.2% 🔺) 2.010s (+95.4% 🔺) 0.010s (+8.7% 🔺) 2.023s (+94.5% 🔺) 0.507s 30 1.01x
🐘 Postgres Nitro 1.533s (+145.7% 🔺) 2.003s (+99.0% 🔺) 0.004s (-1.7%) 2.025s (+98.0% 🔺) 0.491s 30 1.02x
💻 Local Nitro 1.717s (+104.7% 🔺) 2.011s (+98.7% 🔺) 0.010s (+2.5%) 2.201s (+97.3% 🔺) 0.485s 28 1.15x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.929s (-79.9% 🟢) 7.076s (-77.0% 🟢) 0.213s (+90.6% 🔺) 7.799s (-75.5% 🟢) 1.870s 8 1.00x
▲ Vercel Express 6.020s (-7.4% 🟢) 7.497s (-6.4% 🟢) 0.260s (-36.4% 🟢) 8.290s (-6.2% 🟢) 2.269s 8 1.02x

🔍 Observability: Nitro | Express

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.645s (-32.9% 🟢) 1.051s (-17.8% 🟢) 0.000s (-100.0% 🟢) 1.060s (-18.9% 🟢) 0.415s 57 1.00x
🐘 Postgres Nitro 0.724s (-25.3% 🟢) 1.048s (-16.0% 🟢) 0.000s (+110.5% 🔺) 1.060s (-15.7% 🟢) 0.336s 57 1.12x
💻 Local Nitro 1.343s (+9.9% 🔺) 2.014s (~) 0.000s (+133.3% 🔺) 2.016s (~) 0.673s 30 2.08x
💻 Local Express 1.377s (+12.4% 🔺) 2.015s (~) 0.000s (-30.0% 🟢) 2.017s (~) 0.640s 30 2.14x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.529s (-5.7% 🟢) 4.866s (-4.6%) 0.002s (+816.7% 🔺) 5.349s (-3.3%) 1.821s 12 1.00x
▲ Vercel Nitro 3.797s (+24.5% 🔺) 4.891s (+11.3% 🔺) 0.000s (-100.0% 🟢) 5.324s (+10.7% 🔺) 1.527s 12 1.08x

🔍 Observability: Express | 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.317s (-25.7% 🟢) 1.964s (-9.8% 🟢) 0.000s (+Infinity% 🔺) 1.992s (-9.4% 🟢) 0.675s 31 1.00x
🐘 Postgres Nitro 1.380s (-23.0% 🟢) 2.066s (-3.5%) 0.000s (+93.1% 🔺) 2.102s (-3.3%) 0.722s 29 1.05x
💻 Local Nitro 3.123s (-7.8% 🟢) 3.843s (-4.7%) 0.001s (+28.9% 🔺) 3.846s (-4.7%) 0.724s 16 2.37x
💻 Local Express 3.356s (-3.2%) 3.906s (-3.2%) 0.001s (-21.9% 🟢) 3.911s (-3.1%) 0.556s 16 2.55x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.493s (+19.7% 🔺) 6.851s (+13.8% 🔺) 0.000s (+Infinity% 🔺) 7.366s (+14.1% 🔺) 1.873s 9 1.00x
▲ Vercel Nitro 5.682s (+38.8% 🔺) 6.969s (+29.7% 🔺) 0.001s (+144.4% 🔺) 7.414s (+28.0% 🔺) 1.732s 9 1.03x

🔍 Observability: Express | Nitro

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 18/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)

📋 View full workflow run


Some benchmark jobs failed:

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

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1200 0 219 1419
✅ 💻 Local Development 1587 0 219 1806
✅ 📦 Local Production 1587 0 219 1806
✅ 🐘 Local Postgres 1587 0 219 1806
✅ 🪟 Windows 129 0 0 129
✅ 📋 Other 727 0 176 903
Total 6817 0 1052 7869

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 127 0 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 104 0 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

Comment thread .changeset/fix-load-events-cursor-null.md Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 21, 2026

🦋 Changeset detected

Latest commit: 96a9fc8

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

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

@VaguelySerious VaguelySerious merged commit 9454151 into main May 22, 2026
200 of 212 checks passed
@VaguelySerious VaguelySerious deleted the peter/fix-load-events-cursor-null branch May 22, 2026 07:12
github-actions Bot added a commit that referenced this pull request May 22, 2026
…adation due to clobbered cursor (#2056)

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

Backport PR opened against stable: #2076. Merge conflicts were resolved by AI — please review carefully. (backport job run)

TooTallNate pushed a commit that referenced this pull request May 22, 2026
…adation due to clobbered cursor (#2056) (#2076)

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@github-actions github-actions Bot mentioned this pull request May 22, 2026
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