Skip to content

fix(core): wait for replay propagation before suspending#1961

Open
karthikscale3 wants to merge 13 commits intomainfrom
kk/schedule-when-idle-repro-test
Open

fix(core): wait for replay propagation before suspending#1961
karthikscale3 wants to merge 13 commits intomainfrom
kk/schedule-when-idle-repro-test

Conversation

@karthikscale3
Copy link
Copy Markdown
Contributor

@karthikscale3 karthikscale3 commented May 7, 2026

Summary

Fixes a false-positive WorkflowRuntimeError: Unconsumed event in event log that can happen during high-concurrency replay when many parallel branches advance into follow-up sequential steps.

Problem

pendingDeliveries can briefly drop to 0 after a step result finishes hydrating, before the workflow VM has resumed across the VM boundary and registered callbacks for the next wave of useStep calls.

scheduleWhenIdle treated that transient 0 as truly idle and fired WorkflowSuspension immediately. In that case replay could abort before the next-wave step callback was registered, leaving an existing step_created event unclaimed. The deferred unconsumed-event check then failed the run with WorkflowRuntimeError even though the event log and step execution were valid.

Fix

Update scheduleWhenIdle so idle suspension waits for replay delivery propagation before firing:

  1. Wait for the current promiseQueue to drain.
  2. Yield once with setTimeout(0) so cross-VM promise continuations can run.
  3. Wait for the possibly-updated promiseQueue again.
  4. Re-check pendingDeliveries and loop if new deliveries appeared.
  5. If this idle cycle observed in-flight deliveries, wait the same propagation delay (aliased from EventsConsumer's DEFERRED_CHECK_DELAY_MS) before suspending, then re-check pendingDeliveries one more time.

The non-zero deferred delay only applies after scheduleWhenIdle has seen replay deliveries in flight. That gives follow-up useStep callbacks time to register after hydrated results cross the VM boundary, while preserving the fast suspension path for ordinary new-work scheduling where no replay delivery was active.

Latency note

The added wait is bounded to "idle cycles that observed deliveries", which in practice is at most one per replay round per scheduling site, not per step. Cold-start single-step workflows and ordinary new-work suspensions are unaffected. Worth watching CI/prod data, but it should not be a meaningful added cost relative to the I/O involved in writing step_created events.

Why no cancellation hook

Unlike EventsConsumer's deferred unconsumed-event check, this propagation timer is intentionally not cancelled when a follow-up useStep/hook/sleep registers during the wait. If a callback arrives mid-wait and consumes the pending *_created event, the suspension still fires after the delay, but it is harmless: the matching invocation already has hasCreatedEvent=true, so the suspension handler does not re-create the step and the run simply continues replay from the persisted log.

Tests

  • Added a focused unit test (packages/core/src/private.test.ts) for the scheduleWhenIdle state machine: covers (a) the fast path firing immediately when no deliveries are observed, (b) the deferred path firing after the propagation window when deliveries were observed, (c) re-looping when pendingDeliveries reappears mid-wait, and (d) continued polling while deliveries persist.
  • Added a new e2e regression workflow 96_many_steps.ts::concurrentMultiWaveWorkflow with many concurrent branches and multiple sequential waves. The workflow lives in workbench/example/workflows/ (canonical) with symlinks across the rest of the matrix.
  • The stress e2e is intentionally limited to the Vercel-backed nextjs-turbopack lane (APP_NAME=nextjs-turbopack with WORKFLOW_VERCEL_ENV set), which is the representative adapter/environment for the production-shaped replay race. What we observed in CI when it ran more broadly: local dev/prod/postgres and Windows lanes timed out at the 600s test limit with the workflow still running, while some full-matrix Vercel adapter lanes failed inside the stress workflow with Cannot read properties of undefined (reading 'map'). That makes broader execution a CI blocker and suggests a separate high-load stress behavior to investigate outside this targeted runtime fix.
  • Verified pnpm --filter @workflow/core build and pnpm --filter @workflow/core test pass locally.

Adds an e2e regression test that exercises 50 concurrent items each running
two sequential steps (search → addResult). The pattern produces the timing
skew that triggers the scheduleWhenIdle premature-suspension race seen in
production runs (e.g. wrun_01KQ05J17ZJHGZFRYZ20QM1DBS, where 250 steps
completed cleanly server-side but the workflow still failed with
WorkflowRuntimeError "Unconsumed event in event log" due to scheduleWhenIdle
firing WorkflowSuspension before the addResult callback could be registered).

The race only manifests reliably when flow handlers run across separate
function invocations, so this test should be evaluated against a real Vercel
deployment (which CI does for the nextjs-turbopack matrix entry).

Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 7, 2026

🦋 Changeset detected

Latest commit: f9d27d4

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

This PR includes changesets to release 18 packages
Name Type
@workflow/core Patch
@workflow/builders Patch
@workflow/cli Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/web Patch
workflow Patch
@workflow/world-testing Patch
tarballs Patch
@workflow/astro Patch
@workflow/nest Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch
@workflow/nuxt Patch
@workflow/ai 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

@vercel
Copy link
Copy Markdown
Contributor

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 7, 2026

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 0.031s (-30.0% 🟢) 1.005s (~) 0.974s 10 1.00x
💻 Local Nitro 0.033s (-23.2% 🟢) 1.006s (~) 0.973s 10 1.07x
🐘 Postgres Nitro 0.047s (-50.2% 🟢) 1.011s (-3.1%) 0.963s 10 1.53x
💻 Local Next.js (Turbopack) 0.050s 1.005s 0.955s 10 1.62x
🐘 Postgres Express 0.054s (-7.2% 🟢) 1.011s (~) 0.957s 10 1.74x
🌐 Redis Next.js (Turbopack) 0.057s 1.005s 0.949s 10 1.82x
🐘 Postgres Next.js (Turbopack) 0.057s 1.011s 0.954s 10 1.85x
🌐 MongoDB Next.js (Turbopack) 0.099s 1.008s 0.908s 10 3.20x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.253s (+7.5% 🔺) 2.068s (-3.2%) 1.815s 10 1.00x
▲ Vercel Next.js (Turbopack) 0.477s (+89.7% 🔺) 2.504s (+7.3% 🔺) 2.027s 10 1.89x
▲ 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 🥇 Express 1.075s (-4.5%) 2.006s (~) 0.931s 10 1.00x
💻 Local Nitro 1.077s (-4.8%) 2.007s (~) 0.930s 10 1.00x
🐘 Postgres Nitro 1.087s (-4.7%) 2.009s (~) 0.923s 10 1.01x
🐘 Postgres Express 1.088s (-5.1% 🟢) 2.009s (~) 0.920s 10 1.01x
💻 Local Next.js (Turbopack) 1.110s 2.006s 0.896s 10 1.03x
🌐 Redis Next.js (Turbopack) 1.112s 2.006s 0.894s 10 1.03x
🐘 Postgres Next.js (Turbopack) 1.117s 2.010s 0.893s 10 1.04x
🌐 MongoDB Next.js (Turbopack) 1.151s 2.009s 0.858s 10 1.07x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.688s (-10.0% 🟢) 3.728s (-2.1%) 2.039s 10 1.00x
▲ Vercel Next.js (Turbopack) 3.289s (+61.6% 🔺) 4.652s (+21.4% 🔺) 1.363s 10 1.95x
▲ 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
🐘 Postgres 🥇 Nitro 10.427s (-4.1%) 11.016s (~) 0.589s 3 1.00x
🐘 Postgres Express 10.431s (-4.9%) 11.017s (~) 0.586s 3 1.00x
💻 Local Express 10.434s (-4.5%) 11.021s (~) 0.588s 3 1.00x
💻 Local Nitro 10.470s (-4.3%) 11.022s (~) 0.552s 3 1.00x
🌐 MongoDB Next.js (Turbopack) 10.660s 11.019s 0.359s 3 1.02x
💻 Local Next.js (Turbopack) 10.709s 11.022s 0.313s 3 1.03x
🌐 Redis Next.js (Turbopack) 10.730s 11.023s 0.293s 3 1.03x
🐘 Postgres Next.js (Turbopack) 10.738s 11.016s 0.278s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.380s (-21.2% 🟢) 15.424s (-23.0% 🟢) 2.044s 2 1.00x
▲ Vercel Next.js (Turbopack) 14.566s (-15.9% 🟢) 16.548s (-14.7% 🟢) 1.982s 2 1.09x
▲ 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
🐘 Postgres 🥇 Nitro 13.481s (-7.6% 🟢) 14.019s (-6.7% 🟢) 0.538s 5 1.00x
💻 Local Express 13.503s (-9.8% 🟢) 14.027s (-6.7% 🟢) 0.524s 5 1.00x
🐘 Postgres Express 13.542s (-7.1% 🟢) 14.021s (-6.7% 🟢) 0.479s 5 1.00x
💻 Local Nitro 13.573s (-9.9% 🟢) 14.028s (-12.5% 🟢) 0.455s 5 1.01x
🌐 MongoDB Next.js (Turbopack) 13.953s 14.223s 0.270s 5 1.03x
💻 Local Next.js (Turbopack) 14.101s 15.029s 0.928s 4 1.05x
🌐 Redis Next.js (Turbopack) 14.105s 15.029s 0.924s 4 1.05x
🐘 Postgres Next.js (Turbopack) 14.120s 15.014s 0.893s 4 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 21.487s (-57.3% 🟢) 23.445s (-55.4% 🟢) 1.958s 3 1.00x
▲ Vercel Next.js (Turbopack) 23.244s (-55.8% 🟢) 25.238s (-53.8% 🟢) 1.994s 3 1.08x
▲ 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
🐘 Postgres 🥇 Nitro 11.916s (-14.7% 🟢) 12.020s (-16.0% 🟢) 0.104s 8 1.00x
💻 Local Express 12.021s (-27.6% 🟢) 12.397s (-27.2% 🟢) 0.376s 8 1.01x
🐘 Postgres Express 12.029s (-14.1% 🟢) 12.641s (-13.4% 🟢) 0.611s 8 1.01x
💻 Local Nitro 12.247s (-27.0% 🟢) 13.026s (-23.5% 🟢) 0.778s 7 1.03x
🌐 MongoDB Next.js (Turbopack) 12.688s 13.024s 0.336s 7 1.06x
🌐 Redis Next.js (Turbopack) 13.011s 13.167s 0.157s 7 1.09x
💻 Local Next.js (Turbopack) 13.195s 14.026s 0.832s 7 1.11x
🐘 Postgres Next.js (Turbopack) 13.200s 14.018s 0.818s 7 1.11x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 33.813s (-72.1% 🟢) 35.903s (-71.0% 🟢) 2.090s 3 1.00x
▲ Vercel Next.js (Turbopack) 37.539s (-90.5% 🟢) 39.779s (-89.9% 🟢) 2.240s 3 1.11x
▲ 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 🥇 Nitro 1.152s (-9.6% 🟢) 2.007s (~) 0.855s 15 1.00x
🐘 Postgres Express 1.153s (-8.5% 🟢) 2.007s (~) 0.854s 15 1.00x
💻 Local Nitro 1.185s (-27.3% 🟢) 2.006s (-3.3%) 0.821s 15 1.03x
💻 Local Express 1.189s (-20.1% 🟢) 2.006s (~) 0.817s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.217s 2.007s 0.789s 15 1.06x
🌐 Redis Next.js (Turbopack) 1.259s 2.006s 0.747s 15 1.09x
💻 Local Next.js (Turbopack) 1.310s 2.006s 0.696s 15 1.14x
🌐 MongoDB Next.js (Turbopack) 2.028s 2.675s 0.647s 12 1.76x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.571s (-10.1% 🟢) 4.450s (-3.8%) 1.879s 7 1.00x
▲ Vercel Next.js (Turbopack) 4.220s (+24.2% 🔺) 6.075s (+23.2% 🔺) 1.856s 5 1.64x
▲ 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.219s (-48.4% 🟢) 2.006s (-33.3% 🟢) 0.787s 15 1.00x
🐘 Postgres Nitro 1.228s (-47.8% 🟢) 2.007s (-33.3% 🟢) 0.780s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.365s 2.008s 0.643s 15 1.12x
💻 Local Express 1.769s (-40.1% 🟢) 2.007s (-41.9% 🟢) 0.238s 15 1.45x
💻 Local Nitro 1.863s (-40.7% 🟢) 2.073s (-46.6% 🟢) 0.210s 15 1.53x
💻 Local Next.js (Turbopack) 1.918s 2.392s 0.473s 13 1.57x
🌐 Redis Next.js (Turbopack) 2.368s 3.008s 0.640s 10 1.94x
🌐 MongoDB Next.js (Turbopack) 3.588s 4.011s 0.423s 8 2.94x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.024s (+11.2% 🔺) 6.188s (+21.1% 🔺) 2.163s 5 1.00x
▲ Vercel Next.js (Turbopack) 4.821s (-32.1% 🟢) 6.291s (-29.4% 🟢) 1.470s 5 1.20x
▲ 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 🥇 Nitro 1.387s (-60.2% 🟢) 2.008s (-49.9% 🟢) 0.621s 15 1.00x
🐘 Postgres Express 1.406s (-59.7% 🟢) 2.077s (-48.2% 🟢) 0.671s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.728s 2.393s 0.665s 13 1.25x
🌐 Redis Next.js (Turbopack) 3.668s 4.010s 0.341s 8 2.65x
💻 Local Express 5.306s (-36.4% 🟢) 6.013s (-33.4% 🟢) 0.707s 5 3.83x
💻 Local Next.js (Turbopack) 5.459s 6.013s 0.554s 5 3.94x
💻 Local Nitro 5.491s (-34.2% 🟢) 6.013s (-33.3% 🟢) 0.523s 5 3.96x
🌐 MongoDB Next.js (Turbopack) 6.318s 7.013s 0.695s 5 4.56x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.349s (-28.8% 🟢) 8.085s (-26.2% 🟢) 1.736s 4 1.00x
▲ Vercel Express 10.283s (+142.5% 🔺) 12.097s (+97.4% 🔺) 1.814s 3 1.62x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.153s (-8.3% 🟢) 2.008s (~) 0.855s 15 1.00x
🐘 Postgres Express 1.155s (-8.2% 🟢) 2.008s (~) 0.853s 15 1.00x
🌐 Redis Next.js (Turbopack) 1.231s 2.006s 0.775s 15 1.07x
🐘 Postgres Next.js (Turbopack) 1.232s 2.008s 0.776s 15 1.07x
💻 Local Express 1.236s (-34.7% 🟢) 2.005s (-15.2% 🟢) 0.769s 15 1.07x
💻 Local Next.js (Turbopack) 1.358s 2.006s 0.648s 15 1.18x
💻 Local Nitro 1.418s (-24.0% 🟢) 2.007s (-14.3% 🟢) 0.589s 15 1.23x
🌐 MongoDB Next.js (Turbopack) 2.027s 2.735s 0.708s 11 1.76x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.546s (-1.4%) 4.114s (-5.4% 🟢) 1.568s 8 1.00x
▲ Vercel Next.js (Turbopack) 4.043s (+37.9% 🔺) 5.571s (+20.0% 🔺) 1.527s 6 1.59x
▲ 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.240s (-47.0% 🟢) 2.009s (-33.3% 🟢) 0.768s 15 1.00x
🐘 Postgres Nitro 1.242s (-46.9% 🟢) 2.007s (-33.3% 🟢) 0.764s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.380s 2.007s 0.628s 15 1.11x
💻 Local Express 2.126s (-32.1% 🟢) 2.508s (-33.3% 🟢) 0.382s 12 1.71x
💻 Local Next.js (Turbopack) 2.150s 3.008s 0.858s 10 1.73x
💻 Local Nitro 2.164s (-29.4% 🟢) 2.675s (-31.2% 🟢) 0.511s 12 1.74x
🌐 Redis Next.js (Turbopack) 2.352s 3.008s 0.656s 10 1.90x
🌐 MongoDB Next.js (Turbopack) 3.614s 4.010s 0.396s 8 2.91x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.617s (+13.3% 🔺) 5.114s (+6.7% 🔺) 1.497s 6 1.00x
▲ Vercel Next.js (Turbopack) 5.291s (+68.4% 🔺) 6.930s (+53.2% 🔺) 1.639s 5 1.46x
▲ 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.385s (-60.4% 🟢) 2.008s (-49.9% 🟢) 0.623s 15 1.00x
🐘 Postgres Nitro 1.395s (-59.9% 🟢) 2.007s (-49.9% 🟢) 0.612s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.668s 2.009s 0.340s 15 1.20x
🌐 Redis Next.js (Turbopack) 3.656s 4.010s 0.354s 8 2.64x
💻 Local Next.js (Turbopack) 5.191s 5.848s 0.656s 6 3.75x
💻 Local Express 5.824s (-33.8% 🟢) 6.214s (-33.0% 🟢) 0.390s 5 4.21x
💻 Local Nitro 5.968s (-34.7% 🟢) 6.417s (-36.0% 🟢) 0.449s 5 4.31x
🌐 MongoDB Next.js (Turbopack) 6.319s 7.014s 0.695s 5 4.56x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 6.170s (-3.8%) 8.439s (+3.2%) 2.269s 4 1.00x
▲ Vercel Next.js (Turbopack) 6.900s (+2.1%) 8.804s (+3.0%) 1.904s 4 1.12x
▲ 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
🐘 Postgres 🥇 Nitro 0.442s (-46.2% 🟢) 1.006s (~) 0.564s 60 1.00x
🐘 Postgres Express 0.454s (-45.9% 🟢) 1.007s (-1.6%) 0.553s 60 1.03x
💻 Local Express 0.475s (-51.7% 🟢) 1.004s (-6.7% 🟢) 0.528s 60 1.08x
💻 Local Nitro 0.509s (-48.1% 🟢) 1.005s (-8.2% 🟢) 0.495s 60 1.15x
🌐 MongoDB Next.js (Turbopack) 0.618s 1.006s 0.388s 60 1.40x
🌐 Redis Next.js (Turbopack) 0.637s 1.004s 0.367s 60 1.44x
🐘 Postgres Next.js (Turbopack) 0.670s 1.007s 0.337s 60 1.52x
💻 Local Next.js (Turbopack) 0.757s 1.004s 0.248s 60 1.71x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.107s (-73.1% 🟢) 6.773s (-68.2% 🟢) 1.667s 9 1.00x
▲ Vercel Next.js (Turbopack) 7.299s (-49.7% 🟢) 8.980s (-44.2% 🟢) 1.681s 8 1.43x
▲ 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 🥇 Nitro 1.085s (-43.7% 🟢) 1.773s (-15.6% 🟢) 0.688s 51 1.00x
🐘 Postgres Express 1.185s (-40.0% 🟢) 2.030s (-10.1% 🟢) 0.845s 45 1.09x
💻 Local Express 1.214s (-59.7% 🟢) 2.006s (-44.1% 🟢) 0.792s 45 1.12x
💻 Local Nitro 1.266s (-58.3% 🟢) 2.006s (-46.6% 🟢) 0.740s 45 1.17x
🌐 MongoDB Next.js (Turbopack) 1.559s 2.007s 0.448s 45 1.44x
🌐 Redis Next.js (Turbopack) 1.559s 2.006s 0.446s 45 1.44x
🐘 Postgres Next.js (Turbopack) 1.628s 2.007s 0.379s 45 1.50x
💻 Local Next.js (Turbopack) 1.820s 2.006s 0.186s 45 1.68x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 14.094s (-59.2% 🟢) 16.235s (-55.9% 🟢) 2.141s 6 1.00x
▲ Vercel Next.js (Turbopack) 19.448s (-60.9% 🟢) 21.422s (-58.6% 🟢) 1.974s 5 1.38x
▲ 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.093s (-47.6% 🟢) 2.803s (-35.8% 🟢) 0.710s 44 1.00x
🐘 Postgres Nitro 2.110s (-48.6% 🟢) 2.697s (-41.4% 🟢) 0.587s 45 1.01x
💻 Local Express 2.698s (-70.7% 🟢) 3.007s (-70.0% 🟢) 0.309s 40 1.29x
💻 Local Nitro 2.869s (-69.1% 🟢) 3.162s (-68.4% 🟢) 0.292s 39 1.37x
🌐 Redis Next.js (Turbopack) 3.089s 3.976s 0.887s 31 1.48x
🐘 Postgres Next.js (Turbopack) 3.185s 4.010s 0.825s 30 1.52x
🌐 MongoDB Next.js (Turbopack) 3.756s 4.011s 0.255s 30 1.79x
💻 Local Next.js (Turbopack) 3.908s 4.146s 0.238s 29 1.87x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 43.478s (-66.6% 🟢) 45.262s (-65.8% 🟢) 1.784s 3 1.00x
▲ Vercel Next.js (Turbopack) 44.952s (-58.0% 🟢) 46.857s (-57.0% 🟢) 1.905s 3 1.03x
▲ 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 🥇 Nitro 0.185s (-34.8% 🟢) 1.006s (~) 0.821s 60 1.00x
🐘 Postgres Express 0.192s (-32.1% 🟢) 1.006s (~) 0.814s 60 1.04x
🐘 Postgres Next.js (Turbopack) 0.237s 1.006s 0.769s 60 1.28x
🌐 Redis Next.js (Turbopack) 0.251s 1.004s 0.754s 60 1.36x
💻 Local Express 0.432s (-22.9% 🟢) 1.004s (~) 0.572s 60 2.34x
💻 Local Nitro 0.481s (-20.5% 🟢) 1.005s (-1.6%) 0.524s 60 2.60x
💻 Local Next.js (Turbopack) 0.537s 1.004s 0.467s 60 2.91x
🌐 MongoDB Next.js (Turbopack) 1.038s 1.942s 0.904s 31 5.62x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.117s (+8.3% 🔺) 3.903s (+7.3% 🔺) 1.787s 16 1.00x
▲ Vercel Next.js (Turbopack) 4.028s (+99.2% 🔺) 5.901s (+55.5% 🔺) 1.872s 11 1.90x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express | Next.js (Turbopack)

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.321s (-37.0% 🟢) 1.006s (~) 0.685s 90 1.00x
🐘 Postgres Nitro 0.321s (-35.2% 🟢) 1.007s (~) 0.685s 90 1.00x
🌐 Redis Next.js (Turbopack) 0.427s 1.004s 0.577s 90 1.33x
🐘 Postgres Next.js (Turbopack) 0.466s 1.006s 0.540s 90 1.45x
💻 Local Nitro 2.275s (-10.4% 🟢) 3.009s (~) 0.734s 30 7.08x
💻 Local Next.js (Turbopack) 2.311s 3.043s 0.732s 30 7.20x
💻 Local Express 2.353s (-6.4% 🟢) 3.075s (+2.2%) 0.721s 30 7.33x
🌐 MongoDB Next.js (Turbopack) 2.606s 3.008s 0.402s 30 8.11x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 7.668s (+116.9% 🔺) 9.158s (+76.3% 🔺) 1.490s 10 1.00x
▲ Vercel Express 8.137s (+167.1% 🔺) 10.095s (+110.0% 🔺) 1.958s 9 1.06x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Express

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.671s (-18.0% 🟢) 1.006s (-1.1%) 0.335s 120 1.00x
🐘 Postgres Nitro 0.686s (-13.1% 🟢) 1.006s (~) 0.320s 120 1.02x
🌐 Redis Next.js (Turbopack) 0.788s 1.004s 0.215s 120 1.17x
🐘 Postgres Next.js (Turbopack) 0.988s 1.526s 0.538s 79 1.47x
🌐 MongoDB Next.js (Turbopack) 5.418s 6.013s 0.595s 20 8.07x
💻 Local Express 9.930s (-11.3% 🟢) 10.444s (-12.5% 🟢) 0.514s 12 14.79x
💻 Local Nitro 10.719s (-4.2%) 11.212s (-3.9%) 0.493s 11 15.96x
💻 Local Next.js (Turbopack) 11.540s 12.127s 0.587s 10 17.19x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 15.186s (+47.0% 🔺) 17.224s (+40.2% 🔺) 2.038s 7 1.00x
▲ Vercel Express 19.762s (+166.3% 🔺) 21.856s (+136.4% 🔺) 2.094s 6 1.30x
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | 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.134s (+453.3% 🔺) 1.995s (+99.5% 🔺) 0.001s (-26.7% 🟢) 2.011s (+98.8% 🔺) 0.876s 10 1.00x
🐘 Postgres Express 1.138s (+454.7% 🔺) 2.000s (+100.3% 🔺) 0.002s (+6.2% 🔺) 2.010s (+98.8% 🔺) 0.873s 10 1.00x
💻 Local Express 1.140s (+472.6% 🔺) 2.005s (+99.6% 🔺) 0.013s (+3.3%) 2.020s (+98.4% 🔺) 0.880s 10 1.01x
💻 Local Nitro 1.164s (+444.7% 🔺) 2.006s (+99.7% 🔺) 0.013s (+3.2%) 2.021s (+98.3% 🔺) 0.857s 10 1.03x
💻 Local Next.js (Turbopack) 1.177s 2.003s 0.010s 2.017s 0.840s 10 1.04x
🐘 Postgres Next.js (Turbopack) 1.191s 2.001s 0.001s 2.010s 0.819s 10 1.05x
🌐 MongoDB Next.js (Turbopack) ⚠️ missing - - - - -
🌐 Redis Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.199s (-12.2% 🟢) 3.314s (-19.0% 🟢) 1.933s (+101.2% 🔺) 5.709s (+2.1%) 3.510s 10 1.00x
▲ Vercel Next.js (Turbopack) 5.670s (-17.3% 🟢) 5.495s (-36.5% 🟢) 0.759s (+20.1% 🔺) 8.163s (-16.6% 🟢) 2.493s 10 2.58x
▲ 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.527s (+101.7% 🔺) 2.010s (+95.4% 🔺) 0.010s (+3.0%) 2.022s (+94.4% 🔺) 0.495s 30 1.00x
🐘 Postgres Nitro 1.548s (+147.9% 🔺) 2.007s (+99.4% 🔺) 0.004s (-7.3% 🟢) 2.027s (+98.2% 🔺) 0.479s 30 1.01x
🐘 Postgres Express 1.561s (+147.7% 🔺) 2.004s (+99.1% 🔺) 0.004s (+2.7%) 2.025s (+98.0% 🔺) 0.465s 30 1.02x
💻 Local Next.js (Turbopack) 1.668s 2.009s 0.010s 2.023s 0.354s 30 1.09x
🐘 Postgres Next.js (Turbopack) 1.691s 2.043s 0.004s 2.056s 0.365s 30 1.11x
💻 Local Nitro 1.769s (+110.9% 🔺) 2.011s (+98.7% 🔺) 0.010s (+11.7% 🔺) 2.203s (+97.4% 🔺) 0.434s 28 1.16x
🌐 MongoDB Next.js (Turbopack) ⚠️ missing - - - - -
🌐 Redis Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 6.296s (-3.2%) 7.899s (-1.4%) 0.297s (-27.3% 🟢) 8.651s (-2.1%) 2.355s 7 1.00x
▲ Vercel Next.js (Turbopack) 12.170s (-28.1% 🟢) 12.874s (-29.4% 🟢) 0.277s (+31.3% 🔺) 14.599s (-22.9% 🟢) 2.429s 5 1.93x
▲ 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.662s (-31.6% 🟢) 1.031s (-17.4% 🟢) 0.000s (+106.9% 🔺) 1.043s (-17.1% 🟢) 0.380s 58 1.00x
🐘 Postgres Express 0.663s (-31.0% 🟢) 1.032s (-19.2% 🟢) 0.000s (-60.3% 🟢) 1.042s (-20.2% 🟢) 0.379s 58 1.00x
🐘 Postgres Next.js (Turbopack) 0.800s 1.052s 0.000s 1.059s 0.259s 57 1.21x
💻 Local Nitro 1.425s (+16.6% 🔺) 2.017s (~) 0.001s (+400.0% 🔺) 2.019s (~) 0.594s 30 2.15x
💻 Local Next.js (Turbopack) 1.452s 2.014s 0.000s 2.018s 0.565s 30 2.19x
💻 Local Express 1.494s (+22.0% 🔺) 2.017s (~) 0.000s (+28.6% 🔺) 2.197s (+8.7% 🔺) 0.703s 28 2.26x
🌐 MongoDB Next.js (Turbopack) ⚠️ missing - - - - -
🌐 Redis Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.089s (+9.3% 🔺) 5.658s (+10.9% 🔺) 0.001s (+395.0% 🔺) 6.141s (+11.0% 🔺) 2.052s 10 1.00x
▲ Vercel Next.js (Turbopack) 6.024s (-40.8% 🟢) 6.592s (-42.8% 🟢) 0.000s (+Infinity% 🔺) 7.904s (-34.4% 🟢) 1.880s 8 1.47x
▲ 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 🥇 Nitro 1.350s (-24.6% 🟢) 1.996s (-6.8% 🟢) 0.000s (-6.7% 🟢) 2.009s (-7.6% 🟢) 0.659s 30 1.00x
🐘 Postgres Express 1.387s (-21.7% 🟢) 2.102s (-3.5%) 0.000s (+Infinity% 🔺) 2.115s (-3.8%) 0.728s 29 1.03x
🐘 Postgres Next.js (Turbopack) 1.831s 2.348s 0.000s 2.357s 0.526s 26 1.36x
💻 Local Next.js (Turbopack) 2.809s 3.287s 0.000s 3.296s 0.486s 19 2.08x
💻 Local Express 3.008s (-13.3% 🟢) 3.671s (-9.0% 🟢) 0.000s (-85.3% 🟢) 3.677s (-8.9% 🟢) 0.669s 17 2.23x
💻 Local Nitro 3.212s (-5.2% 🟢) 3.906s (-3.1%) 0.000s (-53.1% 🟢) 3.908s (-3.2%) 0.696s 16 2.38x
🌐 MongoDB Next.js (Turbopack) ⚠️ missing - - - - -
🌐 Redis Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.245s (+14.3% 🔺) 6.849s (+13.7% 🔺) 0.000s (NaN%) 7.320s (+13.4% 🔺) 2.075s 9 1.00x
▲ Vercel Next.js (Turbopack) 8.375s (+49.1% 🔺) 9.248s (+32.5% 🔺) 0.000s (-100.0% 🟢) 10.262s (+36.1% 🔺) 1.887s 6 1.60x
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express | Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

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

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

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 1198 3 229 1430
✅ 💻 Local Development 1587 0 233 1820
✅ 📦 Local Production 1587 0 233 1820
✅ 🐘 Local Postgres 1587 0 233 1820
✅ 🪟 Windows 129 0 1 130
✅ 📋 Other 727 0 183 910
Total 6815 3 1112 7930

❌ Failed Tests

▲ Vercel Production (3 failed)

nextjs-turbopack (3 failed):

  • outputStreamWorkflow no startIndex (reads all chunks)
  • scheduleWhenIdle - concurrent multi-wave workflow completes without unconsumed event error | wrun_01KR2EV0P5T94NDXTV7S0D1HG9 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_01KR2AMX1E2N2T961ZYJC59XHD | 🔍 observability

Details by Category

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

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

Replaces the simple 50-item × 2-step pattern with the production failure
pattern: 80 concurrent items each running 5 nested waves of steps (parallel
search reps → sequential addResult → sequential getProjectResults → parallel
exa-source loop → sequential getToday + parallel fetchStatus). A few items
per wave 1 are stragglers whose searchStep lags 10-15s behind the rest of
the batch, mirroring the T97/T9T/T9V pattern from production run
wrun_01KQ05J17ZJHGZFRYZ20QM1DBS.

This timing skew is what triggers scheduleWhenIdle to fire WorkflowSuspension
in the gap between fast hydrations completing (pendingDeliveries → 0) and
the next useStep callback registering, leaving the next-wave step's
step_created event unclaimed → WorkflowRuntimeError.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
karthikscale3 and others added 8 commits May 7, 2026 13:52
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Adds focused unit tests for scheduleWhenIdle's fast and deferred paths,
plus a local REPLAY_PROPAGATION_DELAY_MS alias and a doc note explaining
why the deferred timer does not need cancellation when a follow-up
useStep registers mid-wait.

Co-authored-by: Cursor <cursoragent@cursor.com>
Move 96_many_steps.ts to the canonical workbench/example/workflows
location and add the matching symlinks in every workbench whose
workflows directory is a real directory (nextjs-turbopack,
nextjs-webpack, nitro-v3, sveltekit). Adapters whose workflows
directory is itself a symlink chain (express/fastify/hono/nitro/
nitro-v2/nuxt/tanstack-start/vite via nitro-v3, astro via sveltekit,
nest via example) pick the file up automatically through the chain.

Drop the `test.skipIf(APP_NAME !== 'nextjs-turbopack')` guard so
every adapter in the e2e matrix exercises the regression workflow.

Co-authored-by: Cursor <cursoragent@cursor.com>
Switches private.test.ts to vi.useFakeTimers + advanceTimersByTimeAsync
so the state-machine assertions are deterministic and instant rather
than wall-clock dependent. Uses a getter-based pendingDeliveries stub
to avoid sinon-fake-timers' loopLimit when polling iterations would
otherwise persist across many 0ms re-polls.

Also adds a TODO next to REPLAY_PROPAGATION_DELAY_MS pointing at a
future deterministic VM-resumption-in-flight counter so the 100ms
heuristic isn't load-bearing forever.

Co-authored-by: Cursor <cursoragent@cursor.com>
Keep the high-concurrency replay stress case on the representative Next.js Turbopack lane after CI showed the full adapter matrix timing out or failing under the added load.

Co-authored-by: Cursor <cursoragent@cursor.com>
Limit the high-concurrency replay regression to the Vercel-backed Next.js Turbopack lane so local and Windows matrices do not time out under the stress workload.

Co-authored-by: Cursor <cursoragent@cursor.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.

1 participant